使用 [[gitignore.io|https://www.gitignore.io/]] 可以快速生成跟你项目相关的 `.gitignore` 文件。

[[GitHub/gitignore|https://github.com/github/gitignore]] 仓库也提供了一些配置好的 `.gitignore` 文件,我将它下到 Dropbox 中方便使用。
0
Snow
8px
tiddlywiki
#ffffff

TableOfContents

reverse
tiddlers
created

Algorithm: Book
above
top
Introspection
YYYY-0MM-0DD Topic
wiki-1251140025.cos.ap-shanghai.myqcloud.com
hide
hide
hide
show
show
hide
hide
hide
hide
yes
2
no
500px
fixed
no
tc-btn-invisible
no
$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin
show
show
disable
{
    "tiddlers": {
        "$:/Acknowledgements": {
            "title": "$:/Acknowledgements",
            "text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
        },
        "$:/core/copyright.txt": {
            "title": "$:/core/copyright.txt",
            "type": "text/plain",
            "text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
        },
        "$:/core/icon": {
            "title": "$:/core/icon",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
        },
        "$:/core/images/add-comment": {
            "title": "$:/core/images/add-comment",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
        },
        "$:/core/images/advanced-search-button": {
            "title": "$:/core/images/advanced-search-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
        },
        "$:/core/images/auto-height": {
            "title": "$:/core/images/auto-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/blank": {
            "title": "$:/core/images/blank",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
        },
        "$:/core/images/bold": {
            "title": "$:/core/images/bold",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
        },
        "$:/core/images/cancel-button": {
            "title": "$:/core/images/cancel-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
        },
        "$:/core/images/chevron-down": {
            "title": "$:/core/images/chevron-down",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
        },
        "$:/core/images/chevron-left": {
            "title": "$:/core/images/chevron-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-right": {
            "title": "$:/core/images/chevron-right",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-up": {
            "title": "$:/core/images/chevron-up",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
        },
        "$:/core/images/clone-button": {
            "title": "$:/core/images/clone-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
        },
        "$:/core/images/close-all-button": {
            "title": "$:/core/images/close-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
        },
        "$:/core/images/close-button": {
            "title": "$:/core/images/close-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
        },
        "$:/core/images/close-others-button": {
            "title": "$:/core/images/close-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/copy-clipboard": {
            "title": "$:/core/images/copy-clipboard",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
        },
        "$:/core/images/delete-button": {
            "title": "$:/core/images/delete-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/done-button": {
            "title": "$:/core/images/done-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
        },
        "$:/core/images/down-arrow": {
            "title": "$:/core/images/down-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
        },
        "$:/core/images/download-button": {
            "title": "$:/core/images/download-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
        },
        "$:/core/images/edit-button": {
            "title": "$:/core/images/edit-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
        },
        "$:/core/images/erase": {
            "title": "$:/core/images/erase",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
        },
        "$:/core/images/excise": {
            "title": "$:/core/images/excise",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
        },
        "$:/core/images/export-button": {
            "title": "$:/core/images/export-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
        },
        "$:/core/images/file": {
            "title": "$:/core/images/file",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
        },
        "$:/core/images/fixed-height": {
            "title": "$:/core/images/fixed-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/fold-all-button": {
            "title": "$:/core/images/fold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
        },
        "$:/core/images/fold-button": {
            "title": "$:/core/images/fold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
        },
        "$:/core/images/fold-others-button": {
            "title": "$:/core/images/fold-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/folder": {
            "title": "$:/core/images/folder",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
        },
        "$:/core/images/full-screen-button": {
            "title": "$:/core/images/full-screen-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
        },
        "$:/core/images/github": {
            "title": "$:/core/images/github",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
        },
        "$:/core/images/gitter": {
            "title": "$:/core/images/gitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
        },
        "$:/core/images/globe": {
            "title": "$:/core/images/globe",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
        },
        "$:/core/images/heading-1": {
            "title": "$:/core/images/heading-1",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
        },
        "$:/core/images/heading-2": {
            "title": "$:/core/images/heading-2",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
        },
        "$:/core/images/heading-3": {
            "title": "$:/core/images/heading-3",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
        },
        "$:/core/images/heading-4": {
            "title": "$:/core/images/heading-4",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
        },
        "$:/core/images/heading-5": {
            "title": "$:/core/images/heading-5",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
        },
        "$:/core/images/heading-6": {
            "title": "$:/core/images/heading-6",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
        },
        "$:/core/images/help": {
            "title": "$:/core/images/help",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
        },
        "$:/core/images/home-button": {
            "title": "$:/core/images/home-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
        },
        "$:/core/images/import-button": {
            "title": "$:/core/images/import-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
        },
        "$:/core/images/info-button": {
            "title": "$:/core/images/info-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/italic": {
            "title": "$:/core/images/italic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
        },
        "$:/core/images/left-arrow": {
            "title": "$:/core/images/left-arrow",
            "created": "20150315234410875",
            "modified": "20150315235324760",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
        },
        "$:/core/images/line-width": {
            "title": "$:/core/images/line-width",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/link": {
            "title": "$:/core/images/link",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
        },
        "$:/core/images/linkify": {
            "title": "$:/core/images/linkify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
        },
        "$:/core/images/list-bullet": {
            "title": "$:/core/images/list-bullet",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
        },
        "$:/core/images/list-number": {
            "title": "$:/core/images/list-number",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
        },
        "$:/core/images/list": {
            "title": "$:/core/images/list",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
        },
        "$:/core/images/locked-padlock": {
            "title": "$:/core/images/locked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/mail": {
            "title": "$:/core/images/mail",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
        },
        "$:/core/images/menu-button": {
            "title": "$:/core/images/menu-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
        },
        "$:/core/images/mono-block": {
            "title": "$:/core/images/mono-block",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
        },
        "$:/core/images/mono-line": {
            "title": "$:/core/images/mono-line",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
        },
        "$:/core/images/new-button": {
            "title": "$:/core/images/new-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
        },
        "$:/core/images/new-here-button": {
            "title": "$:/core/images/new-here-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/new-image-button": {
            "title": "$:/core/images/new-image-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
        },
        "$:/core/images/new-journal-button": {
            "title": "$:/core/images/new-journal-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
        },
        "$:/core/images/opacity": {
            "title": "$:/core/images/opacity",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
        },
        "$:/core/images/open-window": {
            "title": "$:/core/images/open-window",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
        },
        "$:/core/images/options-button": {
            "title": "$:/core/images/options-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
        },
        "$:/core/images/paint": {
            "title": "$:/core/images/paint",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
        },
        "$:/core/images/palette": {
            "title": "$:/core/images/palette",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
        },
        "$:/core/images/permalink-button": {
            "title": "$:/core/images/permalink-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
        },
        "$:/core/images/permaview-button": {
            "title": "$:/core/images/permaview-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
        },
        "$:/core/images/picture": {
            "title": "$:/core/images/picture",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
        },
        "$:/core/images/plugin-generic-language": {
            "title": "$:/core/images/plugin-generic-language",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
        },
        "$:/core/images/plugin-generic-plugin": {
            "title": "$:/core/images/plugin-generic-plugin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
        },
        "$:/core/images/plugin-generic-theme": {
            "title": "$:/core/images/plugin-generic-theme",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
        },
        "$:/core/images/preview-closed": {
            "title": "$:/core/images/preview-closed",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
        },
        "$:/core/images/preview-open": {
            "title": "$:/core/images/preview-open",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
        },
        "$:/core/images/print-button": {
            "title": "$:/core/images/print-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
        },
        "$:/core/images/quote": {
            "title": "$:/core/images/quote",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
        },
        "$:/core/images/refresh-button": {
            "title": "$:/core/images/refresh-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
        },
        "$:/core/images/right-arrow": {
            "title": "$:/core/images/right-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
        },
        "$:/core/images/rotate-left": {
            "title": "$:/core/images/rotate-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
        },
        "$:/core/images/save-button": {
            "title": "$:/core/images/save-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
        },
        "$:/core/images/size": {
            "title": "$:/core/images/size",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
        },
        "$:/core/images/spiral": {
            "title": "$:/core/images/spiral",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
        },
        "$:/core/images/stamp": {
            "title": "$:/core/images/stamp",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
        },
        "$:/core/images/star-filled": {
            "title": "$:/core/images/star-filled",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
        },
        "$:/core/images/storyview-classic": {
            "title": "$:/core/images/storyview-classic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-pop": {
            "title": "$:/core/images/storyview-pop",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-zoomin": {
            "title": "$:/core/images/storyview-zoomin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
        },
        "$:/core/images/strikethrough": {
            "title": "$:/core/images/strikethrough",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
        },
        "$:/core/images/subscript": {
            "title": "$:/core/images/subscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/superscript": {
            "title": "$:/core/images/superscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/tag-button": {
            "title": "$:/core/images/tag-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
        },
        "$:/core/images/theme-button": {
            "title": "$:/core/images/theme-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
        },
        "$:/core/images/timestamp-off": {
            "title": "$:/core/images/timestamp-off",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
        },
        "$:/core/images/timestamp-on": {
            "title": "$:/core/images/timestamp-on",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
        },
        "$:/core/images/tip": {
            "title": "$:/core/images/tip",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
        },
        "$:/core/images/transcludify": {
            "title": "$:/core/images/transcludify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
        },
        "$:/core/images/twitter": {
            "title": "$:/core/images/twitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
        },
        "$:/core/images/underline": {
            "title": "$:/core/images/underline",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
        },
        "$:/core/images/unfold-all-button": {
            "title": "$:/core/images/unfold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unfold-button": {
            "title": "$:/core/images/unfold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unlocked-padlock": {
            "title": "$:/core/images/unlocked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/up-arrow": {
            "title": "$:/core/images/up-arrow",
            "created": "20150316000544368",
            "modified": "20150316000831867",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
        },
        "$:/core/images/video": {
            "title": "$:/core/images/video",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
        },
        "$:/core/images/warning": {
            "title": "$:/core/images/warning",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
        },
        "$:/language/Buttons/AdvancedSearch/Caption": {
            "title": "$:/language/Buttons/AdvancedSearch/Caption",
            "text": "advanced search"
        },
        "$:/language/Buttons/AdvancedSearch/Hint": {
            "title": "$:/language/Buttons/AdvancedSearch/Hint",
            "text": "Advanced search"
        },
        "$:/language/Buttons/Cancel/Caption": {
            "title": "$:/language/Buttons/Cancel/Caption",
            "text": "cancel"
        },
        "$:/language/Buttons/Cancel/Hint": {
            "title": "$:/language/Buttons/Cancel/Hint",
            "text": "Discard changes to this tiddler"
        },
        "$:/language/Buttons/Clone/Caption": {
            "title": "$:/language/Buttons/Clone/Caption",
            "text": "clone"
        },
        "$:/language/Buttons/Clone/Hint": {
            "title": "$:/language/Buttons/Clone/Hint",
            "text": "Clone this tiddler"
        },
        "$:/language/Buttons/Close/Caption": {
            "title": "$:/language/Buttons/Close/Caption",
            "text": "close"
        },
        "$:/language/Buttons/Close/Hint": {
            "title": "$:/language/Buttons/Close/Hint",
            "text": "Close this tiddler"
        },
        "$:/language/Buttons/CloseAll/Caption": {
            "title": "$:/language/Buttons/CloseAll/Caption",
            "text": "close all"
        },
        "$:/language/Buttons/CloseAll/Hint": {
            "title": "$:/language/Buttons/CloseAll/Hint",
            "text": "Close all tiddlers"
        },
        "$:/language/Buttons/CloseOthers/Caption": {
            "title": "$:/language/Buttons/CloseOthers/Caption",
            "text": "close others"
        },
        "$:/language/Buttons/CloseOthers/Hint": {
            "title": "$:/language/Buttons/CloseOthers/Hint",
            "text": "Close other tiddlers"
        },
        "$:/language/Buttons/ControlPanel/Caption": {
            "title": "$:/language/Buttons/ControlPanel/Caption",
            "text": "control panel"
        },
        "$:/language/Buttons/ControlPanel/Hint": {
            "title": "$:/language/Buttons/ControlPanel/Hint",
            "text": "Open control panel"
        },
        "$:/language/Buttons/CopyToClipboard/Caption": {
            "title": "$:/language/Buttons/CopyToClipboard/Caption",
            "text": "copy to clipboard"
        },
        "$:/language/Buttons/CopyToClipboard/Hint": {
            "title": "$:/language/Buttons/CopyToClipboard/Hint",
            "text": "Copy this text to the clipboard"
        },
        "$:/language/Buttons/Delete/Caption": {
            "title": "$:/language/Buttons/Delete/Caption",
            "text": "delete"
        },
        "$:/language/Buttons/Delete/Hint": {
            "title": "$:/language/Buttons/Delete/Hint",
            "text": "Delete this tiddler"
        },
        "$:/language/Buttons/Edit/Caption": {
            "title": "$:/language/Buttons/Edit/Caption",
            "text": "edit"
        },
        "$:/language/Buttons/Edit/Hint": {
            "title": "$:/language/Buttons/Edit/Hint",
            "text": "Edit this tiddler"
        },
        "$:/language/Buttons/Encryption/Caption": {
            "title": "$:/language/Buttons/Encryption/Caption",
            "text": "encryption"
        },
        "$:/language/Buttons/Encryption/Hint": {
            "title": "$:/language/Buttons/Encryption/Hint",
            "text": "Set or clear a password for saving this wiki"
        },
        "$:/language/Buttons/Encryption/ClearPassword/Caption": {
            "title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
            "text": "clear password"
        },
        "$:/language/Buttons/Encryption/ClearPassword/Hint": {
            "title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
            "text": "Clear the password and save this wiki without encryption"
        },
        "$:/language/Buttons/Encryption/SetPassword/Caption": {
            "title": "$:/language/Buttons/Encryption/SetPassword/Caption",
            "text": "set password"
        },
        "$:/language/Buttons/Encryption/SetPassword/Hint": {
            "title": "$:/language/Buttons/Encryption/SetPassword/Hint",
            "text": "Set a password for saving this wiki with encryption"
        },
        "$:/language/Buttons/ExportPage/Caption": {
            "title": "$:/language/Buttons/ExportPage/Caption",
            "text": "export all"
        },
        "$:/language/Buttons/ExportPage/Hint": {
            "title": "$:/language/Buttons/ExportPage/Hint",
            "text": "Export all tiddlers"
        },
        "$:/language/Buttons/ExportTiddler/Caption": {
            "title": "$:/language/Buttons/ExportTiddler/Caption",
            "text": "export tiddler"
        },
        "$:/language/Buttons/ExportTiddler/Hint": {
            "title": "$:/language/Buttons/ExportTiddler/Hint",
            "text": "Export tiddler"
        },
        "$:/language/Buttons/ExportTiddlers/Caption": {
            "title": "$:/language/Buttons/ExportTiddlers/Caption",
            "text": "export tiddlers"
        },
        "$:/language/Buttons/ExportTiddlers/Hint": {
            "title": "$:/language/Buttons/ExportTiddlers/Hint",
            "text": "Export tiddlers"
        },
        "$:/language/Buttons/SidebarSearch/Hint": {
            "title": "$:/language/Buttons/SidebarSearch/Hint",
            "text": "Select the sidebar search field"
        },
        "$:/language/Buttons/Fold/Caption": {
            "title": "$:/language/Buttons/Fold/Caption",
            "text": "fold tiddler"
        },
        "$:/language/Buttons/Fold/Hint": {
            "title": "$:/language/Buttons/Fold/Hint",
            "text": "Fold the body of this tiddler"
        },
        "$:/language/Buttons/Fold/FoldBar/Caption": {
            "title": "$:/language/Buttons/Fold/FoldBar/Caption",
            "text": "fold-bar"
        },
        "$:/language/Buttons/Fold/FoldBar/Hint": {
            "title": "$:/language/Buttons/Fold/FoldBar/Hint",
            "text": "Optional bars to fold and unfold tiddlers"
        },
        "$:/language/Buttons/Unfold/Caption": {
            "title": "$:/language/Buttons/Unfold/Caption",
            "text": "unfold tiddler"
        },
        "$:/language/Buttons/Unfold/Hint": {
            "title": "$:/language/Buttons/Unfold/Hint",
            "text": "Unfold the body of this tiddler"
        },
        "$:/language/Buttons/FoldOthers/Caption": {
            "title": "$:/language/Buttons/FoldOthers/Caption",
            "text": "fold other tiddlers"
        },
        "$:/language/Buttons/FoldOthers/Hint": {
            "title": "$:/language/Buttons/FoldOthers/Hint",
            "text": "Fold the bodies of other opened tiddlers"
        },
        "$:/language/Buttons/FoldAll/Caption": {
            "title": "$:/language/Buttons/FoldAll/Caption",
            "text": "fold all tiddlers"
        },
        "$:/language/Buttons/FoldAll/Hint": {
            "title": "$:/language/Buttons/FoldAll/Hint",
            "text": "Fold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Caption": {
            "title": "$:/language/Buttons/UnfoldAll/Caption",
            "text": "unfold all tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Hint": {
            "title": "$:/language/Buttons/UnfoldAll/Hint",
            "text": "Unfold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/FullScreen/Caption": {
            "title": "$:/language/Buttons/FullScreen/Caption",
            "text": "full-screen"
        },
        "$:/language/Buttons/FullScreen/Hint": {
            "title": "$:/language/Buttons/FullScreen/Hint",
            "text": "Enter or leave full-screen mode"
        },
        "$:/language/Buttons/Help/Caption": {
            "title": "$:/language/Buttons/Help/Caption",
            "text": "help"
        },
        "$:/language/Buttons/Help/Hint": {
            "title": "$:/language/Buttons/Help/Hint",
            "text": "Show help panel"
        },
        "$:/language/Buttons/Import/Caption": {
            "title": "$:/language/Buttons/Import/Caption",
            "text": "import"
        },
        "$:/language/Buttons/Import/Hint": {
            "title": "$:/language/Buttons/Import/Hint",
            "text": "Import many types of file including text, image, TiddlyWiki or JSON"
        },
        "$:/language/Buttons/Info/Caption": {
            "title": "$:/language/Buttons/Info/Caption",
            "text": "info"
        },
        "$:/language/Buttons/Info/Hint": {
            "title": "$:/language/Buttons/Info/Hint",
            "text": "Show information for this tiddler"
        },
        "$:/language/Buttons/Home/Caption": {
            "title": "$:/language/Buttons/Home/Caption",
            "text": "home"
        },
        "$:/language/Buttons/Home/Hint": {
            "title": "$:/language/Buttons/Home/Hint",
            "text": "Open the default tiddlers"
        },
        "$:/language/Buttons/Language/Caption": {
            "title": "$:/language/Buttons/Language/Caption",
            "text": "language"
        },
        "$:/language/Buttons/Language/Hint": {
            "title": "$:/language/Buttons/Language/Hint",
            "text": "Choose the user interface language"
        },
        "$:/language/Buttons/Manager/Caption": {
            "title": "$:/language/Buttons/Manager/Caption",
            "text": "tiddler manager"
        },
        "$:/language/Buttons/Manager/Hint": {
            "title": "$:/language/Buttons/Manager/Hint",
            "text": "Open tiddler manager"
        },
        "$:/language/Buttons/More/Caption": {
            "title": "$:/language/Buttons/More/Caption",
            "text": "more"
        },
        "$:/language/Buttons/More/Hint": {
            "title": "$:/language/Buttons/More/Hint",
            "text": "More actions"
        },
        "$:/language/Buttons/NewHere/Caption": {
            "title": "$:/language/Buttons/NewHere/Caption",
            "text": "new here"
        },
        "$:/language/Buttons/NewHere/Hint": {
            "title": "$:/language/Buttons/NewHere/Hint",
            "text": "Create a new tiddler tagged with this one"
        },
        "$:/language/Buttons/NewJournal/Caption": {
            "title": "$:/language/Buttons/NewJournal/Caption",
            "text": "new journal"
        },
        "$:/language/Buttons/NewJournal/Hint": {
            "title": "$:/language/Buttons/NewJournal/Hint",
            "text": "Create a new journal tiddler"
        },
        "$:/language/Buttons/NewJournalHere/Caption": {
            "title": "$:/language/Buttons/NewJournalHere/Caption",
            "text": "new journal here"
        },
        "$:/language/Buttons/NewJournalHere/Hint": {
            "title": "$:/language/Buttons/NewJournalHere/Hint",
            "text": "Create a new journal tiddler tagged with this one"
        },
        "$:/language/Buttons/NewImage/Caption": {
            "title": "$:/language/Buttons/NewImage/Caption",
            "text": "new image"
        },
        "$:/language/Buttons/NewImage/Hint": {
            "title": "$:/language/Buttons/NewImage/Hint",
            "text": "Create a new image tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Caption": {
            "title": "$:/language/Buttons/NewMarkdown/Caption",
            "text": "new Markdown tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Hint": {
            "title": "$:/language/Buttons/NewMarkdown/Hint",
            "text": "Create a new Markdown tiddler"
        },
        "$:/language/Buttons/NewTiddler/Caption": {
            "title": "$:/language/Buttons/NewTiddler/Caption",
            "text": "new tiddler"
        },
        "$:/language/Buttons/NewTiddler/Hint": {
            "title": "$:/language/Buttons/NewTiddler/Hint",
            "text": "Create a new tiddler"
        },
        "$:/language/Buttons/OpenWindow/Caption": {
            "title": "$:/language/Buttons/OpenWindow/Caption",
            "text": "open in new window"
        },
        "$:/language/Buttons/OpenWindow/Hint": {
            "title": "$:/language/Buttons/OpenWindow/Hint",
            "text": "Open tiddler in new window"
        },
        "$:/language/Buttons/Palette/Caption": {
            "title": "$:/language/Buttons/Palette/Caption",
            "text": "palette"
        },
        "$:/language/Buttons/Palette/Hint": {
            "title": "$:/language/Buttons/Palette/Hint",
            "text": "Choose the colour palette"
        },
        "$:/language/Buttons/Permalink/Caption": {
            "title": "$:/language/Buttons/Permalink/Caption",
            "text": "permalink"
        },
        "$:/language/Buttons/Permalink/Hint": {
            "title": "$:/language/Buttons/Permalink/Hint",
            "text": "Set browser address bar to a direct link to this tiddler"
        },
        "$:/language/Buttons/Permaview/Caption": {
            "title": "$:/language/Buttons/Permaview/Caption",
            "text": "permaview"
        },
        "$:/language/Buttons/Permaview/Hint": {
            "title": "$:/language/Buttons/Permaview/Hint",
            "text": "Set browser address bar to a direct link to all the tiddlers in this story"
        },
        "$:/language/Buttons/Print/Caption": {
            "title": "$:/language/Buttons/Print/Caption",
            "text": "print page"
        },
        "$:/language/Buttons/Print/Hint": {
            "title": "$:/language/Buttons/Print/Hint",
            "text": "Print the current page"
        },
        "$:/language/Buttons/Refresh/Caption": {
            "title": "$:/language/Buttons/Refresh/Caption",
            "text": "refresh"
        },
        "$:/language/Buttons/Refresh/Hint": {
            "title": "$:/language/Buttons/Refresh/Hint",
            "text": "Perform a full refresh of the wiki"
        },
        "$:/language/Buttons/Save/Caption": {
            "title": "$:/language/Buttons/Save/Caption",
            "text": "ok"
        },
        "$:/language/Buttons/Save/Hint": {
            "title": "$:/language/Buttons/Save/Hint",
            "text": "Confirm changes to this tiddler"
        },
        "$:/language/Buttons/SaveWiki/Caption": {
            "title": "$:/language/Buttons/SaveWiki/Caption",
            "text": "save changes"
        },
        "$:/language/Buttons/SaveWiki/Hint": {
            "title": "$:/language/Buttons/SaveWiki/Hint",
            "text": "Save changes"
        },
        "$:/language/Buttons/StoryView/Caption": {
            "title": "$:/language/Buttons/StoryView/Caption",
            "text": "storyview"
        },
        "$:/language/Buttons/StoryView/Hint": {
            "title": "$:/language/Buttons/StoryView/Hint",
            "text": "Choose the story visualisation"
        },
        "$:/language/Buttons/HideSideBar/Caption": {
            "title": "$:/language/Buttons/HideSideBar/Caption",
            "text": "hide sidebar"
        },
        "$:/language/Buttons/HideSideBar/Hint": {
            "title": "$:/language/Buttons/HideSideBar/Hint",
            "text": "Hide sidebar"
        },
        "$:/language/Buttons/ShowSideBar/Caption": {
            "title": "$:/language/Buttons/ShowSideBar/Caption",
            "text": "show sidebar"
        },
        "$:/language/Buttons/ShowSideBar/Hint": {
            "title": "$:/language/Buttons/ShowSideBar/Hint",
            "text": "Show sidebar"
        },
        "$:/language/Buttons/TagManager/Caption": {
            "title": "$:/language/Buttons/TagManager/Caption",
            "text": "tag manager"
        },
        "$:/language/Buttons/TagManager/Hint": {
            "title": "$:/language/Buttons/TagManager/Hint",
            "text": "Open tag manager"
        },
        "$:/language/Buttons/Timestamp/Caption": {
            "title": "$:/language/Buttons/Timestamp/Caption",
            "text": "timestamps"
        },
        "$:/language/Buttons/Timestamp/Hint": {
            "title": "$:/language/Buttons/Timestamp/Hint",
            "text": "Choose whether modifications update timestamps"
        },
        "$:/language/Buttons/Timestamp/On/Caption": {
            "title": "$:/language/Buttons/Timestamp/On/Caption",
            "text": "timestamps are on"
        },
        "$:/language/Buttons/Timestamp/On/Hint": {
            "title": "$:/language/Buttons/Timestamp/On/Hint",
            "text": "Update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Timestamp/Off/Caption": {
            "title": "$:/language/Buttons/Timestamp/Off/Caption",
            "text": "timestamps are off"
        },
        "$:/language/Buttons/Timestamp/Off/Hint": {
            "title": "$:/language/Buttons/Timestamp/Off/Hint",
            "text": "Don't update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Theme/Caption": {
            "title": "$:/language/Buttons/Theme/Caption",
            "text": "theme"
        },
        "$:/language/Buttons/Theme/Hint": {
            "title": "$:/language/Buttons/Theme/Hint",
            "text": "Choose the display theme"
        },
        "$:/language/Buttons/Bold/Caption": {
            "title": "$:/language/Buttons/Bold/Caption",
            "text": "bold"
        },
        "$:/language/Buttons/Bold/Hint": {
            "title": "$:/language/Buttons/Bold/Hint",
            "text": "Apply bold formatting to selection"
        },
        "$:/language/Buttons/Clear/Caption": {
            "title": "$:/language/Buttons/Clear/Caption",
            "text": "clear"
        },
        "$:/language/Buttons/Clear/Hint": {
            "title": "$:/language/Buttons/Clear/Hint",
            "text": "Clear image to solid colour"
        },
        "$:/language/Buttons/EditorHeight/Caption": {
            "title": "$:/language/Buttons/EditorHeight/Caption",
            "text": "editor height"
        },
        "$:/language/Buttons/EditorHeight/Caption/Auto": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Auto",
            "text": "Automatically adjust height to fit content"
        },
        "$:/language/Buttons/EditorHeight/Caption/Fixed": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
            "text": "Fixed height:"
        },
        "$:/language/Buttons/EditorHeight/Hint": {
            "title": "$:/language/Buttons/EditorHeight/Hint",
            "text": "Choose the height of the text editor"
        },
        "$:/language/Buttons/Excise/Caption": {
            "title": "$:/language/Buttons/Excise/Caption",
            "text": "excise"
        },
        "$:/language/Buttons/Excise/Caption/Excise": {
            "title": "$:/language/Buttons/Excise/Caption/Excise",
            "text": "Perform excision"
        },
        "$:/language/Buttons/Excise/Caption/MacroName": {
            "title": "$:/language/Buttons/Excise/Caption/MacroName",
            "text": "Macro name:"
        },
        "$:/language/Buttons/Excise/Caption/NewTitle": {
            "title": "$:/language/Buttons/Excise/Caption/NewTitle",
            "text": "Title of new tiddler:"
        },
        "$:/language/Buttons/Excise/Caption/Replace": {
            "title": "$:/language/Buttons/Excise/Caption/Replace",
            "text": "Replace excised text with:"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Macro": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
            "text": "macro"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Link": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Link",
            "text": "link"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
            "text": "transclusion"
        },
        "$:/language/Buttons/Excise/Caption/Tag": {
            "title": "$:/language/Buttons/Excise/Caption/Tag",
            "text": "Tag new tiddler with the title of this tiddler"
        },
        "$:/language/Buttons/Excise/Caption/TiddlerExists": {
            "title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
            "text": "Warning: tiddler already exists"
        },
        "$:/language/Buttons/Excise/Hint": {
            "title": "$:/language/Buttons/Excise/Hint",
            "text": "Excise the selected text into a new tiddler"
        },
        "$:/language/Buttons/Heading1/Caption": {
            "title": "$:/language/Buttons/Heading1/Caption",
            "text": "heading 1"
        },
        "$:/language/Buttons/Heading1/Hint": {
            "title": "$:/language/Buttons/Heading1/Hint",
            "text": "Apply heading level 1 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading2/Caption": {
            "title": "$:/language/Buttons/Heading2/Caption",
            "text": "heading 2"
        },
        "$:/language/Buttons/Heading2/Hint": {
            "title": "$:/language/Buttons/Heading2/Hint",
            "text": "Apply heading level 2 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading3/Caption": {
            "title": "$:/language/Buttons/Heading3/Caption",
            "text": "heading 3"
        },
        "$:/language/Buttons/Heading3/Hint": {
            "title": "$:/language/Buttons/Heading3/Hint",
            "text": "Apply heading level 3 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading4/Caption": {
            "title": "$:/language/Buttons/Heading4/Caption",
            "text": "heading 4"
        },
        "$:/language/Buttons/Heading4/Hint": {
            "title": "$:/language/Buttons/Heading4/Hint",
            "text": "Apply heading level 4 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading5/Caption": {
            "title": "$:/language/Buttons/Heading5/Caption",
            "text": "heading 5"
        },
        "$:/language/Buttons/Heading5/Hint": {
            "title": "$:/language/Buttons/Heading5/Hint",
            "text": "Apply heading level 5 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading6/Caption": {
            "title": "$:/language/Buttons/Heading6/Caption",
            "text": "heading 6"
        },
        "$:/language/Buttons/Heading6/Hint": {
            "title": "$:/language/Buttons/Heading6/Hint",
            "text": "Apply heading level 6 formatting to lines containing selection"
        },
        "$:/language/Buttons/Italic/Caption": {
            "title": "$:/language/Buttons/Italic/Caption",
            "text": "italic"
        },
        "$:/language/Buttons/Italic/Hint": {
            "title": "$:/language/Buttons/Italic/Hint",
            "text": "Apply italic formatting to selection"
        },
        "$:/language/Buttons/LineWidth/Caption": {
            "title": "$:/language/Buttons/LineWidth/Caption",
            "text": "line width"
        },
        "$:/language/Buttons/LineWidth/Hint": {
            "title": "$:/language/Buttons/LineWidth/Hint",
            "text": "Set line width for painting"
        },
        "$:/language/Buttons/Link/Caption": {
            "title": "$:/language/Buttons/Link/Caption",
            "text": "link"
        },
        "$:/language/Buttons/Link/Hint": {
            "title": "$:/language/Buttons/Link/Hint",
            "text": "Create wikitext link"
        },
        "$:/language/Buttons/Linkify/Caption": {
            "title": "$:/language/Buttons/Linkify/Caption",
            "text": "wikilink"
        },
        "$:/language/Buttons/Linkify/Hint": {
            "title": "$:/language/Buttons/Linkify/Hint",
            "text": "Wrap selection in square brackets"
        },
        "$:/language/Buttons/ListBullet/Caption": {
            "title": "$:/language/Buttons/ListBullet/Caption",
            "text": "bulleted list"
        },
        "$:/language/Buttons/ListBullet/Hint": {
            "title": "$:/language/Buttons/ListBullet/Hint",
            "text": "Apply bulleted list formatting to lines containing selection"
        },
        "$:/language/Buttons/ListNumber/Caption": {
            "title": "$:/language/Buttons/ListNumber/Caption",
            "text": "numbered list"
        },
        "$:/language/Buttons/ListNumber/Hint": {
            "title": "$:/language/Buttons/ListNumber/Hint",
            "text": "Apply numbered list formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoBlock/Caption": {
            "title": "$:/language/Buttons/MonoBlock/Caption",
            "text": "monospaced block"
        },
        "$:/language/Buttons/MonoBlock/Hint": {
            "title": "$:/language/Buttons/MonoBlock/Hint",
            "text": "Apply monospaced block formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoLine/Caption": {
            "title": "$:/language/Buttons/MonoLine/Caption",
            "text": "monospaced"
        },
        "$:/language/Buttons/MonoLine/Hint": {
            "title": "$:/language/Buttons/MonoLine/Hint",
            "text": "Apply monospaced character formatting to selection"
        },
        "$:/language/Buttons/Opacity/Caption": {
            "title": "$:/language/Buttons/Opacity/Caption",
            "text": "opacity"
        },
        "$:/language/Buttons/Opacity/Hint": {
            "title": "$:/language/Buttons/Opacity/Hint",
            "text": "Set painting opacity"
        },
        "$:/language/Buttons/Paint/Caption": {
            "title": "$:/language/Buttons/Paint/Caption",
            "text": "paint colour"
        },
        "$:/language/Buttons/Paint/Hint": {
            "title": "$:/language/Buttons/Paint/Hint",
            "text": "Set painting colour"
        },
        "$:/language/Buttons/Picture/Caption": {
            "title": "$:/language/Buttons/Picture/Caption",
            "text": "picture"
        },
        "$:/language/Buttons/Picture/Hint": {
            "title": "$:/language/Buttons/Picture/Hint",
            "text": "Insert picture"
        },
        "$:/language/Buttons/Preview/Caption": {
            "title": "$:/language/Buttons/Preview/Caption",
            "text": "preview"
        },
        "$:/language/Buttons/Preview/Hint": {
            "title": "$:/language/Buttons/Preview/Hint",
            "text": "Show preview pane"
        },
        "$:/language/Buttons/PreviewType/Caption": {
            "title": "$:/language/Buttons/PreviewType/Caption",
            "text": "preview type"
        },
        "$:/language/Buttons/PreviewType/Hint": {
            "title": "$:/language/Buttons/PreviewType/Hint",
            "text": "Choose preview type"
        },
        "$:/language/Buttons/Quote/Caption": {
            "title": "$:/language/Buttons/Quote/Caption",
            "text": "quote"
        },
        "$:/language/Buttons/Quote/Hint": {
            "title": "$:/language/Buttons/Quote/Hint",
            "text": "Apply quoted text formatting to lines containing selection"
        },
        "$:/language/Buttons/RotateLeft/Caption": {
            "title": "$:/language/Buttons/RotateLeft/Caption",
            "text": "rotate left"
        },
        "$:/language/Buttons/RotateLeft/Hint": {
            "title": "$:/language/Buttons/RotateLeft/Hint",
            "text": "Rotate image left by 90 degrees"
        },
        "$:/language/Buttons/Size/Caption": {
            "title": "$:/language/Buttons/Size/Caption",
            "text": "image size"
        },
        "$:/language/Buttons/Size/Caption/Height": {
            "title": "$:/language/Buttons/Size/Caption/Height",
            "text": "Height:"
        },
        "$:/language/Buttons/Size/Caption/Resize": {
            "title": "$:/language/Buttons/Size/Caption/Resize",
            "text": "Resize image"
        },
        "$:/language/Buttons/Size/Caption/Width": {
            "title": "$:/language/Buttons/Size/Caption/Width",
            "text": "Width:"
        },
        "$:/language/Buttons/Size/Hint": {
            "title": "$:/language/Buttons/Size/Hint",
            "text": "Set image size"
        },
        "$:/language/Buttons/Stamp/Caption": {
            "title": "$:/language/Buttons/Stamp/Caption",
            "text": "stamp"
        },
        "$:/language/Buttons/Stamp/Caption/New": {
            "title": "$:/language/Buttons/Stamp/Caption/New",
            "text": "Add your own"
        },
        "$:/language/Buttons/Stamp/Hint": {
            "title": "$:/language/Buttons/Stamp/Hint",
            "text": "Insert a preconfigured snippet of text"
        },
        "$:/language/Buttons/Stamp/New/Title": {
            "title": "$:/language/Buttons/Stamp/New/Title",
            "text": "Name as shown in menu"
        },
        "$:/language/Buttons/Stamp/New/Text": {
            "title": "$:/language/Buttons/Stamp/New/Text",
            "text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
        },
        "$:/language/Buttons/Strikethrough/Caption": {
            "title": "$:/language/Buttons/Strikethrough/Caption",
            "text": "strikethrough"
        },
        "$:/language/Buttons/Strikethrough/Hint": {
            "title": "$:/language/Buttons/Strikethrough/Hint",
            "text": "Apply strikethrough formatting to selection"
        },
        "$:/language/Buttons/Subscript/Caption": {
            "title": "$:/language/Buttons/Subscript/Caption",
            "text": "subscript"
        },
        "$:/language/Buttons/Subscript/Hint": {
            "title": "$:/language/Buttons/Subscript/Hint",
            "text": "Apply subscript formatting to selection"
        },
        "$:/language/Buttons/Superscript/Caption": {
            "title": "$:/language/Buttons/Superscript/Caption",
            "text": "superscript"
        },
        "$:/language/Buttons/Superscript/Hint": {
            "title": "$:/language/Buttons/Superscript/Hint",
            "text": "Apply superscript formatting to selection"
        },
        "$:/language/Buttons/ToggleSidebar/Hint": {
            "title": "$:/language/Buttons/ToggleSidebar/Hint",
            "text": "Toggle the sidebar visibility"
        },
        "$:/language/Buttons/Transcludify/Caption": {
            "title": "$:/language/Buttons/Transcludify/Caption",
            "text": "transclusion"
        },
        "$:/language/Buttons/Transcludify/Hint": {
            "title": "$:/language/Buttons/Transcludify/Hint",
            "text": "Wrap selection in curly brackets"
        },
        "$:/language/Buttons/Underline/Caption": {
            "title": "$:/language/Buttons/Underline/Caption",
            "text": "underline"
        },
        "$:/language/Buttons/Underline/Hint": {
            "title": "$:/language/Buttons/Underline/Hint",
            "text": "Apply underline formatting to selection"
        },
        "$:/language/ControlPanel/Advanced/Caption": {
            "title": "$:/language/ControlPanel/Advanced/Caption",
            "text": "Advanced"
        },
        "$:/language/ControlPanel/Advanced/Hint": {
            "title": "$:/language/ControlPanel/Advanced/Hint",
            "text": "Internal information about this TiddlyWiki"
        },
        "$:/language/ControlPanel/Appearance/Caption": {
            "title": "$:/language/ControlPanel/Appearance/Caption",
            "text": "Appearance"
        },
        "$:/language/ControlPanel/Appearance/Hint": {
            "title": "$:/language/ControlPanel/Appearance/Hint",
            "text": "Ways to customise the appearance of your TiddlyWiki."
        },
        "$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
            "text": "Animation duration"
        },
        "$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
            "text": "Default focus field for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/Caption": {
            "title": "$:/language/ControlPanel/Basics/Caption",
            "text": "Basics"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
            "text": "Use &#91;&#91;double square brackets&#93;&#93; for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
            "text": "Default tiddlers"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
            "text": "Choose which tiddlers are displayed at startup"
        },
        "$:/language/ControlPanel/Basics/Language/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Language/Prompt",
            "text": "Hello! Current language:"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
            "text": "Title of new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
            "text": "Text for new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
            "text": "Tags for new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
            "text": "Title of new tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
            "text": "Tags for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
            "text": "Number of overridden shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/RemoveTags": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags",
            "text": "Update to current format"
        },
        "$:/language/ControlPanel/Basics/RemoveTags/Hint": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags/Hint",
            "text": "Update the tags configuration to the latest format"
        },
        "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
            "text": "Number of shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/Subtitle/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
            "text": "Subtitle"
        },
        "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
            "text": "Number of system tiddlers"
        },
        "$:/language/ControlPanel/Basics/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Tags/Prompt",
            "text": "Number of tags"
        },
        "$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
            "text": "Number of tiddlers"
        },
        "$:/language/ControlPanel/Basics/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Title/Prompt",
            "text": "Title of this ~TiddlyWiki"
        },
        "$:/language/ControlPanel/Basics/Username/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Username/Prompt",
            "text": "Username for signing edits"
        },
        "$:/language/ControlPanel/Basics/Version/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Version/Prompt",
            "text": "~TiddlyWiki version"
        },
        "$:/language/ControlPanel/EditorTypes/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Caption",
            "text": "Editor Types"
        },
        "$:/language/ControlPanel/EditorTypes/Editor/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
            "text": "Editor"
        },
        "$:/language/ControlPanel/EditorTypes/Hint": {
            "title": "$:/language/ControlPanel/EditorTypes/Hint",
            "text": "These tiddlers determine which editor is used to edit specific tiddler types."
        },
        "$:/language/ControlPanel/EditorTypes/Type/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
            "text": "Type"
        },
        "$:/language/ControlPanel/Info/Caption": {
            "title": "$:/language/ControlPanel/Info/Caption",
            "text": "Info"
        },
        "$:/language/ControlPanel/Info/Hint": {
            "title": "$:/language/ControlPanel/Info/Hint",
            "text": "Information about this TiddlyWiki"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
            "text": "Type shortcut here"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
            "text": "add shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
            "text": "Keyboard Shortcuts"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
            "text": "Manage keyboard shortcut assignments"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
            "text": "No keyboard shortcuts assigned"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
            "text": "remove keyboard shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
            "text": "All platforms"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
            "text": "Macintosh platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
            "text": "Non-Macintosh platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
            "text": "Linux platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
            "text": "Non-Linux platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
            "text": "Windows platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
            "text": "Non-Windows platforms only"
        },
        "$:/language/ControlPanel/LayoutSwitcher/Caption": {
            "title": "$:/language/ControlPanel/LayoutSwitcher/Caption",
            "text": "Layout"
        },
        "$:/language/ControlPanel/LoadedModules/Caption": {
            "title": "$:/language/ControlPanel/LoadedModules/Caption",
            "text": "Loaded Modules"
        },
        "$:/language/ControlPanel/LoadedModules/Hint": {
            "title": "$:/language/ControlPanel/LoadedModules/Hint",
            "text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
        },
        "$:/language/ControlPanel/Palette/Caption": {
            "title": "$:/language/ControlPanel/Palette/Caption",
            "text": "Palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
            "title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
            "text": "clone"
        },
        "$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
            "text": "It is recommended that you clone this shadow palette before editing it"
        },
        "$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
            "title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
            "text": "delete this entry from the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
            "title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
            "text": "Show color names that are not part of the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
            "title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
            "text": "This shadow palette has been modified"
        },
        "$:/language/ControlPanel/Palette/Editor/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Editor/Prompt",
            "text": "Editing"
        },
        "$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
            "title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
            "text": "reset"
        },
        "$:/language/ControlPanel/Palette/HideEditor/Caption": {
            "title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
            "text": "hide editor"
        },
        "$:/language/ControlPanel/Palette/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Prompt",
            "text": "Current palette:"
        },
        "$:/language/ControlPanel/Palette/ShowEditor/Caption": {
            "title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
            "text": "show editor"
        },
        "$:/language/ControlPanel/Parsing/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Caption",
            "text": "Parsing"
        },
        "$:/language/ControlPanel/Parsing/Hint": {
            "title": "$:/language/ControlPanel/Parsing/Hint",
            "text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
        },
        "$:/language/ControlPanel/Parsing/Block/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Block/Caption",
            "text": "Block Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Inline/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Inline/Caption",
            "text": "Inline Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Pragma/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
            "text": "Pragma Parse Rules"
        },
        "$:/language/ControlPanel/Plugins/Add/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Add/Caption",
            "text": "Get more plugins"
        },
        "$:/language/ControlPanel/Plugins/Add/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Add/Hint",
            "text": "Install plugins from the official library"
        },
        "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
            "text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
        },
        "$:/language/ControlPanel/Plugins/AlsoRequires": {
            "title": "$:/language/ControlPanel/Plugins/AlsoRequires",
            "text": "Also requires:"
        },
        "$:/language/ControlPanel/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Disable/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Disable/Caption",
            "text": "disable"
        },
        "$:/language/ControlPanel/Plugins/Disable/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Disable/Hint",
            "text": "Disable this plugin when reloading page"
        },
        "$:/language/ControlPanel/Plugins/Disabled/Status": {
            "title": "$:/language/ControlPanel/Plugins/Disabled/Status",
            "text": "(disabled)"
        },
        "$:/language/ControlPanel/Plugins/Downgrade/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
            "text": "downgrade"
        },
        "$:/language/ControlPanel/Plugins/Empty/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Empty/Hint",
            "text": "None"
        },
        "$:/language/ControlPanel/Plugins/Enable/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Enable/Caption",
            "text": "enable"
        },
        "$:/language/ControlPanel/Plugins/Enable/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Enable/Hint",
            "text": "Enable this plugin when reloading page"
        },
        "$:/language/ControlPanel/Plugins/Install/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Install/Caption",
            "text": "install"
        },
        "$:/language/ControlPanel/Plugins/Installed/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Installed/Hint",
            "text": "Currently installed plugins:"
        },
        "$:/language/ControlPanel/Plugins/Languages/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Caption",
            "text": "Languages"
        },
        "$:/language/ControlPanel/Plugins/Languages/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Hint",
            "text": "Language pack plugins"
        },
        "$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
            "text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
        },
        "$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
            "text": "This plugin is not currently installed"
        },
        "$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
            "text": "open plugin library"
        },
        "$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
            "text": "close plugin library"
        },
        "$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
            "title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
            "text": "(requires reload)"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Reinstall/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
            "text": "reinstall"
        },
        "$:/language/ControlPanel/Plugins/Themes/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Caption",
            "text": "Themes"
        },
        "$:/language/ControlPanel/Plugins/Themes/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Hint",
            "text": "Theme plugins"
        },
        "$:/language/ControlPanel/Plugins/Update/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Update/Caption",
            "text": "update"
        },
        "$:/language/ControlPanel/Plugins/Updates/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Caption",
            "text": "Updates"
        },
        "$:/language/ControlPanel/Plugins/Updates/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Hint",
            "text": "Available updates to installed plugins"
        },
        "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
            "text": "Update <<update-count>> plugins"
        },
        "$:/language/ControlPanel/Plugins/SubPluginPrompt": {
            "title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
            "text": "With <<count>> sub-plugins available"
        },
        "$:/language/ControlPanel/Saving/Caption": {
            "title": "$:/language/ControlPanel/Saving/Caption",
            "text": "Saving"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
            "text": "Permit automatic saving for the download saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
            "text": "Enable Autosave for Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
            "text": "Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
            "text": "These settings apply to the HTML5-compatible download saver"
        },
        "$:/language/ControlPanel/Saving/General/Caption": {
            "title": "$:/language/ControlPanel/Saving/General/Caption",
            "text": "General"
        },
        "$:/language/ControlPanel/Saving/General/Hint": {
            "title": "$:/language/ControlPanel/Saving/General/Hint",
            "text": "These settings apply to all the loaded savers"
        },
        "$:/language/ControlPanel/Saving/Hint": {
            "title": "$:/language/ControlPanel/Saving/Hint",
            "text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
        },
        "$:/language/ControlPanel/Saving/GitService/Branch": {
            "title": "$:/language/ControlPanel/Saving/GitService/Branch",
            "text": "Target branch for saving"
        },
        "$:/language/ControlPanel/Saving/GitService/CommitMessage": {
            "title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
            "text": "Saved by TiddlyWiki"
        },
        "$:/language/ControlPanel/Saving/GitService/Description": {
            "title": "$:/language/ControlPanel/Saving/GitService/Description",
            "text": "These settings are only used when saving to <<service-name>>"
        },
        "$:/language/ControlPanel/Saving/GitService/Filename": {
            "title": "$:/language/ControlPanel/Saving/GitService/Filename",
            "text": "Filename of target file (e.g. `index.html`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Path": {
            "title": "$:/language/ControlPanel/Saving/GitService/Path",
            "text": "Path to target file (e.g. `/wiki/`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Repo": {
            "title": "$:/language/ControlPanel/Saving/GitService/Repo",
            "text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
        },
        "$:/language/ControlPanel/Saving/GitService/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
            "text": "Server API URL"
        },
        "$:/language/ControlPanel/Saving/GitService/UserName": {
            "title": "$:/language/ControlPanel/Saving/GitService/UserName",
            "text": "Username"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
            "text": "~GitHub Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
            "text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
            "text": "~GitLab Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
            "text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
            "text": "Gitea Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
            "text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
            "text": "Advanced Settings"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
            "text": "Backup Directory"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel",
            "text": "~TiddlySpot Control Panel"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
            "text": "Backups"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
            "text": "~TiddlySpot Saver"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Description": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
            "text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
            "text": "Upload Filename"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
            "text": "~TiddlySpot"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
            "text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Password": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
            "text": "Password"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly",
            "text": "The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers."
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
            "text": "Server URL"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
            "text": "Upload Directory"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
            "text": "Wiki Name"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Caption": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
            "text": "Autosave"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
            "text": "Do not save changes automatically"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
            "text": "Save changes automatically"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
            "text": "Attempt to automatically save changes during editing when using a supporting saver"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Caption": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
            "text": "Camel Case Wiki Links"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Hint": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
            "text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Description": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Description",
            "text": "Enable automatic ~CamelCase linking"
        },
        "$:/language/ControlPanel/Settings/Caption": {
            "title": "$:/language/ControlPanel/Settings/Caption",
            "text": "Settings"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
            "text": "Enable or disable the editor toolbar:"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Description": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
            "text": "Show editor toolbar"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
            "text": "Tiddler Info Panel Mode"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
            "text": "Control when the tiddler info panel closes:"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
            "text": "Tiddler info panel closes automatically"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
            "text": "Tiddler info panel stays open until explicitly closed"
        },
        "$:/language/ControlPanel/Settings/Hint": {
            "title": "$:/language/ControlPanel/Settings/Hint",
            "text": "These settings let you customise the behaviour of TiddlyWiki."
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
            "text": "Navigation Address Bar"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
            "text": "Behaviour of the browser address bar when navigating to a tiddler:"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
            "text": "Do not update the address bar"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
            "text": "Include the target tiddler"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
            "text": "Include the target tiddler and the current story sequence"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
            "text": "Navigation History"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
            "text": "Update browser history when navigating to a tiddler:"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
            "text": "Do not update history"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
            "text": "Update history"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
            "text": "Permalink/permaview Mode"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
            "text": "Choose how permalink/permaview is handled:"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
            "text": "Copy permalink/permaview URL to clipboard"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
            "text": "Update address bar with permalink/permaview URL"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
            "text": "Performance Instrumentation"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
            "text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
            "text": "Enable performance instrumentation"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
            "text": "Toolbar Button Style"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
            "text": "Choose the style for toolbar buttons:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
            "text": "Borderless"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
            "text": "Boxed"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
            "text": "Rounded"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
            "text": "Toolbar Buttons"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
            "text": "Default toolbar button appearance:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
            "text": "Include icon"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
            "text": "Include text"
        },
        "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
            "text": "Default Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
            "text": "Specify which sidebar tab is displayed by default"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
            "text": "Default More Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
            "text": "Specify which More sidebar tab is displayed by default"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
            "text": "Tiddler Opening Behaviour"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
            "text": "Navigation from //within// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
            "text": "Navigation from //outside// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
            "text": "Open above the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
            "text": "Open below the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
            "text": "Open at the top of the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
            "text": "Open at the bottom of the story river"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
            "text": "Tiddler Titles"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
            "text": "Optionally display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
            "text": "Do not display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
            "text": "Display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
            "text": "Wiki Links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
            "text": "Choose whether to link to tiddlers that do not exist yet"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Description": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
            "text": "Enable links to missing tiddlers"
        },
        "$:/language/ControlPanel/StoryView/Caption": {
            "title": "$:/language/ControlPanel/StoryView/Caption",
            "text": "Story View"
        },
        "$:/language/ControlPanel/StoryView/Prompt": {
            "title": "$:/language/ControlPanel/StoryView/Prompt",
            "text": "Current view:"
        },
        "$:/language/ControlPanel/Stylesheets/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Caption",
            "text": "Stylesheets"
        },
        "$:/language/ControlPanel/Stylesheets/Expand/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
            "text": "Expand All"
        },
        "$:/language/ControlPanel/Stylesheets/Hint": {
            "title": "$:/language/ControlPanel/Stylesheets/Hint",
            "text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
        },
        "$:/language/ControlPanel/Stylesheets/Restore/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
            "text": "Restore"
        },
        "$:/language/ControlPanel/Theme/Caption": {
            "title": "$:/language/ControlPanel/Theme/Caption",
            "text": "Theme"
        },
        "$:/language/ControlPanel/Theme/Prompt": {
            "title": "$:/language/ControlPanel/Theme/Prompt",
            "text": "Current theme:"
        },
        "$:/language/ControlPanel/TiddlerFields/Caption": {
            "title": "$:/language/ControlPanel/TiddlerFields/Caption",
            "text": "Tiddler Fields"
        },
        "$:/language/ControlPanel/TiddlerFields/Hint": {
            "title": "$:/language/ControlPanel/TiddlerFields/Hint",
            "text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
        },
        "$:/language/ControlPanel/Toolbars/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/Caption",
            "text": "Toolbars"
        },
        "$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
            "text": "Edit Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
            "text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/Hint",
            "text": "Select which toolbar buttons are displayed"
        },
        "$:/language/ControlPanel/Toolbars/PageControls/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
            "text": "Page Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/PageControls/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
            "text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
            "text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
            "text": "View Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
            "text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Tools/Download/Full/Caption": {
            "title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
            "text": "Download full wiki"
        },
        "$:/language/Date/DaySuffix/1": {
            "title": "$:/language/Date/DaySuffix/1",
            "text": "st"
        },
        "$:/language/Date/DaySuffix/2": {
            "title": "$:/language/Date/DaySuffix/2",
            "text": "nd"
        },
        "$:/language/Date/DaySuffix/3": {
            "title": "$:/language/Date/DaySuffix/3",
            "text": "rd"
        },
        "$:/language/Date/DaySuffix/4": {
            "title": "$:/language/Date/DaySuffix/4",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/5": {
            "title": "$:/language/Date/DaySuffix/5",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/6": {
            "title": "$:/language/Date/DaySuffix/6",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/7": {
            "title": "$:/language/Date/DaySuffix/7",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/8": {
            "title": "$:/language/Date/DaySuffix/8",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/9": {
            "title": "$:/language/Date/DaySuffix/9",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/10": {
            "title": "$:/language/Date/DaySuffix/10",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/11": {
            "title": "$:/language/Date/DaySuffix/11",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/12": {
            "title": "$:/language/Date/DaySuffix/12",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/13": {
            "title": "$:/language/Date/DaySuffix/13",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/14": {
            "title": "$:/language/Date/DaySuffix/14",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/15": {
            "title": "$:/language/Date/DaySuffix/15",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/16": {
            "title": "$:/language/Date/DaySuffix/16",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/17": {
            "title": "$:/language/Date/DaySuffix/17",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/18": {
            "title": "$:/language/Date/DaySuffix/18",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/19": {
            "title": "$:/language/Date/DaySuffix/19",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/20": {
            "title": "$:/language/Date/DaySuffix/20",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/21": {
            "title": "$:/language/Date/DaySuffix/21",
            "text": "st"
        },
        "$:/language/Date/DaySuffix/22": {
            "title": "$:/language/Date/DaySuffix/22",
            "text": "nd"
        },
        "$:/language/Date/DaySuffix/23": {
            "title": "$:/language/Date/DaySuffix/23",
            "text": "rd"
        },
        "$:/language/Date/DaySuffix/24": {
            "title": "$:/language/Date/DaySuffix/24",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/25": {
            "title": "$:/language/Date/DaySuffix/25",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/26": {
            "title": "$:/language/Date/DaySuffix/26",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/27": {
            "title": "$:/language/Date/DaySuffix/27",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/28": {
            "title": "$:/language/Date/DaySuffix/28",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/29": {
            "title": "$:/language/Date/DaySuffix/29",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/30": {
            "title": "$:/language/Date/DaySuffix/30",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/31": {
            "title": "$:/language/Date/DaySuffix/31",
            "text": "st"
        },
        "$:/language/Date/Long/Day/0": {
            "title": "$:/language/Date/Long/Day/0",
            "text": "Sunday"
        },
        "$:/language/Date/Long/Day/1": {
            "title": "$:/language/Date/Long/Day/1",
            "text": "Monday"
        },
        "$:/language/Date/Long/Day/2": {
            "title": "$:/language/Date/Long/Day/2",
            "text": "Tuesday"
        },
        "$:/language/Date/Long/Day/3": {
            "title": "$:/language/Date/Long/Day/3",
            "text": "Wednesday"
        },
        "$:/language/Date/Long/Day/4": {
            "title": "$:/language/Date/Long/Day/4",
            "text": "Thursday"
        },
        "$:/language/Date/Long/Day/5": {
            "title": "$:/language/Date/Long/Day/5",
            "text": "Friday"
        },
        "$:/language/Date/Long/Day/6": {
            "title": "$:/language/Date/Long/Day/6",
            "text": "Saturday"
        },
        "$:/language/Date/Long/Month/1": {
            "title": "$:/language/Date/Long/Month/1",
            "text": "January"
        },
        "$:/language/Date/Long/Month/2": {
            "title": "$:/language/Date/Long/Month/2",
            "text": "February"
        },
        "$:/language/Date/Long/Month/3": {
            "title": "$:/language/Date/Long/Month/3",
            "text": "March"
        },
        "$:/language/Date/Long/Month/4": {
            "title": "$:/language/Date/Long/Month/4",
            "text": "April"
        },
        "$:/language/Date/Long/Month/5": {
            "title": "$:/language/Date/Long/Month/5",
            "text": "May"
        },
        "$:/language/Date/Long/Month/6": {
            "title": "$:/language/Date/Long/Month/6",
            "text": "June"
        },
        "$:/language/Date/Long/Month/7": {
            "title": "$:/language/Date/Long/Month/7",
            "text": "July"
        },
        "$:/language/Date/Long/Month/8": {
            "title": "$:/language/Date/Long/Month/8",
            "text": "August"
        },
        "$:/language/Date/Long/Month/9": {
            "title": "$:/language/Date/Long/Month/9",
            "text": "September"
        },
        "$:/language/Date/Long/Month/10": {
            "title": "$:/language/Date/Long/Month/10",
            "text": "October"
        },
        "$:/language/Date/Long/Month/11": {
            "title": "$:/language/Date/Long/Month/11",
            "text": "November"
        },
        "$:/language/Date/Long/Month/12": {
            "title": "$:/language/Date/Long/Month/12",
            "text": "December"
        },
        "$:/language/Date/Period/am": {
            "title": "$:/language/Date/Period/am",
            "text": "am"
        },
        "$:/language/Date/Period/pm": {
            "title": "$:/language/Date/Period/pm",
            "text": "pm"
        },
        "$:/language/Date/Short/Day/0": {
            "title": "$:/language/Date/Short/Day/0",
            "text": "Sun"
        },
        "$:/language/Date/Short/Day/1": {
            "title": "$:/language/Date/Short/Day/1",
            "text": "Mon"
        },
        "$:/language/Date/Short/Day/2": {
            "title": "$:/language/Date/Short/Day/2",
            "text": "Tue"
        },
        "$:/language/Date/Short/Day/3": {
            "title": "$:/language/Date/Short/Day/3",
            "text": "Wed"
        },
        "$:/language/Date/Short/Day/4": {
            "title": "$:/language/Date/Short/Day/4",
            "text": "Thu"
        },
        "$:/language/Date/Short/Day/5": {
            "title": "$:/language/Date/Short/Day/5",
            "text": "Fri"
        },
        "$:/language/Date/Short/Day/6": {
            "title": "$:/language/Date/Short/Day/6",
            "text": "Sat"
        },
        "$:/language/Date/Short/Month/1": {
            "title": "$:/language/Date/Short/Month/1",
            "text": "Jan"
        },
        "$:/language/Date/Short/Month/2": {
            "title": "$:/language/Date/Short/Month/2",
            "text": "Feb"
        },
        "$:/language/Date/Short/Month/3": {
            "title": "$:/language/Date/Short/Month/3",
            "text": "Mar"
        },
        "$:/language/Date/Short/Month/4": {
            "title": "$:/language/Date/Short/Month/4",
            "text": "Apr"
        },
        "$:/language/Date/Short/Month/5": {
            "title": "$:/language/Date/Short/Month/5",
            "text": "May"
        },
        "$:/language/Date/Short/Month/6": {
            "title": "$:/language/Date/Short/Month/6",
            "text": "Jun"
        },
        "$:/language/Date/Short/Month/7": {
            "title": "$:/language/Date/Short/Month/7",
            "text": "Jul"
        },
        "$:/language/Date/Short/Month/8": {
            "title": "$:/language/Date/Short/Month/8",
            "text": "Aug"
        },
        "$:/language/Date/Short/Month/9": {
            "title": "$:/language/Date/Short/Month/9",
            "text": "Sep"
        },
        "$:/language/Date/Short/Month/10": {
            "title": "$:/language/Date/Short/Month/10",
            "text": "Oct"
        },
        "$:/language/Date/Short/Month/11": {
            "title": "$:/language/Date/Short/Month/11",
            "text": "Nov"
        },
        "$:/language/Date/Short/Month/12": {
            "title": "$:/language/Date/Short/Month/12",
            "text": "Dec"
        },
        "$:/language/RelativeDate/Future/Days": {
            "title": "$:/language/RelativeDate/Future/Days",
            "text": "<<period>> days from now"
        },
        "$:/language/RelativeDate/Future/Hours": {
            "title": "$:/language/RelativeDate/Future/Hours",
            "text": "<<period>> hours from now"
        },
        "$:/language/RelativeDate/Future/Minutes": {
            "title": "$:/language/RelativeDate/Future/Minutes",
            "text": "<<period>> minutes from now"
        },
        "$:/language/RelativeDate/Future/Months": {
            "title": "$:/language/RelativeDate/Future/Months",
            "text": "<<period>> months from now"
        },
        "$:/language/RelativeDate/Future/Second": {
            "title": "$:/language/RelativeDate/Future/Second",
            "text": "1 second from now"
        },
        "$:/language/RelativeDate/Future/Seconds": {
            "title": "$:/language/RelativeDate/Future/Seconds",
            "text": "<<period>> seconds from now"
        },
        "$:/language/RelativeDate/Future/Years": {
            "title": "$:/language/RelativeDate/Future/Years",
            "text": "<<period>> years from now"
        },
        "$:/language/RelativeDate/Past/Days": {
            "title": "$:/language/RelativeDate/Past/Days",
            "text": "<<period>> days ago"
        },
        "$:/language/RelativeDate/Past/Hours": {
            "title": "$:/language/RelativeDate/Past/Hours",
            "text": "<<period>> hours ago"
        },
        "$:/language/RelativeDate/Past/Minutes": {
            "title": "$:/language/RelativeDate/Past/Minutes",
            "text": "<<period>> minutes ago"
        },
        "$:/language/RelativeDate/Past/Months": {
            "title": "$:/language/RelativeDate/Past/Months",
            "text": "<<period>> months ago"
        },
        "$:/language/RelativeDate/Past/Second": {
            "title": "$:/language/RelativeDate/Past/Second",
            "text": "1 second ago"
        },
        "$:/language/RelativeDate/Past/Seconds": {
            "title": "$:/language/RelativeDate/Past/Seconds",
            "text": "<<period>> seconds ago"
        },
        "$:/language/RelativeDate/Past/Years": {
            "title": "$:/language/RelativeDate/Past/Years",
            "text": "<<period>> years ago"
        },
        "$:/language/Docs/ModuleTypes/allfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/allfilteroperator",
            "text": "A sub-operator for the ''all'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/animation": {
            "title": "$:/language/Docs/ModuleTypes/animation",
            "text": "Animations that may be used with the RevealWidget."
        },
        "$:/language/Docs/ModuleTypes/authenticator": {
            "title": "$:/language/Docs/ModuleTypes/authenticator",
            "text": "Defines how requests are authenticated by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
            "text": "A bitmap editor toolbar operation."
        },
        "$:/language/Docs/ModuleTypes/command": {
            "title": "$:/language/Docs/ModuleTypes/command",
            "text": "Commands that can be executed under Node.js."
        },
        "$:/language/Docs/ModuleTypes/config": {
            "title": "$:/language/Docs/ModuleTypes/config",
            "text": "Data to be inserted into `$tw.config`."
        },
        "$:/language/Docs/ModuleTypes/filteroperator": {
            "title": "$:/language/Docs/ModuleTypes/filteroperator",
            "text": "Individual filter operator methods."
        },
        "$:/language/Docs/ModuleTypes/global": {
            "title": "$:/language/Docs/ModuleTypes/global",
            "text": "Global data to be inserted into `$tw`."
        },
        "$:/language/Docs/ModuleTypes/info": {
            "title": "$:/language/Docs/ModuleTypes/info",
            "text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
        },
        "$:/language/Docs/ModuleTypes/isfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/isfilteroperator",
            "text": "Operands for the ''is'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/library": {
            "title": "$:/language/Docs/ModuleTypes/library",
            "text": "Generic module type for general purpose JavaScript modules."
        },
        "$:/language/Docs/ModuleTypes/macro": {
            "title": "$:/language/Docs/ModuleTypes/macro",
            "text": "JavaScript macro definitions."
        },
        "$:/language/Docs/ModuleTypes/parser": {
            "title": "$:/language/Docs/ModuleTypes/parser",
            "text": "Parsers for different content types."
        },
        "$:/language/Docs/ModuleTypes/route": {
            "title": "$:/language/Docs/ModuleTypes/route",
            "text": "Defines how individual URL patterns are handled by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/saver": {
            "title": "$:/language/Docs/ModuleTypes/saver",
            "text": "Savers handle different methods for saving files from the browser."
        },
        "$:/language/Docs/ModuleTypes/startup": {
            "title": "$:/language/Docs/ModuleTypes/startup",
            "text": "Startup functions."
        },
        "$:/language/Docs/ModuleTypes/storyview": {
            "title": "$:/language/Docs/ModuleTypes/storyview",
            "text": "Story views customise the animation and behaviour of list widgets."
        },
        "$:/language/Docs/ModuleTypes/texteditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/texteditoroperation",
            "text": "A text editor toolbar operation."
        },
        "$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
            "title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
            "text": "Converts different content types into tiddlers."
        },
        "$:/language/Docs/ModuleTypes/tiddlerfield": {
            "title": "$:/language/Docs/ModuleTypes/tiddlerfield",
            "text": "Defines the behaviour of an individual tiddler field."
        },
        "$:/language/Docs/ModuleTypes/tiddlermethod": {
            "title": "$:/language/Docs/ModuleTypes/tiddlermethod",
            "text": "Adds methods to the `$tw.Tiddler` prototype."
        },
        "$:/language/Docs/ModuleTypes/upgrader": {
            "title": "$:/language/Docs/ModuleTypes/upgrader",
            "text": "Applies upgrade processing to tiddlers during an upgrade/import."
        },
        "$:/language/Docs/ModuleTypes/utils": {
            "title": "$:/language/Docs/ModuleTypes/utils",
            "text": "Adds methods to `$tw.utils`."
        },
        "$:/language/Docs/ModuleTypes/utils-node": {
            "title": "$:/language/Docs/ModuleTypes/utils-node",
            "text": "Adds Node.js-specific methods to `$tw.utils`."
        },
        "$:/language/Docs/ModuleTypes/widget": {
            "title": "$:/language/Docs/ModuleTypes/widget",
            "text": "Widgets encapsulate DOM rendering and refreshing."
        },
        "$:/language/Docs/ModuleTypes/wikimethod": {
            "title": "$:/language/Docs/ModuleTypes/wikimethod",
            "text": "Adds methods to `$tw.Wiki`."
        },
        "$:/language/Docs/ModuleTypes/wikirule": {
            "title": "$:/language/Docs/ModuleTypes/wikirule",
            "text": "Individual parser rules for the main WikiText parser."
        },
        "$:/language/Docs/PaletteColours/alert-background": {
            "title": "$:/language/Docs/PaletteColours/alert-background",
            "text": "Alert background"
        },
        "$:/language/Docs/PaletteColours/alert-border": {
            "title": "$:/language/Docs/PaletteColours/alert-border",
            "text": "Alert border"
        },
        "$:/language/Docs/PaletteColours/alert-highlight": {
            "title": "$:/language/Docs/PaletteColours/alert-highlight",
            "text": "Alert highlight"
        },
        "$:/language/Docs/PaletteColours/alert-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
            "text": "Alert muted foreground"
        },
        "$:/language/Docs/PaletteColours/background": {
            "title": "$:/language/Docs/PaletteColours/background",
            "text": "General background"
        },
        "$:/language/Docs/PaletteColours/blockquote-bar": {
            "title": "$:/language/Docs/PaletteColours/blockquote-bar",
            "text": "Blockquote bar"
        },
        "$:/language/Docs/PaletteColours/button-background": {
            "title": "$:/language/Docs/PaletteColours/button-background",
            "text": "Default button background"
        },
        "$:/language/Docs/PaletteColours/button-border": {
            "title": "$:/language/Docs/PaletteColours/button-border",
            "text": "Default button border"
        },
        "$:/language/Docs/PaletteColours/button-foreground": {
            "title": "$:/language/Docs/PaletteColours/button-foreground",
            "text": "Default button foreground"
        },
        "$:/language/Docs/PaletteColours/dirty-indicator": {
            "title": "$:/language/Docs/PaletteColours/dirty-indicator",
            "text": "Unsaved changes indicator"
        },
        "$:/language/Docs/PaletteColours/code-background": {
            "title": "$:/language/Docs/PaletteColours/code-background",
            "text": "Code background"
        },
        "$:/language/Docs/PaletteColours/code-border": {
            "title": "$:/language/Docs/PaletteColours/code-border",
            "text": "Code border"
        },
        "$:/language/Docs/PaletteColours/code-foreground": {
            "title": "$:/language/Docs/PaletteColours/code-foreground",
            "text": "Code foreground"
        },
        "$:/language/Docs/PaletteColours/download-background": {
            "title": "$:/language/Docs/PaletteColours/download-background",
            "text": "Download button background"
        },
        "$:/language/Docs/PaletteColours/download-foreground": {
            "title": "$:/language/Docs/PaletteColours/download-foreground",
            "text": "Download button foreground"
        },
        "$:/language/Docs/PaletteColours/dragger-background": {
            "title": "$:/language/Docs/PaletteColours/dragger-background",
            "text": "Dragger background"
        },
        "$:/language/Docs/PaletteColours/dragger-foreground": {
            "title": "$:/language/Docs/PaletteColours/dragger-foreground",
            "text": "Dragger foreground"
        },
        "$:/language/Docs/PaletteColours/dropdown-background": {
            "title": "$:/language/Docs/PaletteColours/dropdown-background",
            "text": "Dropdown background"
        },
        "$:/language/Docs/PaletteColours/dropdown-border": {
            "title": "$:/language/Docs/PaletteColours/dropdown-border",
            "text": "Dropdown border"
        },
        "$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
            "text": "Dropdown tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/dropdown-tab-background": {
            "title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
            "text": "Dropdown tab background"
        },
        "$:/language/Docs/PaletteColours/dropzone-background": {
            "title": "$:/language/Docs/PaletteColours/dropzone-background",
            "text": "Dropzone background"
        },
        "$:/language/Docs/PaletteColours/external-link-background-hover": {
            "title": "$:/language/Docs/PaletteColours/external-link-background-hover",
            "text": "External link background hover"
        },
        "$:/language/Docs/PaletteColours/external-link-background-visited": {
            "title": "$:/language/Docs/PaletteColours/external-link-background-visited",
            "text": "External link background visited"
        },
        "$:/language/Docs/PaletteColours/external-link-background": {
            "title": "$:/language/Docs/PaletteColours/external-link-background",
            "text": "External link background"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
            "text": "External link foreground hover"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground-visited": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
            "text": "External link foreground visited"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground",
            "text": "External link foreground"
        },
        "$:/language/Docs/PaletteColours/foreground": {
            "title": "$:/language/Docs/PaletteColours/foreground",
            "text": "General foreground"
        },
        "$:/language/Docs/PaletteColours/menubar-background": {
            "title": "$:/language/Docs/PaletteColours/menubar-background",
            "text": "Menu bar background"
        },
        "$:/language/Docs/PaletteColours/menubar-foreground": {
            "title": "$:/language/Docs/PaletteColours/menubar-foreground",
            "text": "Menu bar foreground"
        },
        "$:/language/Docs/PaletteColours/message-background": {
            "title": "$:/language/Docs/PaletteColours/message-background",
            "text": "Message box background"
        },
        "$:/language/Docs/PaletteColours/message-border": {
            "title": "$:/language/Docs/PaletteColours/message-border",
            "text": "Message box border"
        },
        "$:/language/Docs/PaletteColours/message-foreground": {
            "title": "$:/language/Docs/PaletteColours/message-foreground",
            "text": "Message box foreground"
        },
        "$:/language/Docs/PaletteColours/modal-backdrop": {
            "title": "$:/language/Docs/PaletteColours/modal-backdrop",
            "text": "Modal backdrop"
        },
        "$:/language/Docs/PaletteColours/modal-background": {
            "title": "$:/language/Docs/PaletteColours/modal-background",
            "text": "Modal background"
        },
        "$:/language/Docs/PaletteColours/modal-border": {
            "title": "$:/language/Docs/PaletteColours/modal-border",
            "text": "Modal border"
        },
        "$:/language/Docs/PaletteColours/modal-footer-background": {
            "title": "$:/language/Docs/PaletteColours/modal-footer-background",
            "text": "Modal footer background"
        },
        "$:/language/Docs/PaletteColours/modal-footer-border": {
            "title": "$:/language/Docs/PaletteColours/modal-footer-border",
            "text": "Modal footer border"
        },
        "$:/language/Docs/PaletteColours/modal-header-border": {
            "title": "$:/language/Docs/PaletteColours/modal-header-border",
            "text": "Modal header border"
        },
        "$:/language/Docs/PaletteColours/muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/muted-foreground",
            "text": "General muted foreground"
        },
        "$:/language/Docs/PaletteColours/notification-background": {
            "title": "$:/language/Docs/PaletteColours/notification-background",
            "text": "Notification background"
        },
        "$:/language/Docs/PaletteColours/notification-border": {
            "title": "$:/language/Docs/PaletteColours/notification-border",
            "text": "Notification border"
        },
        "$:/language/Docs/PaletteColours/page-background": {
            "title": "$:/language/Docs/PaletteColours/page-background",
            "text": "Page background"
        },
        "$:/language/Docs/PaletteColours/pre-background": {
            "title": "$:/language/Docs/PaletteColours/pre-background",
            "text": "Preformatted code background"
        },
        "$:/language/Docs/PaletteColours/pre-border": {
            "title": "$:/language/Docs/PaletteColours/pre-border",
            "text": "Preformatted code border"
        },
        "$:/language/Docs/PaletteColours/primary": {
            "title": "$:/language/Docs/PaletteColours/primary",
            "text": "General primary"
        },
        "$:/language/Docs/PaletteColours/select-tag-background": {
            "title": "$:/language/Docs/PaletteColours/select-tag-background",
            "text": "`<select>` element background"
        },
        "$:/language/Docs/PaletteColours/select-tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/select-tag-foreground",
            "text": "`<select>` element text"
        },
        "$:/language/Docs/PaletteColours/sidebar-button-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
            "text": "Sidebar button foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
            "text": "Sidebar controls foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
            "text": "Sidebar controls foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
            "title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
            "text": "Sidebar foreground shadow"
        },
        "$:/language/Docs/PaletteColours/sidebar-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-foreground",
            "text": "Sidebar foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
            "text": "Sidebar muted foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
            "text": "Sidebar muted foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
            "text": "Sidebar tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-background": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
            "text": "Sidebar tab background"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
            "text": "Sidebar tab border for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-border": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
            "text": "Sidebar tab border"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-divider": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
            "text": "Sidebar tab divider"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
            "text": "Sidebar tab foreground for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
            "text": "Sidebar tab foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
            "text": "Sidebar tiddler link foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
            "text": "Sidebar tiddler link foreground"
        },
        "$:/language/Docs/PaletteColours/site-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/site-title-foreground",
            "text": "Site title foreground"
        },
        "$:/language/Docs/PaletteColours/static-alert-foreground": {
            "title": "$:/language/Docs/PaletteColours/static-alert-foreground",
            "text": "Static alert foreground"
        },
        "$:/language/Docs/PaletteColours/tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-background-selected",
            "text": "Tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-background": {
            "title": "$:/language/Docs/PaletteColours/tab-background",
            "text": "Tab background"
        },
        "$:/language/Docs/PaletteColours/tab-border-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-border-selected",
            "text": "Tab border for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-border": {
            "title": "$:/language/Docs/PaletteColours/tab-border",
            "text": "Tab border"
        },
        "$:/language/Docs/PaletteColours/tab-divider": {
            "title": "$:/language/Docs/PaletteColours/tab-divider",
            "text": "Tab divider"
        },
        "$:/language/Docs/PaletteColours/tab-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
            "text": "Tab foreground for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-foreground": {
            "title": "$:/language/Docs/PaletteColours/tab-foreground",
            "text": "Tab foreground"
        },
        "$:/language/Docs/PaletteColours/table-border": {
            "title": "$:/language/Docs/PaletteColours/table-border",
            "text": "Table border"
        },
        "$:/language/Docs/PaletteColours/table-footer-background": {
            "title": "$:/language/Docs/PaletteColours/table-footer-background",
            "text": "Table footer background"
        },
        "$:/language/Docs/PaletteColours/table-header-background": {
            "title": "$:/language/Docs/PaletteColours/table-header-background",
            "text": "Table header background"
        },
        "$:/language/Docs/PaletteColours/tag-background": {
            "title": "$:/language/Docs/PaletteColours/tag-background",
            "text": "Tag background"
        },
        "$:/language/Docs/PaletteColours/tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/tag-foreground",
            "text": "Tag foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-background",
            "text": "Tiddler background"
        },
        "$:/language/Docs/PaletteColours/tiddler-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-border",
            "text": "Tiddler border"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
            "text": "Tiddler controls foreground hover"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
            "text": "Tiddler controls foreground for selected controls"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
            "text": "Tiddler controls foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
            "text": "Tiddler editor background"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
            "text": "Tiddler editor border image"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
            "text": "Tiddler editor border"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
            "text": "Tiddler editor background for even fields"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
            "text": "Tiddler editor background for odd fields"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-background",
            "text": "Tiddler info panel background"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-border",
            "text": "Tiddler info panel border"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
            "text": "Tiddler info panel tab background"
        },
        "$:/language/Docs/PaletteColours/tiddler-link-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-link-background",
            "text": "Tiddler link background"
        },
        "$:/language/Docs/PaletteColours/tiddler-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
            "text": "Tiddler link foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
            "text": "Tiddler subtitle foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
            "text": "Tiddler title foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-new-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-new-button",
            "text": "Toolbar 'new tiddler' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-options-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-options-button",
            "text": "Toolbar 'options' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-save-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-save-button",
            "text": "Toolbar 'save' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-info-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-info-button",
            "text": "Toolbar 'info' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-edit-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
            "text": "Toolbar 'edit' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-close-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-close-button",
            "text": "Toolbar 'close' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-delete-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
            "text": "Toolbar 'delete' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-cancel-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
            "text": "Toolbar 'cancel' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-done-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-done-button",
            "text": "Toolbar 'done' button foreground"
        },
        "$:/language/Docs/PaletteColours/untagged-background": {
            "title": "$:/language/Docs/PaletteColours/untagged-background",
            "text": "Untagged pill background"
        },
        "$:/language/Docs/PaletteColours/very-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/very-muted-foreground",
            "text": "Very muted foreground"
        },
        "$:/language/EditTemplate/Body/External/Hint": {
            "title": "$:/language/EditTemplate/Body/External/Hint",
            "text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
        },
        "$:/language/EditTemplate/Body/Placeholder": {
            "title": "$:/language/EditTemplate/Body/Placeholder",
            "text": "Type the text for this tiddler"
        },
        "$:/language/EditTemplate/Body/Preview/Type/Output": {
            "title": "$:/language/EditTemplate/Body/Preview/Type/Output",
            "text": "output"
        },
        "$:/language/EditTemplate/Field/Remove/Caption": {
            "title": "$:/language/EditTemplate/Field/Remove/Caption",
            "text": "remove field"
        },
        "$:/language/EditTemplate/Field/Remove/Hint": {
            "title": "$:/language/EditTemplate/Field/Remove/Hint",
            "text": "Remove field"
        },
        "$:/language/EditTemplate/Field/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Caption",
            "text": "field list"
        },
        "$:/language/EditTemplate/Field/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Hint",
            "text": "Show field list"
        },
        "$:/language/EditTemplate/Fields/Add/Button": {
            "title": "$:/language/EditTemplate/Fields/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Fields/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
            "text": "Add the new field to the tiddler"
        },
        "$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
            "title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
            "text": "field name"
        },
        "$:/language/EditTemplate/Fields/Add/Prompt": {
            "title": "$:/language/EditTemplate/Fields/Add/Prompt",
            "text": "Add a new field:"
        },
        "$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
            "title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
            "text": "field value"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/System": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
            "text": "System fields"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/User": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
            "text": "User fields"
        },
        "$:/language/EditTemplate/Shadow/Warning": {
            "title": "$:/language/EditTemplate/Shadow/Warning",
            "text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
        },
        "$:/language/EditTemplate/Shadow/OverriddenWarning": {
            "title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
            "text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
        },
        "$:/language/EditTemplate/Tags/Add/Button": {
            "title": "$:/language/EditTemplate/Tags/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Tags/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
            "text": "add tag"
        },
        "$:/language/EditTemplate/Tags/Add/Placeholder": {
            "title": "$:/language/EditTemplate/Tags/Add/Placeholder",
            "text": "tag name"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Caption": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Caption",
            "text": "clear input"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Hint": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Hint",
            "text": "Clear tag input"
        },
        "$:/language/EditTemplate/Tags/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
            "text": "tag list"
        },
        "$:/language/EditTemplate/Tags/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
            "text": "Show tag list"
        },
        "$:/language/EditTemplate/Title/BadCharacterWarning": {
            "title": "$:/language/EditTemplate/Title/BadCharacterWarning",
            "text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
        },
        "$:/language/EditTemplate/Title/Exists/Prompt": {
            "title": "$:/language/EditTemplate/Title/Exists/Prompt",
            "text": "Target tiddler already exists"
        },
        "$:/language/EditTemplate/Title/Relink/Prompt": {
            "title": "$:/language/EditTemplate/Title/Relink/Prompt",
            "text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
        },
        "$:/language/EditTemplate/Title/References/Prompt": {
            "title": "$:/language/EditTemplate/Title/References/Prompt",
            "text": "The following references to this tiddler will not be automatically updated:"
        },
        "$:/language/EditTemplate/Type/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Type/Dropdown/Caption",
            "text": "content type list"
        },
        "$:/language/EditTemplate/Type/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Type/Dropdown/Hint",
            "text": "Show content type list"
        },
        "$:/language/EditTemplate/Type/Delete/Caption": {
            "title": "$:/language/EditTemplate/Type/Delete/Caption",
            "text": "delete content type"
        },
        "$:/language/EditTemplate/Type/Delete/Hint": {
            "title": "$:/language/EditTemplate/Type/Delete/Hint",
            "text": "Delete content type"
        },
        "$:/language/EditTemplate/Type/Placeholder": {
            "title": "$:/language/EditTemplate/Type/Placeholder",
            "text": "content type"
        },
        "$:/language/EditTemplate/Type/Prompt": {
            "title": "$:/language/EditTemplate/Type/Prompt",
            "text": "Type:"
        },
        "$:/language/Exporters/StaticRiver": {
            "title": "$:/language/Exporters/StaticRiver",
            "text": "Static HTML"
        },
        "$:/language/Exporters/JsonFile": {
            "title": "$:/language/Exporters/JsonFile",
            "text": "JSON file"
        },
        "$:/language/Exporters/CsvFile": {
            "title": "$:/language/Exporters/CsvFile",
            "text": "CSV file"
        },
        "$:/language/Exporters/TidFile": {
            "title": "$:/language/Exporters/TidFile",
            "text": "\".tid\" file"
        },
        "$:/language/Docs/Fields/_canonical_uri": {
            "title": "$:/language/Docs/Fields/_canonical_uri",
            "text": "The full URI of an external image tiddler"
        },
        "$:/language/Docs/Fields/bag": {
            "title": "$:/language/Docs/Fields/bag",
            "text": "The name of the bag from which a tiddler came"
        },
        "$:/language/Docs/Fields/caption": {
            "title": "$:/language/Docs/Fields/caption",
            "text": "The text to be displayed on a tab or button"
        },
        "$:/language/Docs/Fields/color": {
            "title": "$:/language/Docs/Fields/color",
            "text": "The CSS color value associated with a tiddler"
        },
        "$:/language/Docs/Fields/component": {
            "title": "$:/language/Docs/Fields/component",
            "text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
        },
        "$:/language/Docs/Fields/current-tiddler": {
            "title": "$:/language/Docs/Fields/current-tiddler",
            "text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
        },
        "$:/language/Docs/Fields/created": {
            "title": "$:/language/Docs/Fields/created",
            "text": "The date a tiddler was created"
        },
        "$:/language/Docs/Fields/creator": {
            "title": "$:/language/Docs/Fields/creator",
            "text": "The name of the person who created a tiddler"
        },
        "$:/language/Docs/Fields/dependents": {
            "title": "$:/language/Docs/Fields/dependents",
            "text": "For a plugin, lists the dependent plugin titles"
        },
        "$:/language/Docs/Fields/description": {
            "title": "$:/language/Docs/Fields/description",
            "text": "The descriptive text for a plugin, or a modal dialogue"
        },
        "$:/language/Docs/Fields/draft.of": {
            "title": "$:/language/Docs/Fields/draft.of",
            "text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
        },
        "$:/language/Docs/Fields/draft.title": {
            "title": "$:/language/Docs/Fields/draft.title",
            "text": "For draft tiddlers, contains the proposed new title of the tiddler"
        },
        "$:/language/Docs/Fields/footer": {
            "title": "$:/language/Docs/Fields/footer",
            "text": "The footer text for a wizard"
        },
        "$:/language/Docs/Fields/hide-body": {
            "title": "$:/language/Docs/Fields/hide-body",
            "text": "The view template will hide bodies of tiddlers if set to: ''yes''"
        },
        "$:/language/Docs/Fields/icon": {
            "title": "$:/language/Docs/Fields/icon",
            "text": "The title of the tiddler containing the icon associated with a tiddler"
        },
        "$:/language/Docs/Fields/library": {
            "title": "$:/language/Docs/Fields/library",
            "text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
        },
        "$:/language/Docs/Fields/list": {
            "title": "$:/language/Docs/Fields/list",
            "text": "An ordered list of tiddler titles associated with a tiddler"
        },
        "$:/language/Docs/Fields/list-before": {
            "title": "$:/language/Docs/Fields/list-before",
            "text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
        },
        "$:/language/Docs/Fields/list-after": {
            "title": "$:/language/Docs/Fields/list-after",
            "text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
        },
        "$:/language/Docs/Fields/modified": {
            "title": "$:/language/Docs/Fields/modified",
            "text": "The date and time at which a tiddler was last modified"
        },
        "$:/language/Docs/Fields/modifier": {
            "title": "$:/language/Docs/Fields/modifier",
            "text": "The tiddler title associated with the person who last modified a tiddler"
        },
        "$:/language/Docs/Fields/name": {
            "title": "$:/language/Docs/Fields/name",
            "text": "The human readable name associated with a plugin tiddler"
        },
        "$:/language/Docs/Fields/plugin-priority": {
            "title": "$:/language/Docs/Fields/plugin-priority",
            "text": "A numerical value indicating the priority of a plugin tiddler"
        },
        "$:/language/Docs/Fields/plugin-type": {
            "title": "$:/language/Docs/Fields/plugin-type",
            "text": "The type of plugin in a plugin tiddler"
        },
        "$:/language/Docs/Fields/revision": {
            "title": "$:/language/Docs/Fields/revision",
            "text": "The revision of the tiddler held at the server"
        },
        "$:/language/Docs/Fields/released": {
            "title": "$:/language/Docs/Fields/released",
            "text": "Date of a TiddlyWiki release"
        },
        "$:/language/Docs/Fields/source": {
            "title": "$:/language/Docs/Fields/source",
            "text": "The source URL associated with a tiddler"
        },
        "$:/language/Docs/Fields/subtitle": {
            "title": "$:/language/Docs/Fields/subtitle",
            "text": "The subtitle text for a wizard"
        },
        "$:/language/Docs/Fields/tags": {
            "title": "$:/language/Docs/Fields/tags",
            "text": "A list of tags associated with a tiddler"
        },
        "$:/language/Docs/Fields/text": {
            "title": "$:/language/Docs/Fields/text",
            "text": "The body text of a tiddler"
        },
        "$:/language/Docs/Fields/throttle.refresh": {
            "title": "$:/language/Docs/Fields/throttle.refresh",
            "text": "If present, throttles refreshes of this tiddler"
        },
        "$:/language/Docs/Fields/title": {
            "title": "$:/language/Docs/Fields/title",
            "text": "The unique name of a tiddler"
        },
        "$:/language/Docs/Fields/toc-link": {
            "title": "$:/language/Docs/Fields/toc-link",
            "text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
        },
        "$:/language/Docs/Fields/type": {
            "title": "$:/language/Docs/Fields/type",
            "text": "The content type of a tiddler"
        },
        "$:/language/Docs/Fields/version": {
            "title": "$:/language/Docs/Fields/version",
            "text": "Version information for a plugin"
        },
        "$:/language/Docs/Fields/_is_skinny": {
            "title": "$:/language/Docs/Fields/_is_skinny",
            "text": "If present, indicates that the tiddler text field must be loaded from the server"
        },
        "$:/language/Filters/AllTiddlers": {
            "title": "$:/language/Filters/AllTiddlers",
            "text": "All tiddlers except system tiddlers"
        },
        "$:/language/Filters/RecentSystemTiddlers": {
            "title": "$:/language/Filters/RecentSystemTiddlers",
            "text": "Recently modified tiddlers, including system tiddlers"
        },
        "$:/language/Filters/RecentTiddlers": {
            "title": "$:/language/Filters/RecentTiddlers",
            "text": "Recently modified tiddlers"
        },
        "$:/language/Filters/AllTags": {
            "title": "$:/language/Filters/AllTags",
            "text": "All tags except system tags"
        },
        "$:/language/Filters/Missing": {
            "title": "$:/language/Filters/Missing",
            "text": "Missing tiddlers"
        },
        "$:/language/Filters/Drafts": {
            "title": "$:/language/Filters/Drafts",
            "text": "Draft tiddlers"
        },
        "$:/language/Filters/Orphans": {
            "title": "$:/language/Filters/Orphans",
            "text": "Orphan tiddlers"
        },
        "$:/language/Filters/SystemTiddlers": {
            "title": "$:/language/Filters/SystemTiddlers",
            "text": "System tiddlers"
        },
        "$:/language/Filters/ShadowTiddlers": {
            "title": "$:/language/Filters/ShadowTiddlers",
            "text": "Shadow tiddlers"
        },
        "$:/language/Filters/OverriddenShadowTiddlers": {
            "title": "$:/language/Filters/OverriddenShadowTiddlers",
            "text": "Overridden shadow tiddlers"
        },
        "$:/language/Filters/SessionTiddlers": {
            "title": "$:/language/Filters/SessionTiddlers",
            "text": "Tiddlers modified since the wiki was loaded"
        },
        "$:/language/Filters/SystemTags": {
            "title": "$:/language/Filters/SystemTags",
            "text": "System tags"
        },
        "$:/language/Filters/StoryList": {
            "title": "$:/language/Filters/StoryList",
            "text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
        },
        "$:/language/Filters/TypedTiddlers": {
            "title": "$:/language/Filters/TypedTiddlers",
            "text": "Non wiki-text tiddlers"
        },
        "GettingStarted": {
            "title": "GettingStarted",
            "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
        },
        "$:/language/Help/build": {
            "title": "$:/language/Help/build",
            "description": "Automatically run configured commands",
            "text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
        },
        "$:/language/Help/clearpassword": {
            "title": "$:/language/Help/clearpassword",
            "description": "Clear a password for subsequent crypto operations",
            "text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
        },
        "$:/language/Help/default": {
            "title": "$:/language/Help/default",
            "text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
        },
        "$:/language/Help/deletetiddlers": {
            "title": "$:/language/Help/deletetiddlers",
            "description": "Deletes a group of tiddlers",
            "text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
        },
        "$:/language/Help/editions": {
            "title": "$:/language/Help/editions",
            "description": "Lists the available editions of TiddlyWiki",
            "text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
        },
        "$:/language/Help/fetch": {
            "title": "$:/language/Help/fetch",
            "description": "Fetch tiddlers from wiki by URL",
            "text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
        },
        "$:/language/Help/help": {
            "title": "$:/language/Help/help",
            "description": "Display help for TiddlyWiki commands",
            "text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
        },
        "$:/language/Help/import": {
            "title": "$:/language/Help/import",
            "description": "Import tiddlers from a file",
            "text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
        },
        "$:/language/Help/init": {
            "title": "$:/language/Help/init",
            "description": "Initialise a new wiki folder",
            "text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
        },
        "$:/language/Help/listen": {
            "title": "$:/language/Help/listen",
            "description": "Provides an HTTP server interface to TiddlyWiki",
            "text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
        },
        "$:/language/Help/load": {
            "title": "$:/language/Help/load",
            "description": "Load tiddlers from a file",
            "text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
        },
        "$:/language/Help/makelibrary": {
            "title": "$:/language/Help/makelibrary",
            "description": "Construct library plugin required by upgrade process",
            "text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
        },
        "$:/language/Help/notfound": {
            "title": "$:/language/Help/notfound",
            "text": "No such help item"
        },
        "$:/language/Help/output": {
            "title": "$:/language/Help/output",
            "description": "Set the base output directory for subsequent commands",
            "text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
        },
        "$:/language/Help/password": {
            "title": "$:/language/Help/password",
            "description": "Set a password for subsequent crypto operations",
            "text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
        },
        "$:/language/Help/render": {
            "title": "$:/language/Help/render",
            "description": "Renders individual tiddlers to files",
            "text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
        },
        "$:/language/Help/rendertiddler": {
            "title": "$:/language/Help/rendertiddler",
            "description": "Render an individual tiddler as a specified ContentType",
            "text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
        },
        "$:/language/Help/rendertiddlers": {
            "title": "$:/language/Help/rendertiddlers",
            "description": "Render tiddlers matching a filter to a specified ContentType",
            "text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
        },
        "$:/language/Help/save": {
            "title": "$:/language/Help/save",
            "description": "Saves individual raw tiddlers to files",
            "text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
        },
        "$:/language/Help/savetiddler": {
            "title": "$:/language/Help/savetiddler",
            "description": "Saves a raw tiddler to a file",
            "text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
        },
        "$:/language/Help/savetiddlers": {
            "title": "$:/language/Help/savetiddlers",
            "description": "Saves a group of raw tiddlers to a directory",
            "text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
        },
        "$:/language/Help/savewikifolder": {
            "title": "$:/language/Help/savewikifolder",
            "description": "Saves a wiki to a new wiki folder",
            "text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
        },
        "$:/language/Help/server": {
            "title": "$:/language/Help/server",
            "description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
            "text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
        },
        "$:/language/Help/setfield": {
            "title": "$:/language/Help/setfield",
            "description": "Prepares external tiddlers for use",
            "text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
        },
        "$:/language/Help/unpackplugin": {
            "title": "$:/language/Help/unpackplugin",
            "description": "Unpack the payload tiddlers from a plugin",
            "text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
        },
        "$:/language/Help/verbose": {
            "title": "$:/language/Help/verbose",
            "description": "Triggers verbose output mode",
            "text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
        },
        "$:/language/Help/version": {
            "title": "$:/language/Help/version",
            "description": "Displays the version number of TiddlyWiki",
            "text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
        },
        "$:/language/Import/Imported/Hint": {
            "title": "$:/language/Import/Imported/Hint",
            "text": "The following tiddlers were imported:"
        },
        "$:/language/Import/Listing/Cancel/Caption": {
            "title": "$:/language/Import/Listing/Cancel/Caption",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Hint": {
            "title": "$:/language/Import/Listing/Hint",
            "text": "These tiddlers are ready to import:"
        },
        "$:/language/Import/Listing/Import/Caption": {
            "title": "$:/language/Import/Listing/Import/Caption",
            "text": "Import"
        },
        "$:/language/Import/Listing/Select/Caption": {
            "title": "$:/language/Import/Listing/Select/Caption",
            "text": "Select"
        },
        "$:/language/Import/Listing/Status/Caption": {
            "title": "$:/language/Import/Listing/Status/Caption",
            "text": "Status"
        },
        "$:/language/Import/Listing/Title/Caption": {
            "title": "$:/language/Import/Listing/Title/Caption",
            "text": "Title"
        },
        "$:/language/Import/Listing/Preview": {
            "title": "$:/language/Import/Listing/Preview",
            "text": "Preview:"
        },
        "$:/language/Import/Listing/Preview/Text": {
            "title": "$:/language/Import/Listing/Preview/Text",
            "text": "Text"
        },
        "$:/language/Import/Listing/Preview/TextRaw": {
            "title": "$:/language/Import/Listing/Preview/TextRaw",
            "text": "Text (Raw)"
        },
        "$:/language/Import/Listing/Preview/Fields": {
            "title": "$:/language/Import/Listing/Preview/Fields",
            "text": "Fields"
        },
        "$:/language/Import/Listing/Preview/Diff": {
            "title": "$:/language/Import/Listing/Preview/Diff",
            "text": "Diff"
        },
        "$:/language/Import/Listing/Preview/DiffFields": {
            "title": "$:/language/Import/Listing/Preview/DiffFields",
            "text": "Diff (Fields)"
        },
        "$:/language/Import/Listing/Rename/Tooltip": {
            "title": "$:/language/Import/Listing/Rename/Tooltip",
            "text": "Rename tiddler before importing"
        },
        "$:/language/Import/Listing/Rename/Prompt": {
            "title": "$:/language/Import/Listing/Rename/Prompt",
            "text": "Rename to:"
        },
        "$:/language/Import/Listing/Rename/ConfirmRename": {
            "title": "$:/language/Import/Listing/Rename/ConfirmRename",
            "text": "Rename tiddler"
        },
        "$:/language/Import/Listing/Rename/CancelRename": {
            "title": "$:/language/Import/Listing/Rename/CancelRename",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Rename/OverwriteWarning": {
            "title": "$:/language/Import/Listing/Rename/OverwriteWarning",
            "text": "A tiddler with this title already exists."
        },
        "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
            "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
            "text": "Blocked incompatible or obsolete plugin."
        },
        "$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
            "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
            "text": "Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>)."
        },
        "$:/language/Import/Upgrader/Plugins/Upgraded": {
            "title": "$:/language/Import/Upgrader/Plugins/Upgraded",
            "text": "Upgraded plugin from <<incoming>> to <<upgraded>>."
        },
        "$:/language/Import/Upgrader/State/Suppressed": {
            "title": "$:/language/Import/Upgrader/State/Suppressed",
            "text": "Blocked temporary state tiddler."
        },
        "$:/language/Import/Upgrader/System/Suppressed": {
            "title": "$:/language/Import/Upgrader/System/Suppressed",
            "text": "Blocked system tiddler."
        },
        "$:/language/Import/Upgrader/System/Warning": {
            "title": "$:/language/Import/Upgrader/System/Warning",
            "text": "Core module tiddler."
        },
        "$:/language/Import/Upgrader/System/Alert": {
            "title": "$:/language/Import/Upgrader/System/Alert",
            "text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable."
        },
        "$:/language/Import/Upgrader/ThemeTweaks/Created": {
            "title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
            "text": "Migrated theme tweak from <$text text=<<from>>/>."
        },
        "$:/language/AboveStory/ClassicPlugin/Warning": {
            "title": "$:/language/AboveStory/ClassicPlugin/Warning",
            "text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
        },
        "$:/language/BinaryWarning/Prompt": {
            "title": "$:/language/BinaryWarning/Prompt",
            "text": "This tiddler contains binary data"
        },
        "$:/language/ClassicWarning/Hint": {
            "title": "$:/language/ClassicWarning/Hint",
            "text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
        },
        "$:/language/ClassicWarning/Upgrade/Caption": {
            "title": "$:/language/ClassicWarning/Upgrade/Caption",
            "text": "upgrade"
        },
        "$:/language/CloseAll/Button": {
            "title": "$:/language/CloseAll/Button",
            "text": "close all"
        },
        "$:/language/ColourPicker/Recent": {
            "title": "$:/language/ColourPicker/Recent",
            "text": "Recent:"
        },
        "$:/language/ConfirmCancelTiddler": {
            "title": "$:/language/ConfirmCancelTiddler",
            "text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmDeleteTiddler": {
            "title": "$:/language/ConfirmDeleteTiddler",
            "text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmOverwriteTiddler": {
            "title": "$:/language/ConfirmOverwriteTiddler",
            "text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmEditShadowTiddler": {
            "title": "$:/language/ConfirmEditShadowTiddler",
            "text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmAction": {
            "title": "$:/language/ConfirmAction",
            "text": "Do you wish to proceed?"
        },
        "$:/language/Count": {
            "title": "$:/language/Count",
            "text": "count"
        },
        "$:/language/DefaultNewTiddlerTitle": {
            "title": "$:/language/DefaultNewTiddlerTitle",
            "text": "New Tiddler"
        },
        "$:/language/Diffs/CountMessage": {
            "title": "$:/language/Diffs/CountMessage",
            "text": "<<diff-count>> differences"
        },
        "$:/language/DropMessage": {
            "title": "$:/language/DropMessage",
            "text": "Drop here (or use the 'Escape' key to cancel)"
        },
        "$:/language/Encryption/Cancel": {
            "title": "$:/language/Encryption/Cancel",
            "text": "Cancel"
        },
        "$:/language/Encryption/ConfirmClearPassword": {
            "title": "$:/language/Encryption/ConfirmClearPassword",
            "text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
        },
        "$:/language/Encryption/PromptSetPassword": {
            "title": "$:/language/Encryption/PromptSetPassword",
            "text": "Set a new password for this TiddlyWiki"
        },
        "$:/language/Encryption/Username": {
            "title": "$:/language/Encryption/Username",
            "text": "Username"
        },
        "$:/language/Encryption/Password": {
            "title": "$:/language/Encryption/Password",
            "text": "Password"
        },
        "$:/language/Encryption/RepeatPassword": {
            "title": "$:/language/Encryption/RepeatPassword",
            "text": "Repeat password"
        },
        "$:/language/Encryption/PasswordNoMatch": {
            "title": "$:/language/Encryption/PasswordNoMatch",
            "text": "Passwords do not match"
        },
        "$:/language/Encryption/SetPassword": {
            "title": "$:/language/Encryption/SetPassword",
            "text": "Set password"
        },
        "$:/language/Error/Caption": {
            "title": "$:/language/Error/Caption",
            "text": "Error"
        },
        "$:/language/Error/EditConflict": {
            "title": "$:/language/Error/EditConflict",
            "text": "File changed on server"
        },
        "$:/language/Error/Filter": {
            "title": "$:/language/Error/Filter",
            "text": "Filter error"
        },
        "$:/language/Error/FilterSyntax": {
            "title": "$:/language/Error/FilterSyntax",
            "text": "Syntax error in filter expression"
        },
        "$:/language/Error/FilterRunPrefix": {
            "title": "$:/language/Error/FilterRunPrefix",
            "text": "Filter Error: Unknown prefix for filter run"
        },
        "$:/language/Error/IsFilterOperator": {
            "title": "$:/language/Error/IsFilterOperator",
            "text": "Filter Error: Unknown operand for the 'is' filter operator"
        },
        "$:/language/Error/FormatFilterOperator": {
            "title": "$:/language/Error/FormatFilterOperator",
            "text": "Filter Error: Unknown suffix for the 'format' filter operator"
        },
        "$:/language/Error/LoadingPluginLibrary": {
            "title": "$:/language/Error/LoadingPluginLibrary",
            "text": "Error loading plugin library"
        },
        "$:/language/Error/NetworkErrorAlert": {
            "title": "$:/language/Error/NetworkErrorAlert",
            "text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
        },
        "$:/language/Error/RecursiveTransclusion": {
            "title": "$:/language/Error/RecursiveTransclusion",
            "text": "Recursive transclusion error in transclude widget"
        },
        "$:/language/Error/RetrievingSkinny": {
            "title": "$:/language/Error/RetrievingSkinny",
            "text": "Error retrieving skinny tiddler list"
        },
        "$:/language/Error/SavingToTWEdit": {
            "title": "$:/language/Error/SavingToTWEdit",
            "text": "Error saving to TWEdit"
        },
        "$:/language/Error/WhileSaving": {
            "title": "$:/language/Error/WhileSaving",
            "text": "Error while saving"
        },
        "$:/language/Error/XMLHttpRequest": {
            "title": "$:/language/Error/XMLHttpRequest",
            "text": "XMLHttpRequest error code"
        },
        "$:/language/InternalJavaScriptError/Title": {
            "title": "$:/language/InternalJavaScriptError/Title",
            "text": "Internal JavaScript Error"
        },
        "$:/language/InternalJavaScriptError/Hint": {
            "title": "$:/language/InternalJavaScriptError/Hint",
            "text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
        },
        "$:/language/InvalidFieldName": {
            "title": "$:/language/InvalidFieldName",
            "text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
        },
        "$:/language/LayoutSwitcher/Description": {
            "title": "$:/language/LayoutSwitcher/Description",
            "text": "Open the layout switcher"
        },
        "$:/language/LazyLoadingWarning": {
            "title": "$:/language/LazyLoadingWarning",
            "text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
        },
        "$:/language/LoginToTiddlySpace": {
            "title": "$:/language/LoginToTiddlySpace",
            "text": "Login to TiddlySpace"
        },
        "$:/language/Manager/Controls/FilterByTag/None": {
            "title": "$:/language/Manager/Controls/FilterByTag/None",
            "text": "(none)"
        },
        "$:/language/Manager/Controls/FilterByTag/Prompt": {
            "title": "$:/language/Manager/Controls/FilterByTag/Prompt",
            "text": "Filter by tag:"
        },
        "$:/language/Manager/Controls/Order/Prompt": {
            "title": "$:/language/Manager/Controls/Order/Prompt",
            "text": "Reverse order"
        },
        "$:/language/Manager/Controls/Search/Placeholder": {
            "title": "$:/language/Manager/Controls/Search/Placeholder",
            "text": "Search"
        },
        "$:/language/Manager/Controls/Search/Prompt": {
            "title": "$:/language/Manager/Controls/Search/Prompt",
            "text": "Search:"
        },
        "$:/language/Manager/Controls/Show/Option/Tags": {
            "title": "$:/language/Manager/Controls/Show/Option/Tags",
            "text": "tags"
        },
        "$:/language/Manager/Controls/Show/Option/Tiddlers": {
            "title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
            "text": "tiddlers"
        },
        "$:/language/Manager/Controls/Show/Prompt": {
            "title": "$:/language/Manager/Controls/Show/Prompt",
            "text": "Show:"
        },
        "$:/language/Manager/Controls/Sort/Prompt": {
            "title": "$:/language/Manager/Controls/Sort/Prompt",
            "text": "Sort by:"
        },
        "$:/language/Manager/Item/Colour": {
            "title": "$:/language/Manager/Item/Colour",
            "text": "Colour"
        },
        "$:/language/Manager/Item/Fields": {
            "title": "$:/language/Manager/Item/Fields",
            "text": "Fields"
        },
        "$:/language/Manager/Item/Icon/None": {
            "title": "$:/language/Manager/Item/Icon/None",
            "text": "(none)"
        },
        "$:/language/Manager/Item/Icon": {
            "title": "$:/language/Manager/Item/Icon",
            "text": "Icon"
        },
        "$:/language/Manager/Item/RawText": {
            "title": "$:/language/Manager/Item/RawText",
            "text": "Raw text"
        },
        "$:/language/Manager/Item/Tags": {
            "title": "$:/language/Manager/Item/Tags",
            "text": "Tags"
        },
        "$:/language/Manager/Item/Tools": {
            "title": "$:/language/Manager/Item/Tools",
            "text": "Tools"
        },
        "$:/language/Manager/Item/WikifiedText": {
            "title": "$:/language/Manager/Item/WikifiedText",
            "text": "Wikified text"
        },
        "$:/language/MissingTiddler/Hint": {
            "title": "$:/language/MissingTiddler/Hint",
            "text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
        },
        "$:/language/No": {
            "title": "$:/language/No",
            "text": "No"
        },
        "$:/language/OfficialPluginLibrary": {
            "title": "$:/language/OfficialPluginLibrary",
            "text": "Official ~TiddlyWiki Plugin Library"
        },
        "$:/language/OfficialPluginLibrary/Hint": {
            "title": "$:/language/OfficialPluginLibrary/Hint",
            "text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
        },
        "$:/language/PageTemplate/Description": {
            "title": "$:/language/PageTemplate/Description",
            "text": "the default ~TiddlyWiki layout"
        },
        "$:/language/PageTemplate/Name": {
            "title": "$:/language/PageTemplate/Name",
            "text": "Default ~PageTemplate"
        },
        "$:/language/PluginReloadWarning": {
            "title": "$:/language/PluginReloadWarning",
            "text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
        },
        "$:/language/RecentChanges/DateFormat": {
            "title": "$:/language/RecentChanges/DateFormat",
            "text": "DDth MMM YYYY"
        },
        "$:/language/Shortcuts/Input/AdvancedSearch/Hint": {
            "title": "$:/language/Shortcuts/Input/AdvancedSearch/Hint",
            "text": "Open the ~AdvancedSearch panel from within the sidebar search field"
        },
        "$:/language/Shortcuts/Input/Accept/Hint": {
            "title": "$:/language/Shortcuts/Input/Accept/Hint",
            "text": "Accept the selected item"
        },
        "$:/language/Shortcuts/Input/AcceptVariant/Hint": {
            "title": "$:/language/Shortcuts/Input/AcceptVariant/Hint",
            "text": "Accept the selected item (variant)"
        },
        "$:/language/Shortcuts/Input/Cancel/Hint": {
            "title": "$:/language/Shortcuts/Input/Cancel/Hint",
            "text": "Clear the input field"
        },
        "$:/language/Shortcuts/Input/Down/Hint": {
            "title": "$:/language/Shortcuts/Input/Down/Hint",
            "text": "Select the next item"
        },
        "$:/language/Shortcuts/Input/Tab-Left/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Left/Hint",
            "text": "Select the previous Tab"
        },
        "$:/language/Shortcuts/Input/Tab-Right/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Right/Hint",
            "text": "Select the next Tab"
        },
        "$:/language/Shortcuts/Input/Up/Hint": {
            "title": "$:/language/Shortcuts/Input/Up/Hint",
            "text": "Select the previous item"
        },
        "$:/language/Shortcuts/SidebarLayout/Hint": {
            "title": "$:/language/Shortcuts/SidebarLayout/Hint",
            "text": "Change the sidebar layout"
        },
        "$:/language/Switcher/Subtitle/theme": {
            "title": "$:/language/Switcher/Subtitle/theme",
            "text": "Switch Theme"
        },
        "$:/language/Switcher/Subtitle/layout": {
            "title": "$:/language/Switcher/Subtitle/layout",
            "text": "Switch Layout"
        },
        "$:/language/Switcher/Subtitle/language": {
            "title": "$:/language/Switcher/Subtitle/language",
            "text": "Switch Language"
        },
        "$:/language/Switcher/Subtitle/palette": {
            "title": "$:/language/Switcher/Subtitle/palette",
            "text": "Switch Palette"
        },
        "$:/language/SystemTiddler/Tooltip": {
            "title": "$:/language/SystemTiddler/Tooltip",
            "text": "This is a system tiddler"
        },
        "$:/language/SystemTiddlers/Include/Prompt": {
            "title": "$:/language/SystemTiddlers/Include/Prompt",
            "text": "Include system tiddlers"
        },
        "$:/language/TagManager/Colour/Heading": {
            "title": "$:/language/TagManager/Colour/Heading",
            "text": "Colour"
        },
        "$:/language/TagManager/Count/Heading": {
            "title": "$:/language/TagManager/Count/Heading",
            "text": "Count"
        },
        "$:/language/TagManager/Icon/Heading": {
            "title": "$:/language/TagManager/Icon/Heading",
            "text": "Icon"
        },
        "$:/language/TagManager/Icons/None": {
            "title": "$:/language/TagManager/Icons/None",
            "text": "None"
        },
        "$:/language/TagManager/Info/Heading": {
            "title": "$:/language/TagManager/Info/Heading",
            "text": "Info"
        },
        "$:/language/TagManager/Tag/Heading": {
            "title": "$:/language/TagManager/Tag/Heading",
            "text": "Tag"
        },
        "$:/language/Tiddler/DateFormat": {
            "title": "$:/language/Tiddler/DateFormat",
            "text": "DDth MMM YYYY at hh12:0mmam"
        },
        "$:/language/UnsavedChangesWarning": {
            "title": "$:/language/UnsavedChangesWarning",
            "text": "You have unsaved changes in TiddlyWiki"
        },
        "$:/language/Yes": {
            "title": "$:/language/Yes",
            "text": "Yes"
        },
        "$:/language/Modals/Download": {
            "title": "$:/language/Modals/Download",
            "subtitle": "Download changes",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://tiddlywiki.com/static/DownloadingChanges.html",
            "text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
        },
        "$:/language/Modals/SaveInstructions": {
            "title": "$:/language/Modals/SaveInstructions",
            "subtitle": "Save your work",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://tiddlywiki.com/static/SavingChanges.html",
            "text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
        },
        "$:/config/NewJournal/Title": {
            "title": "$:/config/NewJournal/Title",
            "text": "DDth MMM YYYY"
        },
        "$:/config/NewJournal/Text": {
            "title": "$:/config/NewJournal/Text",
            "text": ""
        },
        "$:/config/NewJournal/Tags": {
            "title": "$:/config/NewJournal/Tags",
            "text": "Journal\n"
        },
        "$:/language/Notifications/Save/Done": {
            "title": "$:/language/Notifications/Save/Done",
            "text": "Saved wiki"
        },
        "$:/language/Notifications/Save/Starting": {
            "title": "$:/language/Notifications/Save/Starting",
            "text": "Starting to save wiki"
        },
        "$:/language/Notifications/CopiedToClipboard/Succeeded": {
            "title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
            "text": "Copied to clipboard!"
        },
        "$:/language/Notifications/CopiedToClipboard/Failed": {
            "title": "$:/language/Notifications/CopiedToClipboard/Failed",
            "text": "Failed to copy to clipboard!"
        },
        "$:/language/Search/DefaultResults/Caption": {
            "title": "$:/language/Search/DefaultResults/Caption",
            "text": "List"
        },
        "$:/language/Search/Filter/Caption": {
            "title": "$:/language/Search/Filter/Caption",
            "text": "Filter"
        },
        "$:/language/Search/Filter/Hint": {
            "title": "$:/language/Search/Filter/Hint",
            "text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
        },
        "$:/language/Search/Filter/Matches": {
            "title": "$:/language/Search/Filter/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Matches": {
            "title": "$:/language/Search/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Matches/All": {
            "title": "$:/language/Search/Matches/All",
            "text": "All matches:"
        },
        "$:/language/Search/Matches/Title": {
            "title": "$:/language/Search/Matches/Title",
            "text": "Title matches:"
        },
        "$:/language/Search/Search": {
            "title": "$:/language/Search/Search",
            "text": "Search"
        },
        "$:/language/Search/Search/TooShort": {
            "title": "$:/language/Search/Search/TooShort",
            "text": "Search text too short"
        },
        "$:/language/Search/Shadows/Caption": {
            "title": "$:/language/Search/Shadows/Caption",
            "text": "Shadows"
        },
        "$:/language/Search/Shadows/Hint": {
            "title": "$:/language/Search/Shadows/Hint",
            "text": "Search for shadow tiddlers"
        },
        "$:/language/Search/Shadows/Matches": {
            "title": "$:/language/Search/Shadows/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Standard/Caption": {
            "title": "$:/language/Search/Standard/Caption",
            "text": "Standard"
        },
        "$:/language/Search/Standard/Hint": {
            "title": "$:/language/Search/Standard/Hint",
            "text": "Search for standard tiddlers"
        },
        "$:/language/Search/Standard/Matches": {
            "title": "$:/language/Search/Standard/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/System/Caption": {
            "title": "$:/language/Search/System/Caption",
            "text": "System"
        },
        "$:/language/Search/System/Hint": {
            "title": "$:/language/Search/System/Hint",
            "text": "Search for system tiddlers"
        },
        "$:/language/Search/System/Matches": {
            "title": "$:/language/Search/System/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/SideBar/All/Caption": {
            "title": "$:/language/SideBar/All/Caption",
            "text": "All"
        },
        "$:/language/SideBar/Contents/Caption": {
            "title": "$:/language/SideBar/Contents/Caption",
            "text": "Contents"
        },
        "$:/language/SideBar/Drafts/Caption": {
            "title": "$:/language/SideBar/Drafts/Caption",
            "text": "Drafts"
        },
        "$:/language/SideBar/Explorer/Caption": {
            "title": "$:/language/SideBar/Explorer/Caption",
            "text": "Explorer"
        },
        "$:/language/SideBar/Missing/Caption": {
            "title": "$:/language/SideBar/Missing/Caption",
            "text": "Missing"
        },
        "$:/language/SideBar/More/Caption": {
            "title": "$:/language/SideBar/More/Caption",
            "text": "More"
        },
        "$:/language/SideBar/Open/Caption": {
            "title": "$:/language/SideBar/Open/Caption",
            "text": "Open"
        },
        "$:/language/SideBar/Orphans/Caption": {
            "title": "$:/language/SideBar/Orphans/Caption",
            "text": "Orphans"
        },
        "$:/language/SideBar/Recent/Caption": {
            "title": "$:/language/SideBar/Recent/Caption",
            "text": "Recent"
        },
        "$:/language/SideBar/Shadows/Caption": {
            "title": "$:/language/SideBar/Shadows/Caption",
            "text": "Shadows"
        },
        "$:/language/SideBar/System/Caption": {
            "title": "$:/language/SideBar/System/Caption",
            "text": "System"
        },
        "$:/language/SideBar/Tags/Caption": {
            "title": "$:/language/SideBar/Tags/Caption",
            "text": "Tags"
        },
        "$:/language/SideBar/Tags/Untagged/Caption": {
            "title": "$:/language/SideBar/Tags/Untagged/Caption",
            "text": "untagged"
        },
        "$:/language/SideBar/Tools/Caption": {
            "title": "$:/language/SideBar/Tools/Caption",
            "text": "Tools"
        },
        "$:/language/SideBar/Types/Caption": {
            "title": "$:/language/SideBar/Types/Caption",
            "text": "Types"
        },
        "$:/SiteSubtitle": {
            "title": "$:/SiteSubtitle",
            "text": "a non-linear personal web notebook"
        },
        "$:/SiteTitle": {
            "title": "$:/SiteTitle",
            "text": "My ~TiddlyWiki"
        },
        "$:/language/Snippets/ListByTag": {
            "title": "$:/language/Snippets/ListByTag",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "List of tiddlers by tag",
            "text": "<<list-links \"[tag[task]sort[title]]\">>\n"
        },
        "$:/language/Snippets/MacroDefinition": {
            "title": "$:/language/Snippets/MacroDefinition",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Macro definition",
            "text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
        },
        "$:/language/Snippets/Table4x3": {
            "title": "$:/language/Snippets/Table4x3",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table with 4 columns by 3 rows",
            "text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
        },
        "$:/language/Snippets/TableOfContents": {
            "title": "$:/language/Snippets/TableOfContents",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table of Contents",
            "text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
        },
        "$:/language/ThemeTweaks/ThemeTweaks": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks",
            "text": "Theme Tweaks"
        },
        "$:/language/ThemeTweaks/ThemeTweaks/Hint": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
            "text": "You can tweak certain aspects of the ''Vanilla'' theme."
        },
        "$:/language/ThemeTweaks/Options": {
            "title": "$:/language/ThemeTweaks/Options",
            "text": "Options"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout",
            "text": "Sidebar layout"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
            "text": "Fixed story, fluid sidebar"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
            "text": "Fluid story, fixed sidebar"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles",
            "text": "Sticky titles"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
            "text": "Causes tiddler titles to \"stick\" to the top of the browser window"
        },
        "$:/language/ThemeTweaks/Options/CodeWrapping": {
            "title": "$:/language/ThemeTweaks/Options/CodeWrapping",
            "text": "Wrap long lines in code blocks"
        },
        "$:/language/ThemeTweaks/Settings": {
            "title": "$:/language/ThemeTweaks/Settings",
            "text": "Settings"
        },
        "$:/language/ThemeTweaks/Settings/FontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/FontFamily",
            "text": "Font family"
        },
        "$:/language/ThemeTweaks/Settings/CodeFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
            "text": "Code font family"
        },
        "$:/language/ThemeTweaks/Settings/EditorFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
            "text": "Editor font family"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImage": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
            "text": "Page background image"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
            "text": "Page background image attachment"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
            "text": "Scroll with tiddlers"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
            "text": "Fixed to window"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
            "text": "Page background image size"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
            "text": "Auto"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
            "text": "Cover"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
            "text": "Contain"
        },
        "$:/language/ThemeTweaks/Metrics": {
            "title": "$:/language/ThemeTweaks/Metrics",
            "text": "Sizes"
        },
        "$:/language/ThemeTweaks/Metrics/FontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/FontSize",
            "text": "Font size"
        },
        "$:/language/ThemeTweaks/Metrics/LineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/LineHeight",
            "text": "Line height"
        },
        "$:/language/ThemeTweaks/Metrics/BodyFontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
            "text": "Font size for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
            "text": "Line height for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
            "text": "Story left position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
            "text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop",
            "text": "Story top position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
            "text": "how far the top margin of the story river<br>is from the top of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight",
            "text": "Story right"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
            "text": "how far the left margin of the sidebar <br>is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
            "text": "Story width"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
            "text": "the overall width of the story river"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
            "text": "Tiddler width"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
            "text": "within the story river"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
            "text": "Sidebar breakpoint"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
            "text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
            "text": "Sidebar width"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
            "text": "the width of the sidebar in fluid-fixed layout"
        },
        "$:/language/TiddlerInfo/Advanced/Caption": {
            "title": "$:/language/TiddlerInfo/Advanced/Caption",
            "text": "Advanced"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
            "text": "none"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
            "text": "Plugin Details"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
            "text": "This plugin contains the following shadow tiddlers:"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
            "text": "Shadow Status"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
            "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
            "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
            "text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
            "text": "It is overridden by an ordinary tiddler"
        },
        "$:/language/TiddlerInfo/Fields/Caption": {
            "title": "$:/language/TiddlerInfo/Fields/Caption",
            "text": "Fields"
        },
        "$:/language/TiddlerInfo/List/Caption": {
            "title": "$:/language/TiddlerInfo/List/Caption",
            "text": "List"
        },
        "$:/language/TiddlerInfo/List/Empty": {
            "title": "$:/language/TiddlerInfo/List/Empty",
            "text": "This tiddler does not have a list"
        },
        "$:/language/TiddlerInfo/Listed/Caption": {
            "title": "$:/language/TiddlerInfo/Listed/Caption",
            "text": "Listed"
        },
        "$:/language/TiddlerInfo/Listed/Empty": {
            "title": "$:/language/TiddlerInfo/Listed/Empty",
            "text": "This tiddler is not listed by any others"
        },
        "$:/language/TiddlerInfo/References/Caption": {
            "title": "$:/language/TiddlerInfo/References/Caption",
            "text": "Backlinks"
        },
        "$:/language/TiddlerInfo/References/Empty": {
            "title": "$:/language/TiddlerInfo/References/Empty",
            "text": "No tiddlers link to this one"
        },
        "$:/language/TiddlerInfo/Tagging/Caption": {
            "title": "$:/language/TiddlerInfo/Tagging/Caption",
            "text": "Tagging"
        },
        "$:/language/TiddlerInfo/Tagging/Empty": {
            "title": "$:/language/TiddlerInfo/Tagging/Empty",
            "text": "No tiddlers are tagged with this one"
        },
        "$:/language/TiddlerInfo/Tools/Caption": {
            "title": "$:/language/TiddlerInfo/Tools/Caption",
            "text": "Tools"
        },
        "$:/language/Docs/Types/application/javascript": {
            "title": "$:/language/Docs/Types/application/javascript",
            "description": "JavaScript code",
            "name": "application/javascript",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/json": {
            "title": "$:/language/Docs/Types/application/json",
            "description": "JSON data",
            "name": "application/json",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/x-tiddler-dictionary": {
            "title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
            "description": "Data dictionary",
            "name": "application/x-tiddler-dictionary",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/image/gif": {
            "title": "$:/language/Docs/Types/image/gif",
            "description": "GIF image",
            "name": "image/gif",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/jpeg": {
            "title": "$:/language/Docs/Types/image/jpeg",
            "description": "JPEG image",
            "name": "image/jpeg",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/png": {
            "title": "$:/language/Docs/Types/image/png",
            "description": "PNG image",
            "name": "image/png",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/svg+xml": {
            "title": "$:/language/Docs/Types/image/svg+xml",
            "description": "Structured Vector Graphics image",
            "name": "image/svg+xml",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/x-icon": {
            "title": "$:/language/Docs/Types/image/x-icon",
            "description": "ICO format icon file",
            "name": "image/x-icon",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/text/css": {
            "title": "$:/language/Docs/Types/text/css",
            "description": "Static stylesheet",
            "name": "text/css",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/text/html": {
            "title": "$:/language/Docs/Types/text/html",
            "description": "HTML markup",
            "name": "text/html",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/plain": {
            "title": "$:/language/Docs/Types/text/plain",
            "description": "Plain text",
            "name": "text/plain",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/vnd.tiddlywiki": {
            "title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
            "description": "TiddlyWiki 5",
            "name": "text/vnd.tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/x-tiddlywiki": {
            "title": "$:/language/Docs/Types/text/x-tiddlywiki",
            "description": "TiddlyWiki Classic",
            "name": "text/x-tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/languages/en-GB/icon": {
            "title": "$:/languages/en-GB/icon",
            "type": "image/svg+xml",
            "text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
        },
        "$:/languages/en-GB": {
            "title": "$:/languages/en-GB",
            "name": "en-GB",
            "description": "English (British)",
            "author": "JeremyRuston",
            "core-version": ">=5.0.0\"",
            "text": "Stub pseudo-plugin for the default language"
        },
        "$:/core/modules/commander.js": {
            "title": "$:/core/modules/commander.js",
            "text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/commands/build.js": {
            "title": "$:/core/modules/commands/build.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/clearpassword.js": {
            "title": "$:/core/modules/commands/clearpassword.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/deletetiddlers.js": {
            "title": "$:/core/modules/commands/deletetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/editions.js": {
            "title": "$:/core/modules/commands/editions.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\"    \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/fetch.js": {
            "title": "$:/core/modules/commands/fetch.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t    var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t    \tdata = [];\n\t    self.commander.write(\"Reading \" + url + \": \");\n\t    response.on(\"data\",function(chunk) {\n\t        data.push(chunk);\n\t        self.commander.write(\".\");\n\t    });\n\t    response.on(\"end\",function() {\n\t        self.commander.write(\"\\n\");\n\t        if(response.statusCode === 200) {\n\t\t        self.processBody(Buffer.concat(data),type,options,url);\n\t\t        callback(null);\n\t        } else {\n\t        \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t        \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t        \t} else {\n\t\t        \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t        \t\t\n\t        \t}\n\t        }\n\t   \t});\n\t   \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t   \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/help.js": {
            "title": "$:/core/modules/commands/help.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/import.js": {
            "title": "$:/core/modules/commands/import.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/init.js": {
            "title": "$:/core/modules/commands/init.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/listen.js": {
            "title": "$:/core/modules/commands/listen.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/load.js": {
            "title": "$:/core/modules/commands/load.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/makelibrary.js": {
            "title": "$:/core/modules/commands/makelibrary.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/output.js": {
            "title": "$:/core/modules/commands/output.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/password.js": {
            "title": "$:/core/modules/commands/password.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/render.js": {
            "title": "$:/core/modules/commands/render.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddler.js": {
            "title": "$:/core/modules/commands/rendertiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddlers.js": {
            "title": "$:/core/modules/commands/rendertiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/save.js": {
            "title": "$:/core/modules/commands/save.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savelibrarytiddlers.js": {
            "title": "$:/core/modules/commands/savelibrarytiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddler.js": {
            "title": "$:/core/modules/commands/savetiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddlers.js": {
            "title": "$:/core/modules/commands/savetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savewikifolder.js": {
            "title": "$:/core/modules/commands/savewikifolder.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type]  || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/server.js": {
            "title": "$:/core/modules/commands/server.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/setfield.js": {
            "title": "$:/core/modules/commands/setfield.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/unpackplugin.js": {
            "title": "$:/core/modules/commands/unpackplugin.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/verbose.js": {
            "title": "$:/core/modules/commands/verbose.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n  \" + $tw.boot.logMessages.join(\"\\n  \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/version.js": {
            "title": "$:/core/modules/commands/version.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/config.js": {
            "title": "$:/core/modules/config.js",
            "text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter:   \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
            "type": "application/javascript",
            "module-type": "config"
        },
        "$:/core/modules/deserializers.js": {
            "title": "$:/core/modules/deserializers.js",
            "text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlerdeserializer"
        },
        "$:/core/modules/editor/engines/framed.js": {
            "title": "$:/core/modules/editor/engines/framed.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\t\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\t\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/engines/simple.js": {
            "title": "$:/core/modules/editor/engines/simple.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/factory.js": {
            "title": "$:/core/modules/editor/factory.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup ||  changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t    clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t    el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/operations/bitmap/clear.js": {
            "title": "$:/core/modules/editor/operations/bitmap/clear.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/resize.js": {
            "title": "$:/core/modules/editor/operations/bitmap/resize.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/rotate-left.js": {
            "title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/text/excise.js": {
            "title": "$:/core/modules/editor/operations/text/excise.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ?  [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/make-link.js": {
            "title": "$:/core/modules/editor/operations/text/make-link.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/prefix-lines.js": {
            "title": "$:/core/modules/editor/operations/text/prefix-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline =  prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-all.js": {
            "title": "$:/core/modules/editor/operations/text/replace-all.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-selection.js": {
            "title": "$:/core/modules/editor/operations/text/replace-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/save-selection.js": {
            "title": "$:/core/modules/editor/operations/text/save-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-lines.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-selection.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/filterrunprefixes/all.js": {
            "title": "$:/core/modules/filterrunprefixes/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/and.js": {
            "title": "$:/core/modules/filterrunprefixes/and.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/else.js": {
            "title": "$:/core/modules/filterrunprefixes/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/except.js": {
            "title": "$:/core/modules/filterrunprefixes/except.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/filter.js": {
            "title": "$:/core/modules/filterrunprefixes/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [];\n\t\t\tresults.each(function(result) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget);\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(result);\n\t\t\t\t}\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/intersection.js": {
            "title": "$:/core/modules/filterrunprefixes/intersection.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/or.js": {
            "title": "$:/core/modules/filterrunprefixes/or.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/reduce.js": {
            "title": "$:/core/modules/filterrunprefixes/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\";\n\t\t\tvar index = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\t\t\treturn \"\" +  (results.length - 1 - index);\n\t\t\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn widget.getVariable(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\t\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filters/addprefix.js": {
            "title": "$:/core/modules/filters/addprefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/addsuffix.js": {
            "title": "$:/core/modules/filters/addsuffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/after.js": {
            "title": "$:/core/modules/filters/after.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/all/current.js": {
            "title": "$:/core/modules/filters/all/current.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/missing.js": {
            "title": "$:/core/modules/filters/all/missing.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/orphans.js": {
            "title": "$:/core/modules/filters/all/orphans.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/shadows.js": {
            "title": "$:/core/modules/filters/all/shadows.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tags.js": {
            "title": "$:/core/modules/filters/all/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tiddlers.js": {
            "title": "$:/core/modules/filters/all/tiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all.js": {
            "title": "$:/core/modules/filters/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/backlinks.js": {
            "title": "$:/core/modules/filters/backlinks.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/before.js": {
            "title": "$:/core/modules/filters/before.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/commands.js": {
            "title": "$:/core/modules/filters/commands.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/compare.js": {
            "title": "$:/core/modules/filters/compare.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/contains.js": {
            "title": "$:/core/modules/filters/contains.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/count.js": {
            "title": "$:/core/modules/filters/count.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/days.js": {
            "title": "$:/core/modules/filters/days.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/duplicateslugs.js": {
            "title": "$:/core/modules/filters/duplicateslugs.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/each.js": {
            "title": "$:/core/modules/filters/each.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/eachday.js": {
            "title": "$:/core/modules/filters/eachday.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editiondescription.js": {
            "title": "$:/core/modules/filters/editiondescription.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editions.js": {
            "title": "$:/core/modules/filters/editions.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/else.js": {
            "title": "$:/core/modules/filters/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/decodeuricomponent.js": {
            "title": "$:/core/modules/filters/decodeuricomponent.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/enlist.js": {
            "title": "$:/core/modules/filters/enlist.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/field.js": {
            "title": "$:/core/modules/filters/field.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/fields.js": {
            "title": "$:/core/modules/filters/fields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/filter.js": {
            "title": "$:/core/modules/filters/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/format/date.js": {
            "title": "$:/core/modules/filters/format/date.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.date = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format/relativedate.js": {
            "title": "$:/core/modules/filters/format/relativedate.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.relativedate = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format.js": {
            "title": "$:/core/modules/filters/format.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/get.js": {
            "title": "$:/core/modules/filters/get.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getindex.js": {
            "title": "$:/core/modules/filters/getindex.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getvariable.js": {
            "title": "$:/core/modules/filters/getvariable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/has.js": {
            "title": "$:/core/modules/filters/has.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/haschanged.js": {
            "title": "$:/core/modules/filters/haschanged.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/indexes.js": {
            "title": "$:/core/modules/filters/indexes.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/insertbefore.js": {
            "title": "$:/core/modules/filters/insertbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/is/binary.js": {
            "title": "$:/core/modules/filters/is/binary.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/blank.js": {
            "title": "$:/core/modules/filters/is/blank.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/current.js": {
            "title": "$:/core/modules/filters/is/current.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/draft.js": {
            "title": "$:/core/modules/filters/is/draft.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,\"draft.of\")) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,\"draft.of\") && (tiddler.fields[\"draft.of\"].length !== 0)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\t\t\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/image.js": {
            "title": "$:/core/modules/filters/is/image.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/missing.js": {
            "title": "$:/core/modules/filters/is/missing.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/orphan.js": {
            "title": "$:/core/modules/filters/is/orphan.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/shadow.js": {
            "title": "$:/core/modules/filters/is/shadow.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/system.js": {
            "title": "$:/core/modules/filters/is/system.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tag.js": {
            "title": "$:/core/modules/filters/is/tag.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tiddler.js": {
            "title": "$:/core/modules/filters/is/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/variable.js": {
            "title": "$:/core/modules/filters/is/variable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is.js": {
            "title": "$:/core/modules/filters/is.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/limit.js": {
            "title": "$:/core/modules/filters/limit.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/links.js": {
            "title": "$:/core/modules/filters/links.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/list.js": {
            "title": "$:/core/modules/filters/list.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listed.js": {
            "title": "$:/core/modules/filters/listed.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listops.js": {
            "title": "$:/core/modules/filters/listops.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/lookup.js": {
            "title": "$:/core/modules/filters/lookup.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/match.js": {
            "title": "$:/core/modules/filters/match.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/math.js": {
            "title": "$:/core/modules/filters/math.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/minlength.js": {
            "title": "$:/core/modules/filters/minlength.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/modules.js": {
            "title": "$:/core/modules/filters/modules.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/moduletypes.js": {
            "title": "$:/core/modules/filters/moduletypes.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/next.js": {
            "title": "$:/core/modules/filters/next.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/plugintiddlers.js": {
            "title": "$:/core/modules/filters/plugintiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/prefix.js": {
            "title": "$:/core/modules/filters/prefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/previous.js": {
            "title": "$:/core/modules/filters/previous.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/range.js": {
            "title": "$:/core/modules/filters/range.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/reduce.js": {
            "title": "$:/core/modules/filters/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" +  list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/regexp.js": {
            "title": "$:/core/modules/filters/regexp.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removeprefix.js": {
            "title": "$:/core/modules/filters/removeprefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removesuffix.js": {
            "title": "$:/core/modules/filters/removesuffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sameday.js": {
            "title": "$:/core/modules/filters/sameday.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/search.js": {
            "title": "$:/core/modules/filters/search.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/shadowsource.js": {
            "title": "$:/core/modules/filters/shadowsource.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/slugify.js": {
            "title": "$:/core/modules/filters/slugify.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sort.js": {
            "title": "$:/core/modules/filters/sort.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sortsub.js": {
            "title": "$:/core/modules/filters/sortsub.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},{\n\t\t\tgetVariable: function(name) {\n\t\t\t\tif(name === \"currentTiddler\") {\n\t\t\t\t\treturn title;\n\t\t\t\t} else {\n\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/splitbefore.js": {
            "title": "$:/core/modules/filters/splitbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/storyviews.js": {
            "title": "$:/core/modules/filters/storyviews.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/strings.js": {
            "title": "$:/core/modules/filters/strings.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\tsearchTerm,\n\t\tregExp;\n\t\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\t//Escape regexp characters if the operand is not a regular expression\n\t\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);\n\t\t\ttry {\n\t\t\t\tregExp = new RegExp(searchTerm,flags);\n\t\t\t} catch(ex) {\n\t\t\t\treturn [\"RegExp error: \" + ex];\n\t\t\t}\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,operator.operands[1])\n\t\t\t);\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile (padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subfilter.js": {
            "title": "$:/core/modules/filters/subfilter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subtiddlerfields.js": {
            "title": "$:/core/modules/filters/subtiddlerfields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/suffix.js": {
            "title": "$:/core/modules/filters/suffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tag.js": {
            "title": "$:/core/modules/filters/tag.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tagging.js": {
            "title": "$:/core/modules/filters/tagging.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tags.js": {
            "title": "$:/core/modules/filters/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/then.js": {
            "title": "$:/core/modules/filters/then.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/title.js": {
            "title": "$:/core/modules/filters/title.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/untagged.js": {
            "title": "$:/core/modules/filters/untagged.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/variables.js": {
            "title": "$:/core/modules/filters/variables.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/wikiparserrules.js": {
            "title": "$:/core/modules/filters/wikiparserrules.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/x-listops.js": {
            "title": "$:/core/modules/filters/x-listops.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset =  (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\t\t\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i - opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\t\t\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\t\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\t\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\t\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters.js": {
            "title": "$:/core/modules/filters.js",
            "text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\t\toperator.operands = [];\n\t\tfunction parseOperand(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(!operator.regexp) {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t\toperator.operands.push(operand);\n\t\t\t}\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\t\t\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\t\t\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=|\\:(\\w+))?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[3]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[4] || match[5] || match[6]}]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\n}\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\toperand.value = widget.getVariable(operand.text,{defaultValue: \"\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self};\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results.toArray();\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/indexers/backlinks-indexer.js": {
            "title": "$:/core/modules/indexers/backlinks-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser =  this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t    oldLinks = [],\n\t    self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/field-indexer.js": {
            "title": "$:/core/modules/indexers/field-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/tag-indexer.js": {
            "title": "$:/core/modules/indexers/tag-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/info/platform.js": {
            "title": "$:/core/modules/info/platform.js",
            "text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "info"
        },
        "$:/core/modules/keyboard.js": {
            "title": "$:/core/modules/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t   (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t   (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t   (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t   (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/language.js": {
            "title": "$:/core/modules/language.js",
            "text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/macros/changecount.js": {
            "title": "$:/core/modules/macros/changecount.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/contrastcolour.js": {
            "title": "$:/core/modules/macros/contrastcolour.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/csvtiddlers.js": {
            "title": "$:/core/modules/macros/csvtiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/displayshortcuts.js": {
            "title": "$:/core/modules/macros/displayshortcuts.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t    return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddler.js": {
            "title": "$:/core/modules/macros/jsontiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddlers.js": {
            "title": "$:/core/modules/macros/jsontiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/makedatauri.js": {
            "title": "$:/core/modules/macros/makedatauri.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/now.js": {
            "title": "$:/core/modules/macros/now.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/qualify.js": {
            "title": "$:/core/modules/macros/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/resolvepath.js": {
            "title": "$:/core/modules/macros/resolvepath.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/unusedtitle.js": {
            "title": "$:/core/modules/macros/unusedtitle.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/version.js": {
            "title": "$:/core/modules/macros/version.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/parsers/audioparser.js": {
            "title": "$:/core/modules/parsers/audioparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/binaryparser.js": {
            "title": "$:/core/modules/parsers/binaryparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/csvparser.js": {
            "title": "$:/core/modules/parsers/csvparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/htmlparser.js": {
            "title": "$:/core/modules/parsers/htmlparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/imageparser.js": {
            "title": "$:/core/modules/parsers/imageparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/utils/parseutils.js": {
            "title": "$:/core/modules/utils/parseutils.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/parsers/pdfparser.js": {
            "title": "$:/core/modules/parsers/pdfparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/textparser.js": {
            "title": "$:/core/modules/parsers/textparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/videoparser.js": {
            "title": "$:/core/modules/parsers/videoparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/dash.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"&ndash;\" : \"&mdash;\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/entity.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: &copy;\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/extlink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/heading.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/html.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/html.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/image.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/image.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/import.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/import.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/list.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/list.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/rules.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/syslink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/table.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/table.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n  <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/wikiparser.js": {
            "title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined  && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t//  Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t//  Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/pluginswitcher.js": {
            "title": "$:/core/modules/pluginswitcher.js",
            "text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/saver-handler.js": {
            "title": "$:/core/modules/saver-handler.js",
            "text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/savers/andtidwiki.js": {
            "title": "$:/core/modules/savers/andtidwiki.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t    link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/beaker.js": {
            "title": "$:/core/modules/savers/beaker.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/custom.js": {
            "title": "$:/core/modules/savers/custom.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t//   Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/download.js": {
            "title": "$:/core/modules/savers/download.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/fsosaver.js": {
            "title": "$:/core/modules/savers/fsosaver.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitea.js": {
            "title": "$:/core/modules/savers/gitea.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/github.js": {
            "title": "$:/core/modules/savers/github.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitlab.js": {
            "title": "$:/core/modules/savers/gitlab.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/hyperdrive.js": {
            "title": "$:/core/modules/savers/hyperdrive.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/hyperdrive.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com)\nCompatible with beaker >= V1.0.0\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar HyperdriveSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nHyperdriveSaver.prototype.save = function(text,method,callback) {\n\tvar dat = beaker.hyperdrive.drive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Hyperdrive Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Hyperdrive Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nHyperdriveSaver.prototype.info = {\n\tname: \"beaker-1.x\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.beaker && !!beaker.hyperdrive && location.protocol===\"hyper:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new HyperdriveSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/manualdownload.js": {
            "title": "$:/core/modules/savers/manualdownload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/msdownload.js": {
            "title": "$:/core/modules/savers/msdownload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/put.js": {
            "title": "$:/core/modules/savers/put.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyfox.js": {
            "title": "$:/core/modules/savers/tiddlyfox.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyie.js": {
            "title": "$:/core/modules/savers/tiddlyie.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/twedit.js": {
            "title": "$:/core/modules/savers/twedit.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/upload.js": {
            "title": "$:/core/modules/savers/upload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/server/authenticators/basic.js": {
            "title": "$:/core/modules/server/authenticators/basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/authenticators/header.js": {
            "title": "$:/core/modules/server/authenticators/header.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/routes/delete-tiddler.js": {
            "title": "$:/core/modules/server/routes/delete-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-favicon.js": {
            "title": "$:/core/modules/server/routes/get-favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-file.js": {
            "title": "$:/core/modules/server/routes/get-file.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve(state.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-index.js": {
            "title": "$:/core/modules/server/routes/get-index.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-login-basic.js": {
            "title": "$:/core/modules/server/routes/get-login-basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-status.js": {
            "title": "$:/core/modules/server/routes/get-status.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler-html.js": {
            "title": "$:/core/modules/server/routes/get-tiddler-html.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler.js": {
            "title": "$:/core/modules/server/routes/get-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddlers-json.js": {
            "title": "$:/core/modules/server/routes/get-tiddlers-json.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/put-tiddler.js": {
            "title": "$:/core/modules/server/routes/put-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/server.js": {
            "title": "$:/core/modules/server/server.js",
            "text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.pathPrefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!this.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !this.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/browser-messaging.js": {
            "title": "$:/core/modules/browser-messaging.js",
            "text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t  iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/commands.js": {
            "title": "$:/core/modules/startup/commands.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/CSSescape.js": {
            "title": "$:/core/modules/startup/CSSescape.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/favicon.js": {
            "title": "$:/core/modules/startup/favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/info.js": {
            "title": "$:/core/modules/startup/info.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/load-modules.js": {
            "title": "$:/core/modules/startup/load-modules.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/password.js": {
            "title": "$:/core/modules/startup/password.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/plugins.js": {
            "title": "$:/core/modules/startup/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/render.js": {
            "title": "$:/core/modules/startup/render.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \"no\"});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n   \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/rootwidget.js": {
            "title": "$:/core/modules/startup/rootwidget.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\t\n\t// Install the notification  mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard  mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup.js": {
            "title": "$:/core/modules/startup.js",
            "text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/story.js": {
            "title": "$:/core/modules/startup/story.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/windows.js": {
            "title": "$:/core/modules/startup/windows.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\n$tw.windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t    srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/story.js": {
            "title": "$:/core/modules/story.js",
            "text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/storyviews/classic.js": {
            "title": "$:/core/modules/storyviews/classic.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom:  currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/pop.js": {
            "title": "$:/core/modules/storyviews/pop.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/zoomin.js": {
            "title": "$:/core/modules/storyviews/zoomin.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx =  zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty =  zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/syncer.js": {
            "title": "$:/core/modules/syncer.js",
            "text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\n\t\t}\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t},\n\t\tsyncSystemFromServer = (self.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\tif($tw.boot.files){\n\t\t\t// Remove the tiddler from $tw.boot.files\n\t\t\tdelete $tw.boot.files[self.title];\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/tiddler.js": {
            "title": "$:/core/modules/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlermethod"
        },
        "$:/core/modules/upgraders/plugins.js": {
            "title": "$:/core/modules/upgraders/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/system.js": {
            "title": "$:/core/modules/upgraders/system.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/themetweaks.js": {
            "title": "$:/core/modules/upgraders/themetweaks.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
            "text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/crypto.js": {
            "title": "$:/core/modules/utils/crypto.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/csv.js": {
            "title": "$:/core/modules/utils/csv.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
            "text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&amp;\").replace(d,\"&lt;\").replace(e,\"&gt;\").replace(f,\"&para;<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/dom/animations/slide.js": {
            "title": "$:/core/modules/utils/dom/animations/slide.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "animation"
        },
        "$:/core/modules/utils/dom/animator.js": {
            "title": "$:/core/modules/utils/dom/animator.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/browser.js": {
            "title": "$:/core/modules/utils/dom/browser.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/csscolorparser.js": {
            "title": "$:/core/modules/utils/dom/csscolorparser.js",
            "text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom.js": {
            "title": "$:/core/modules/utils/dom.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n    // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/dragndrop.js": {
            "title": "$:/core/modules/utils/dom/dragndrop.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/http.js": {
            "title": "$:/core/modules/utils/dom/http.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !hasHeader(\"Content-Type\")) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/keyboard.js": {
            "title": "$:/core/modules/utils/dom/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/modal.js": {
            "title": "$:/core/modules/utils/dom/modal.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\t\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/notifier.js": {
            "title": "$:/core/modules/utils/dom/notifier.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/popup.js": {
            "title": "$:/core/modules/utils/dom/popup.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n        \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/scroller.js": {
            "title": "$:/core/modules/utils/dom/scroller.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target);\t\t\t\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t    srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/edition-info.js": {
            "title": "$:/core/modules/utils/edition-info.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/fakedom.js": {
            "title": "$:/core/modules/utils/fakedom.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nTW_TextNode.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/filesystem.js": {
            "title": "$:/core/modules/utils/filesystem.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n\toriginalpath: a preferred filepath if no pathFilters match\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo) {\n\t\tfileInfo.isEditableFile = options.fileInfo.isEditableFile || false;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension override\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt){\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo,\n\t\toriginalpath: options.originalpath\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar self = this,\n\t\textension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = options.originalpath || \"\",\n\t\tfilepath;\t\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && originalpath !== \"\") {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t//If the path does not start with \".\" or \"..\" and a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,\"_\");\n\t}\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tif(oldPath && oldPath == fullPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, \n\t//\tthen encodeURIComponent() and resolve to tiddler directory\n\tvar newPath = fullPath,\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode){\n\t\tencode = !(fullPath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\tfullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\tfullPath.indexOf($tw.boot.wikiTiddlersPath) == 0);\n\t\t}\n\tif(encode){\n\t\tfullPath = path.resolve(directory, encodeURIComponent(fullPath));\n\t}\n\t// Call hook to allow plugins to modify the final path\n\tfullPath = $tw.hooks.invokeHook(\"th-make-tiddler-path\", newPath, fullPath);\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo, callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\treturn callback(null);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\t\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options, callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\treturn $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \"+title, err);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null);\n\t\t});\n\t} else {\n\t\treturn callback(null);\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/linkedlist.js": {
            "title": "$:/core/modules/utils/linkedlist.js",
            "text": "/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\tthis.index = Object.create(null);\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = this;\n\tthis.prev = this;\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_removeOne(this,value);\n\t}\n};\n\nLinkedList.prototype.push = function(/* values */) {\n\tfor(var i = 0; i < arguments.length; i++) {\n\t\tvar value = arguments[i];\n\t\tvar node = {value: value};\n\t\tvar preexistingNode = this.index[value];\n\t\t_linkToEnd(this,node);\n\t\tif(preexistingNode) {\n\t\t\t// We want to keep pointing to the first instance, but we want\n\t\t\t// to have that instance (or chain of instances) point to the\n\t\t\t// new one.\n\t\t\twhile (preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\tpreexistingNode.copy = node;\n\t\t} else {\n\t\t\tthis.index[value] = node;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tthis.push.apply(this,value);\n\t} else {\n\t\tvar node = _removeOne(this,value);\n\t\tif(!node) {\n\t\t\tnode = {value: value};\n\t\t\tthis.index[value] = node;\n\t\t} else {\n\t\t\t// Put this node at the end of the copy chain.\n\t\t\tvar preexistingNode = node;\n\t\t\twhile(preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\t// The order of these three statements is important,\n\t\t\t// because sometimes preexistingNode == node.\n\t\t\tpreexistingNode.copy = node;\n\t\t\tthis.index[value] = node.copy;\n\t\t\tnode.copy = undefined;\n\t\t}\n\t\t_linkToEnd(this,node);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\tcallback(ptr.value);\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = [];\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\toutput.push(ptr.value);\n\t}\n\treturn output;\n};\n\nfunction _removeOne(list,value) {\n\tvar node = list.index[value];\n\tif(node) {\n\t\tnode.prev.next = node.next;\n\t\tnode.next.prev = node.prev;\n\t\tlist.length -= 1;\n\t\t// Point index to the next instance of the same value, maybe nothing.\n\t\tlist.index[value] = node.copy;\n\t}\n\treturn node;\n};\n\nfunction _linkToEnd(list,node) {\n\t// Sticks the given node onto the end of the list.\n\tlist.prev.next = node;\n\tnode.prev = list.prev;\n\tlist.prev = node;\n\tnode.next = list;\n\tlist.length += 1;\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n",
            "module-type": "utils",
            "type": "application/javascript"
        },
        "$:/core/modules/utils/logger.js": {
            "title": "$:/core/modules/utils/logger.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/parsetree.js": {
            "title": "$:/core/modules/utils/parsetree.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/performance.js": {
            "title": "$:/core/modules/utils/performance.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/pluginmaker.js": {
            "title": "$:/core/modules/utils/pluginmaker.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/transliterate.js": {
            "title": "$:/core/modules/utils/transliterate.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/utils.js": {
            "title": "$:/core/modules/utils/utils.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\",   duration:      365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\",  duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\",    duration:            24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\",   duration:                 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration:                      60 * 1000},\n\t\t{name: \"Seconds\", duration:                           1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&amp;\", < to \"&lt;\", > to \"&gt;\", \" to \"&quot;\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&amp;\").replace(/</mg,\"&lt;\").replace(/>/mg,\"&gt;\").replace(/\\\"/mg,\"&quot;\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s, rawUnicode) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/'/g, \"\\\\'\")              // single quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(regex, exports.escape);   // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(/\\x08/g, '\\\\b')           // backspace\n\t\t.replace(/\\x0c/g, '\\\\f')           // formfeed\n\t\t.replace(/\\t/g, '\\\\t')             // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n    return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm =  r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\tvar gt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\treturn compare(\"\" + a,\"\" +b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/widgets/action-confirm.js": {
            "title": "$:/core/modules/widgets/action-confirm.js",
            "text": "/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true;\n\tif(this.prompt) {\n\t\tinvokeActions = confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-createtiddler.js": {
            "title": "$:/core/modules/widgets/action-createtiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletefield.js": {
            "title": "$:/core/modules/widgets/action-deletefield.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletetiddler.js": {
            "title": "$:/core/modules/widgets/action-deletetiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-listops.js": {
            "title": "$:/core/modules/widgets/action-listops.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-log.js": {
            "title": "$:/core/modules/widgets/action-log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\t\t\n\t});\n\n\tfor(var v in this.variables) {\n\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t}\t\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\t\t\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-navigate.js": {
            "title": "$:/core/modules/widgets/action-navigate.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-popup.js": {
            "title": "$:/core/modules/widgets/action-popup.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords || \"\");\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-sendmessage.js": {
            "title": "$:/core/modules/widgets/action-sendmessage.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-setfield.js": {
            "title": "$:/core/modules/widgets/action-setfield.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\")  || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/browse.js": {
            "title": "$:/core/modules/widgets/browse.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/button.js": {
            "title": "$:/core/modules/widgets/button.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = \"button\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n    return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\t\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.updateDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/checkbox.js": {
            "title": "$:/core/modules/widgets/checkbox.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/codeblock.js": {
            "title": "$:/core/modules/widgets/codeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/count.js": {
            "title": "$:/core/modules/widgets/count.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/diff-text.js": {
            "title": "$:/core/modules/widgets/diff-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/draggable.js": {
            "title": "$:/core/modules/widgets/draggable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/droppable.js": {
            "title": "$:/core/modules/widgets/droppable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent  = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/dropzone.js": {
            "title": "$:/core/modules/widgets/dropzone.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent  = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-binary.js": {
            "title": "$:/core/modules/widgets/edit-binary.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-bitmap.js": {
            "title": "$:/core/modules/widgets/edit-bitmap.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-shortcut.js": {
            "title": "$:/core/modules/widgets/edit-shortcut.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-text.js": {
            "title": "$:/core/modules/widgets/edit-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit.js": {
            "title": "$:/core/modules/widgets/edit.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/element.js": {
            "title": "$:/core/modules/widgets/element.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\t\t\t\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/encrypt.js": {
            "title": "$:/core/modules/widgets/encrypt.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/entity.js": {
            "title": "$:/core/modules/widgets/entity.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/eventcatcher.js": {
            "title": "$:/core/modules/widgets/eventcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\t\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\t\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tactions = self.getAttribute(\"actions-\"+type),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!selectedNode.matches(selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// If we found one, copy the attributes as variables, otherwise exit\n\t\t\t\tif(selectedNode.matches(selector)) {\n\t\t\t\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\t\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t\t\t\t});\n\t\t\t\t\t//Add a variable with a popup coordinate string for the selected node\n\t\t\t\t\tvariables[\"tv-popup-coords\"] = \"(\" + selectedNode.offsetLeft + \",\" + selectedNode.offsetTop +\",\" + selectedNode.offsetWidth + \",\" + selectedNode.offsetHeight + \")\";\n\t\t\t\t\t\n\t\t\t\t\t//Add variables for offset of selected node\n\t\t\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to selected node\n\t\t\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\t\t\t\t\n\t\t\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to event catcher node\n\t\t\t\t\tcatcherNodeRect = self.domNode.getBoundingClientRect();\n\t\t\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - catcherNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - catcherNodeRect.top).toString();\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"events\"] || changedAttributes[\"tag\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fieldmangler.js": {
            "title": "$:/core/modules/widgets/fieldmangler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fields.js": {
            "title": "$:/core/modules/widgets/fields.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/image.js": {
            "title": "$:/core/modules/widgets/image.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/importvariables.js": {
            "title": "$:/core/modules/widgets/importvariables.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = new this.variablesConstructor();\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t// importvariable tree.\n\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t}\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/keyboard.js": {
            "title": "$:/core/modules/widgets/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tvar handled = self.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tif(handled || self.actions || self.message) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/link.js": {
            "title": "$:/core/modules/widgets/link.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/linkcatcher.js": {
            "title": "$:/core/modules/widgets/linkcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/list.js": {
            "title": "$:/core/modules/widgets/list.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\",\"\");\n\t// this.wiki.parseText() calls \n\t// new Parser(..), which should only be done, if needed, because it's heavy!\n\tif (emptyMessage === \"\") {\n\t\treturn [];\n\t}\n\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/log.js": {
            "title": "$:/core/modules/widgets/log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\t\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();",
            "type": "application/javascript",
            "module-type": "widget-subclass"
        },
        "$:/core/modules/widgets/macrocall.js": {
            "title": "$:/core/modules/widgets/macrocall.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\t// Check if we've already cached parsing this macro\n\t\tvar mode = this.parseTreeNode.isBlock ? \"blockParser\" : \"inlineParser\",\n\t\t\tparser;\n\t\tif(variableInfo.srcVariable && variableInfo.srcVariable[mode]) {\n\t\t\tparser = variableInfo.srcVariable[mode];\n\t\t} else {\n\t\t\tparser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\t\tif(variableInfo.isCacheable && variableInfo.srcVariable) {\n\t\t\t\tvariableInfo.srcVariable[mode] = parser;\n\t\t\t}\n\t\t}\n\t\tvar parseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else if(this.renderOutput === \"text/raw\") {\n\t\tparseTreeNodes = [{type: \"text\", text: text}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/navigator.js": {
            "title": "$:/core/modules/widgets/navigator.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\t\ttext: \"\",\n\t\t\t},\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t\tnewFields[\"suppressed-\" + title] = \"yes\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tvar autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable(\"tv-auto-open-on-import\");  \n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar options = {},\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\tthis.wiki.renameTiddler(from,to,options);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/password.js": {
            "title": "$:/core/modules/widgets/password.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/qualify.js": {
            "title": "$:/core/modules/widgets/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/radio.js": {
            "title": "$:/core/modules/widgets/radio.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/range.js": {
            "title": "$:/core/modules/widgets/range.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\",   handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\",    handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\",     handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) {  // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/raw.js": {
            "title": "$:/core/modules/widgets/raw.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/reveal.js": {
            "title": "$:/core/modules/widgets/reveal.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\t\t\t\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\t\t\t\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t    defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\t\t\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n        $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/scrollable.js": {
            "title": "$:/core/modules/widgets/scrollable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t} else {\n\t\tthis.scrollIntoView(event.target);\t\t\t\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/select.js": {
            "title": "$:/core/modules/widgets/select.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/set.js": {
            "title": "$:/core/modules/widgets/set.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t   (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/text.js": {
            "title": "$:/core/modules/widgets/text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/tiddler.js": {
            "title": "$:/core/modules/widgets/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/transclude.js": {
            "title": "$:/core/modules/widgets/transclude.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.recursionMarker === \"yes\") {\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/vars.js": {
            "title": "$:/core/modules/widgets/vars.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n  <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/view.js": {
            "title": "$:/core/modules/widgets/view.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/widget.js": {
            "title": "$:/core/modules/widgets/widget.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning  that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\toriginalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\tevent.widget = event.widget || this;\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/wikify.js": {
            "title": "$:/core/modules/widgets/wikify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/wiki-bulkops.js": {
            "title": "$:/core/modules/wiki-bulkops.js",
            "text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/wiki.js": {
            "title": "$:/core/modules/wiki.js",
            "text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type]  || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles.  Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x :  x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t//         indexOf unless we have a new\n\t\t\t\t\t//         position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create  a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\")                                       // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\")                                 // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\")                                     // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\")                                         // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\");                                        // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/palettes/Blanca": {
            "title": "$:/palettes/Blanca",
            "name": "Blanca",
            "description": "A clean white palette to let you focus",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/Blue": {
            "title": "$:/palettes/Blue",
            "name": "Blue",
            "description": "A blue theme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/Muted": {
            "title": "$:/palettes/Muted",
            "name": "Muted",
            "description": "Bright tiddlers on a muted background",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastLight": {
            "title": "$:/palettes/ContrastLight",
            "name": "Contrast (Light)",
            "description": "High contrast and unambiguous (light version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastDark": {
            "title": "$:/palettes/ContrastDark",
            "name": "Contrast (Dark)",
            "description": "High contrast and unambiguous (dark version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/CupertinoDark": {
            "title": "$:/palettes/CupertinoDark",
            "tags": "$:/tags/Palette",
            "name": "Cupertino Dark",
            "description": "A macOS inspired dark palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nforeground: #FFFFFF\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour background>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n"
        },
        "$:/palettes/DarkPhotos": {
            "title": "$:/palettes/DarkPhotos",
            "created": "20150402111612188",
            "description": "Good with dark photo backgrounds",
            "modified": "20150402112344080",
            "name": "DarkPhotos",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/DesertSand": {
            "title": "$:/palettes/DesertSand",
            "tags": "$:/tags/Palette",
            "name": "Desert Sand",
            "description": "A desert sand palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #E9E0C7\ndropdown-tab-background: #BAB29C\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #313163\nexternal-link-foreground: #555592\nforeground: #2D2A23\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"
        },
        "$:/palettes/GruvboxDark": {
            "title": "$:/palettes/GruvboxDark",
            "name": "Gruvbox Dark",
            "description": "Retro groove color scheme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "https://github.com/morhetz/gruvbox",
            "text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n"
        },
        "$:/palettes/Nord": {
            "title": "$:/palettes/Nord",
            "name": "Nord",
            "description": "An arctic, north-bluish color palette.",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
            "text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n"
        },
        "$:/palettes/Rocker": {
            "title": "$:/palettes/Rocker",
            "name": "Rocker",
            "description": "A dark theme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/SolarFlare": {
            "title": "$:/palettes/SolarFlare",
            "name": "Solar Flare",
            "description": "Warm, relaxing earth colours",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n    download-foreground: <<colour background>>\n    dragger-foreground: <<colour background>>\n    dropdown-background: <<colour background>>\n    modal-background: <<colour background>>\n    sidebar-foreground-shadow: <<colour background>>\n    tiddler-background: <<colour background>>\n    tiddler-border: <<colour background>>\n    tiddler-link-background: <<colour background>>\n    tab-background-selected: <<colour background>>\n        dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n    dragger-background: <<colour foreground>>\n    tab-foreground: <<colour foreground>>\n        tab-foreground-selected: <<colour tab-foreground>>\n            sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n        sidebar-tab-foreground: <<colour tab-foreground>>\n    sidebar-button-foreground: <<colour foreground>>\n    sidebar-controls-foreground: <<colour foreground>>\n    sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n    alert-muted-foreground: <<colour base01>>\n: base00\n    code-foreground: <<colour base00>>\n    message-foreground: <<colour base00>>\n    tag-foreground: <<colour base00>>\n: base0\n    sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n    muted-foreground: <<colour base1>>\n        blockquote-bar: <<colour muted-foreground>>\n        dropdown-border: <<colour muted-foreground>>\n        sidebar-muted-foreground: <<colour muted-foreground>>\n        tiddler-title-foreground: <<colour muted-foreground>>\n            site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n    modal-footer-background: <<colour base2>>\n    page-background: <<colour base2>>\n        modal-backdrop: <<colour page-background>>\n        notification-background: <<colour page-background>>\n        code-background: <<colour page-background>>\n            code-border: <<colour code-background>>\n        pre-background: <<colour page-background>>\n            pre-border: <<colour pre-background>>\n        sidebar-tab-background-selected: <<colour page-background>>\n    table-header-background: <<colour base2>>\n    tag-background: <<colour base2>>\n    tiddler-editor-background: <<colour base2>>\n    tiddler-info-background: <<colour base2>>\n    tiddler-info-tab-background: <<colour base2>>\n    tab-background: <<colour base2>>\n        dropdown-tab-background: <<colour tab-background>>\n: base3\n    alert-background: <<colour base3>>\n    message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n    alert-highlight: <<colour magenta>>\n: violet\n    external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n    tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n    external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n    primary: <<colour blue-muted>>\n        download-background: <<colour primary>>\n        tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n    modal-footer-border: <<colour tab-border>>\n    modal-header-border: <<colour tab-border>>\n    notification-border: <<colour tab-border>>\n    sidebar-tab-border: <<colour tab-border>>\n    tab-border-selected: <<colour tab-border>>\n        sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n    sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/SolarizedDark": {
            "title": "$:/palettes/SolarizedDark",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision dark colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedDark",
            "text": "alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nforeground: #839496\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n"
        },
        "$:/palettes/SolarizedLight": {
            "title": "$:/palettes/SolarizedLight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedLight",
            "text": "alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nforeground: #657b83\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n"
        },
        "$:/palettes/SpartanDay": {
            "title": "$:/palettes/SpartanDay",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Cold, spartan day colors",
            "name": "Spartan Day",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
        },
        "$:/palettes/SpartanNight": {
            "title": "$:/palettes/SpartanNight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Dark spartan colors",
            "name": "Spartan Night",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
        },
        "$:/palettes/Twilight": {
            "title": "$:/palettes/Twilight",
            "tags": "$:/tags/Palette",
            "author": "Thomas Elmiger",
            "type": "application/x-tiddler-dictionary",
            "name": "Twilight",
            "description": "Delightful, soft darkness.",
            "text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
        },
        "$:/palettes/Vanilla": {
            "title": "$:/palettes/Vanilla",
            "name": "Vanilla",
            "description": "Pale and unobtrusive",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
        },
        "$:/core/readme": {
            "title": "$:/core/readme",
            "text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
        },
        "$:/library/sjcl.js/license": {
            "title": "$:/library/sjcl.js/license",
            "type": "text/plain",
            "text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
        },
        "$:/core/templates/MOTW.html": {
            "title": "$:/core/templates/MOTW.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com -->&#13;&#10;"
        },
        "$:/core/templates/alltiddlers.template.html": {
            "title": "$:/core/templates/alltiddlers.template.html",
            "type": "text/vnd.tiddlywiki-html",
            "text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
        },
        "$:/core/templates/canonical-uri-external-image": {
            "title": "$:/core/templates/canonical-uri-external-image",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
        },
        "$:/core/templates/canonical-uri-external-raw": {
            "title": "$:/core/templates/canonical-uri-external-raw",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
        },
        "$:/core/templates/canonical-uri-external-text": {
            "title": "$:/core/templates/canonical-uri-external-text",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
        },
        "$:/core/templates/css-tiddler": {
            "title": "$:/core/templates/css-tiddler",
            "text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
        },
        "$:/core/templates/exporters/CsvFile": {
            "title": "$:/core/templates/exporters/CsvFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/CsvFile}}",
            "extension": ".csv",
            "text": "<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/JsonFile": {
            "title": "$:/core/templates/exporters/JsonFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/JsonFile}}",
            "extension": ".json",
            "text": "<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/StaticRiver": {
            "title": "$:/core/templates/exporters/StaticRiver",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/StaticRiver}}",
            "extension": ".html",
            "text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river tc-static-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
        },
        "$:/core/templates/exporters/StaticRiver/Content": {
            "title": "$:/core/templates/exporters/StaticRiver/Content",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
        },
        "$:/core/templates/exporters/TidFile": {
            "title": "$:/core/templates/exporters/TidFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/TidFile}}",
            "extension": ".tid",
            "condition": "[<count>compare:lte[1]]",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
        },
        "$:/core/save/all-external-js": {
            "title": "$:/core/save/all-external-js",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
        },
        "$:/core/templates/tiddlywiki5.js": {
            "title": "$:/core/templates/tiddlywiki5.js",
            "text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
        },
        "$:/core/templates/tiddlywiki5.js/tiddlers": {
            "title": "$:/core/templates/tiddlywiki5.js/tiddlers",
            "text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n`\n"
        },
        "$:/core/templates/tiddlywiki5-external-js.html": {
            "title": "$:/core/templates/tiddlywiki5-external-js.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
        },
        "$:/core/templates/html-div-skinny-tiddler": {
            "title": "$:/core/templates/html-div-skinny-tiddler",
            "text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
        },
        "$:/core/templates/html-div-tiddler": {
            "title": "$:/core/templates/html-div-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
        },
        "$:/core/templates/html-tiddler": {
            "title": "$:/core/templates/html-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
        },
        "$:/core/templates/javascript-tiddler": {
            "title": "$:/core/templates/javascript-tiddler",
            "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
        },
        "$:/core/templates/json-tiddler": {
            "title": "$:/core/templates/json-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
        },
        "$:/core/templates/module-tiddler": {
            "title": "$:/core/templates/module-tiddler",
            "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
        },
        "$:/core/templates/plain-text-tiddler": {
            "title": "$:/core/templates/plain-text-tiddler",
            "text": "<$view field=\"text\" format=\"text\" />"
        },
        "$:/core/templates/raw-static-tiddler": {
            "title": "$:/core/templates/raw-static-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
        },
        "$:/core/save/all": {
            "title": "$:/core/save/all",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/empty": {
            "title": "$:/core/save/empty",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/lazy-all": {
            "title": "$:/core/save/lazy-all",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/lazy-images": {
            "title": "$:/core/save/lazy-images",
            "text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/templates/server/static.sidebar.wikitext": {
            "title": "$:/core/templates/server/static.sidebar.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
        },
        "$:/core/templates/server/static.tiddler.html": {
            "title": "$:/core/templates/server/static.tiddler.html",
            "text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
        },
        "$:/core/templates/server/static.tiddler.wikitext": {
            "title": "$:/core/templates/server/static.tiddler.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
        },
        "$:/core/templates/single.tiddler.window": {
            "title": "$:/core/templates/single.tiddler.window",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
        },
        "$:/core/templates/split-recipe": {
            "title": "$:/core/templates/split-recipe",
            "text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
        },
        "$:/core/templates/static-tiddler": {
            "title": "$:/core/templates/static-tiddler",
            "text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
        },
        "$:/core/templates/static.area": {
            "title": "$:/core/templates/static.area",
            "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
        },
        "$:/core/templates/static.content": {
            "title": "$:/core/templates/static.content",
            "text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
        },
        "$:/core/templates/static.template.css": {
            "title": "$:/core/templates/static.template.css",
            "text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
        },
        "$:/core/templates/static.template.html": {
            "title": "$:/core/templates/static.template.html",
            "type": "text/vnd.tiddlywiki-html",
            "text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
        },
        "$:/core/templates/static.tiddler.html": {
            "title": "$:/core/templates/static.tiddler.html",
            "text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n"
        },
        "$:/core/templates/store.area.template.html": {
            "title": "$:/core/templates/store.area.template.html",
            "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
        },
        "$:/core/templates/tid-tiddler": {
            "title": "$:/core/templates/tid-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
        },
        "$:/core/templates/tiddler-metadata": {
            "title": "$:/core/templates/tiddler-metadata",
            "text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
        },
        "$:/core/templates/tiddlywiki5.html": {
            "title": "$:/core/templates/tiddlywiki5.html",
            "text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
        },
        "$:/core/templates/version": {
            "title": "$:/core/templates/version",
            "text": "<<version>>"
        },
        "$:/core/templates/wikified-tiddler": {
            "title": "$:/core/templates/wikified-tiddler",
            "text": "<$transclude />"
        },
        "$:/core/ui/AboveStory/tw2-plugin-check": {
            "title": "$:/core/ui/AboveStory/tw2-plugin-check",
            "tags": "$:/tags/AboveStory",
            "text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/Actions/new-image": {
            "title": "$:/core/ui/Actions/new-image",
            "tags": "$:/tags/Actions",
            "description": "create a new image tiddler",
            "text": "\\define get-type()\nimage/$(imageType)$\n\\end\n\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-journal": {
            "title": "$:/core/ui/Actions/new-journal",
            "tags": "$:/tags/Actions",
            "description": "create a new journal tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-tiddler": {
            "title": "$:/core/ui/Actions/new-tiddler",
            "tags": "$:/tags/Actions",
            "description": "create a new empty tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter": {
            "title": "$:/core/ui/AdvancedSearch/Filter",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Filter/Caption}}",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\" \n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/temp/advancedsearch]]\" firstSearchFilterField=\"text\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tinputCancelActions=<<cancel-search-actions>>/>\n</$keyboard>\n</$keyboard>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</div>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param='.tc-advanced-search input' />\"\"\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Shadows": {
            "title": "$:/core/ui/AdvancedSearch/Shadows",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Shadows/Caption}}",
            "first-search-filter": "[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]",
            "text": "\\define lingo-base() $:/language/Search/\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>>  filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Standard": {
            "title": "$:/core/ui/AdvancedSearch/Standard",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Standard/Caption}}",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define next-search-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<next-search-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/System": {
            "title": "$:/core/ui/AdvancedSearch/System",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/System/Caption}}",
            "first-search-filter": "[is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\ttype=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
        },
        "$:/AdvancedSearch": {
            "title": "$:/AdvancedSearch",
            "icon": "$:/core/images/advanced-search-button",
            "color": "#bbb",
            "text": "<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n"
        },
        "$:/core/ui/AlertTemplate": {
            "title": "$:/core/ui/AlertTemplate",
            "text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
        },
        "$:/core/ui/BinaryWarning": {
            "title": "$:/core/ui/BinaryWarning",
            "text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
        },
        "$:/core/ui/Components/plugin-info": {
            "title": "$:/core/ui/Components/plugin-info",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
        },
        "$:/core/ui/Components/tag-link": {
            "title": "$:/core/ui/Components/tag-link",
            "text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
        },
        "$:/core/ui/ControlPanel/Advanced": {
            "title": "$:/core/ui/ControlPanel/Advanced",
            "tags": "$:/tags/ControlPanel/Info",
            "caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
            "text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Appearance": {
            "title": "$:/core/ui/ControlPanel/Appearance",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
            "text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Basics": {
            "title": "$:/core/ui/ControlPanel/Basics",
            "tags": "$:/tags/ControlPanel/Info",
            "caption": "{{$:/language/ControlPanel/Basics/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
        },
        "$:/core/ui/ControlPanel/EditorTypes": {
            "title": "$:/core/ui/ControlPanel/EditorTypes",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ControlPanel/Info": {
            "title": "$:/core/ui/ControlPanel/Info",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Info/Caption}}",
            "text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/KeyboardShortcuts": {
            "title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ControlPanel/LoadedModules": {
            "title": "$:/core/ui/ControlPanel/LoadedModules",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
        },
        "$:/core/ui/ControlPanel/Modals/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
            "subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
            "text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n</$list>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Palette": {
            "title": "$:/core/ui/ControlPanel/Palette",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Palette/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
        },
        "$:/core/ui/ControlPanel/Parsing": {
            "title": "$:/core/ui/ControlPanel/Parsing",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
            "text": "<<display-server-assets language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
            "text": "<<display-server-assets plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
            "text": "<<display-server-assets theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Updates": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
            "caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
            "text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"&#91;&#91;<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
            "text": "<<plugin-table language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
            "text": "<<plugin-table plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
            "text": "<<plugin-table theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"
        },
        "$:/core/ui/ControlPanel/Saving/DownloadSaver": {
            "title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Saving/General": {
            "title": "$:/core/ui/ControlPanel/Saving/General",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
            "list-before": "",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Saving/GitHub": {
            "title": "$:/core/ui/ControlPanel/Saving/GitHub",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/GitLab": {
            "title": "$:/core/ui/ControlPanel/Saving/GitLab",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/TiddlySpot": {
            "title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<siteLink backup>> |\n|<<lingo ControlPanel>> |<<siteLink controlpanel>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>>  |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n"
        },
        "$:/core/ui/ControlPanel/Saving/Gitea": {
            "title": "$:/core/ui/ControlPanel/Saving/Gitea",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
        },
        "$:/core/ui/ControlPanel/Saving": {
            "title": "$:/core/ui/ControlPanel/Saving",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Saving/Caption}}",
            "text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\n"
        },
        "$:/core/buttonstyles/Borderless": {
            "title": "$:/core/buttonstyles/Borderless",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
            "text": "tc-btn-invisible"
        },
        "$:/core/buttonstyles/Boxed": {
            "title": "$:/core/buttonstyles/Boxed",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
            "text": "tc-btn-boxed"
        },
        "$:/core/buttonstyles/Rounded": {
            "title": "$:/core/buttonstyles/Rounded",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
            "text": "tc-btn-rounded"
        },
        "$:/core/ui/ControlPanel/Settings/CamelCase": {
            "title": "$:/core/ui/ControlPanel/Settings/CamelCase",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
            "title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
            "title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n  <option value=\"above\"><<lingo \"OpenAbove\">></option>\n  <option value=\"below\"><<lingo \"OpenBelow\">></option>\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/MissingLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationHistory": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
            "title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/TitleLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings": {
            "title": "$:/core/ui/ControlPanel/Settings",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Settings/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ControlPanel/StoryView": {
            "title": "$:/core/ui/ControlPanel/StoryView",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
            "text": "{{$:/snippets/viewswitcher}}\n"
        },
        "$:/core/ui/ControlPanel/Stylesheets": {
            "title": "$:/core/ui/ControlPanel/Stylesheets",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
        },
        "$:/core/ui/ControlPanel/Theme": {
            "title": "$:/core/ui/ControlPanel/Theme",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Theme/Caption}}",
            "text": "{{$:/snippets/themeswitcher}}\n"
        },
        "$:/core/ui/ControlPanel/TiddlerFields": {
            "title": "$:/core/ui/ControlPanel/TiddlerFields",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/PageControls": {
            "title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars": {
            "title": "$:/core/ui/ControlPanel/Toolbars",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
            "text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"
        },
        "$:/ControlPanel": {
            "title": "$:/ControlPanel",
            "icon": "$:/core/images/options-button",
            "color": "#bbb",
            "text": "<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"
        },
        "$:/core/ui/DefaultSearchResultList": {
            "title": "$:/core/ui/DefaultSearchResultList",
            "tags": "$:/tags/SearchResults",
            "caption": "{{$:/language/Search/DefaultResults/Caption}}",
            "first-search-filter": "[!is[system]search:title<userInput>sort[title]limit[250]]",
            "second-search-filter": "[!is[system]search<userInput>sort[title]limit[250]]",
            "text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-current": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from current",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from shadow (if any)",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/output": {
            "title": "$:/core/ui/EditTemplate/body/preview/output",
            "tags": "$:/tags/EditPreview",
            "caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
            "text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
        },
        "$:/state/showeditpreview": {
            "title": "$:/state/showeditpreview",
            "text": "no"
        },
        "$:/core/ui/EditTemplate/body/editor": {
            "title": "$:/core/ui/EditTemplate/body/editor",
            "text": "<$edit\n\n  field=\"text\"\n  class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n  placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n  tabindex={{$:/config/EditTabIndex}}\n  focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n  cancelPopups=\"yes\"\n\n><$set\n\n  name=\"targetTiddler\"\n  value=<<currentTiddler>>\n\n><$list\n\n  filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n  type=\"nomatch\"\n  state=<<config-visibility-title>>\n  text=\"hide\"\n  class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n  tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n  mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
        },
        "$:/core/ui/EditTemplate/body/toolbar/button": {
            "title": "$:/core/ui/EditTemplate/body/toolbar/button",
            "text": "\\define toolbar-button-icon()\n<$list\n\n  filter=\"[all[current]!has[custom-icon]]\"\n  variable=\"no-custom-icon\"\n\n><$transclude\n\n  tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n  filter={{!!condition}}\n  variable=\"list-condition\"\n\n><$wikify\n\n  name=\"tooltip-text\"\n  text=<<toolbar-button-tooltip>>\n  mode=\"inline\"\n  output=\"text\"\n\n><$list\n\n  filter=\"[all[current]!has[dropdown]]\"\n  variable=\"no-dropdown\"\n\n><$button\n\n  class=\"tc-btn-invisible $(buttonClasses)$\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button></$list><$list\n\n  filter=\"[all[current]has[dropdown]]\"\n  variable=\"dropdown\"\n\n><$set\n\n  name=\"dropdown-state\"\n  value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n  popup=<<dropdown-state>>\n  class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n  selectedClass=\"tc-selected\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button><$reveal\n\n  state=<<dropdown-state>>\n  type=\"popup\"\n  position=\"below\"\n  animate=\"yes\"\n  tag=\"span\"\n\n><div\n\n  class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n  tiddler={{!!dropdown}}\n  mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n  name=\"buttonClasses\"\n  value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
        },
        "$:/core/ui/EditTemplate/body": {
            "title": "$:/core/ui/EditTemplate/body",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
        },
        "$:/core/ui/EditTemplate/controls": {
            "title": "$:/core/ui/EditTemplate/controls",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
        },
        "$:/core/ui/EditTemplate/fields": {
            "title": "$:/core/ui/EditTemplate/fields",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name-wrapper input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\define cancel-search-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit tc-big-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\"  variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</$set>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</$vars>\n</div>\n</$fieldmangler>\n"
        },
        "$:/core/ui/EditTemplate/shadow": {
            "title": "$:/core/ui/EditTemplate/shadow",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
        },
        "$:/core/ui/EditTemplate/tags": {
            "title": "$:/core/ui/EditTemplate/tags",
            "tags": "$:/tags/EditTemplate",
            "text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button class=\"tc-btn-invisible tc-remove-tag-button\"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[{!!title}]\"/>{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\" tagField=<<__tagField__>>/>\n\\end\n\n\\define edit-tags-template(tagField:\"tags\")\n\\whitespace trim\n<div class=\"tc-edit-tags\">\n<$list filter=\"[list[!!$tagField$]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>\n</$list>\n<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n<$macrocall $name=\"tag-picker\" tagField=<<__tagField__>>/>\n</$vars>\n</div>\n\\end\n<$set name=\"saveTiddler\" value=<<currentTiddler>>>\n<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate/title": {
            "title": "$:/core/ui/EditTemplate/title",
            "tags": "$:/tags/EditTemplate",
            "text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/EditTemplate/type": {
            "title": "$:/core/ui/EditTemplate/type",
            "tags": "$:/tags/EditTemplate",
            "first-search-filter": "[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-big-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter=\"[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate": {
            "title": "$:/core/ui/EditTemplate",
            "text": "\\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define cancel-delete-tiddler-actions(message)\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">> newFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">> newFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">> newTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">> typeInputTiddler=<<qualify \"$:/temp/Type/input\">> typeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">>>\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
        },
        "$:/core/ui/Buttons/cancel": {
            "title": "$:/core/ui/Buttons/cancel",
            "tags": "$:/tags/EditToolbar",
            "caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
            "description": "{{$:/language/Buttons/Cancel/Hint}}",
            "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/delete": {
            "title": "$:/core/ui/Buttons/delete",
            "tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
            "caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
            "description": "{{$:/language/Buttons/Delete/Hint}}",
            "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/save": {
            "title": "$:/core/ui/Buttons/save",
            "tags": "$:/tags/EditToolbar",
            "caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
            "description": "{{$:/language/Buttons/Save/Hint}}",
            "text": "\\define save-tiddler-button()\n\\whitespace trim\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
        },
        "$:/core/ui/EditorToolbar/bold": {
            "title": "$:/core/ui/EditorToolbar/bold",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/bold",
            "caption": "{{$:/language/Buttons/Bold/Caption}}",
            "description": "{{$:/language/Buttons/Bold/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((bold))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/clear-dropdown": {
            "title": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/clear": {
            "title": "$:/core/ui/EditorToolbar/clear",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/erase",
            "caption": "{{$:/language/Buttons/Clear/Caption}}",
            "description": "{{$:/language/Buttons/Clear/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/editor-height-dropdown": {
            "title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
        },
        "$:/core/ui/EditorToolbar/editor-height": {
            "title": "$:/core/ui/EditorToolbar/editor-height",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/fixed-height",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
            "description": "{{$:/language/Buttons/EditorHeight/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/excise-dropdown": {
            "title": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/excise": {
            "title": "$:/core/ui/EditorToolbar/excise",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/excise",
            "caption": "{{$:/language/Buttons/Excise/Caption}}",
            "description": "{{$:/language/Buttons/Excise/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
            "shortcuts": "((excise))",
            "dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/heading-1": {
            "title": "$:/core/ui/EditorToolbar/heading-1",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-1",
            "caption": "{{$:/language/Buttons/Heading1/Caption}}",
            "description": "{{$:/language/Buttons/Heading1/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((heading-1))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-2": {
            "title": "$:/core/ui/EditorToolbar/heading-2",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-2",
            "caption": "{{$:/language/Buttons/Heading2/Caption}}",
            "description": "{{$:/language/Buttons/Heading2/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-2))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-3": {
            "title": "$:/core/ui/EditorToolbar/heading-3",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-3",
            "caption": "{{$:/language/Buttons/Heading3/Caption}}",
            "description": "{{$:/language/Buttons/Heading3/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-3))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/core/ui/EditorToolbar/heading-4",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-4",
            "caption": "{{$:/language/Buttons/Heading4/Caption}}",
            "description": "{{$:/language/Buttons/Heading4/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-4))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/core/ui/EditorToolbar/heading-5",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-5",
            "caption": "{{$:/language/Buttons/Heading5/Caption}}",
            "description": "{{$:/language/Buttons/Heading5/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-5))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/core/ui/EditorToolbar/heading-6",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-6",
            "caption": "{{$:/language/Buttons/Heading6/Caption}}",
            "description": "{{$:/language/Buttons/Heading6/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-6))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/italic": {
            "title": "$:/core/ui/EditorToolbar/italic",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/italic",
            "caption": "{{$:/language/Buttons/Italic/Caption}}",
            "description": "{{$:/language/Buttons/Italic/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((italic))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/line-width-dropdown": {
            "title": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/line-width": {
            "title": "$:/core/ui/EditorToolbar/line-width",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/line-width",
            "caption": "{{$:/language/Buttons/LineWidth/Caption}}",
            "description": "{{$:/language/Buttons/LineWidth/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"
        },
        "$:/core/ui/EditorToolbar/link-dropdown": {
            "title": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\define get-focus-selector() [data-tiddler-title=\"$(cssEscapedTitle)$\"] .tc-create-wikitext-link input\n\n\\define cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"wrap-selection\" prefix=\"\" suffix=\"\"/></$list>\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">> class=\"tc-create-wikitext-link\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/link": {
            "title": "$:/core/ui/EditorToolbar/link",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/link",
            "caption": "{{$:/language/Buttons/Link/Caption}}",
            "description": "{{$:/language/Buttons/Link/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((link))",
            "dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/linkify": {
            "title": "$:/core/ui/EditorToolbar/linkify",
            "caption": "{{$:/language/Buttons/Linkify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Linkify/Hint}}",
            "icon": "$:/core/images/linkify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((linkify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-bullet": {
            "title": "$:/core/ui/EditorToolbar/list-bullet",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-bullet",
            "caption": "{{$:/language/Buttons/ListBullet/Caption}}",
            "description": "{{$:/language/Buttons/ListBullet/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-bullet))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-number": {
            "title": "$:/core/ui/EditorToolbar/list-number",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-number",
            "caption": "{{$:/language/Buttons/ListNumber/Caption}}",
            "description": "{{$:/language/Buttons/ListNumber/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-number))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-block": {
            "title": "$:/core/ui/EditorToolbar/mono-block",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-block",
            "caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
            "description": "{{$:/language/Buttons/MonoBlock/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((mono-block))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-line": {
            "title": "$:/core/ui/EditorToolbar/mono-line",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-line",
            "caption": "{{$:/language/Buttons/MonoLine/Caption}}",
            "description": "{{$:/language/Buttons/MonoLine/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((mono-line))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/more-dropdown": {
            "title": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/more": {
            "title": "$:/core/ui/EditorToolbar/more",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/down-arrow",
            "caption": "{{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "condition": "[<targetTiddler>]",
            "dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/opacity-dropdown": {
            "title": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/opacity": {
            "title": "$:/core/ui/EditorToolbar/opacity",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/opacity",
            "caption": "{{$:/language/Buttons/Opacity/Caption}}",
            "description": "{{$:/language/Buttons/Opacity/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
        },
        "$:/core/ui/EditorToolbar/paint-dropdown": {
            "title": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/paint": {
            "title": "$:/core/ui/EditorToolbar/paint",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/paint",
            "caption": "{{$:/language/Buttons/Paint/Caption}}",
            "description": "{{$:/language/Buttons/Paint/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/picture-dropdown": {
            "title": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/picture": {
            "title": "$:/core/ui/EditorToolbar/picture",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/picture",
            "caption": "{{$:/language/Buttons/Picture/Caption}}",
            "description": "{{$:/language/Buttons/Picture/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((picture))",
            "dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/preview-type-dropdown": {
            "title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
            "text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/preview-type": {
            "title": "$:/core/ui/EditorToolbar/preview-type",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/chevron-down",
            "caption": "{{$:/language/Buttons/PreviewType/Caption}}",
            "description": "{{$:/language/Buttons/PreviewType/Hint}}",
            "condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
            "button-classes": "tc-text-editor-toolbar-item-adjunct",
            "dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
        },
        "$:/core/ui/EditorToolbar/preview": {
            "title": "$:/core/ui/EditorToolbar/preview",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/preview-open",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/Preview/Caption}}",
            "description": "{{$:/language/Buttons/Preview/Hint}}",
            "condition": "[<targetTiddler>]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((preview))",
            "text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/quote": {
            "title": "$:/core/ui/EditorToolbar/quote",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/quote",
            "caption": "{{$:/language/Buttons/Quote/Caption}}",
            "description": "{{$:/language/Buttons/Quote/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((quote))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/rotate-left": {
            "title": "$:/core/ui/EditorToolbar/rotate-left",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/rotate-left",
            "caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
            "description": "{{$:/language/Buttons/RotateLeft/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/size-dropdown": {
            "title": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> &times; <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/size": {
            "title": "$:/core/ui/EditorToolbar/size",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/size",
            "caption": "{{$:/language/Buttons/Size/Caption}}",
            "description": "{{$:/language/Buttons/Size/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/stamp-dropdown": {
            "title": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
        },
        "$:/core/ui/EditorToolbar/stamp": {
            "title": "$:/core/ui/EditorToolbar/stamp",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/stamp",
            "caption": "{{$:/language/Buttons/Stamp/Caption}}",
            "description": "{{$:/language/Buttons/Stamp/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "shortcuts": "((stamp))",
            "dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/strikethrough": {
            "title": "$:/core/ui/EditorToolbar/strikethrough",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/strikethrough",
            "caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
            "description": "{{$:/language/Buttons/Strikethrough/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((strikethrough))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/subscript": {
            "title": "$:/core/ui/EditorToolbar/subscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/subscript",
            "caption": "{{$:/language/Buttons/Subscript/Caption}}",
            "description": "{{$:/language/Buttons/Subscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((subscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/superscript": {
            "title": "$:/core/ui/EditorToolbar/superscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/superscript",
            "caption": "{{$:/language/Buttons/Superscript/Caption}}",
            "description": "{{$:/language/Buttons/Superscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((superscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/transcludify": {
            "title": "$:/core/ui/EditorToolbar/transcludify",
            "caption": "{{$:/language/Buttons/Transcludify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Transcludify/Hint}}",
            "icon": "$:/core/images/transcludify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((transcludify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/underline": {
            "title": "$:/core/ui/EditorToolbar/underline",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/underline",
            "caption": "{{$:/language/Buttons/Underline/Caption}}",
            "description": "{{$:/language/Buttons/Underline/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((underline))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
        },
        "$:/core/Filters/AllTags": {
            "title": "$:/core/Filters/AllTags",
            "tags": "$:/tags/Filter",
            "filter": "[tags[]!is[system]sort[title]]",
            "description": "{{$:/language/Filters/AllTags}}",
            "text": ""
        },
        "$:/core/Filters/AllTiddlers": {
            "title": "$:/core/Filters/AllTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]sort[title]]",
            "description": "{{$:/language/Filters/AllTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/Drafts": {
            "title": "$:/core/Filters/Drafts",
            "tags": "$:/tags/Filter",
            "filter": "[has[draft.of]sort[title]]",
            "description": "{{$:/language/Filters/Drafts}}",
            "text": ""
        },
        "$:/core/Filters/Missing": {
            "title": "$:/core/Filters/Missing",
            "tags": "$:/tags/Filter",
            "filter": "[all[missing]sort[title]]",
            "description": "{{$:/language/Filters/Missing}}",
            "text": ""
        },
        "$:/core/Filters/Orphans": {
            "title": "$:/core/Filters/Orphans",
            "tags": "$:/tags/Filter",
            "filter": "[all[orphans]sort[title]]",
            "description": "{{$:/language/Filters/Orphans}}",
            "text": ""
        },
        "$:/core/Filters/OverriddenShadowTiddlers": {
            "title": "$:/core/Filters/OverriddenShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[is[shadow]]",
            "description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/RecentSystemTiddlers": {
            "title": "$:/core/Filters/RecentSystemTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[has[modified]!sort[modified]limit[50]]",
            "description": "{{$:/language/Filters/RecentSystemTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/RecentTiddlers": {
            "title": "$:/core/Filters/RecentTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
            "description": "{{$:/language/Filters/RecentTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/SessionTiddlers": {
            "title": "$:/core/Filters/SessionTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[haschanged[]]",
            "description": "{{$:/language/Filters/SessionTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/ShadowTiddlers": {
            "title": "$:/core/Filters/ShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows]sort[title]]",
            "description": "{{$:/language/Filters/ShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/StoryList": {
            "title": "$:/core/Filters/StoryList",
            "tags": "$:/tags/Filter",
            "filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
            "description": "{{$:/language/Filters/StoryList}}",
            "text": ""
        },
        "$:/core/Filters/SystemTags": {
            "title": "$:/core/Filters/SystemTags",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
            "description": "{{$:/language/Filters/SystemTags}}",
            "text": ""
        },
        "$:/core/Filters/SystemTiddlers": {
            "title": "$:/core/Filters/SystemTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[is[system]sort[title]]",
            "description": "{{$:/language/Filters/SystemTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/TypedTiddlers": {
            "title": "$:/core/Filters/TypedTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Filters/TypedTiddlers}}",
            "text": ""
        },
        "$:/core/ui/ImportListing": {
            "title": "$:/core/ui/ImportListing",
            "text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n<td colspan=\"3\">\n<div class=\"tc-flex\">\n<$edit-text tiddler=<<newImportTitleTiddler>>  default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/><span class=\"tc-small-gap-left\"><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class=\"tc-small-gap-right\"/></span><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button>\n</div>\n</td>\n</$reveal>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Diff": {
            "title": "$:/core/ui/ImportPreviews/Diff",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Diff}}",
            "text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
        },
        "$:/core/ui/ImportPreviews/DiffFields": {
            "title": "$:/core/ui/ImportPreviews/DiffFields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
            "text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
        },
        "$:/core/ui/ImportPreviews/Fields": {
            "title": "$:/core/ui/ImportPreviews/Fields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Fields}}",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Text": {
            "title": "$:/core/ui/ImportPreviews/Text",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Text}}",
            "text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
        },
        "$:/core/ui/ImportPreviews/TextRaw": {
            "title": "$:/core/ui/ImportPreviews/TextRaw",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
            "text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
        },
        "$:/core/ui/KeyboardShortcuts/advanced-search": {
            "title": "$:/core/ui/KeyboardShortcuts/advanced-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((advanced-search))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/change-sidebar-layout": {
            "title": "$:/core/ui/KeyboardShortcuts/change-sidebar-layout",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((change-sidebar-layout))",
            "text": "<$list filter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\" \nemptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fixed-fluid\"/>\"\"\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-image": {
            "title": "$:/core/ui/KeyboardShortcuts/new-image",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-image))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-journal": {
            "title": "$:/core/ui/KeyboardShortcuts/new-journal",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-journal))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-tiddler": {
            "title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-tiddler))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/save-wiki": {
            "title": "$:/core/ui/KeyboardShortcuts/save-wiki",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((save-wiki))",
            "text": "<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n"
        },
        "$:/core/ui/KeyboardShortcuts/sidebar-search": {
            "title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((sidebar-search))",
            "text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
        },
        "$:/core/ui/KeyboardShortcuts/switcher": {
            "title": "$:/core/ui/KeyboardShortcuts/switcher",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((layout-switcher))",
            "text": "<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"
        },
        "$:/core/ui/KeyboardShortcuts/toggle-sidebar": {
            "title": "$:/core/ui/KeyboardShortcuts/toggle-sidebar",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((toggle-sidebar))",
            "text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
        },
        "$:/snippets/LayoutSwitcher": {
            "title": "$:/snippets/LayoutSwitcher",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/LayoutSwitcher/Caption}}",
            "text": "<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list filter=\"[{$:/layout}!has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/core/ui/ListItemTemplate": {
            "title": "$:/core/ui/ListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
        },
        "$:/Manager/ItemMain/Fields": {
            "title": "$:/Manager/ItemMain/Fields",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/Fields}}",
            "text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/Manager/ItemMain/RawText": {
            "title": "$:/Manager/ItemMain/RawText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/RawText}}",
            "text": "<pre><code><$view/></code></pre>\n"
        },
        "$:/Manager/ItemMain/WikifiedText": {
            "title": "$:/Manager/ItemMain/WikifiedText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/WikifiedText}}",
            "text": "<$transclude mode=\"block\"/>\n"
        },
        "$:/Manager/ItemSidebar/Colour": {
            "title": "$:/Manager/ItemSidebar/Colour",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Colour}}",
            "text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Icon": {
            "title": "$:/Manager/ItemSidebar/Icon",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Icon}}",
            "text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tags": {
            "title": "$:/Manager/ItemSidebar/Tags",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tags}}",
            "text": "\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tools": {
            "title": "$:/Manager/ItemSidebar/Tools",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tools}}",
            "text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
        },
        "$:/Manager": {
            "title": "$:/Manager",
            "icon": "$:/core/images/list",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
        },
        "$:/core/ui/MissingTemplate": {
            "title": "$:/core/ui/MissingTemplate",
            "text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
        },
        "$:/core/ui/MoreSideBar/All": {
            "title": "$:/core/ui/MoreSideBar/All",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/All/Caption}}",
            "text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Drafts": {
            "title": "$:/core/ui/MoreSideBar/Drafts",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Drafts/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Explorer": {
            "title": "$:/core/ui/MoreSideBar/Explorer",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Explorer/Caption}}",
            "text": "<<tree \"$:/\">>\n"
        },
        "$:/core/ui/MoreSideBar/Missing": {
            "title": "$:/core/ui/MoreSideBar/Missing",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Missing/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Orphans": {
            "title": "$:/core/ui/MoreSideBar/Orphans",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Orphans/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Recent": {
            "title": "$:/core/ui/MoreSideBar/Recent",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Recent/Caption}}",
            "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Shadows": {
            "title": "$:/core/ui/MoreSideBar/Shadows",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Shadows/Caption}}",
            "text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/System": {
            "title": "$:/core/ui/MoreSideBar/System",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/System/Caption}}",
            "text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Tags": {
            "title": "$:/core/ui/MoreSideBar/Tags",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Tags/Caption}}",
            "text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
        },
        "$:/core/ui/MoreSideBar/Types": {
            "title": "$:/core/ui/MoreSideBar/Types",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Types/Caption}}",
            "text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Languages": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Languages",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Theme": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Theme",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/Buttons/advanced-search": {
            "title": "$:/core/ui/Buttons/advanced-search",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
            "description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
            "text": "\\whitespace trim\n\\define advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/close-all": {
            "title": "$:/core/ui/Buttons/close-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
            "description": "{{$:/language/Buttons/CloseAll/Hint}}",
            "text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/control-panel": {
            "title": "$:/core/ui/Buttons/control-panel",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
            "description": "{{$:/language/Buttons/ControlPanel/Hint}}",
            "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/encryption": {
            "title": "$:/core/ui/Buttons/encryption",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
            "description": "{{$:/language/Buttons/Encryption/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/export-page": {
            "title": "$:/core/ui/Buttons/export-page",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
            "description": "{{$:/language/Buttons/ExportPage/Hint}}",
            "text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
        },
        "$:/core/ui/Buttons/fold-all": {
            "title": "$:/core/ui/Buttons/fold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
            "description": "{{$:/language/Buttons/FoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/full-screen": {
            "title": "$:/core/ui/Buttons/full-screen",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
            "description": "{{$:/language/Buttons/FullScreen/Hint}}",
            "text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/home": {
            "title": "$:/core/ui/Buttons/home",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
            "description": "{{$:/language/Buttons/Home/Hint}}",
            "text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/import": {
            "title": "$:/core/ui/Buttons/import",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
            "description": "{{$:/language/Buttons/Import/Hint}}",
            "text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
        },
        "$:/core/ui/Buttons/language": {
            "title": "$:/core/ui/Buttons/language",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
            "description": "{{$:/language/Buttons/Language/Hint}}",
            "text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/manager": {
            "title": "$:/core/ui/Buttons/manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
            "description": "{{$:/language/Buttons/Manager/Hint}}",
            "text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/more-page-actions": {
            "title": "$:/core/ui/Buttons/more-page-actions",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
        },
        "$:/core/ui/Buttons/new-image": {
            "title": "$:/core/ui/Buttons/new-image",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
            "description": "{{$:/language/Buttons/NewImage/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/new-journal": {
            "title": "$:/core/ui/Buttons/new-journal",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
            "description": "{{$:/language/Buttons/NewJournal/Hint}}",
            "text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
        },
        "$:/core/ui/Buttons/new-tiddler": {
            "title": "$:/core/ui/Buttons/new-tiddler",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
            "description": "{{$:/language/Buttons/NewTiddler/Hint}}",
            "text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/palette": {
            "title": "$:/core/ui/Buttons/palette",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
            "description": "{{$:/language/Buttons/Palette/Hint}}",
            "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/print": {
            "title": "$:/core/ui/Buttons/print",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
            "description": "{{$:/language/Buttons/Print/Hint}}",
            "text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/refresh": {
            "title": "$:/core/ui/Buttons/refresh",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
            "description": "{{$:/language/Buttons/Refresh/Hint}}",
            "text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/save-wiki": {
            "title": "$:/core/ui/Buttons/save-wiki",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
            "description": "{{$:/language/Buttons/SaveWiki/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
        },
        "$:/core/ui/Buttons/storyview": {
            "title": "$:/core/ui/Buttons/storyview",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
            "description": "{{$:/language/Buttons/StoryView/Hint}}",
            "text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/tag-manager": {
            "title": "$:/core/ui/Buttons/tag-manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
            "description": "{{$:/language/Buttons/TagManager/Hint}}",
            "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/theme": {
            "title": "$:/core/ui/Buttons/theme",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
            "description": "{{$:/language/Buttons/Theme/Hint}}",
            "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/timestamp": {
            "title": "$:/core/ui/Buttons/timestamp",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
            "description": "{{$:/language/Buttons/Timestamp/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/unfold-all": {
            "title": "$:/core/ui/Buttons/unfold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
            "description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/PageTemplate/pagecontrols": {
            "title": "$:/core/ui/PageTemplate/pagecontrols",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
        },
        "$:/core/ui/PageStylesheet": {
            "title": "$:/core/ui/PageStylesheet",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/PageTemplate/alerts": {
            "title": "$:/core/ui/PageTemplate/alerts",
            "tags": "$:/tags/PageTemplate",
            "text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
        },
        "$:/core/ui/PageTemplate/drafts": {
            "title": "$:/core/ui/PageTemplate/drafts",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/PageTemplate/pluginreloadwarning": {
            "title": "$:/core/ui/PageTemplate/pluginreloadwarning",
            "tags": "$:/tags/PageTemplate",
            "text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
        },
        "$:/core/ui/PageTemplate/sidebar": {
            "title": "$:/core/ui/PageTemplate/sidebar",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
        },
        "$:/core/ui/PageTemplate/story": {
            "title": "$:/core/ui/PageTemplate/story",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
        },
        "$:/core/ui/PageTemplate/topleftbar": {
            "title": "$:/core/ui/PageTemplate/topleftbar",
            "tags": "$:/tags/PageTemplate",
            "text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate/toprightbar": {
            "title": "$:/core/ui/PageTemplate/toprightbar",
            "tags": "$:/tags/PageTemplate",
            "text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate": {
            "title": "$:/core/ui/PageTemplate",
            "name": "{{$:/language/PageTemplate/Name}}",
            "description": "{{$:/language/PageTemplate/Description}}",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
        },
        "$:/PaletteManager": {
            "title": "$:/PaletteManager",
            "text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\n"
        },
        "$:/core/ui/PluginInfo": {
            "title": "$:/core/ui/PluginInfo",
            "text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
        },
        "$:/core/ui/PluginInfo/Default/contents": {
            "title": "$:/core/ui/PluginInfo/Default/contents",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
        },
        "$:/core/ui/PluginListItemTemplate": {
            "title": "$:/core/ui/PluginListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
        },
        "$:/core/ui/RootTemplate": {
            "title": "$:/core/ui/RootTemplate",
            "text": "<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n"
        },
        "$:/core/ui/SearchResults": {
            "title": "$:/core/ui/SearchResults",
            "text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n"
        },
        "$:/core/ui/SideBar/More": {
            "title": "$:/core/ui/SideBar/More",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/More/Caption}}",
            "text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"
        },
        "$:/core/ui/SideBar/Open": {
            "title": "$:/core/ui/SideBar/Open",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Open/Caption}}",
            "text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini tc-small-gap-right\">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
        },
        "$:/core/ui/SideBar/Recent": {
            "title": "$:/core/ui/SideBar/Recent",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Recent/Caption}}",
            "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
        },
        "$:/core/ui/SideBar/Tools": {
            "title": "$:/core/ui/SideBar/Tools",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Tools/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/SideBarLists": {
            "title": "$:/core/ui/SideBarLists",
            "text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
        },
        "$:/core/ui/SideBarSegments/page-controls": {
            "title": "$:/core/ui/SideBarSegments/page-controls",
            "tags": "$:/tags/SideBarSegment",
            "text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
        },
        "$:/core/ui/SideBarSegments/search": {
            "title": "$:/core/ui/SideBarSegments/search",
            "tags": "$:/tags/SideBarSegment",
            "text": "\\whitespace trim\n\n\\define count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\define search-results-list()\n\\whitespace trim\n<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-subtitle": {
            "title": "$:/core/ui/SideBarSegments/site-subtitle",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-title": {
            "title": "$:/core/ui/SideBarSegments/site-title",
            "tags": "$:/tags/SideBarSegment",
            "text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
        },
        "$:/core/ui/SideBarSegments/tabs": {
            "title": "$:/core/ui/SideBarSegments/tabs",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"
        },
        "$:/core/ui/SwitcherModal": {
            "title": "$:/core/ui/SwitcherModal",
            "subtitle": "<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>",
            "class": "tc-modal-centered",
            "text": "<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"
        },
        "$:/TagManager": {
            "title": "$:/TagManager",
            "icon": "$:/core/images/tag-button",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TagPickerTagTemplate": {
            "title": "$:/core/ui/TagPickerTagTemplate",
            "text": "\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$list filter=\"[<saveTiddler>minlength[1]]\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n</$list>\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$list filter=\"[<refreshTitle>minlength[1]]\">\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n<<actions>>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<$wikify name=\"foregroundColor\" text=\"\"\"<$macrocall $name=\"contrastcolour\" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\">\n<span class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n<$transclude tiddler={{!!icon}}/><$view field=\"title\" format=\"text\"/>\n</span>\n</$wikify>\n</$set>\n</$button>\n"
        },
        "$:/core/ui/TagTemplate": {
            "title": "$:/core/ui/TagTemplate",
            "text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
        },
        "$:/core/ui/TiddlerFieldTemplate": {
            "title": "$:/core/ui/TiddlerFieldTemplate",
            "text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
        },
        "$:/core/ui/TiddlerFields": {
            "title": "$:/core/ui/TiddlerFields",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced": {
            "title": "$:/core/ui/TiddlerInfo/Advanced",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
            "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Fields": {
            "title": "$:/core/ui/TiddlerInfo/Fields",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
            "text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/List": {
            "title": "$:/core/ui/TiddlerInfo/List",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/List/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/Listed": {
            "title": "$:/core/ui/TiddlerInfo/Listed",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/References": {
            "title": "$:/core/ui/TiddlerInfo/References",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/References/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
        },
        "$:/core/ui/TiddlerInfo/Tagging": {
            "title": "$:/core/ui/TiddlerInfo/Tagging",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/Tools": {
            "title": "$:/core/ui/TiddlerInfo/Tools",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo": {
            "title": "$:/core/ui/TiddlerInfo",
            "text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n"
        },
        "$:/core/ui/TopBar/menu": {
            "title": "$:/core/ui/TopBar/menu",
            "tags": "$:/tags/TopRightBar",
            "text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
        },
        "$:/core/ui/UntaggedTemplate": {
            "title": "$:/core/ui/UntaggedTemplate",
            "text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/body": {
            "title": "$:/core/ui/ViewTemplate/body",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/classic": {
            "title": "$:/core/ui/ViewTemplate/classic",
            "tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/import": {
            "title": "$:/core/ui/ViewTemplate/import",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/plugin": {
            "title": "$:/core/ui/ViewTemplate/plugin",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-plugin-info\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n</$reveal>"
        },
        "$:/core/ui/ViewTemplate/subtitle": {
            "title": "$:/core/ui/ViewTemplate/subtitle",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/tags": {
            "title": "$:/core/ui/ViewTemplate/tags",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/title": {
            "title": "$:/core/ui/ViewTemplate/title",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<$list filter=\"[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]\">\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$list>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
        },
        "$:/core/ui/ViewTemplate/unfold": {
            "title": "$:/core/ui/ViewTemplate/unfold",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate": {
            "title": "$:/core/ui/ViewTemplate",
            "text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
        },
        "$:/core/ui/Buttons/clone": {
            "title": "$:/core/ui/Buttons/clone",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
            "description": "{{$:/language/Buttons/Clone/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/close-others": {
            "title": "$:/core/ui/Buttons/close-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
            "description": "{{$:/language/Buttons/CloseOthers/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/close": {
            "title": "$:/core/ui/Buttons/close",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
            "description": "{{$:/language/Buttons/Close/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/edit": {
            "title": "$:/core/ui/Buttons/edit",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
            "description": "{{$:/language/Buttons/Edit/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/export-tiddler": {
            "title": "$:/core/ui/Buttons/export-tiddler",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
            "description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
            "text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
        },
        "$:/core/ui/Buttons/fold-bar": {
            "title": "$:/core/ui/Buttons/fold-bar",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
            "description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
            "text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
        },
        "$:/core/ui/Buttons/fold-others": {
            "title": "$:/core/ui/Buttons/fold-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
            "description": "{{$:/language/Buttons/FoldOthers/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/fold": {
            "title": "$:/core/ui/Buttons/fold",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
            "description": "{{$:/language/Buttons/Fold/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/info": {
            "title": "$:/core/ui/Buttons/info",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
            "description": "{{$:/language/Buttons/Info/Hint}}",
            "text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
        },
        "$:/core/ui/Buttons/more-tiddler-actions": {
            "title": "$:/core/ui/Buttons/more-tiddler-actions",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
        },
        "$:/core/ui/Buttons/new-here": {
            "title": "$:/core/ui/Buttons/new-here",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
            "description": "{{$:/language/Buttons/NewHere/Hint}}",
            "text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
        },
        "$:/core/ui/Buttons/new-journal-here": {
            "title": "$:/core/ui/Buttons/new-journal-here",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
            "description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
            "text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
        },
        "$:/core/ui/Buttons/open-window": {
            "title": "$:/core/ui/Buttons/open-window",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
            "description": "{{$:/language/Buttons/OpenWindow/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/permalink": {
            "title": "$:/core/ui/Buttons/permalink",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
            "description": "{{$:/language/Buttons/Permalink/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/permaview": {
            "title": "$:/core/ui/Buttons/permaview",
            "tags": "$:/tags/ViewToolbar $:/tags/PageControls",
            "caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
            "description": "{{$:/language/Buttons/Permaview/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/DefaultTiddlers": {
            "title": "$:/DefaultTiddlers",
            "text": "GettingStarted\n"
        },
        "$:/temp/advancedsearch": {
            "title": "$:/temp/advancedsearch",
            "text": ""
        },
        "$:/snippets/allfields": {
            "title": "$:/snippets/allfields",
            "text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
        },
        "$:/config/AnimationDuration": {
            "title": "$:/config/AnimationDuration",
            "text": "400"
        },
        "$:/config/AutoFocus": {
            "title": "$:/config/AutoFocus",
            "text": "title"
        },
        "$:/config/AutoSave": {
            "title": "$:/config/AutoSave",
            "text": "yes"
        },
        "$:/config/BitmapEditor/Colour": {
            "title": "$:/config/BitmapEditor/Colour",
            "text": "#444"
        },
        "$:/config/BitmapEditor/ImageSizes": {
            "title": "$:/config/BitmapEditor/ImageSizes",
            "text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
        },
        "$:/config/BitmapEditor/LineWidth": {
            "title": "$:/config/BitmapEditor/LineWidth",
            "text": "3px"
        },
        "$:/config/BitmapEditor/LineWidths": {
            "title": "$:/config/BitmapEditor/LineWidths",
            "text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
        },
        "$:/config/BitmapEditor/Opacities": {
            "title": "$:/config/BitmapEditor/Opacities",
            "text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
        },
        "$:/config/BitmapEditor/Opacity": {
            "title": "$:/config/BitmapEditor/Opacity",
            "text": "1.0"
        },
        "$:/config/DefaultMoreSidebarTab": {
            "title": "$:/config/DefaultMoreSidebarTab",
            "text": "$:/core/ui/MoreSideBar/Tags"
        },
        "$:/config/DefaultSidebarTab": {
            "title": "$:/config/DefaultSidebarTab",
            "text": "$:/core/ui/SideBar/Open"
        },
        "$:/config/DownloadSaver/AutoSave": {
            "title": "$:/config/DownloadSaver/AutoSave",
            "text": "no"
        },
        "$:/config/Drafts/TypingTimeout": {
            "title": "$:/config/Drafts/TypingTimeout",
            "text": "400"
        },
        "$:/config/EditMode/fieldname-filter": {
            "title": "$:/config/EditMode/fieldname-filter",
            "first-search-filter": "[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type",
            "second-search-filter": "[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"
        },
        "$:/config/EditTabIndex": {
            "title": "$:/config/EditTabIndex",
            "text": "1\n"
        },
        "$:/config/EditTemplateFields/Visibility/title": {
            "title": "$:/config/EditTemplateFields/Visibility/title",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/tags": {
            "title": "$:/config/EditTemplateFields/Visibility/tags",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/text": {
            "title": "$:/config/EditTemplateFields/Visibility/text",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/creator": {
            "title": "$:/config/EditTemplateFields/Visibility/creator",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/created": {
            "title": "$:/config/EditTemplateFields/Visibility/created",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/modified": {
            "title": "$:/config/EditTemplateFields/Visibility/modified",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/modifier": {
            "title": "$:/config/EditTemplateFields/Visibility/modifier",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/type": {
            "title": "$:/config/EditTemplateFields/Visibility/type",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/draft.title": {
            "title": "$:/config/EditTemplateFields/Visibility/draft.title",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/draft.of": {
            "title": "$:/config/EditTemplateFields/Visibility/draft.of",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/revision": {
            "title": "$:/config/EditTemplateFields/Visibility/revision",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/bag": {
            "title": "$:/config/EditTemplateFields/Visibility/bag",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
            "text": "hide"
        },
        "$:/config/EditorTypeMappings/image/gif": {
            "title": "$:/config/EditorTypeMappings/image/gif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/webp": {
            "title": "$:/config/EditorTypeMappings/image/webp",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heic": {
            "title": "$:/config/EditorTypeMappings/image/heic",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heif": {
            "title": "$:/config/EditorTypeMappings/image/heif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/jpeg": {
            "title": "$:/config/EditorTypeMappings/image/jpeg",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/jpg": {
            "title": "$:/config/EditorTypeMappings/image/jpg",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/png": {
            "title": "$:/config/EditorTypeMappings/image/png",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/x-icon": {
            "title": "$:/config/EditorTypeMappings/image/x-icon",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
            "title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
            "text": "text"
        },
        "$:/config/Manager/Show": {
            "title": "$:/config/Manager/Show",
            "text": "tiddlers"
        },
        "$:/config/Manager/Filter": {
            "title": "$:/config/Manager/Filter",
            "text": ""
        },
        "$:/config/Manager/Order": {
            "title": "$:/config/Manager/Order",
            "text": "forward"
        },
        "$:/config/Manager/Sort": {
            "title": "$:/config/Manager/Sort",
            "text": "title"
        },
        "$:/config/Manager/System": {
            "title": "$:/config/Manager/System",
            "text": "system"
        },
        "$:/config/Manager/Tag": {
            "title": "$:/config/Manager/Tag",
            "text": ""
        },
        "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
            "title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
            "text": "hide"
        },
        "$:/config/MissingLinks": {
            "title": "$:/config/MissingLinks",
            "text": "yes"
        },
        "$:/config/Navigation/UpdateAddressBar": {
            "title": "$:/config/Navigation/UpdateAddressBar",
            "text": "no"
        },
        "$:/config/Navigation/UpdateHistory": {
            "title": "$:/config/Navigation/UpdateHistory",
            "text": "no"
        },
        "$:/config/NewImageType": {
            "title": "$:/config/NewImageType",
            "text": "jpeg"
        },
        "$:/config/OfficialPluginLibrary": {
            "title": "$:/config/OfficialPluginLibrary",
            "tags": "$:/tags/PluginLibrary",
            "url": "https://tiddlywiki.com/library/v5.1.23/index.html",
            "caption": "{{$:/language/OfficialPluginLibrary}}",
            "text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
        },
        "$:/config/Navigation/openLinkFromInsideRiver": {
            "title": "$:/config/Navigation/openLinkFromInsideRiver",
            "text": "below"
        },
        "$:/config/Navigation/openLinkFromOutsideRiver": {
            "title": "$:/config/Navigation/openLinkFromOutsideRiver",
            "text": "top"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
            "text": "hide"
        },
        "$:/config/Performance/Instrumentation": {
            "title": "$:/config/Performance/Instrumentation",
            "text": "no"
        },
        "$:/config/RegisterPluginType/plugin": {
            "title": "$:/config/RegisterPluginType/plugin",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/theme": {
            "title": "$:/config/RegisterPluginType/theme",
            "text": "no"
        },
        "$:/config/RegisterPluginType/language": {
            "title": "$:/config/RegisterPluginType/language",
            "text": "no"
        },
        "$:/config/RegisterPluginType/info": {
            "title": "$:/config/RegisterPluginType/info",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/import": {
            "title": "$:/config/RegisterPluginType/import",
            "text": "no"
        },
        "$:/config/SaveWikiButton/Template": {
            "title": "$:/config/SaveWikiButton/Template",
            "text": "$:/core/save/all"
        },
        "$:/config/SaverFilter": {
            "title": "$:/config/SaverFilter",
            "text": "[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/Search/AutoFocus": {
            "title": "$:/config/Search/AutoFocus",
            "text": "true"
        },
        "$:/config/Search/MinLength": {
            "title": "$:/config/Search/MinLength",
            "text": "3"
        },
        "$:/config/SearchResults/Default": {
            "title": "$:/config/SearchResults/Default",
            "text": "$:/core/ui/DefaultSearchResultList"
        },
        "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
            "title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
            "text": "yes"
        },
        "$:/config/ShortcutInfo/add-field": {
            "title": "$:/config/ShortcutInfo/add-field",
            "text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search": {
            "title": "$:/config/ShortcutInfo/advanced-search",
            "text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search-sidebar": {
            "title": "$:/config/ShortcutInfo/advanced-search-sidebar",
            "text": "{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/bold": {
            "title": "$:/config/ShortcutInfo/bold",
            "text": "{{$:/language/Buttons/Bold/Hint}}"
        },
        "$:/config/ShortcutInfo/cancel-edit-tiddler": {
            "title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
            "text": "{{$:/language/Buttons/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/change-sidebar-layout": {
            "title": "$:/config/ShortcutInfo/change-sidebar-layout",
            "text": "{{$:/language/Shortcuts/SidebarLayout/Hint}}"
        },
        "$:/config/ShortcutInfo/delete-field": {
            "title": "$:/config/ShortcutInfo/delete-field",
            "text": "{{$:/language/EditTemplate/Field/Remove/Hint}}"
        },
        "$:/config/ShortcutInfo/excise": {
            "title": "$:/config/ShortcutInfo/excise",
            "text": "{{$:/language/Buttons/Excise/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-1": {
            "title": "$:/config/ShortcutInfo/heading-1",
            "text": "{{$:/language/Buttons/Heading1/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-2": {
            "title": "$:/config/ShortcutInfo/heading-2",
            "text": "{{$:/language/Buttons/Heading2/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-3": {
            "title": "$:/config/ShortcutInfo/heading-3",
            "text": "{{$:/language/Buttons/Heading3/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-4": {
            "title": "$:/config/ShortcutInfo/heading-4",
            "text": "{{$:/language/Buttons/Heading4/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-5": {
            "title": "$:/config/ShortcutInfo/heading-5",
            "text": "{{$:/language/Buttons/Heading5/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-6": {
            "title": "$:/config/ShortcutInfo/heading-6",
            "text": "{{$:/language/Buttons/Heading6/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept": {
            "title": "$:/config/ShortcutInfo/input-accept",
            "text": "{{$:/language/Shortcuts/Input/Accept/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept-variant": {
            "title": "$:/config/ShortcutInfo/input-accept-variant",
            "text": "{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"
        },
        "$:/config/ShortcutInfo/input-cancel": {
            "title": "$:/config/ShortcutInfo/input-cancel",
            "text": "{{$:/language/Shortcuts/Input/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/input-down": {
            "title": "$:/config/ShortcutInfo/input-down",
            "text": "{{$:/language/Shortcuts/Input/Down/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-left": {
            "title": "$:/config/ShortcutInfo/input-tab-left",
            "text": "{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-right": {
            "title": "$:/config/ShortcutInfo/input-tab-right",
            "text": "{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"
        },
        "$:/config/ShortcutInfo/input-up": {
            "title": "$:/config/ShortcutInfo/input-up",
            "text": "{{$:/language/Shortcuts/Input/Up/Hint}}"
        },
        "$:/config/ShortcutInfo/italic": {
            "title": "$:/config/ShortcutInfo/italic",
            "text": "{{$:/language/Buttons/Italic/Hint}}"
        },
        "$:/config/ShortcutInfo/layout-switcher": {
            "title": "$:/config/ShortcutInfo/layout-switcher",
            "text": "{{$:/language/LayoutSwitcher/Description}}"
        },
        "$:/config/ShortcutInfo/link": {
            "title": "$:/config/ShortcutInfo/link",
            "text": "{{$:/language/Buttons/Link/Hint}}"
        },
        "$:/config/ShortcutInfo/linkify": {
            "title": "$:/config/ShortcutInfo/linkify",
            "text": "{{$:/language/Buttons/Linkify/Hint}}"
        },
        "$:/config/ShortcutInfo/list-bullet": {
            "title": "$:/config/ShortcutInfo/list-bullet",
            "text": "{{$:/language/Buttons/ListBullet/Hint}}"
        },
        "$:/config/ShortcutInfo/list-number": {
            "title": "$:/config/ShortcutInfo/list-number",
            "text": "{{$:/language/Buttons/ListNumber/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-block": {
            "title": "$:/config/ShortcutInfo/mono-block",
            "text": "{{$:/language/Buttons/MonoBlock/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-line": {
            "title": "$:/config/ShortcutInfo/mono-line",
            "text": "{{$:/language/Buttons/MonoLine/Hint}}"
        },
        "$:/config/ShortcutInfo/new-image": {
            "title": "$:/config/ShortcutInfo/new-image",
            "text": "{{$:/language/Buttons/NewImage/Hint}}"
        },
        "$:/config/ShortcutInfo/new-journal": {
            "title": "$:/config/ShortcutInfo/new-journal",
            "text": "{{$:/language/Buttons/NewJournal/Hint}}"
        },
        "$:/config/ShortcutInfo/new-tiddler": {
            "title": "$:/config/ShortcutInfo/new-tiddler",
            "text": "{{$:/language/Buttons/NewTiddler/Hint}}"
        },
        "$:/config/ShortcutInfo/picture": {
            "title": "$:/config/ShortcutInfo/picture",
            "text": "{{$:/language/Buttons/Picture/Hint}}"
        },
        "$:/config/ShortcutInfo/preview": {
            "title": "$:/config/ShortcutInfo/preview",
            "text": "{{$:/language/Buttons/Preview/Hint}}"
        },
        "$:/config/ShortcutInfo/quote": {
            "title": "$:/config/ShortcutInfo/quote",
            "text": "{{$:/language/Buttons/Quote/Hint}}"
        },
        "$:/config/ShortcutInfo/save-tiddler": {
            "title": "$:/config/ShortcutInfo/save-tiddler",
            "text": "{{$:/language/Buttons/Save/Hint}}"
        },
        "$:/config/ShortcutInfo/save-wiki": {
            "title": "$:/config/ShortcutInfo/save-wiki",
            "text": "{{$:/language/Buttons/SaveWiki/Hint}}"
        },
        "$:/config/ShortcutInfo/sidebar-search": {
            "title": "$:/config/ShortcutInfo/sidebar-search",
            "text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/stamp": {
            "title": "$:/config/ShortcutInfo/stamp",
            "text": "{{$:/language/Buttons/Stamp/Hint}}"
        },
        "$:/config/ShortcutInfo/strikethrough": {
            "title": "$:/config/ShortcutInfo/strikethrough",
            "text": "{{$:/language/Buttons/Strikethrough/Hint}}"
        },
        "$:/config/ShortcutInfo/subscript": {
            "title": "$:/config/ShortcutInfo/subscript",
            "text": "{{$:/language/Buttons/Subscript/Hint}}"
        },
        "$:/config/ShortcutInfo/superscript": {
            "title": "$:/config/ShortcutInfo/superscript",
            "text": "{{$:/language/Buttons/Superscript/Hint}}"
        },
        "$:/config/ShortcutInfo/toggle-sidebar": {
            "title": "$:/config/ShortcutInfo/toggle-sidebar",
            "text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
        },
        "$:/config/ShortcutInfo/transcludify": {
            "title": "$:/config/ShortcutInfo/transcludify",
            "text": "{{$:/language/Buttons/Transcludify/Hint}}"
        },
        "$:/config/ShortcutInfo/underline": {
            "title": "$:/config/ShortcutInfo/underline",
            "text": "{{$:/language/Buttons/Underline/Hint}}"
        },
        "$:/config/SwitcherTargets/layout": {
            "title": "$:/config/SwitcherTargets/layout",
            "text": "$:/snippets/LayoutSwitcher"
        },
        "$:/config/SwitcherTargets/language": {
            "title": "$:/config/SwitcherTargets/language",
            "text": "$:/snippets/languageswitcher"
        },
        "$:/config/SwitcherTargets/palette": {
            "title": "$:/config/SwitcherTargets/palette",
            "text": "$:/core/ui/ControlPanel/Palette"
        },
        "$:/config/SwitcherTargets/theme": {
            "title": "$:/config/SwitcherTargets/theme",
            "text": "$:/core/ui/ControlPanel/Theme"
        },
        "$:/config/SyncFilter": {
            "title": "$:/config/SyncFilter",
            "text": "[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/SyncSystemTiddlersFromServer": {
            "title": "$:/config/SyncSystemTiddlersFromServer",
            "text": "no"
        },
        "$:/config/Tags/MinLength": {
            "title": "$:/config/Tags/MinLength",
            "text": "0"
        },
        "$:/config/TextEditor/EditorHeight/Height": {
            "title": "$:/config/TextEditor/EditorHeight/Height",
            "text": "400px"
        },
        "$:/config/TextEditor/EditorHeight/Mode": {
            "title": "$:/config/TextEditor/EditorHeight/Mode",
            "text": "auto"
        },
        "$:/config/TiddlerInfo/Default": {
            "title": "$:/config/TiddlerInfo/Default",
            "text": "$:/core/ui/TiddlerInfo/Fields"
        },
        "$:/config/TiddlerInfo/Mode": {
            "title": "$:/config/TiddlerInfo/Mode",
            "text": "popup"
        },
        "$:/config/Tiddlers/TitleLinks": {
            "title": "$:/config/Tiddlers/TitleLinks",
            "text": "no"
        },
        "$:/config/Toolbar/ButtonClass": {
            "title": "$:/config/Toolbar/ButtonClass",
            "text": "tc-btn-invisible"
        },
        "$:/config/Toolbar/Icons": {
            "title": "$:/config/Toolbar/Icons",
            "text": "yes"
        },
        "$:/config/Toolbar/Text": {
            "title": "$:/config/Toolbar/Text",
            "text": "no"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
            "text": "show"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
            "text": "hide"
        },
        "$:/config/shortcuts-mac/bold": {
            "title": "$:/config/shortcuts-mac/bold",
            "text": "meta-B"
        },
        "$:/config/shortcuts-mac/input-tab-left": {
            "title": "$:/config/shortcuts-mac/input-tab-left",
            "text": "ctrl-Left"
        },
        "$:/config/shortcuts-mac/input-tab-right": {
            "title": "$:/config/shortcuts-mac/input-tab-right",
            "text": "ctrl-Right"
        },
        "$:/config/shortcuts-mac/italic": {
            "title": "$:/config/shortcuts-mac/italic",
            "text": "meta-I"
        },
        "$:/config/shortcuts-mac/underline": {
            "title": "$:/config/shortcuts-mac/underline",
            "text": "meta-U"
        },
        "$:/config/shortcuts-mac/new-image": {
            "title": "$:/config/shortcuts-mac/new-image",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-mac/new-journal": {
            "title": "$:/config/shortcuts-mac/new-journal",
            "text": "ctrl-J"
        },
        "$:/config/shortcuts-mac/new-tiddler": {
            "title": "$:/config/shortcuts-mac/new-tiddler",
            "text": "ctrl-N"
        },
        "$:/config/shortcuts-mac/save-wiki": {
            "title": "$:/config/shortcuts-mac/save-wiki",
            "text": "meta-S"
        },
        "$:/config/shortcuts-not-mac/bold": {
            "title": "$:/config/shortcuts-not-mac/bold",
            "text": "ctrl-B"
        },
        "$:/config/shortcuts-not-mac/italic": {
            "title": "$:/config/shortcuts-not-mac/italic",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-not-mac/underline": {
            "title": "$:/config/shortcuts-not-mac/underline",
            "text": "ctrl-U"
        },
        "$:/config/shortcuts-not-mac/new-image": {
            "title": "$:/config/shortcuts-not-mac/new-image",
            "text": "alt-I"
        },
        "$:/config/shortcuts-not-mac/new-journal": {
            "title": "$:/config/shortcuts-not-mac/new-journal",
            "text": "alt-J"
        },
        "$:/config/shortcuts-not-mac/new-tiddler": {
            "title": "$:/config/shortcuts-not-mac/new-tiddler",
            "text": "alt-N"
        },
        "$:/config/shortcuts/add-field": {
            "title": "$:/config/shortcuts/add-field",
            "text": "enter"
        },
        "$:/config/shortcuts/advanced-search": {
            "title": "$:/config/shortcuts/advanced-search",
            "text": "ctrl-shift-A"
        },
        "$:/config/shortcuts/advanced-search-sidebar": {
            "title": "$:/config/shortcuts/advanced-search-sidebar",
            "text": "alt-Enter"
        },
        "$:/config/shortcuts/cancel-edit-tiddler": {
            "title": "$:/config/shortcuts/cancel-edit-tiddler",
            "text": "escape"
        },
        "$:/config/shortcuts/change-sidebar-layout": {
            "title": "$:/config/shortcuts/change-sidebar-layout",
            "text": "shift-alt-Down"
        },
        "$:/config/shortcuts/delete-field": {
            "title": "$:/config/shortcuts/delete-field",
            "text": "shift-alt-D"
        },
        "$:/config/shortcuts/excise": {
            "title": "$:/config/shortcuts/excise",
            "text": "ctrl-E"
        },
        "$:/config/shortcuts/sidebar-search": {
            "title": "$:/config/shortcuts/sidebar-search",
            "text": "ctrl-shift-F"
        },
        "$:/config/shortcuts/heading-1": {
            "title": "$:/config/shortcuts/heading-1",
            "text": "ctrl-1"
        },
        "$:/config/shortcuts/heading-2": {
            "title": "$:/config/shortcuts/heading-2",
            "text": "ctrl-2"
        },
        "$:/config/shortcuts/heading-3": {
            "title": "$:/config/shortcuts/heading-3",
            "text": "ctrl-3"
        },
        "$:/config/shortcuts/heading-4": {
            "title": "$:/config/shortcuts/heading-4",
            "text": "ctrl-4"
        },
        "$:/config/shortcuts/heading-5": {
            "title": "$:/config/shortcuts/heading-5",
            "text": "ctrl-5"
        },
        "$:/config/shortcuts/heading-6": {
            "title": "$:/config/shortcuts/heading-6",
            "text": "ctrl-6"
        },
        "$:/config/shortcuts/input-accept": {
            "title": "$:/config/shortcuts/input-accept",
            "text": "Enter"
        },
        "$:/config/shortcuts/input-accept-variant": {
            "title": "$:/config/shortcuts/input-accept-variant",
            "text": "ctrl-Enter"
        },
        "$:/config/shortcuts/input-cancel": {
            "title": "$:/config/shortcuts/input-cancel",
            "text": "Escape"
        },
        "$:/config/shortcuts/input-down": {
            "title": "$:/config/shortcuts/input-down",
            "text": "Down"
        },
        "$:/config/shortcuts/input-tab-left": {
            "title": "$:/config/shortcuts/input-tab-left",
            "text": "alt-Left"
        },
        "$:/config/shortcuts/input-tab-right": {
            "title": "$:/config/shortcuts/input-tab-right",
            "text": "alt-Right"
        },
        "$:/config/shortcuts/input-up": {
            "title": "$:/config/shortcuts/input-up",
            "text": "Up"
        },
        "$:/config/shortcuts/layout-switcher": {
            "title": "$:/config/shortcuts/layout-switcher",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/link": {
            "title": "$:/config/shortcuts/link",
            "text": "ctrl-L"
        },
        "$:/config/shortcuts/linkify": {
            "title": "$:/config/shortcuts/linkify",
            "text": "alt-shift-L"
        },
        "$:/config/shortcuts/list-bullet": {
            "title": "$:/config/shortcuts/list-bullet",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/list-number": {
            "title": "$:/config/shortcuts/list-number",
            "text": "ctrl-shift-N"
        },
        "$:/config/shortcuts/mono-block": {
            "title": "$:/config/shortcuts/mono-block",
            "text": "ctrl-shift-M"
        },
        "$:/config/shortcuts/mono-line": {
            "title": "$:/config/shortcuts/mono-line",
            "text": "ctrl-M"
        },
        "$:/config/shortcuts/picture": {
            "title": "$:/config/shortcuts/picture",
            "text": "ctrl-shift-I"
        },
        "$:/config/shortcuts/preview": {
            "title": "$:/config/shortcuts/preview",
            "text": "alt-P"
        },
        "$:/config/shortcuts/quote": {
            "title": "$:/config/shortcuts/quote",
            "text": "ctrl-Q"
        },
        "$:/config/shortcuts/save-tiddler": {
            "title": "$:/config/shortcuts/save-tiddler",
            "text": "ctrl+enter"
        },
        "$:/config/shortcuts/save-wiki": {
            "title": "$:/config/shortcuts/save-wiki",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/stamp": {
            "title": "$:/config/shortcuts/stamp",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/strikethrough": {
            "title": "$:/config/shortcuts/strikethrough",
            "text": "ctrl-T"
        },
        "$:/config/shortcuts/subscript": {
            "title": "$:/config/shortcuts/subscript",
            "text": "ctrl-shift-B"
        },
        "$:/config/shortcuts/superscript": {
            "title": "$:/config/shortcuts/superscript",
            "text": "ctrl-shift-P"
        },
        "$:/config/shortcuts/toggle-sidebar": {
            "title": "$:/config/shortcuts/toggle-sidebar",
            "text": "alt-shift-S"
        },
        "$:/config/shortcuts/transcludify": {
            "title": "$:/config/shortcuts/transcludify",
            "text": "alt-shift-T"
        },
        "$:/config/ui/EditTemplate": {
            "title": "$:/config/ui/EditTemplate",
            "text": "$:/core/ui/EditTemplate"
        },
        "$:/config/ui/ViewTemplate": {
            "title": "$:/config/ui/ViewTemplate",
            "text": "$:/core/ui/ViewTemplate"
        },
        "$:/config/WikiParserRules/Inline/wikilink": {
            "title": "$:/config/WikiParserRules/Inline/wikilink",
            "text": "enable"
        },
        "$:/snippets/currpalettepreview": {
            "title": "$:/snippets/currpalettepreview",
            "text": "\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>\n"
        },
        "$:/snippets/download-wiki-button": {
            "title": "$:/snippets/download-wiki-button",
            "text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
        },
        "$:/language": {
            "title": "$:/language",
            "text": "$:/languages/en-GB"
        },
        "$:/snippets/languageswitcher": {
            "title": "$:/snippets/languageswitcher",
            "text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/macros/CSS": {
            "title": "$:/core/macros/CSS",
            "tags": "$:/tags/Macro",
            "text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n  -webkit-box-shadow: $shadow$;\n     -moz-box-shadow: $shadow$;\n          box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n  -webkit-filter: $filter$;\n     -moz-filter: $filter$;\n          filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n  -webkit-transition: $transition$;\n     -moz-transition: $transition$;\n          transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n  -webkit-transform-origin: $origin$;\n     -moz-transform-origin: $origin$;\n          transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
        },
        "$:/core/macros/colour-picker": {
            "title": "$:/core/macros/colour-picker",
            "tags": "$:/tags/Macro",
            "text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
        },
        "$:/core/macros/copy-to-clipboard": {
            "title": "$:/core/macros/copy-to-clipboard",
            "tags": "$:/tags/Macro",
            "text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
        },
        "$:/core/macros/diff": {
            "title": "$:/core/macros/diff",
            "tags": "$:/tags/Macro",
            "text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
        },
        "$:/core/macros/dumpvariables": {
            "title": "$:/core/macros/dumpvariables",
            "tags": "$:/tags/Macro",
            "text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
        },
        "$:/core/macros/export": {
            "title": "$:/core/macros/export",
            "tags": "$:/tags/Macro",
            "text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"count\" value={{{ [subfilter<__exportFilter__>count[]] }}}>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\" variable=\"ignore\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</$list>\n</$set>\n</div>\n</$reveal>\n\\end\n"
        },
        "$:/core/macros/image-picker": {
            "title": "$:/core/macros/image-picker",
            "created": "20170715180840889",
            "modified": "20170715180914005",
            "tags": "$:/tags/Macro",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
        },
        "$:/core/macros/keyboard-driven-input": {
            "title": "$:/core/macros/keyboard-driven-input",
            "tags": "$:/tags/Macro",
            "text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n$actions$\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define keyboard-input-actions()\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/>\n</$list>\n\\end\n\n\\define input-next-actions-inner()\n<$list filter=\"[<nextItem>minlength[1]]\" variable=\"ignore\">\n<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/>\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n\\end\n\n\\define input-next-actions(afterOrBefore:\"after\",reverse:\"\")\n<$list filter=\"[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]\" variable=\"ignore\">\n<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}>\n<$set name=\"configTiddler\" value={{{ [subfilter<__configTiddlerFilter__>] }}}>\n<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}>\n<$set name=\"filteredList\" filter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\">\n<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}>\n<$list filter=\"[<selectedItem>match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<lastItem>!match<firstItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<firstItem>match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>!match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<<input-next-actions-inner>>\n</$list>\n</$vars>\n</$set>\n</$vars>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<__inputAcceptActions__>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<__inputAcceptVariantActions__>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions \"before\" \"reverse[]\">>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions>>>\n<$keyboard key=\"((input-cancel))\" actions=<<__inputCancelActions__>>>\n<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> \n\t\tinputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> \n\t\tplaceholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> \n\t\tfocus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> \n\t\ttabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> \n\t\trefreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n\\end\n"
        },
        "$:/core/macros/lingo": {
            "title": "$:/core/macros/lingo",
            "tags": "$:/tags/Macro",
            "text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
        },
        "$:/core/macros/list": {
            "title": "$:/core/macros/list",
            "tags": "$:/tags/Macro",
            "text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n{{$:/core/images/blank}}\n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$type$>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
        },
        "$:/core/macros/tabs": {
            "title": "$:/core/macros/tabs",
            "tags": "$:/tags/Macro",
            "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler>$actions$</$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n</$vars>\n</$set>\n\\end\n"
        },
        "$:/core/macros/tag-picker": {
            "title": "$:/core/macros/tag-picker",
            "tags": "$:/tags/Macro",
            "first-search-filter": "[tags[]!is[system]search:title<userInput>sort[]]",
            "second-search-filter": "[tags[]is[system]search:title<userInput>sort[]]",
            "text": "\\define get-tagpicker-focus-selector() [data-tiddler-title=\"$(currentTiddlerCSSEscaped)$\"] .tc-add-tag-name input\n\n\\define delete-tag-state-tiddlers() <$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\n\\define add-tag-actions(actions,tagField:\"tags\")\n<$set name=\"tag\" value={{{ [<__tiddler__>get[text]] }}}>\n<$list filter=\"[<saveTiddler>!contains:$tagField$<tag>!match[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[<tag>]\"/>\n\"\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n</$list>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\\end\n\n\\define clear-tags-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-tag-state-tiddlers>>\n</$list>\n\\end\n\n\\define clear-tags-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<clear-tags-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define tag-picker-inner(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars newTagNameInputTiddlerQualified=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}>\n<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}>\n<$vars refreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">> nonSystemTagsFilter=\"[tags[]!is[system]search:title<userInput>sort[]]\" systemTagsFilter=\"[tags[]is[system]search:title<userInput>sort[]]\">\n<div class=\"tc-edit-add-tag\">\n<div>\n<span class=\"tc-add-tag-name tc-small-gap-right\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<tagSelectionState>> inputAcceptActions=\"\"\"<$macrocall $name=\"add-tag-actions\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\"\n\t\tinputCancelActions=<<clear-tags-actions>> tag=\"input\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> \n\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} \n\t\tcancelPopups=<<cancelPopups>> configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"/>\n</span><$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type=\"nomatch\" text=\"\"><$button class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class=\"tc-add-tag-button tc-small-gap-left\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<<delete-tag-state-tiddlers>><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>>/>\n</$set>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<nonSystemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<systemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n</div>\n</$vars>\n</$vars>\n</$vars>\n\\end\n\\define tag-picker(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}>\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=\"\"\"<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\">\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\n</$set>\n</$list>\n</$vars>\n\\end\n"
        },
        "$:/core/macros/tag": {
            "title": "$:/core/macros/tag",
            "tags": "$:/tags/Macro",
            "text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
        },
        "$:/core/macros/thumbnails": {
            "title": "$:/core/macros/thumbnails",
            "tags": "$:/tags/Macro",
            "text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
        },
        "$:/core/macros/timeline": {
            "title": "$:/core/macros/timeline",
            "created": "20141212105914482",
            "modified": "20141212110330815",
            "tags": "$:/tags/Macro",
            "text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n     of the same name if you need to change \n     how titles are displayed on the timeline \n     -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
        },
        "$:/core/macros/toc": {
            "title": "$:/core/macros/toc",
            "tags": "$:/tags/Macro",
            "text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n  <$transclude field=\"caption\">\n    <$view field=\"title\"/>\n  </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n  <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n    <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n      <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n        <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n          <li class=<<toc-item-class>>>\n            <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>\">\n              <<toc-caption>>\n            </$list>\n            <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n          </li>\n        </$set>\n      </$set>\n    </$vars>\n  </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\"  tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n    <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n        </$button>\n      </$reveal>\n      <<toc-caption>>\n    </$link>\n    <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n      <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n    </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n    <li class=<<toc-item-class>>>\n      <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n          <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n          <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/right-arrow}}\n            </$button>\n          </$reveal>\n          <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/down-arrow}}\n            </$button>\n          </$reveal>\n        </$list>\n        <<toc-caption>>\n      </$link>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n        <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/right-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n        <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/down-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n      </$list>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-selective-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n  <div class=\"tc-tabbed-table-of-contents\">\n    <$linkcatcher to=<<__selectedTiddler__>>>\n      <div class=\"tc-table-of-contents\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n      </div>\n    </$linkcatcher>\n    <div class=\"tc-tabbed-table-of-contents-content\">\n      <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n        <$transclude mode=\"block\" tiddler=<<__template__>>>\n          <h1><<toc-caption>></h1>\n          <$transclude mode=\"block\">$missingText$</$transclude>\n        </$transclude>\n      </$reveal>\n      <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n        $unselectedText$\n      </$reveal>\n    </div>\n  </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n  <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
        },
        "$:/core/macros/translink": {
            "title": "$:/core/macros/translink",
            "tags": "$:/tags/Macro",
            "text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/tree": {
            "title": "$:/core/macros/tree",
            "tags": "$:/tags/Macro",
            "text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/utils": {
            "title": "$:/core/macros/utils",
            "text": "\\define colour(colour)\n$colour$\n\\end\n"
        },
        "$:/snippets/minifocusswitcher": {
            "title": "$:/snippets/minifocusswitcher",
            "text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
        },
        "$:/snippets/minilanguageswitcher": {
            "title": "$:/snippets/minilanguageswitcher",
            "text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
        },
        "$:/snippets/minithemeswitcher": {
            "title": "$:/snippets/minithemeswitcher",
            "text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
        },
        "$:/snippets/modules": {
            "title": "$:/snippets/modules",
            "text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
        },
        "$:/palette": {
            "title": "$:/palette",
            "text": "$:/palettes/Vanilla"
        },
        "$:/snippets/paletteeditor": {
            "title": "$:/snippets/paletteeditor",
            "text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
        },
        "$:/snippets/palettepreview": {
            "title": "$:/snippets/palettepreview",
            "text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
        },
        "$:/snippets/paletteswitcher": {
            "title": "$:/snippets/paletteswitcher",
            "text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/snippets/peek-stylesheets": {
            "title": "$:/snippets/peek-stylesheets",
            "text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
        },
        "$:/temp/search": {
            "title": "$:/temp/search",
            "text": ""
        },
        "$:/tags/AdvancedSearch": {
            "title": "$:/tags/AdvancedSearch",
            "list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
        },
        "$:/tags/AdvancedSearch/FilterButton": {
            "title": "$:/tags/AdvancedSearch/FilterButton",
            "list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
        },
        "$:/tags/ControlPanel": {
            "title": "$:/tags/ControlPanel",
            "list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
        },
        "$:/tags/ControlPanel/Info": {
            "title": "$:/tags/ControlPanel/Info",
            "list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
        },
        "$:/tags/ControlPanel/Plugins": {
            "title": "$:/tags/ControlPanel/Plugins",
            "list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
        },
        "$:/tags/EditTemplate": {
            "title": "$:/tags/EditTemplate",
            "list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
        },
        "$:/tags/EditToolbar": {
            "title": "$:/tags/EditToolbar",
            "list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
        },
        "$:/tags/EditorToolbar": {
            "title": "$:/tags/EditorToolbar",
            "list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
        },
        "$:/tags/Manager/ItemMain": {
            "title": "$:/tags/Manager/ItemMain",
            "list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
        },
        "$:/tags/Manager/ItemSidebar": {
            "title": "$:/tags/Manager/ItemSidebar",
            "list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
        },
        "$:/tags/MoreSideBar": {
            "title": "$:/tags/MoreSideBar",
            "list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
            "text": ""
        },
        "$:/tags/PageControls": {
            "title": "$:/tags/PageControls",
            "list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
        },
        "$:/tags/PageTemplate": {
            "title": "$:/tags/PageTemplate",
            "list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
            "text": ""
        },
        "$:/tags/PluginLibrary": {
            "title": "$:/tags/PluginLibrary",
            "list": "$:/config/OfficialPluginLibrary"
        },
        "$:/tags/SideBar": {
            "title": "$:/tags/SideBar",
            "list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
            "text": ""
        },
        "$:/tags/SideBarSegment": {
            "title": "$:/tags/SideBarSegment",
            "list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
        },
        "$:/tags/TiddlerInfo": {
            "title": "$:/tags/TiddlerInfo",
            "list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
            "text": ""
        },
        "$:/tags/TiddlerInfo/Advanced": {
            "title": "$:/tags/TiddlerInfo/Advanced",
            "list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
        },
        "$:/tags/ViewTemplate": {
            "title": "$:/tags/ViewTemplate",
            "list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
        },
        "$:/tags/ViewToolbar": {
            "title": "$:/tags/ViewToolbar",
            "list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
        },
        "$:/snippets/themeswitcher": {
            "title": "$:/snippets/themeswitcher",
            "text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/wiki/title": {
            "title": "$:/core/wiki/title",
            "text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
        },
        "$:/view": {
            "title": "$:/view",
            "text": "classic"
        },
        "$:/snippets/viewswitcher": {
            "title": "$:/snippets/viewswitcher",
            "text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        }
    }
}
Guide
UA-77295418-2
wiki.zhiheng.io
The following tiddlers were imported:

# [[kubernetes-default-scheduling-algorithm]]
no
yes
yes
no
\define ref(label)
<$button popup="$:/state/$label$" class="tc-btn-invisible tc-slider"><sup style="color:green">$label$</sup></$button>
\end

\define definition(label,text)
<$reveal type="popup" state="$:/state/$label$" animate="yes">
<div class="tc-drop-down" style="margin: 0px; padding: 8px">
<dl>
<dt>$label$</dt>
<dd>$text$</dd>
</dl>
</div>
</$reveal>
\end

\define footnote(label,text)
<<ref "$label$">>
<<definition "$label$" "$text$">>
\end

\define footnotes(label,text)
<<definition "$label$" "$text$">>
<sub><span style="color:green">$label$ : </span> $text$</sub>
\end
\define task-undone() <i class="fa fa-square-o"></i>
\define task-done() <i class="fa fa-check-square-o"></i>

\define plat-win() <i class="fa fa-windows"></i>
\define plat-mac() <i class="fa fa-apple"></i>
\define plat-linux() <i class="fa fa-linux"></i>
\define plat-android() <i class="fa fa-android"></i>
\define plat-chrome() <i class="fa fa-chrome"></i>

\define icon-code() <i class="fa fa-code"></i>

\define icon-star-full() <i class="fa fa-star"></i>
\define icon-star-half() <i class="fa fa-star-half-o"></i>
\define icon-star-empty() <i class="fa fa-star-o"></i>

\define icon(name) <i class="fa fa-$name$"></i>


\define es5-compatibility-table()
<<icon "table">> [[ES5 Compatibility Table|https://kangax.github.io/compat-table/es5/]]
\end

\define es6-compatibility-table()
<<icon "table">> [[ES6 Compatibility Table|https://kangax.github.io/compat-table/es6/]]
\end

\define es-next-compatibility-table()
<<icon "table">> [[ES.Next Compatibility Table|https://kangax.github.io/compat-table/es2016plus/]]
\end


\define display-pdf(path, title)
<object data="https://wiki-1251140025.cos.ap-shanghai.myqcloud.com$path$" type="application/pdf" width="100%" height="500px" />

@@font-size:0.8em;opacity:0.9;margin-top:-5px;
电脑上如果 PDF 不展示或者展示不正常,使用 Chrome 并安装 [[PDF Viewer 插件|https://chrome.google.com/webstore/detail/pdf-viewer/oemmndcbldboiebfnladdacbdfmadadm]]。其他情况请下载文件查看:[[$title$|https://wiki-1251140025.cos.ap-shanghai.myqcloud.com$path$]]。
\end

\define .s(_) <strong class="onlyice-strong">$_$</strong>

\define .center(_) <p style="text-align: center">$_$</p>

\define .todo(_)
@@.doc-note
;To-do
: $_$
@@
\end

\define .p1() <span title="重要性" style="font-size: 0.5em; color: #888">重要</span>
\define .p2() <span title="重要性" style="font-size: 0.5em; color: #888">一般</span>
\define .p3() <span title="重要性" style="font-size: 0.5em; color: #888">不重要</span>

\define coslink(text file_key)
[[$text$|https://wiki-1251140025.cos.ap-shanghai.myqcloud.com$file_key$]]
\end

\define cosurl(file_key)
https://wiki-1251140025.cos.ap-shanghai.myqcloud.com$file_key$
\end
(function(){
let progressbar = require("$:/macros/onlyice/progressbar.js").run;

exports.name = "healthy-life-progress";

exports.params = [
  {name: "birthday"}
];

/*
Run the macro
*/
exports.run = function(birthday) {
  const healthyYears = 60;
  
  const birthdate = new Date(birthday);
  const deathdate = new Date(`${birthdate.getFullYear() + healthyYears}-01-17`);
  const now = new Date();
  
  const allTime = deathdate - birthdate;
  const spendTime = now - birthdate;
	const percentage = (spendTime * 100 / allTime).toFixed(1);
  return `${progressbar(percentage)} ${percentage}%`;
};

})();
(function(){

let progressbar = require("$:/macros/onlyice/progressbar.js").run;

exports.name = "life-progress";

exports.params = [
  {name: "birthday"}
];

/*
Run the macro
*/
exports.run = function(birthday) {
  const liveYears = 75;
  
  const birthdate = new Date(birthday);
  const deathdate = new Date(`${birthdate.getFullYear() + liveYears}-01-17`);
  const now = new Date();
  
  const allTime = deathdate - birthdate;
  const spendTime = now - birthdate;
	const percentage = (spendTime * 100 / allTime).toFixed(1);
	return `${progressbar(percentage)} ${percentage}%`;
};

})();
(function(){
exports.name = "progressbar";

exports.params = [
  {name: "number"}
];

/*
Run the macro
*/
exports.run = function(number) {
  if (isNaN(number)) {
    return "Not a number";
  }

  const n = parseFloat(number);
  if (n < 0 || n > 100) {
    return "Number must not be less than 0 or larger than 100";
  }

  const fullNum = parseInt(n / 10);
  const halfNum = (n - fullNum * 10) > 0 ? 1 : 0;
  const emptyNum = 10 - fullNum - halfNum;
  return `${'⣿'.repeat(fullNum)}${'⣧'.repeat(halfNum)}${'⣀'.repeat(emptyNum)}`
};

})();
(function(){

let progressbar = require("$:/macros/onlyice/progressbar.js").run;

exports.name = "year-progress";

exports.params = [
];

/*
Run the macro
*/
exports.run = function() {
  const now = new Date();
	const yearBegins = new Date(`${now.getFullYear()}-01-01`);
	const yearEnds = new Date(`${now.getFullYear()+1}-01-01`);
	const percentage = ((now-yearBegins) * 100 / (yearEnds-yearBegins)).toFixed(1);
	
	return `${progressbar(percentage)} ${percentage}%`;
};

})();
\define .concat(1,2,3,4,5) $1$$2$$3$$4$$5$

\define .def(_) <dfn class="doc-def">$_$</dfn>
\define .em(_) <em class="doc-em">$_$</em>
\define .strong(_) <strong class="doc-strong">$_$</strong>
\define .place(_) <code class="doc-place">$_$</code>
\define .word(_) "$_$"

\define .preamble(_) :.doc-preamble $_$
\define .note(_)
@@.doc-note
;Note
: $_$
@@
\end

\define .tid(_) <code class="doc-tiddler">$_$</code>
\define .tag(_) <code class="doc-tag">$_$</code>
\define .field(_) <code class="doc-field">$_$</code>
\define .value(_) <code class="doc-value">$_$</code>
\define .op(_) <code class="doc-operator">$_$</code>
\define .var(_) <code class="doc-var">$_$</code>
\define .wid(_) <code class="doc-widget">$$_$</code>
\define .attr(_) <code class="doc-attr">$_$</code>
\define .param(_) <code class="doc-param">$_$</code>

\define .mtitle(_) $_$ Macro
\define .otitle(_) $_$ Operator
\define .vtitle(_) $_$ Variable

\define .link(_,to) <$link to="$to$">$_$</$link>
\define .clink(_,to) <span class="doc-clink"><<.link """$_$""" "$to$">></span>
\define .dlink(_,to) <$macrocall $name=".link" _=<<.def "$_$">> to="$to$">/>
\define .dlink-ex(_,to) <a href="$to$" class="tc-tiddlylink-external" target="_blank"><<.def "$_$">></a>
\define .flink(to) <$macrocall $name=".link" _=<<.field {{$to$!!caption}}>> to="$to$"/>
\define .mlink(_,to) <$macrocall $name=".link" _=<<.var "$_$">> to=<<.mtitle "$_$">>/>
\define .mlink2(_,to) <$macrocall $name=".link" _=<<.var "$_$">> to="$to$"/>
\define .olink(_) <$macrocall $name=".link" _=<<.op "$_$">> to=<<.otitle "$_$">>/>
\define .olink2(_,to) <$macrocall $name=".link" _=<<.op "$_$">> to=<<.otitle "$to$">>/>
\define .vlink(_,to) <$macrocall $name=".link" _=<<.var "$_$">> to=<<.vtitle "$_$">>/>
\define .vlink2(_,to) <$macrocall $name=".link" _=<<.var "$_$">> to="$to$"/>
\define .wlink(to) <$macrocall $name=".link" _=<<.wid {{$to$!!caption}}>> to="$to$"/>
\define .wlink2(_,to) <$macrocall $name=".link" _="$_$" to="$to$"/>

\define .key(_) <span class="doc-key">$_$</span>
\define .combokey(_) <$macrocall $name=".if" cond="$_$" then=<<.key '$_$'>>/>
\define .keycombo(1,2,3,4) <<.combokey "$1$">><<.if "$2$" +>><<.combokey "$2$">><<.if "$3$" +>><<.combokey "$3$">><<.if "$4$" +>><<.combokey "$4$">>

\define .tab(_) <span class="doc-tab">{{$_$!!caption}}</span>
\define .sidebar-tab(_) <<.tab "$:/core/ui/SideBar/$_$">>
\define .more-tab(_) <<.tab "$:/core/ui/MoreSideBar/$_$">>
\define .info-tab(_) <<.tab "$:/core/ui/TiddlerInfo/$_$">>
\define .controlpanel-tab(_) <<.tab "$:/core/ui/ControlPanel/$_$">>
\define .advancedsearch-tab(_) <<.tab "$:/core/ui/AdvancedSearch/$_$">>
\define .toc-tab() <<.tab "TableOfContents">>
\define .example-tab(_) <span class="doc-tab">$_$</span>

\define .button(_) <span class="doc-button">{{$:/core/ui/Buttons/$_$!!caption}}</span>

\define .tip(_) <div class="doc-icon-block"><div class="doc-block-icon">{{$:/core/images/tip}}</div> $_$</div>
\define .warning(_) <div class="doc-icon-block"><div class="doc-block-icon">{{$:/core/images/warning}}</div> $_$</div>
\define .info(_) <div class="doc-icon-block"><div class="doc-block-icon">{{$:/core/images/info-button}}</div> $_$</div>

\define .state-prefix() $:/state/editions/tw5.com/

\define .lorem()
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end

\define .toc-lorem()
This is an example tiddler. See [[Table-of-Contents Macros (Examples)]].

<<.lorem>>
\end

\define .example(n,eg,egvar:NO-SUCH-VAR)
<div class="doc-example">
<$reveal default="$egvar$" type="match" text="NO-SUCH-VAR">
	<$codeblock code="""$eg$"""/>
</$reveal>
<$reveal default="$egvar$" type="nomatch" text="NO-SUCH-VAR">
	<!-- allow an example to contain """ -->
	<$codeblock code=<<$egvar$>>/>
</$reveal>
<$list filter="[title<.state-prefix>addsuffix{!!title}addsuffix[/]addsuffix[$n$]]" variable=".state">
<$reveal state=<<.state>> type="nomatch" text="show">
	<dl>
	<dd><$button set=<<.state>> setTo="show">Try it</$button></dd>
	</dl>
</$reveal>
<$reveal state=<<.state>> type="match" text="show">
	<dl>
	<dd><$button set=<<.state>> setTo="">Hide</$button></dd>
	</dl>
	<blockquote class="doc-example-result">
	<$reveal default="$egvar$" type="match" text="NO-SUCH-VAR">
		$eg$
	</$reveal>
	<$reveal default="$egvar$" type="nomatch" text="NO-SUCH-VAR">
		<<$egvar$>>
	</$reveal>
	</blockquote>
</$reveal>
</$list>
\end
$:/palettes/Rocker
<div class="tc-tab-buttons" style="margin-bottom:-1px">
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" variable="currentTab">
<$reveal type="match" state="$:/HistoryList!!current-tiddler" text=<<currentTab>>>
<div style="display:inline-block;">
<$button to=<<currentTab>>  class="tc-tab-selected" style="margin-right: 0.0em; border-right: 0.0em">
<$macrocall $name="currentTab" $type="text/plain" $output="text/plain"/>
</$button>
<$button message="tm-close-tiddler" param=<<currentTab>> class="tc-tab-selected"  style="border-left: 0.0em;">&times;</$button></div></$reveal>
<$reveal type="nomatch" state="$:/HistoryList!!current-tiddler" text=<<currentTab>>>
<div style="display:inline-block;">
<$button to=<<currentTab>> style="margin-right: 0.0em;" >
<$macrocall $name="currentTab" $type="text/plain" $output="text/plain"/>
</$button><$button message="tm-close-tiddler" param=<<currentTab>>>
&times;</$button></div></$reveal>
</$list>
</div>
<div class="tc-tab-divider tc-sidebar-tabs-main"></div>
{
    "tiddlers": {
        "$:/plugins/bj/storytabs/license": {
            "title": "$:/plugins/bj/storytabs/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2015 Jeffrey Wikinson aka Buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/bj/storytabs/readme": {
            "title": "$:/plugins/bj/storytabs/readme",
            "text": "Facilitates easier navigating between open tiddlers. Links to open tiddlers appear above top of the story river . If 'story mode' is set to zooming (see in appearance tab in the $:/ControlPanel tiddler) then the open tiddlers appear in tabs. The top links are controlled from the 'setting' tab in the $:/ControlPanel tiddler.\n"
        },
        "$:/plugin/bj/storytabs": {
            "title": "$:/plugin/bj/storytabs",
            "type": "text/vnd.tiddlywiki",
            "text": "<div  class=\"tc-tab-buttons\" >\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" variable=\"currentTab\">\n<$reveal type=\"match\" state=\"$:/HistoryList!!current-tiddler\" text=<<currentTab>>>\n<div style=\"display:inline-block;\">\n<$button to=<<currentTab>>  class=\"tc-tab-selected\" style=\"margin-right: 0.0em; border-right: 0.0em\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$button>\n<$button message=\"tm-close-tiddler\" param=<<currentTab>> class=\"tc-tab-selected\"  style=\"border-left: 0.0em;\">&times;</$button></div></$reveal>\n<$reveal type=\"nomatch\" state=\"$:/HistoryList!!current-tiddler\" text=<<currentTab>>>\n<div style=\"display:inline-block;\">\n<$button to=<<currentTab>> style=\"margin-right: 0.0em;\" >\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$button><$button message=\"tm-close-tiddler\" param=<<currentTab>>>\n&times;</$button></div></$reveal>\n</$list>\n</div>\n\n"
        },
        "$:/bj/storytabs/storytabs-caller": {
            "tags": "$:/tags/AboveStory",
            "title": "$:/bj/storytabs/storytabs-caller",
            "type": "text/vnd.tiddlywiki",
            "text": "<$transclude tiddler=\"$:/plugin/bj/storytabs\"  mode=\"inline\"/>\n\n\n"
        },
        "$:plugins/bj/ui/ControlPanel/Settings/StoryTabs": {
            "caption": "Display tabs of Open Tids",
            "tags": "$:/tags/ControlPanel/Settings",
            "title": "$:plugins/bj/ui/ControlPanel/Settings/StoryTabs",
            "type": "text/vnd.tiddlywiki",
            "text": "<$checkbox tiddler=\"$:/plugin/bj/storytabs\" tag=\"$:/tags/AboveStory\" > Enable Story Tabs </$checkbox>\n\n\n"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/sq/editor-autolist/editor-operation-autolist": {
            "text": "/*\\\ntitle: $:/plugins/sq/editor-autolist/editor-operation-autolist.js\ntype: application/javascript\nmodule-type: texteditoroperation\nText editor operation to automate syntax for lists\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"autolist\"] = function(event,operation) {\n\t\n\tvar lineStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\tvar lineEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selStart);\n\tvar line = operation.text.substring(lineStart,lineEnd);\t\n\t\n\tvar listPrefixRegex = /^((\\*|#)+).*/;\n\tvar match = line.match(listPrefixRegex);\n\t\n\tvar mode = event.paramObject? event.paramObject.mode : undefined;\n\t\n\t//ensure we only handle lines starting with * or #\n\tif(match != null && match[1]) {\n\t\t// check if we are handling indent level\n\t\tif(mode === \"indent\" || mode === \"unindent\") {\n\t\t\tvar indentRegExp = /^((\\*|#)+)(.*)$/;\n\t\t\tvar indentMatch = line.match(indentRegExp);\n\t\t\tif(indentMatch != null) {\n\t\t\t\t//check if the line has content\n\t\t\t\tvar content = (indentMatch[3].trim().length != 0) ? indentMatch[3].trim() : \"\";\n\t\t\t\toperation.cutStart = lineStart;\n\t\t\t\toperation.cutEnd = lineEnd;\n\t\t\t\tif(mode === \"indent\") {\t\t\t\t\n\t\t\t\t\t//indent a line\n\t\t\t\t\toperation.replacement = indentMatch[1] + indentMatch[2] + \" \" + content;\n\t\t\t\t\toperation.newSelStart = operation.selStart + 1;\n\t\t\t\t\toperation.newSelEnd = operation.selEnd + 1;\n\t\t\t\t} else if(mode === \"unindent\") {\n\t\t\t\t\t//unindent a line\n\t\t\t\t\toperation.replacement = indentMatch[1].substring(0,indentMatch[1].length - 1) + \" \" + content;\n\t\t\t\t\toperation.newSelStart = operation.selStart - 1;\n\t\t\t\t\toperation.newSelEnd = operation.selEnd - 1;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//handle enter key, meaning new line\n\t\t\tvar trimmed = match[0].replace(/\\s\\s*$/, '');\n\t\t\tvar prefixRegEx = /^((\\*|#)+)$/;\n\t\t\tvar trimmedMatch = trimmed.match(prefixRegEx);\n\t\t\tif(trimmedMatch != null) {\n\t\t\t\t// the line only contains * or # characters and optional whitespace\n\t\t\t\t//terminate the list\n\t\t\t\toperation.replacement = \"\\n\";\n\t\t\t\toperation.cutStart = lineStart;\n\t\t\t\toperation.cutEnd = operation.selStart;\n\t\t\t\toperation.newSelStart = lineStart + 1;\n\t\t\t\toperation.newSelEnd = lineStart + 1;\n\t\t\t} else {\n\t\t\t\t// continue indent level on next line\n\t\t\t\tvar prefix = match[1];\n\t\t\t\toperation.replacement = \"\\n\" + prefix + \" \";\n\t\t\t\toperation.cutStart = operation.selStart;\n\t\t\t\toperation.cutEnd = operation.selStart;\n\t\t\t\t\n\t\t\t\t//check if there is trailing whitespace on the line we are on\n\t\t\t\tvar lineEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selStart);\n\t\t\t\tvar trailingText = operation.text.substring(operation.selStart,lineEnd);\n\t\t\t\tif(trailingText.trim().length == 0) {\n\t\t\t\t\toperation.cutEnd = lineEnd;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\toperation.newSelStart = operation.selStart + prefix.length + 2;\n\t\t\t\toperation.newSelEnd = operation.selEnd + prefix.length + 2;\n\t\t\t}\n\t\t}\n\t} else if(mode != \"indent\" && mode != \"unindent\") {\n\t\t// we need to manually add a linebreak for lines not starting with list markup\n\t\toperation.replacement = \"\\n\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.newSelStart = operation.selStart + 1;\n\t\toperation.newSelEnd = operation.selEnd + 1;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "title": "$:/plugins/sq/editor-autolist/editor-operation-autolist",
            "tags": "",
            "module-type": "texteditoroperation",
            "modified": "20200804125155562",
            "created": "20200803160356743"
        },
        "$:/plugins/sq/editor-autolist/EditorToolbar-autolist": {
            "created": "20200803165453913",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"autolist\"\n/>\n",
            "title": "$:/plugins/sq/editor-autolist/EditorToolbar-autolist",
            "tags": "$:/tags/EditorToolbar",
            "shortcuts": "((autolist-newline))",
            "modified": "20200804124434675",
            "icon": "$:/core/images/list-bullet",
            "description": "",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "caption": "",
            "button-classes": "sq-text-editor-btn-hidden"
        },
        "$:/plugins/sq/editor-autolist/styles": {
            "text": ".sq-text-editor-btn-hidden {\n\tdisplay: none;\n}",
            "title": "$:/plugins/sq/editor-autolist/styles",
            "tags": "$:/tags/Stylesheet",
            "modified": "20200803172530073",
            "created": "20200803171440138"
        },
        "$:/plugins/sq/editor-autolist/EditorToolbar-autolist-indent": {
            "created": "20200803213912954",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"autolist\"\n\tmode=\"indent\"\n/>\n",
            "title": "$:/plugins/sq/editor-autolist/EditorToolbar-autolist-indent",
            "tags": "$:/tags/EditorToolbar",
            "shortcuts": "((autolist-indent))",
            "modified": "20200804124659294",
            "icon": "$:/core/images/list-bullet",
            "description": "",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "caption": "",
            "button-classes": "sq-text-editor-btn-hidden"
        },
        "$:/plugins/sq/editor-autolist/EditorToolbar-autolist-unindent": {
            "created": "20200804122848593",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"autolist\"\n\tmode=\"unindent\"\n/>\n",
            "title": "$:/plugins/sq/editor-autolist/EditorToolbar-autolist-unindent",
            "tags": "$:/tags/EditorToolbar",
            "shortcuts": "((autolist-unindent))",
            "modified": "20200804124808496",
            "icon": "$:/core/images/list-bullet",
            "description": "",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "caption": "",
            "button-classes": "sq-text-editor-btn-hidden"
        },
        "$:/config/shortcuts/autolist-newline": {
            "created": "20200804124551033",
            "title": "$:/config/shortcuts/autolist-newline",
            "text": "Enter",
            "modified": "20200804124551033"
        },
        "$:/config/shortcuts/autolist-indent": {
            "created": "20200804124746636",
            "title": "$:/config/shortcuts/autolist-indent",
            "text": "Tab",
            "modified": "20200804124746636"
        },
        "$:/config/shortcuts/autolist-unindent": {
            "created": "20200804124833452",
            "title": "$:/config/shortcuts/autolist-unindent",
            "text": "shift-Tab",
            "modified": "20200804124833452"
        },
        "$:/config/ShortcutInfo/autolist-newline": {
            "created": "20200804124436341",
            "text": "Add a newline and list markup if in a list",
            "tags": "",
            "title": "$:/config/ShortcutInfo/autolist-newline",
            "modified": "20200804124533962"
        },
        "$:/config/ShortcutInfo/autolist-indent": {
            "created": "20200804124703604",
            "text": "Indent a line in a list",
            "tags": "",
            "title": "$:/config/ShortcutInfo/autolist-indent",
            "modified": "20200804124720020"
        },
        "$:/config/ShortcutInfo/autolist-unindent": {
            "created": "20200804124811668",
            "text": "Unindent a line in a list",
            "tags": "",
            "title": "$:/config/ShortcutInfo/autolist-unindent",
            "modified": "20200804124823040"
        }
    }
}
/*!
 * FontAwesome 4.7.0 pour TiddlyWiki préparé par @naudinsylvain le 26/10/2016
 * http://sylvain.naud.in
 * https://forum.tiddlywiki.fr
 * Howto : base64 -w 0 fontawesome-webfont.woff > fontawesome-webfont.txt
 * 
 *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
 *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
 */
/* FONT PATH
 * -------------------------- */
@font-face {
  font-family: 'FontAwesome';
src: url(data:application/font-woff;base64,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) format('woff');
  font-weight: normal;
  font-style: normal;
}
.fa {
  display: inline-block;
  font: normal normal normal 14px/1 FontAwesome;
  font-size: inherit;
  text-rendering: auto;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
/* makes the font 33% larger relative to the icon container */
.fa-lg {
  font-size: 1.33333333em;
  line-height: 0.75em;
  vertical-align: -15%;
}
.fa-2x {
  font-size: 2em;
}
.fa-3x {
  font-size: 3em;
}
.fa-4x {
  font-size: 4em;
}
.fa-5x {
  font-size: 5em;
}
.fa-fw {
  width: 1.28571429em;
  text-align: center;
}
.fa-ul {
  padding-left: 0;
  margin-left: 2.14285714em;
  list-style-type: none;
}
.fa-ul > li {
  position: relative;
}
.fa-li {
  position: absolute;
  left: -2.14285714em;
  width: 2.14285714em;
  top: 0.14285714em;
  text-align: center;
}
.fa-li.fa-lg {
  left: -1.85714286em;
}
.fa-border {
  padding: .2em .25em .15em;
  border: solid 0.08em #eeeeee;
  border-radius: .1em;
}
.fa-pull-left {
  float: left;
}
.fa-pull-right {
  float: right;
}
.fa.fa-pull-left {
  margin-right: .3em;
}
.fa.fa-pull-right {
  margin-left: .3em;
}
/* Deprecated as of 4.4.0 */
.pull-right {
  float: right;
}
.pull-left {
  float: left;
}
.fa.pull-left {
  margin-right: .3em;
}
.fa.pull-right {
  margin-left: .3em;
}
.fa-spin {
  -webkit-animation: fa-spin 2s infinite linear;
  animation: fa-spin 2s infinite linear;
}
.fa-pulse {
  -webkit-animation: fa-spin 1s infinite steps(8);
  animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
    transform: rotate(359deg);
  }
}
@keyframes fa-spin {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(359deg);
    transform: rotate(359deg);
  }
}
.fa-rotate-90 {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
  -webkit-transform: rotate(90deg);
  -ms-transform: rotate(90deg);
  transform: rotate(90deg);
}
.fa-rotate-180 {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
  -webkit-transform: rotate(180deg);
  -ms-transform: rotate(180deg);
  transform: rotate(180deg);
}
.fa-rotate-270 {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
  -webkit-transform: rotate(270deg);
  -ms-transform: rotate(270deg);
  transform: rotate(270deg);
}
.fa-flip-horizontal {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
  -webkit-transform: scale(-1, 1);
  -ms-transform: scale(-1, 1);
  transform: scale(-1, 1);
}
.fa-flip-vertical {
  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
  -webkit-transform: scale(1, -1);
  -ms-transform: scale(1, -1);
  transform: scale(1, -1);
}
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical {
  filter: none;
}
.fa-stack {
  position: relative;
  display: inline-block;
  width: 2em;
  height: 2em;
  line-height: 2em;
  vertical-align: middle;
}
.fa-stack-1x,
.fa-stack-2x {
  position: absolute;
  left: 0;
  width: 100%;
  text-align: center;
}
.fa-stack-1x {
  line-height: inherit;
}
.fa-stack-2x {
  font-size: 2em;
}
.fa-inverse {
  color: #ffffff;
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
   readers do not read off random characters that represent icons */
.fa-glass:before {
  content: "\f000";
}
.fa-music:before {
  content: "\f001";
}
.fa-search:before {
  content: "\f002";
}
.fa-envelope-o:before {
  content: "\f003";
}
.fa-heart:before {
  content: "\f004";
}
.fa-star:before {
  content: "\f005";
}
.fa-star-o:before {
  content: "\f006";
}
.fa-user:before {
  content: "\f007";
}
.fa-film:before {
  content: "\f008";
}
.fa-th-large:before {
  content: "\f009";
}
.fa-th:before {
  content: "\f00a";
}
.fa-th-list:before {
  content: "\f00b";
}
.fa-check:before {
  content: "\f00c";
}
.fa-remove:before,
.fa-close:before,
.fa-times:before {
  content: "\f00d";
}
.fa-search-plus:before {
  content: "\f00e";
}
.fa-search-minus:before {
  content: "\f010";
}
.fa-power-off:before {
  content: "\f011";
}
.fa-signal:before {
  content: "\f012";
}
.fa-gear:before,
.fa-cog:before {
  content: "\f013";
}
.fa-trash-o:before {
  content: "\f014";
}
.fa-home:before {
  content: "\f015";
}
.fa-file-o:before {
  content: "\f016";
}
.fa-clock-o:before {
  content: "\f017";
}
.fa-road:before {
  content: "\f018";
}
.fa-download:before {
  content: "\f019";
}
.fa-arrow-circle-o-down:before {
  content: "\f01a";
}
.fa-arrow-circle-o-up:before {
  content: "\f01b";
}
.fa-inbox:before {
  content: "\f01c";
}
.fa-play-circle-o:before {
  content: "\f01d";
}
.fa-rotate-right:before,
.fa-repeat:before {
  content: "\f01e";
}
.fa-refresh:before {
  content: "\f021";
}
.fa-list-alt:before {
  content: "\f022";
}
.fa-lock:before {
  content: "\f023";
}
.fa-flag:before {
  content: "\f024";
}
.fa-headphones:before {
  content: "\f025";
}
.fa-volume-off:before {
  content: "\f026";
}
.fa-volume-down:before {
  content: "\f027";
}
.fa-volume-up:before {
  content: "\f028";
}
.fa-qrcode:before {
  content: "\f029";
}
.fa-barcode:before {
  content: "\f02a";
}
.fa-tag:before {
  content: "\f02b";
}
.fa-tags:before {
  content: "\f02c";
}
.fa-book:before {
  content: "\f02d";
}
.fa-bookmark:before {
  content: "\f02e";
}
.fa-print:before {
  content: "\f02f";
}
.fa-camera:before {
  content: "\f030";
}
.fa-font:before {
  content: "\f031";
}
.fa-bold:before {
  content: "\f032";
}
.fa-italic:before {
  content: "\f033";
}
.fa-text-height:before {
  content: "\f034";
}
.fa-text-width:before {
  content: "\f035";
}
.fa-align-left:before {
  content: "\f036";
}
.fa-align-center:before {
  content: "\f037";
}
.fa-align-right:before {
  content: "\f038";
}
.fa-align-justify:before {
  content: "\f039";
}
.fa-list:before {
  content: "\f03a";
}
.fa-dedent:before,
.fa-outdent:before {
  content: "\f03b";
}
.fa-indent:before {
  content: "\f03c";
}
.fa-video-camera:before {
  content: "\f03d";
}
.fa-photo:before,
.fa-image:before,
.fa-picture-o:before {
  content: "\f03e";
}
.fa-pencil:before {
  content: "\f040";
}
.fa-map-marker:before {
  content: "\f041";
}
.fa-adjust:before {
  content: "\f042";
}
.fa-tint:before {
  content: "\f043";
}
.fa-edit:before,
.fa-pencil-square-o:before {
  content: "\f044";
}
.fa-share-square-o:before {
  content: "\f045";
}
.fa-check-square-o:before {
  content: "\f046";
}
.fa-arrows:before {
  content: "\f047";
}
.fa-step-backward:before {
  content: "\f048";
}
.fa-fast-backward:before {
  content: "\f049";
}
.fa-backward:before {
  content: "\f04a";
}
.fa-play:before {
  content: "\f04b";
}
.fa-pause:before {
  content: "\f04c";
}
.fa-stop:before {
  content: "\f04d";
}
.fa-forward:before {
  content: "\f04e";
}
.fa-fast-forward:before {
  content: "\f050";
}
.fa-step-forward:before {
  content: "\f051";
}
.fa-eject:before {
  content: "\f052";
}
.fa-chevron-left:before {
  content: "\f053";
}
.fa-chevron-right:before {
  content: "\f054";
}
.fa-plus-circle:before {
  content: "\f055";
}
.fa-minus-circle:before {
  content: "\f056";
}
.fa-times-circle:before {
  content: "\f057";
}
.fa-check-circle:before {
  content: "\f058";
}
.fa-question-circle:before {
  content: "\f059";
}
.fa-info-circle:before {
  content: "\f05a";
}
.fa-crosshairs:before {
  content: "\f05b";
}
.fa-times-circle-o:before {
  content: "\f05c";
}
.fa-check-circle-o:before {
  content: "\f05d";
}
.fa-ban:before {
  content: "\f05e";
}
.fa-arrow-left:before {
  content: "\f060";
}
.fa-arrow-right:before {
  content: "\f061";
}
.fa-arrow-up:before {
  content: "\f062";
}
.fa-arrow-down:before {
  content: "\f063";
}
.fa-mail-forward:before,
.fa-share:before {
  content: "\f064";
}
.fa-expand:before {
  content: "\f065";
}
.fa-compress:before {
  content: "\f066";
}
.fa-plus:before {
  content: "\f067";
}
.fa-minus:before {
  content: "\f068";
}
.fa-asterisk:before {
  content: "\f069";
}
.fa-exclamation-circle:before {
  content: "\f06a";
}
.fa-gift:before {
  content: "\f06b";
}
.fa-leaf:before {
  content: "\f06c";
}
.fa-fire:before {
  content: "\f06d";
}
.fa-eye:before {
  content: "\f06e";
}
.fa-eye-slash:before {
  content: "\f070";
}
.fa-warning:before,
.fa-exclamation-triangle:before {
  content: "\f071";
}
.fa-plane:before {
  content: "\f072";
}
.fa-calendar:before {
  content: "\f073";
}
.fa-random:before {
  content: "\f074";
}
.fa-comment:before {
  content: "\f075";
}
.fa-magnet:before {
  content: "\f076";
}
.fa-chevron-up:before {
  content: "\f077";
}
.fa-chevron-down:before {
  content: "\f078";
}
.fa-retweet:before {
  content: "\f079";
}
.fa-shopping-cart:before {
  content: "\f07a";
}
.fa-folder:before {
  content: "\f07b";
}
.fa-folder-open:before {
  content: "\f07c";
}
.fa-arrows-v:before {
  content: "\f07d";
}
.fa-arrows-h:before {
  content: "\f07e";
}
.fa-bar-chart-o:before,
.fa-bar-chart:before {
  content: "\f080";
}
.fa-twitter-square:before {
  content: "\f081";
}
.fa-facebook-square:before {
  content: "\f082";
}
.fa-camera-retro:before {
  content: "\f083";
}
.fa-key:before {
  content: "\f084";
}
.fa-gears:before,
.fa-cogs:before {
  content: "\f085";
}
.fa-comments:before {
  content: "\f086";
}
.fa-thumbs-o-up:before {
  content: "\f087";
}
.fa-thumbs-o-down:before {
  content: "\f088";
}
.fa-star-half:before {
  content: "\f089";
}
.fa-heart-o:before {
  content: "\f08a";
}
.fa-sign-out:before {
  content: "\f08b";
}
.fa-linkedin-square:before {
  content: "\f08c";
}
.fa-thumb-tack:before {
  content: "\f08d";
}
.fa-external-link:before {
  content: "\f08e";
}
.fa-sign-in:before {
  content: "\f090";
}
.fa-trophy:before {
  content: "\f091";
}
.fa-github-square:before {
  content: "\f092";
}
.fa-upload:before {
  content: "\f093";
}
.fa-lemon-o:before {
  content: "\f094";
}
.fa-phone:before {
  content: "\f095";
}
.fa-square-o:before {
  content: "\f096";
}
.fa-bookmark-o:before {
  content: "\f097";
}
.fa-phone-square:before {
  content: "\f098";
}
.fa-twitter:before {
  content: "\f099";
}
.fa-facebook-f:before,
.fa-facebook:before {
  content: "\f09a";
}
.fa-github:before {
  content: "\f09b";
}
.fa-unlock:before {
  content: "\f09c";
}
.fa-credit-card:before {
  content: "\f09d";
}
.fa-feed:before,
.fa-rss:before {
  content: "\f09e";
}
.fa-hdd-o:before {
  content: "\f0a0";
}
.fa-bullhorn:before {
  content: "\f0a1";
}
.fa-bell:before {
  content: "\f0f3";
}
.fa-certificate:before {
  content: "\f0a3";
}
.fa-hand-o-right:before {
  content: "\f0a4";
}
.fa-hand-o-left:before {
  content: "\f0a5";
}
.fa-hand-o-up:before {
  content: "\f0a6";
}
.fa-hand-o-down:before {
  content: "\f0a7";
}
.fa-arrow-circle-left:before {
  content: "\f0a8";
}
.fa-arrow-circle-right:before {
  content: "\f0a9";
}
.fa-arrow-circle-up:before {
  content: "\f0aa";
}
.fa-arrow-circle-down:before {
  content: "\f0ab";
}
.fa-globe:before {
  content: "\f0ac";
}
.fa-wrench:before {
  content: "\f0ad";
}
.fa-tasks:before {
  content: "\f0ae";
}
.fa-filter:before {
  content: "\f0b0";
}
.fa-briefcase:before {
  content: "\f0b1";
}
.fa-arrows-alt:before {
  content: "\f0b2";
}
.fa-group:before,
.fa-users:before {
  content: "\f0c0";
}
.fa-chain:before,
.fa-link:before {
  content: "\f0c1";
}
.fa-cloud:before {
  content: "\f0c2";
}
.fa-flask:before {
  content: "\f0c3";
}
.fa-cut:before,
.fa-scissors:before {
  content: "\f0c4";
}
.fa-copy:before,
.fa-files-o:before {
  content: "\f0c5";
}
.fa-paperclip:before {
  content: "\f0c6";
}
.fa-save:before,
.fa-floppy-o:before {
  content: "\f0c7";
}
.fa-square:before {
  content: "\f0c8";
}
.fa-navicon:before,
.fa-reorder:before,
.fa-bars:before {
  content: "\f0c9";
}
.fa-list-ul:before {
  content: "\f0ca";
}
.fa-list-ol:before {
  content: "\f0cb";
}
.fa-strikethrough:before {
  content: "\f0cc";
}
.fa-underline:before {
  content: "\f0cd";
}
.fa-table:before {
  content: "\f0ce";
}
.fa-magic:before {
  content: "\f0d0";
}
.fa-truck:before {
  content: "\f0d1";
}
.fa-pinterest:before {
  content: "\f0d2";
}
.fa-pinterest-square:before {
  content: "\f0d3";
}
.fa-google-plus-square:before {
  content: "\f0d4";
}
.fa-google-plus:before {
  content: "\f0d5";
}
.fa-money:before {
  content: "\f0d6";
}
.fa-caret-down:before {
  content: "\f0d7";
}
.fa-caret-up:before {
  content: "\f0d8";
}
.fa-caret-left:before {
  content: "\f0d9";
}
.fa-caret-right:before {
  content: "\f0da";
}
.fa-columns:before {
  content: "\f0db";
}
.fa-unsorted:before,
.fa-sort:before {
  content: "\f0dc";
}
.fa-sort-down:before,
.fa-sort-desc:before {
  content: "\f0dd";
}
.fa-sort-up:before,
.fa-sort-asc:before {
  content: "\f0de";
}
.fa-envelope:before {
  content: "\f0e0";
}
.fa-linkedin:before {
  content: "\f0e1";
}
.fa-rotate-left:before,
.fa-undo:before {
  content: "\f0e2";
}
.fa-legal:before,
.fa-gavel:before {
  content: "\f0e3";
}
.fa-dashboard:before,
.fa-tachometer:before {
  content: "\f0e4";
}
.fa-comment-o:before {
  content: "\f0e5";
}
.fa-comments-o:before {
  content: "\f0e6";
}
.fa-flash:before,
.fa-bolt:before {
  content: "\f0e7";
}
.fa-sitemap:before {
  content: "\f0e8";
}
.fa-umbrella:before {
  content: "\f0e9";
}
.fa-paste:before,
.fa-clipboard:before {
  content: "\f0ea";
}
.fa-lightbulb-o:before {
  content: "\f0eb";
}
.fa-exchange:before {
  content: "\f0ec";
}
.fa-cloud-download:before {
  content: "\f0ed";
}
.fa-cloud-upload:before {
  content: "\f0ee";
}
.fa-user-md:before {
  content: "\f0f0";
}
.fa-stethoscope:before {
  content: "\f0f1";
}
.fa-suitcase:before {
  content: "\f0f2";
}
.fa-bell-o:before {
  content: "\f0a2";
}
.fa-coffee:before {
  content: "\f0f4";
}
.fa-cutlery:before {
  content: "\f0f5";
}
.fa-file-text-o:before {
  content: "\f0f6";
}
.fa-building-o:before {
  content: "\f0f7";
}
.fa-hospital-o:before {
  content: "\f0f8";
}
.fa-ambulance:before {
  content: "\f0f9";
}
.fa-medkit:before {
  content: "\f0fa";
}
.fa-fighter-jet:before {
  content: "\f0fb";
}
.fa-beer:before {
  content: "\f0fc";
}
.fa-h-square:before {
  content: "\f0fd";
}
.fa-plus-square:before {
  content: "\f0fe";
}
.fa-angle-double-left:before {
  content: "\f100";
}
.fa-angle-double-right:before {
  content: "\f101";
}
.fa-angle-double-up:before {
  content: "\f102";
}
.fa-angle-double-down:before {
  content: "\f103";
}
.fa-angle-left:before {
  content: "\f104";
}
.fa-angle-right:before {
  content: "\f105";
}
.fa-angle-up:before {
  content: "\f106";
}
.fa-angle-down:before {
  content: "\f107";
}
.fa-desktop:before {
  content: "\f108";
}
.fa-laptop:before {
  content: "\f109";
}
.fa-tablet:before {
  content: "\f10a";
}
.fa-mobile-phone:before,
.fa-mobile:before {
  content: "\f10b";
}
.fa-circle-o:before {
  content: "\f10c";
}
.fa-quote-left:before {
  content: "\f10d";
}
.fa-quote-right:before {
  content: "\f10e";
}
.fa-spinner:before {
  content: "\f110";
}
.fa-circle:before {
  content: "\f111";
}
.fa-mail-reply:before,
.fa-reply:before {
  content: "\f112";
}
.fa-github-alt:before {
  content: "\f113";
}
.fa-folder-o:before {
  content: "\f114";
}
.fa-folder-open-o:before {
  content: "\f115";
}
.fa-smile-o:before {
  content: "\f118";
}
.fa-frown-o:before {
  content: "\f119";
}
.fa-meh-o:before {
  content: "\f11a";
}
.fa-gamepad:before {
  content: "\f11b";
}
.fa-keyboard-o:before {
  content: "\f11c";
}
.fa-flag-o:before {
  content: "\f11d";
}
.fa-flag-checkered:before {
  content: "\f11e";
}
.fa-terminal:before {
  content: "\f120";
}
.fa-code:before {
  content: "\f121";
}
.fa-mail-reply-all:before,
.fa-reply-all:before {
  content: "\f122";
}
.fa-star-half-empty:before,
.fa-star-half-full:before,
.fa-star-half-o:before {
  content: "\f123";
}
.fa-location-arrow:before {
  content: "\f124";
}
.fa-crop:before {
  content: "\f125";
}
.fa-code-fork:before {
  content: "\f126";
}
.fa-unlink:before,
.fa-chain-broken:before {
  content: "\f127";
}
.fa-question:before {
  content: "\f128";
}
.fa-info:before {
  content: "\f129";
}
.fa-exclamation:before {
  content: "\f12a";
}
.fa-superscript:before {
  content: "\f12b";
}
.fa-subscript:before {
  content: "\f12c";
}
.fa-eraser:before {
  content: "\f12d";
}
.fa-puzzle-piece:before {
  content: "\f12e";
}
.fa-microphone:before {
  content: "\f130";
}
.fa-microphone-slash:before {
  content: "\f131";
}
.fa-shield:before {
  content: "\f132";
}
.fa-calendar-o:before {
  content: "\f133";
}
.fa-fire-extinguisher:before {
  content: "\f134";
}
.fa-rocket:before {
  content: "\f135";
}
.fa-maxcdn:before {
  content: "\f136";
}
.fa-chevron-circle-left:before {
  content: "\f137";
}
.fa-chevron-circle-right:before {
  content: "\f138";
}
.fa-chevron-circle-up:before {
  content: "\f139";
}
.fa-chevron-circle-down:before {
  content: "\f13a";
}
.fa-html5:before {
  content: "\f13b";
}
.fa-css3:before {
  content: "\f13c";
}
.fa-anchor:before {
  content: "\f13d";
}
.fa-unlock-alt:before {
  content: "\f13e";
}
.fa-bullseye:before {
  content: "\f140";
}
.fa-ellipsis-h:before {
  content: "\f141";
}
.fa-ellipsis-v:before {
  content: "\f142";
}
.fa-rss-square:before {
  content: "\f143";
}
.fa-play-circle:before {
  content: "\f144";
}
.fa-ticket:before {
  content: "\f145";
}
.fa-minus-square:before {
  content: "\f146";
}
.fa-minus-square-o:before {
  content: "\f147";
}
.fa-level-up:before {
  content: "\f148";
}
.fa-level-down:before {
  content: "\f149";
}
.fa-check-square:before {
  content: "\f14a";
}
.fa-pencil-square:before {
  content: "\f14b";
}
.fa-external-link-square:before {
  content: "\f14c";
}
.fa-share-square:before {
  content: "\f14d";
}
.fa-compass:before {
  content: "\f14e";
}
.fa-toggle-down:before,
.fa-caret-square-o-down:before {
  content: "\f150";
}
.fa-toggle-up:before,
.fa-caret-square-o-up:before {
  content: "\f151";
}
.fa-toggle-right:before,
.fa-caret-square-o-right:before {
  content: "\f152";
}
.fa-euro:before,
.fa-eur:before {
  content: "\f153";
}
.fa-gbp:before {
  content: "\f154";
}
.fa-dollar:before,
.fa-usd:before {
  content: "\f155";
}
.fa-rupee:before,
.fa-inr:before {
  content: "\f156";
}
.fa-cny:before,
.fa-rmb:before,
.fa-yen:before,
.fa-jpy:before {
  content: "\f157";
}
.fa-ruble:before,
.fa-rouble:before,
.fa-rub:before {
  content: "\f158";
}
.fa-won:before,
.fa-krw:before {
  content: "\f159";
}
.fa-bitcoin:before,
.fa-btc:before {
  content: "\f15a";
}
.fa-file:before {
  content: "\f15b";
}
.fa-file-text:before {
  content: "\f15c";
}
.fa-sort-alpha-asc:before {
  content: "\f15d";
}
.fa-sort-alpha-desc:before {
  content: "\f15e";
}
.fa-sort-amount-asc:before {
  content: "\f160";
}
.fa-sort-amount-desc:before {
  content: "\f161";
}
.fa-sort-numeric-asc:before {
  content: "\f162";
}
.fa-sort-numeric-desc:before {
  content: "\f163";
}
.fa-thumbs-up:before {
  content: "\f164";
}
.fa-thumbs-down:before {
  content: "\f165";
}
.fa-youtube-square:before {
  content: "\f166";
}
.fa-youtube:before {
  content: "\f167";
}
.fa-xing:before {
  content: "\f168";
}
.fa-xing-square:before {
  content: "\f169";
}
.fa-youtube-play:before {
  content: "\f16a";
}
.fa-dropbox:before {
  content: "\f16b";
}
.fa-stack-overflow:before {
  content: "\f16c";
}
.fa-instagram:before {
  content: "\f16d";
}
.fa-flickr:before {
  content: "\f16e";
}
.fa-adn:before {
  content: "\f170";
}
.fa-bitbucket:before {
  content: "\f171";
}
.fa-bitbucket-square:before {
  content: "\f172";
}
.fa-tumblr:before {
  content: "\f173";
}
.fa-tumblr-square:before {
  content: "\f174";
}
.fa-long-arrow-down:before {
  content: "\f175";
}
.fa-long-arrow-up:before {
  content: "\f176";
}
.fa-long-arrow-left:before {
  content: "\f177";
}
.fa-long-arrow-right:before {
  content: "\f178";
}
.fa-apple:before {
  content: "\f179";
}
.fa-windows:before {
  content: "\f17a";
}
.fa-android:before {
  content: "\f17b";
}
.fa-linux:before {
  content: "\f17c";
}
.fa-dribbble:before {
  content: "\f17d";
}
.fa-skype:before {
  content: "\f17e";
}
.fa-foursquare:before {
  content: "\f180";
}
.fa-trello:before {
  content: "\f181";
}
.fa-female:before {
  content: "\f182";
}
.fa-male:before {
  content: "\f183";
}
.fa-gittip:before,
.fa-gratipay:before {
  content: "\f184";
}
.fa-sun-o:before {
  content: "\f185";
}
.fa-moon-o:before {
  content: "\f186";
}
.fa-archive:before {
  content: "\f187";
}
.fa-bug:before {
  content: "\f188";
}
.fa-vk:before {
  content: "\f189";
}
.fa-weibo:before {
  content: "\f18a";
}
.fa-renren:before {
  content: "\f18b";
}
.fa-pagelines:before {
  content: "\f18c";
}
.fa-stack-exchange:before {
  content: "\f18d";
}
.fa-arrow-circle-o-right:before {
  content: "\f18e";
}
.fa-arrow-circle-o-left:before {
  content: "\f190";
}
.fa-toggle-left:before,
.fa-caret-square-o-left:before {
  content: "\f191";
}
.fa-dot-circle-o:before {
  content: "\f192";
}
.fa-wheelchair:before {
  content: "\f193";
}
.fa-vimeo-square:before {
  content: "\f194";
}
.fa-turkish-lira:before,
.fa-try:before {
  content: "\f195";
}
.fa-plus-square-o:before {
  content: "\f196";
}
.fa-space-shuttle:before {
  content: "\f197";
}
.fa-slack:before {
  content: "\f198";
}
.fa-envelope-square:before {
  content: "\f199";
}
.fa-wordpress:before {
  content: "\f19a";
}
.fa-openid:before {
  content: "\f19b";
}
.fa-institution:before,
.fa-bank:before,
.fa-university:before {
  content: "\f19c";
}
.fa-mortar-board:before,
.fa-graduation-cap:before {
  content: "\f19d";
}
.fa-yahoo:before {
  content: "\f19e";
}
.fa-google:before {
  content: "\f1a0";
}
.fa-reddit:before {
  content: "\f1a1";
}
.fa-reddit-square:before {
  content: "\f1a2";
}
.fa-stumbleupon-circle:before {
  content: "\f1a3";
}
.fa-stumbleupon:before {
  content: "\f1a4";
}
.fa-delicious:before {
  content: "\f1a5";
}
.fa-digg:before {
  content: "\f1a6";
}
.fa-pied-piper-pp:before {
  content: "\f1a7";
}
.fa-pied-piper-alt:before {
  content: "\f1a8";
}
.fa-drupal:before {
  content: "\f1a9";
}
.fa-joomla:before {
  content: "\f1aa";
}
.fa-language:before {
  content: "\f1ab";
}
.fa-fax:before {
  content: "\f1ac";
}
.fa-building:before {
  content: "\f1ad";
}
.fa-child:before {
  content: "\f1ae";
}
.fa-paw:before {
  content: "\f1b0";
}
.fa-spoon:before {
  content: "\f1b1";
}
.fa-cube:before {
  content: "\f1b2";
}
.fa-cubes:before {
  content: "\f1b3";
}
.fa-behance:before {
  content: "\f1b4";
}
.fa-behance-square:before {
  content: "\f1b5";
}
.fa-steam:before {
  content: "\f1b6";
}
.fa-steam-square:before {
  content: "\f1b7";
}
.fa-recycle:before {
  content: "\f1b8";
}
.fa-automobile:before,
.fa-car:before {
  content: "\f1b9";
}
.fa-cab:before,
.fa-taxi:before {
  content: "\f1ba";
}
.fa-tree:before {
  content: "\f1bb";
}
.fa-spotify:before {
  content: "\f1bc";
}
.fa-deviantart:before {
  content: "\f1bd";
}
.fa-soundcloud:before {
  content: "\f1be";
}
.fa-database:before {
  content: "\f1c0";
}
.fa-file-pdf-o:before {
  content: "\f1c1";
}
.fa-file-word-o:before {
  content: "\f1c2";
}
.fa-file-excel-o:before {
  content: "\f1c3";
}
.fa-file-powerpoint-o:before {
  content: "\f1c4";
}
.fa-file-photo-o:before,
.fa-file-picture-o:before,
.fa-file-image-o:before {
  content: "\f1c5";
}
.fa-file-zip-o:before,
.fa-file-archive-o:before {
  content: "\f1c6";
}
.fa-file-sound-o:before,
.fa-file-audio-o:before {
  content: "\f1c7";
}
.fa-file-movie-o:before,
.fa-file-video-o:before {
  content: "\f1c8";
}
.fa-file-code-o:before {
  content: "\f1c9";
}
.fa-vine:before {
  content: "\f1ca";
}
.fa-codepen:before {
  content: "\f1cb";
}
.fa-jsfiddle:before {
  content: "\f1cc";
}
.fa-life-bouy:before,
.fa-life-buoy:before,
.fa-life-saver:before,
.fa-support:before,
.fa-life-ring:before {
  content: "\f1cd";
}
.fa-circle-o-notch:before {
  content: "\f1ce";
}
.fa-ra:before,
.fa-resistance:before,
.fa-rebel:before {
  content: "\f1d0";
}
.fa-ge:before,
.fa-empire:before {
  content: "\f1d1";
}
.fa-git-square:before {
  content: "\f1d2";
}
.fa-git:before {
  content: "\f1d3";
}
.fa-y-combinator-square:before,
.fa-yc-square:before,
.fa-hacker-news:before {
  content: "\f1d4";
}
.fa-tencent-weibo:before {
  content: "\f1d5";
}
.fa-qq:before {
  content: "\f1d6";
}
.fa-wechat:before,
.fa-weixin:before {
  content: "\f1d7";
}
.fa-send:before,
.fa-paper-plane:before {
  content: "\f1d8";
}
.fa-send-o:before,
.fa-paper-plane-o:before {
  content: "\f1d9";
}
.fa-history:before {
  content: "\f1da";
}
.fa-circle-thin:before {
  content: "\f1db";
}
.fa-header:before {
  content: "\f1dc";
}
.fa-paragraph:before {
  content: "\f1dd";
}
.fa-sliders:before {
  content: "\f1de";
}
.fa-share-alt:before {
  content: "\f1e0";
}
.fa-share-alt-square:before {
  content: "\f1e1";
}
.fa-bomb:before {
  content: "\f1e2";
}
.fa-soccer-ball-o:before,
.fa-futbol-o:before {
  content: "\f1e3";
}
.fa-tty:before {
  content: "\f1e4";
}
.fa-binoculars:before {
  content: "\f1e5";
}
.fa-plug:before {
  content: "\f1e6";
}
.fa-slideshare:before {
  content: "\f1e7";
}
.fa-twitch:before {
  content: "\f1e8";
}
.fa-yelp:before {
  content: "\f1e9";
}
.fa-newspaper-o:before {
  content: "\f1ea";
}
.fa-wifi:before {
  content: "\f1eb";
}
.fa-calculator:before {
  content: "\f1ec";
}
.fa-paypal:before {
  content: "\f1ed";
}
.fa-google-wallet:before {
  content: "\f1ee";
}
.fa-cc-visa:before {
  content: "\f1f0";
}
.fa-cc-mastercard:before {
  content: "\f1f1";
}
.fa-cc-discover:before {
  content: "\f1f2";
}
.fa-cc-amex:before {
  content: "\f1f3";
}
.fa-cc-paypal:before {
  content: "\f1f4";
}
.fa-cc-stripe:before {
  content: "\f1f5";
}
.fa-bell-slash:before {
  content: "\f1f6";
}
.fa-bell-slash-o:before {
  content: "\f1f7";
}
.fa-trash:before {
  content: "\f1f8";
}
.fa-copyright:before {
  content: "\f1f9";
}
.fa-at:before {
  content: "\f1fa";
}
.fa-eyedropper:before {
  content: "\f1fb";
}
.fa-paint-brush:before {
  content: "\f1fc";
}
.fa-birthday-cake:before {
  content: "\f1fd";
}
.fa-area-chart:before {
  content: "\f1fe";
}
.fa-pie-chart:before {
  content: "\f200";
}
.fa-line-chart:before {
  content: "\f201";
}
.fa-lastfm:before {
  content: "\f202";
}
.fa-lastfm-square:before {
  content: "\f203";
}
.fa-toggle-off:before {
  content: "\f204";
}
.fa-toggle-on:before {
  content: "\f205";
}
.fa-bicycle:before {
  content: "\f206";
}
.fa-bus:before {
  content: "\f207";
}
.fa-ioxhost:before {
  content: "\f208";
}
.fa-angellist:before {
  content: "\f209";
}
.fa-cc:before {
  content: "\f20a";
}
.fa-shekel:before,
.fa-sheqel:before,
.fa-ils:before {
  content: "\f20b";
}
.fa-meanpath:before {
  content: "\f20c";
}
.fa-buysellads:before {
  content: "\f20d";
}
.fa-connectdevelop:before {
  content: "\f20e";
}
.fa-dashcube:before {
  content: "\f210";
}
.fa-forumbee:before {
  content: "\f211";
}
.fa-leanpub:before {
  content: "\f212";
}
.fa-sellsy:before {
  content: "\f213";
}
.fa-shirtsinbulk:before {
  content: "\f214";
}
.fa-simplybuilt:before {
  content: "\f215";
}
.fa-skyatlas:before {
  content: "\f216";
}
.fa-cart-plus:before {
  content: "\f217";
}
.fa-cart-arrow-down:before {
  content: "\f218";
}
.fa-diamond:before {
  content: "\f219";
}
.fa-ship:before {
  content: "\f21a";
}
.fa-user-secret:before {
  content: "\f21b";
}
.fa-motorcycle:before {
  content: "\f21c";
}
.fa-street-view:before {
  content: "\f21d";
}
.fa-heartbeat:before {
  content: "\f21e";
}
.fa-venus:before {
  content: "\f221";
}
.fa-mars:before {
  content: "\f222";
}
.fa-mercury:before {
  content: "\f223";
}
.fa-intersex:before,
.fa-transgender:before {
  content: "\f224";
}
.fa-transgender-alt:before {
  content: "\f225";
}
.fa-venus-double:before {
  content: "\f226";
}
.fa-mars-double:before {
  content: "\f227";
}
.fa-venus-mars:before {
  content: "\f228";
}
.fa-mars-stroke:before {
  content: "\f229";
}
.fa-mars-stroke-v:before {
  content: "\f22a";
}
.fa-mars-stroke-h:before {
  content: "\f22b";
}
.fa-neuter:before {
  content: "\f22c";
}
.fa-genderless:before {
  content: "\f22d";
}
.fa-facebook-official:before {
  content: "\f230";
}
.fa-pinterest-p:before {
  content: "\f231";
}
.fa-whatsapp:before {
  content: "\f232";
}
.fa-server:before {
  content: "\f233";
}
.fa-user-plus:before {
  content: "\f234";
}
.fa-user-times:before {
  content: "\f235";
}
.fa-hotel:before,
.fa-bed:before {
  content: "\f236";
}
.fa-viacoin:before {
  content: "\f237";
}
.fa-train:before {
  content: "\f238";
}
.fa-subway:before {
  content: "\f239";
}
.fa-medium:before {
  content: "\f23a";
}
.fa-yc:before,
.fa-y-combinator:before {
  content: "\f23b";
}
.fa-optin-monster:before {
  content: "\f23c";
}
.fa-opencart:before {
  content: "\f23d";
}
.fa-expeditedssl:before {
  content: "\f23e";
}
.fa-battery-4:before,
.fa-battery:before,
.fa-battery-full:before {
  content: "\f240";
}
.fa-battery-3:before,
.fa-battery-three-quarters:before {
  content: "\f241";
}
.fa-battery-2:before,
.fa-battery-half:before {
  content: "\f242";
}
.fa-battery-1:before,
.fa-battery-quarter:before {
  content: "\f243";
}
.fa-battery-0:before,
.fa-battery-empty:before {
  content: "\f244";
}
.fa-mouse-pointer:before {
  content: "\f245";
}
.fa-i-cursor:before {
  content: "\f246";
}
.fa-object-group:before {
  content: "\f247";
}
.fa-object-ungroup:before {
  content: "\f248";
}
.fa-sticky-note:before {
  content: "\f249";
}
.fa-sticky-note-o:before {
  content: "\f24a";
}
.fa-cc-jcb:before {
  content: "\f24b";
}
.fa-cc-diners-club:before {
  content: "\f24c";
}
.fa-clone:before {
  content: "\f24d";
}
.fa-balance-scale:before {
  content: "\f24e";
}
.fa-hourglass-o:before {
  content: "\f250";
}
.fa-hourglass-1:before,
.fa-hourglass-start:before {
  content: "\f251";
}
.fa-hourglass-2:before,
.fa-hourglass-half:before {
  content: "\f252";
}
.fa-hourglass-3:before,
.fa-hourglass-end:before {
  content: "\f253";
}
.fa-hourglass:before {
  content: "\f254";
}
.fa-hand-grab-o:before,
.fa-hand-rock-o:before {
  content: "\f255";
}
.fa-hand-stop-o:before,
.fa-hand-paper-o:before {
  content: "\f256";
}
.fa-hand-scissors-o:before {
  content: "\f257";
}
.fa-hand-lizard-o:before {
  content: "\f258";
}
.fa-hand-spock-o:before {
  content: "\f259";
}
.fa-hand-pointer-o:before {
  content: "\f25a";
}
.fa-hand-peace-o:before {
  content: "\f25b";
}
.fa-trademark:before {
  content: "\f25c";
}
.fa-registered:before {
  content: "\f25d";
}
.fa-creative-commons:before {
  content: "\f25e";
}
.fa-gg:before {
  content: "\f260";
}
.fa-gg-circle:before {
  content: "\f261";
}
.fa-tripadvisor:before {
  content: "\f262";
}
.fa-odnoklassniki:before {
  content: "\f263";
}
.fa-odnoklassniki-square:before {
  content: "\f264";
}
.fa-get-pocket:before {
  content: "\f265";
}
.fa-wikipedia-w:before {
  content: "\f266";
}
.fa-safari:before {
  content: "\f267";
}
.fa-chrome:before {
  content: "\f268";
}
.fa-firefox:before {
  content: "\f269";
}
.fa-opera:before {
  content: "\f26a";
}
.fa-internet-explorer:before {
  content: "\f26b";
}
.fa-tv:before,
.fa-television:before {
  content: "\f26c";
}
.fa-contao:before {
  content: "\f26d";
}
.fa-500px:before {
  content: "\f26e";
}
.fa-amazon:before {
  content: "\f270";
}
.fa-calendar-plus-o:before {
  content: "\f271";
}
.fa-calendar-minus-o:before {
  content: "\f272";
}
.fa-calendar-times-o:before {
  content: "\f273";
}
.fa-calendar-check-o:before {
  content: "\f274";
}
.fa-industry:before {
  content: "\f275";
}
.fa-map-pin:before {
  content: "\f276";
}
.fa-map-signs:before {
  content: "\f277";
}
.fa-map-o:before {
  content: "\f278";
}
.fa-map:before {
  content: "\f279";
}
.fa-commenting:before {
  content: "\f27a";
}
.fa-commenting-o:before {
  content: "\f27b";
}
.fa-houzz:before {
  content: "\f27c";
}
.fa-vimeo:before {
  content: "\f27d";
}
.fa-black-tie:before {
  content: "\f27e";
}
.fa-fonticons:before {
  content: "\f280";
}
.fa-reddit-alien:before {
  content: "\f281";
}
.fa-edge:before {
  content: "\f282";
}
.fa-credit-card-alt:before {
  content: "\f283";
}
.fa-codiepie:before {
  content: "\f284";
}
.fa-modx:before {
  content: "\f285";
}
.fa-fort-awesome:before {
  content: "\f286";
}
.fa-usb:before {
  content: "\f287";
}
.fa-product-hunt:before {
  content: "\f288";
}
.fa-mixcloud:before {
  content: "\f289";
}
.fa-scribd:before {
  content: "\f28a";
}
.fa-pause-circle:before {
  content: "\f28b";
}
.fa-pause-circle-o:before {
  content: "\f28c";
}
.fa-stop-circle:before {
  content: "\f28d";
}
.fa-stop-circle-o:before {
  content: "\f28e";
}
.fa-shopping-bag:before {
  content: "\f290";
}
.fa-shopping-basket:before {
  content: "\f291";
}
.fa-hashtag:before {
  content: "\f292";
}
.fa-bluetooth:before {
  content: "\f293";
}
.fa-bluetooth-b:before {
  content: "\f294";
}
.fa-percent:before {
  content: "\f295";
}
.fa-gitlab:before {
  content: "\f296";
}
.fa-wpbeginner:before {
  content: "\f297";
}
.fa-wpforms:before {
  content: "\f298";
}
.fa-envira:before {
  content: "\f299";
}
.fa-universal-access:before {
  content: "\f29a";
}
.fa-wheelchair-alt:before {
  content: "\f29b";
}
.fa-question-circle-o:before {
  content: "\f29c";
}
.fa-blind:before {
  content: "\f29d";
}
.fa-audio-description:before {
  content: "\f29e";
}
.fa-volume-control-phone:before {
  content: "\f2a0";
}
.fa-braille:before {
  content: "\f2a1";
}
.fa-assistive-listening-systems:before {
  content: "\f2a2";
}
.fa-asl-interpreting:before,
.fa-american-sign-language-interpreting:before {
  content: "\f2a3";
}
.fa-deafness:before,
.fa-hard-of-hearing:before,
.fa-deaf:before {
  content: "\f2a4";
}
.fa-glide:before {
  content: "\f2a5";
}
.fa-glide-g:before {
  content: "\f2a6";
}
.fa-signing:before,
.fa-sign-language:before {
  content: "\f2a7";
}
.fa-low-vision:before {
  content: "\f2a8";
}
.fa-viadeo:before {
  content: "\f2a9";
}
.fa-viadeo-square:before {
  content: "\f2aa";
}
.fa-snapchat:before {
  content: "\f2ab";
}
.fa-snapchat-ghost:before {
  content: "\f2ac";
}
.fa-snapchat-square:before {
  content: "\f2ad";
}
.fa-pied-piper:before {
  content: "\f2ae";
}
.fa-first-order:before {
  content: "\f2b0";
}
.fa-yoast:before {
  content: "\f2b1";
}
.fa-themeisle:before {
  content: "\f2b2";
}
.fa-google-plus-circle:before,
.fa-google-plus-official:before {
  content: "\f2b3";
}
.fa-fa:before,
.fa-font-awesome:before {
  content: "\f2b4";
}
.fa-handshake-o:before {
  content: "\f2b5";
}
.fa-envelope-open:before {
  content: "\f2b6";
}
.fa-envelope-open-o:before {
  content: "\f2b7";
}
.fa-linode:before {
  content: "\f2b8";
}
.fa-address-book:before {
  content: "\f2b9";
}
.fa-address-book-o:before {
  content: "\f2ba";
}
.fa-vcard:before,
.fa-address-card:before {
  content: "\f2bb";
}
.fa-vcard-o:before,
.fa-address-card-o:before {
  content: "\f2bc";
}
.fa-user-circle:before {
  content: "\f2bd";
}
.fa-user-circle-o:before {
  content: "\f2be";
}
.fa-user-o:before {
  content: "\f2c0";
}
.fa-id-badge:before {
  content: "\f2c1";
}
.fa-drivers-license:before,
.fa-id-card:before {
  content: "\f2c2";
}
.fa-drivers-license-o:before,
.fa-id-card-o:before {
  content: "\f2c3";
}
.fa-quora:before {
  content: "\f2c4";
}
.fa-free-code-camp:before {
  content: "\f2c5";
}
.fa-telegram:before {
  content: "\f2c6";
}
.fa-thermometer-4:before,
.fa-thermometer:before,
.fa-thermometer-full:before {
  content: "\f2c7";
}
.fa-thermometer-3:before,
.fa-thermometer-three-quarters:before {
  content: "\f2c8";
}
.fa-thermometer-2:before,
.fa-thermometer-half:before {
  content: "\f2c9";
}
.fa-thermometer-1:before,
.fa-thermometer-quarter:before {
  content: "\f2ca";
}
.fa-thermometer-0:before,
.fa-thermometer-empty:before {
  content: "\f2cb";
}
.fa-shower:before {
  content: "\f2cc";
}
.fa-bathtub:before,
.fa-s15:before,
.fa-bath:before {
  content: "\f2cd";
}
.fa-podcast:before {
  content: "\f2ce";
}
.fa-window-maximize:before {
  content: "\f2d0";
}
.fa-window-minimize:before {
  content: "\f2d1";
}
.fa-window-restore:before {
  content: "\f2d2";
}
.fa-times-rectangle:before,
.fa-window-close:before {
  content: "\f2d3";
}
.fa-times-rectangle-o:before,
.fa-window-close-o:before {
  content: "\f2d4";
}
.fa-bandcamp:before {
  content: "\f2d5";
}
.fa-grav:before {
  content: "\f2d6";
}
.fa-etsy:before {
  content: "\f2d7";
}
.fa-imdb:before {
  content: "\f2d8";
}
.fa-ravelry:before {
  content: "\f2d9";
}
.fa-eercast:before {
  content: "\f2da";
}
.fa-microchip:before {
  content: "\f2db";
}
.fa-snowflake-o:before {
  content: "\f2dc";
}
.fa-superpowers:before {
  content: "\f2dd";
}
.fa-wpexplorer:before {
  content: "\f2de";
}
.fa-meetup:before {
  content: "\f2e0";
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  overflow: visible;
  clip: auto;
}
{"tiddlers":{"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/history":{"title":"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/history","created":"20180114170309007","modified":"20180128162501143","tags":"","type":"text/vnd.tiddlywiki","text":"* ''1.0.2'' -- adds `caption` field to support new skin selection in the Control Panel tab \"Media Player Skins\".\n* ''1.0.1'' -- adds support for centered (big) play button, similar to what is supported in the default skin as well as some other skins.\n* ''1.0.0'' -- first release of the iPlayer-inspired Video.js Skin plugin."},"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/license":{"title":"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/license","created":"20180114170300930","modified":"20180114211253792","tags":"","type":"text/vnd.tiddlywiki","text":"* The CSS stylesheet for the [[iPlayer-inspired Video.js skin|https://github.com/VD39/videojs-iplayer-skin]] is licensed under the [[MIT License|http://opensource.org/licenses/MIT]].\n* This plugin is licensed under the [[MIT License|http://opensource.org/licenses/MIT]].\n"},"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/readme":{"title":"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/readme","created":"20180114170253183","modified":"20180114211345389","tags":"","type":"text/vnd.tiddlywiki","text":"Provides the [[iPlayer-inspired Video.js skin|https://github.com/VD39/videojs-iplayer-skin]] (~GitHub) by [[Vijay Dubb/VD39|https://github.com/VD39]] (~GitHub) for use with the [[TwTube plugin|https://github.com/TheDiveO/TwTube]] (//you guessed right// ... ~GitHub). Simply install this plugin into your ~TiddlyWiki alongside the ~TwTube plugin and you're done.\n"},"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/styles/fixes.css":{"title":"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/styles/fixes.css","created":"20180114182654131","modified":"20180114182731430","tags":"$:/tags/TwTubeVideojsSkin","type":"text/css","text":".vjs-big-play-centered .vjs-big-play-button {\n  top: 50% !important;\n  left: 50% !important;\n  margin-top: -42px !important;\n  margin-left: -42px !important;\n}\n"},"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/styles/skin.css":{"title":"$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin/styles/skin.css","created":"20180114182654131","modified":"20180114182731430","tags":"$:/tags/TwTubeVideojsSkin","type":"text/css","text":"/*!\n * videojs-iplayer-skin-1\n * A Video.JS skin modelled on the new iPlayer theme.\n * \n * @author Vijay Dubb\n * @version 1.0.0\n * Copyright 2017. MIT licensed.\n */\n\n.video-js .vjs-loading-spinner,\n.vjs-default-skin .vjs-loading-spinner {\n  border-color: #bb1919;\n}\n.video-js .vjs-loading-spinner:before, .video-js .vjs-loading-spinner:after,\n.vjs-default-skin .vjs-loading-spinner:before,\n.vjs-default-skin .vjs-loading-spinner:after {\n  border-color: #bb1919;\n}\n.video-js.vjs-paused .vjs-tech,\n.video-js.vjs-paused .vjs-big-play-button,\n.vjs-default-skin.vjs-paused .vjs-tech,\n.vjs-default-skin.vjs-paused .vjs-big-play-button {\n  z-index: 2;\n}\n.video-js.vjs-paused .vjs-control-bar,\n.vjs-default-skin.vjs-paused .vjs-control-bar {\n  z-index: -1;\n}\n.video-js.vjs-has-started .vjs-tech,\n.video-js.vjs-has-started .vjs-big-play-button,\n.vjs-default-skin.vjs-has-started .vjs-tech,\n.vjs-default-skin.vjs-has-started .vjs-big-play-button {\n  z-index: 0;\n}\n.video-js.vjs-has-started .vjs-control-bar,\n.vjs-default-skin.vjs-has-started .vjs-control-bar {\n  z-index: 2;\n}\n.video-js .vjs-menu,\n.vjs-default-skin .vjs-menu {\n  bottom: 14px;\n}\n.video-js .vjs-big-play-button,\n.vjs-default-skin .vjs-big-play-button {\n  background-color: rgba(0, 0, 0, 0.5);\n  position: absolute;\n  margin: 0;\n  border-radius: 0;\n  border: none;\n  width: 85px;\n  height: 85px;\n  bottom: 0;\n  left: 0;\n  top: auto;\n  box-shadow: none;\n  transition: background-color .5s ease;\n}\n.video-js .vjs-big-play-button .vjs-icon-placeholder:hover, .video-js .vjs-big-play-button .vjs-icon-placeholder:focus,\n.vjs-default-skin .vjs-big-play-button .vjs-icon-placeholder:hover,\n.vjs-default-skin .vjs-big-play-button .vjs-icon-placeholder:focus {\n  background-color: #bb1919;\n}\n.video-js .vjs-big-play-button .vjs-icon-placeholder:before,\n.vjs-default-skin .vjs-big-play-button .vjs-icon-placeholder:before {\n  font-size: 60px;\n  height: auto;\n  padding: 0;\n  margin: 0;\n  line-height: 85px;\n}\n.video-js:hover .vjs-big-play-button,\n.video-js:hover .vjs-big-play-button:focus, .video-js:focus .vjs-big-play-button,\n.video-js:focus .vjs-big-play-button:focus,\n.vjs-default-skin:hover .vjs-big-play-button,\n.vjs-default-skin:hover .vjs-big-play-button:focus,\n.vjs-default-skin:focus .vjs-big-play-button,\n.vjs-default-skin:focus .vjs-big-play-button:focus {\n  border-color: transparent;\n  box-shadow: none;\n  background-color: #bb1919;\n}\n.video-js .vjs-load-progress,\n.vjs-default-skin .vjs-load-progress {\n  background: #e0e0e0;\n}\n.video-js .vjs-progress-holder .vjs-play-progress,\n.video-js .vjs-progress-holder .vjs-load-progress,\n.video-js .vjs-progress-holder .vjs-load-progress div,\n.vjs-default-skin .vjs-progress-holder .vjs-play-progress,\n.vjs-default-skin .vjs-progress-holder .vjs-load-progress,\n.vjs-default-skin .vjs-progress-holder .vjs-load-progress div {\n  height: 6px;\n  line-height: 44px;\n}\n.video-js .vjs-volume-level,\n.video-js .vjs-play-progress,\n.vjs-default-skin .vjs-volume-level,\n.vjs-default-skin .vjs-play-progress {\n  background-color: #bb1919;\n}\n.video-js .vjs-volume-level:before,\n.video-js .vjs-play-progress:before,\n.vjs-default-skin .vjs-volume-level:before,\n.vjs-default-skin .vjs-play-progress:before {\n  right: -8px;\n  font-size: 0.9em;\n  height: 14px;\n  width: 9px;\n  background: #FFFFFF;\n  padding: 0;\n  margin: 0;\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  content: '';\n}\n.video-js .vjs-control-bar,\n.vjs-default-skin .vjs-control-bar {\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n  height: 120px;\n  background: -moz-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.39) 39%, rgba(0, 0, 0, 0.39) 39%, black 100%);\n  background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(39%, rgba(0, 0, 0, 0.39)), color-stop(39%, rgba(0, 0, 0, 0.39)), color-stop(100%, black));\n  background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.39) 39%, rgba(0, 0, 0, 0.39) 39%, black 100%);\n  background: -o-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.39) 39%, rgba(0, 0, 0, 0.39) 39%, black 100%);\n  background: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.39) 39%, rgba(0, 0, 0, 0.39) 39%, black 100%);\n  background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.39) 39%, rgba(0, 0, 0, 0.39) 39%, black 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#000000', GradientType=0);\n}\n.video-js .vjs-icon-placeholder:before,\n.vjs-default-skin .vjs-icon-placeholder:before {\n  font-size: 25px;\n  height: auto;\n  padding: 0;\n  margin: 0;\n  line-height: 44px;\n  width: 44px;\n}\n.video-js .vjs-icon-placeholder:focus:before, .video-js .vjs-icon-placeholder:hover:before,\n.vjs-default-skin .vjs-icon-placeholder:focus:before,\n.vjs-default-skin .vjs-icon-placeholder:hover:before {\n  box-shadow: none;\n  text-shadow: none;\n}\n.video-js .vjs-live-control,\n.vjs-default-skin .vjs-live-control {\n  top: -34px;\n  left: 0;\n  right: 0;\n  margin: auto;\n  position: absolute;\n}\n.video-js .vjs-current-time,\n.video-js .vjs-remaining-time,\n.vjs-default-skin .vjs-current-time,\n.vjs-default-skin .vjs-remaining-time {\n  right: 82px;\n}\n.video-js .vjs-duration,\n.vjs-default-skin .vjs-duration {\n  right: 50px;\n}\n.video-js .vjs-time-divider,\n.vjs-default-skin .vjs-time-divider {\n  right: 75px;\n}\n.video-js .vjs-playback-rate .vjs-menu,\n.vjs-default-skin .vjs-playback-rate .vjs-menu {\n  width: 44px;\n  bottom: 14px;\n}\n.video-js .vjs-playback-rate .vjs-playback-rate-value,\n.vjs-default-skin .vjs-playback-rate .vjs-playback-rate-value {\n  line-height: 44px;\n}\n.video-js .vjs-current-time,\n.video-js .vjs-duration,\n.video-js .vjs-time-divider,\n.vjs-default-skin .vjs-current-time,\n.vjs-default-skin .vjs-duration,\n.vjs-default-skin .vjs-time-divider {\n  position: absolute;\n  height: 44px;\n  display: block;\n  bottom: 0;\n}\n.video-js .vjs-current-time > div,\n.video-js .vjs-duration > div,\n.video-js .vjs-time-divider > div,\n.vjs-default-skin .vjs-current-time > div,\n.vjs-default-skin .vjs-duration > div,\n.vjs-default-skin .vjs-time-divider > div {\n  line-height: 44px;\n  height: 44px;\n}\n.video-js .vjs-remaining-time,\n.vjs-default-skin .vjs-remaining-time {\n  display: none;\n}\n.video-js .vjs-control,\n.vjs-default-skin .vjs-control {\n  width: 44px;\n  height: 44px;\n  transition: background-color .5s ease;\n  bottom: 0;\n}\n.video-js .vjs-control.vjs-fullscreen-control, .video-js .vjs-control.vjs-subs-caps-button, .video-js .vjs-control.vjs-playback-rate, .video-js .vjs-control.vjs-captions-button, .video-js .vjs-control.vjs-chapters-button, .video-js .vjs-control.vjs-volume-menu-button, .video-js .vjs-control.vjs-quality-button, .video-js .vjs-control.vjs-descriptions-button, .video-js .vjs-control.vjs-audio-button,\n.vjs-default-skin .vjs-control.vjs-fullscreen-control,\n.vjs-default-skin .vjs-control.vjs-subs-caps-button,\n.vjs-default-skin .vjs-control.vjs-playback-rate,\n.vjs-default-skin .vjs-control.vjs-captions-button,\n.vjs-default-skin .vjs-control.vjs-chapters-button,\n.vjs-default-skin .vjs-control.vjs-volume-menu-button,\n.vjs-default-skin .vjs-control.vjs-quality-button,\n.vjs-default-skin .vjs-control.vjs-descriptions-button,\n.vjs-default-skin .vjs-control.vjs-audio-button {\n  width: 44px;\n  height: 44px;\n  transition: background-color .5s ease;\n  bottom: -76px;\n  position: relative;\n}\n.video-js .vjs-control:hover, .video-js .vjs-control:focus,\n.vjs-default-skin .vjs-control:hover,\n.vjs-default-skin .vjs-control:focus {\n  background-color: #bb1919;\n}\n.video-js .vjs-progress-control,\n.vjs-default-skin .vjs-progress-control {\n  bottom: 40px;\n  width: 100%;\n  position: absolute;\n}\n.video-js .vjs-progress-control .vjs-slider,\n.vjs-default-skin .vjs-progress-control .vjs-slider {\n  height: 6px;\n  margin: 0 10px;\n}\n.video-js .vjs-progress-control .vjs-slider-handle,\n.vjs-default-skin .vjs-progress-control .vjs-slider-handle {\n  top: 40%;\n}\n.video-js .vjs-progress-control:hover, .video-js .vjs-progress-control:focus,\n.video-js .vjs-current-time:hover,\n.video-js .vjs-current-time:focus,\n.video-js .vjs-duration:hover,\n.video-js .vjs-duration:focus,\n.video-js .vjs-time-divider:hover,\n.video-js .vjs-time-divider:focus,\n.video-js .vjs-volume-control:hover,\n.video-js .vjs-volume-control:focus,\n.video-js .vjs-close-button:hover,\n.video-js .vjs-close-button:focus,\n.video-js .vjs-live-control:hover,\n.video-js .vjs-live-control:focus,\n.vjs-default-skin .vjs-progress-control:hover,\n.vjs-default-skin .vjs-progress-control:focus,\n.vjs-default-skin .vjs-current-time:hover,\n.vjs-default-skin .vjs-current-time:focus,\n.vjs-default-skin .vjs-duration:hover,\n.vjs-default-skin .vjs-duration:focus,\n.vjs-default-skin .vjs-time-divider:hover,\n.vjs-default-skin .vjs-time-divider:focus,\n.vjs-default-skin .vjs-volume-control:hover,\n.vjs-default-skin .vjs-volume-control:focus,\n.vjs-default-skin .vjs-close-button:hover,\n.vjs-default-skin .vjs-close-button:focus,\n.vjs-default-skin .vjs-live-control:hover,\n.vjs-default-skin .vjs-live-control:focus {\n  background-color: transparent;\n}\n.video-js .vjs-play-control,\n.vjs-default-skin .vjs-play-control {\n  position: absolute;\n  left: 0;\n}\n.video-js .vjs-fullscreen-control,\n.vjs-default-skin .vjs-fullscreen-control {\n  margin-left: 85px !important;\n  right: 0;\n  position: absolute;\n}\n.video-js .vjs-volume-menu-button,\n.video-js .vjs-volume-panel,\n.vjs-default-skin .vjs-volume-menu-button,\n.vjs-default-skin .vjs-volume-panel {\n  position: absolute;\n  left: 44px;\n}\n.video-js .vjs-volume-menu-button:hover, .video-js .vjs-volume-menu-button:focus,\n.video-js .vjs-volume-panel:hover,\n.video-js .vjs-volume-panel:focus,\n.vjs-default-skin .vjs-volume-menu-button:hover,\n.vjs-default-skin .vjs-volume-menu-button:focus,\n.vjs-default-skin .vjs-volume-panel:hover,\n.vjs-default-skin .vjs-volume-panel:focus {\n  background-color: transparent;\n}\n.video-js .vjs-volume-menu-button:hover:before, .video-js .vjs-volume-menu-button:focus:before,\n.video-js .vjs-volume-panel:hover:before,\n.video-js .vjs-volume-panel:focus:before,\n.vjs-default-skin .vjs-volume-menu-button:hover:before,\n.vjs-default-skin .vjs-volume-menu-button:focus:before,\n.vjs-default-skin .vjs-volume-panel:hover:before,\n.vjs-default-skin .vjs-volume-panel:focus:before {\n  background-color: #bb1919;\n}\n.video-js .vjs-volume-menu-button:before,\n.video-js .vjs-volume-panel:before,\n.vjs-default-skin .vjs-volume-menu-button:before,\n.vjs-default-skin .vjs-volume-panel:before {\n  width: 44px;\n  left: 0;\n  top: 50%;\n  -webkit-transform: translate(0%, -50%);\n  -ms-transform: translate(0%, -50%);\n  transform: translate(0%, -50%);\n}\n.video-js .vjs-volume-bar,\n.video-js .vjs-volume-level,\n.vjs-default-skin .vjs-volume-bar,\n.vjs-default-skin .vjs-volume-level {\n  height: 6px;\n}\n.video-js .vjs-volume-bar,\n.vjs-default-skin .vjs-volume-bar {\n  top: 24%;\n  margin: 0;\n  left: 4px;\n  width: 80px;\n}\n.video-js .vjs-seek-handle,\n.vjs-default-skin .vjs-seek-handle {\n  height: auto;\n}\n.video-js .vjs-slider-handle:before,\n.video-js .vjs-volume-bar .vjs-volume-handle:before,\n.vjs-default-skin .vjs-slider-handle:before,\n.vjs-default-skin .vjs-volume-bar .vjs-volume-handle:before {\n  width: 10px;\n  height: 16px;\n  background-color: #FFFFFF;\n  position: absolute;\n  right: 0;\n  top: -5px;\n  -webkit-transform: none;\n  -ms-transform: none;\n  transform: none;\n  content: \"\";\n  font-family: none;\n}\n.video-js .vjs-live-controls,\n.vjs-default-skin .vjs-live-controls {\n  display: none;\n}\n.video-js .vjs-menu-button-inline:hover, .video-js .vjs-menu-button-inline:focus, .video-js .vjs-menu-button-inline.vjs-slider-active,\n.vjs-default-skin .vjs-menu-button-inline:hover,\n.vjs-default-skin .vjs-menu-button-inline:focus,\n.vjs-default-skin .vjs-menu-button-inline.vjs-slider-active {\n  width: 14em;\n}\n.video-js .vjs-menu-button-inline .vjs-menu,\n.vjs-default-skin .vjs-menu-button-inline .vjs-menu {\n  left: 97px;\n}\n.video-js .vjs-menu-button-inline .vjs-menu .vjs-menu-content,\n.vjs-default-skin .vjs-menu-button-inline .vjs-menu .vjs-menu-content {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  -webkit-transform: translate(-50%, -50%);\n  -ms-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  overflow: visible;\n  height: auto;\n  width: 8em;\n}\n.video-js.vjs-no-flex .vjs-menu-button-inline,\n.vjs-default-skin.vjs-no-flex .vjs-menu-button-inline {\n  width: 14em;\n}\n.video-js .vjs-time-tooltip,\n.vjs-default-skin .vjs-time-tooltip {\n  line-height: 10px;\n  left: 15px;\n}\n.video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal {\n  top: 24%;\n  margin: 0;\n  left: 4px;\n  width: 80px;\n}\n.video-js .vjs-volume-panel .vjs-volume-control,\n.vjs-default-skin .vjs-volume-panel .vjs-volume-control {\n  top: 24%;\n  margin: 0;\n  left: 4px;\n  width: 0;\n}\n.video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:focus.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-volume-control:focus.vjs-volume-horizontal {\n  top: 24%;\n  margin: 0;\n  left: 4px;\n  width: 80px;\n}\n.video-js .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control.vjs-volume-horizontal {\n  top: 24%;\n  margin: 0;\n  left: 4px;\n  width: 80px;\n}\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal,\n.vjs-default-skin .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal {\n  top: 24%;\n  margin: 0;\n  left: 4px;\n  width: 80px;\n}\n\n/*# sourceMappingURL=videojs-iplayer-theme.css.map */\n"}}}
{"tiddlers":{"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/history":{"title":"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/history","created":"20180114170309007","modified":"20180128162518012","tags":"","type":"text/vnd.tiddlywiki","text":"* ''1.0.1'' -- adds `caption` field to support new skin selection in the Control Panel tab \"Media Player Skins\".\n* ''1.0.0'' -- first release of the Sublime-inspired Video.js Skin plugin."},"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/license":{"title":"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/license","created":"20180114170300930","modified":"20180114175741246","tags":"","type":"text/vnd.tiddlywiki","text":"* The CSS stylesheet for the [[Sublime-inspired Video.js skin|https://github.com/zanechua/videojs-sublime-inspired-skin]] is licensed under the [[MIT License|http://opensource.org/licenses/MIT]].\n* This plugin is licensed under the [[MIT License|http://opensource.org/licenses/MIT]]."},"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/macros/skin class":{"title":"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/macros/skin class","created":"20180114174339454","modified":"20180114175748874","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define twtube-skin-classes() vjs-sublime-skin"},"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/readme":{"title":"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/readme","created":"20180114170253183","modified":"20180114175806600","tags":"","type":"text/vnd.tiddlywiki","text":"Provides the [[Sublime-inspired Video.js skin|https://github.com/zanechua/videojs-sublime-inspired-skin]] (~GitHub) by [[zanechua|https://github.com/zanechua]] (~GitHub) for use with the [[TwTube plugin|https://github.com/TheDiveO/TwTube]] (//you guessed right// ... ~GitHub). Simply install this plugin into your ~TiddlyWiki alongside the ~TwTube plugin and you're done."},"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/styles/skin.css":{"title":"$:/plugins/TheDiveO/SublimeInspiredVideojsSkin/styles/skin.css","created":"20180114164921108","modified":"20180114175812441","tags":"$:/tags/TwTubeVideojsSkin","type":"text/css","text":".video-js {\n    /* The base font size controls the size of everything, not just text.\n       All dimensions use em-based sizes so that the scale along with the font size.\n       Try increasing it to 15px and see what happens. */\n    font-size: 10px;\n    /* The main font color changes the ICON COLORS as well as the text */\n    color: #fff;\n}\n\n/* The \"Big Play Button\" is the play button that shows before the video plays.\n   To center it set the align values to center and middle. The typical location\n   of the button is the center, but there is trend towards moving it to a corner\n   where it gets out of the way of valuable content in the poster image.*/\n.vjs-sublime-skin .vjs-big-play-button {\n    /* The font size is what makes the big play button...big.\n       All width/height values use ems, which are a multiple of the font size.\n       If the .video-js font-size is 10px, then 3em equals 30px.*/\n    font-size: 8em;\n    /* We're using SCSS vars here because the values are used in multiple places.\n       Now that font size is set, the following em values will be a multiple of the\n       new font size. If the font-size is 3em (30px), then setting any of\n       the following values to 3em would equal 30px. 3 * font-size. */\n    /* 1.5em = 45px default */\n    line-height: 1.5em;\n    height: 1.5em;\n    width: 3em;\n    /* 0.06666em = 2px default */\n    border: 0;\n    /* 0.3em = 9px default */\n    border-radius: 0.3em;\n    /* Align center */\n    left: 50%;\n    top: 50%;\n    margin-left: -1.5em;\n    margin-top: -0.75em;\n}\n\n/* The default color of control backgrounds is mostly black but with a little\n   bit of blue so it can still be seen on all-black video frames, which are common. */\n.video-js .vjs-control-bar,\n.video-js .vjs-big-play-button,\n.video-js .vjs-volume-menu-button .vjs-menu-content,\n.video-js .vjs-volume-panel .vjs-volume-control {\n    /* IE8 - has no alpha support */\n    background-color: #2B333F;\n    /* Opacity: 1.0 = 100%, 0.0 = 0% */\n    background-color: rgba(43, 51, 63, 0.7);\n    background-color: transparent;\n}\n\n/* Slider - used for Volume bar and Progress bar */\n.video-js .vjs-slider {\n    background-color: #73859f;\n    background-color: rgba(115, 133, 159, 0.5);\n    background-color: rgba(255, 255, 255, 0.3);\n    border-radius: 2px;\n    height: 6.5px;\n}\n\n/* The slider bar color is used for the progress bar and the volume bar\n   (the first two can be removed after a fix that's coming) */\n.video-js .vjs-volume-level,\n.video-js .vjs-play-progress,\n.video-js .vjs-slider-bar {\n    background: #fff;\n}\n\n.video-js .vjs-progress-holder .vjs-load-progress,\n.video-js .vjs-progress-holder .vjs-load-progress div,\n.video-js .vjs-progress-holder .vjs-play-progress,\n.video-js .vjs-progress-holder .vjs-tooltip-progress-bar {\n    height: 6.5px;\n}\n\n/* The main progress bar also has a bar that shows how much has been loaded. */\n.video-js .vjs-load-progress {\n    /* For IE8 we'll lighten the color */\n    background: ligthen(#73859f, 25%);\n    /* Otherwise we'll rely on stacked opacities */\n    background: rgba(115, 133, 159, 0.5);\n}\n\n/* The load progress bar also has internal divs that represent\n   smaller disconnected loaded time ranges */\n.video-js .vjs-load-progress div {\n    /* For IE8 we'll lighten the color */\n    background: ligthen(#73859f, 50%);\n    /* Otherwise we'll rely on stacked opacities */\n    background: rgba(115, 133, 159, 0.75);\n}\n\n.vjs-sublime-skin .vjs-poster {\n    outline: none; /* Remove Blue Outline on Click*/\n    outline: 0;\n}\n\n.vjs-sublime-skin:hover .vjs-big-play-button {\n    background-color: transparent;\n}\n\n.vjs-sublime-skin .vjs-fullscreen-control:before,\n.vjs-sublime-skin.vjs-fullscreen .vjs-fullscreen-control:before {\n    content: ''; /* Remove Fullscreen Exit Icon */\n}\n\n.vjs-sublime-skin.vjs-fullscreen .vjs-fullscreen-control {\n    background: #fff;\n}\n\n.vjs-sublime-skin .vjs-fullscreen-control {\n    border: 3px solid #fff;\n    box-sizing: border-box;\n    cursor: pointer;\n    margin-top: -7px;\n    top: 50%;\n    height: 14px;\n    width: 22px;\n    margin-right: 10px;\n}\n\n.vjs-sublime-skin.vjs-fullscreen .vjs-fullscreen-control:after {\n    background: #000;\n    content: \"\";\n    display: block;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    height: 5px;\n    width: 5px;\n}\n\n.vjs-sublime-skin .vjs-progress-holder {\n    margin: 0;\n}\n\n.vjs-sublime-skin .vjs-progress-control .vjs-progress-holder:after {\n    border-radius: 2px;\n    display: block;\n    height: 6.5px;\n}\n\n.vjs-sublime-skin .vjs-progress-control .vjs-load-progres,\n.vjs-sublime-skin .vjs-progress-control .vjs-play-progress {\n    border-radius: 2px;\n    height: 6.5px;\n}\n\n.vjs-sublime-skin .vjs-playback-rate {\n    display: none; /* Remove Playback Rate */\n}\n\n.vjs-sublime-skin .vjs-progress-control {\n    margin-right: 50px;\n}\n\n.vjs-sublime-skin .vjs-time-control {\n    right: 55px;\n}\n\n.vjs-sublime-skin .vjs-volume-menu-button:before {\n    width: 1.2em;\n    z-index: 1;\n}\n\n.vjs-sublime-skin .vjs-volume-menu-button .vjs-menu,\n.vjs-sublime-skin .vjs-volume-menu-button:focus .vjs-menu,\n.vjs-sublime-skin .vjs-volume-menu-button.vjs-slider-active .vjs-menu {\n    display: block;\n    opacity: 1;\n}\n\n.vjs-sublime-skin .vjs-volume-menu-button,\n.vjs-sublime-skin .vjs-volume-panel {\n    width: 6em;\n    position: absolute;\n    right: 0;\n    margin-right: 30px;\n}\n\n.vjs-sublime-skin .vjs-volume-menu-button .vjs-menu-content,\n.vjs-sublime-skin .vjs-volume-menu-button:hover,\n.vjs-sublime-skin .vjs-volume-menu-button:focus,\n.vjs-sublime-skin .vjs-volume-menu-button.vjs-slider-active,\n.vjs-sublime-skin .vjs-volume-panel .vjs-volume-control,\n.vjs-sublime-skin .vjs-volume-panel:hover,\n.vjs-sublime-skin .vjs-volume-panel:focus,\n.vjs-sublime-skin .vjs-volume-panel.vjs-slider-active {\n    width: 6em;\n}\n\n.vjs-sublime-skin .vjs-volume-menu-button .vjs-menu {\n    left: 23px;\n}\n\n.vjs-sublime-skin .vjs-mouse-display:before,\n.vjs-sublime-skin .vjs-play-progress:before,\n.vjs-sublime-skin .vjs-volume-level:before {\n    content: ''; /* Remove Circle From Progress Bar */\n}\n\n.vjs-sublime-skin .vjs-mouse-display:after,\n.vjs-sublime-skin .vjs-play-progress:after,\n.vjs-sublime-skin .vjs-time-tooltip {\n    width: 5.5em;\n}\n\n.vjs-sublime-skin .vjs-audio-button {\n    display: none;\n}\n\n.vjs-sublime-skin .vjs-volume-bar {\n    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAcCAQAAACw95UnAAAAMElEQVRIx2NgoBL4n4YKGUYNHkEG4zJg1OCRYDCpBowaPJwMppbLRg0eNXjUYBLEAXWNUA6QNm1lAAAAAElFTkSuQmCC);\n    background-size: 22px 14px;\n    background-repeat: no-repeat;\n    height: 100%;\n    width: 100%;\n    max-width: 22px;\n    max-height: 14px;\n    margin: 7px 4px;\n    border-radius: 0;\n}\n\n.vjs-sublime-skin .vjs-volume-level {\n    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAcAQAAAAAyhWABAAAAAnRSTlMAAHaTzTgAAAAZSURBVHgBYwAB/g9EUv+JokCqiaT+U4MCAPKPS7WUUOc1AAAAAElFTkSuQmCC);\n    background-size: 22px 14px;\n    background-repeat: no-repeat;\n    max-width: 22px;\n    max-height: 14px;\n    height: 100%;\n}\n\n/* New for VideoJS v6 */\n.vjs-sublime-skin .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active,\n.vjs-sublime-skin .vjs-volume-panel.vjs-volume-panel-horizontal:active,\n.vjs-sublime-skin .vjs-volume-panel.vjs-volume-panel-horizontal:focus,\n.vjs-sublime-skin .vjs-volume-panel.vjs-volume-panel-horizontal:hover {\n    width: 6em;\n    transition-property: none;\n}\n\n.vjs-sublime-skin .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-horizontal {\n    width: 3em;\n    height: auto;\n}\n\n.vjs-sublime-skin .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control {\n    transition-property: none;\n}\n\n.vjs-sublime-skin .vjs-fullscreen-control .vjs-icon-placeholder {\n    display: none; /* Remove Duplicate Fullscreen Icon */\n}\n\n.vjs-sublime-skin .vjs-volume-panel .vjs-mute-control {\n    width: 2em;\n    z-index: 1;\n    padding: 0;\n}\n\n.vjs-sublime-skin .vjs-volume-panel .vjs-volume-control {\n    display: inline-block;\n    position: relative;\n    left: 5px;\n    opacity: 1;\n    width: 3em;\n    height: auto;\n}"}}}
{"tiddlers":{"$:/plugins/TheDiveO/TwTube/commands/mediaserver.js":{"title":"$:/plugins/TheDiveO/TwTube/commands/mediaserver.js","text":"/*\\\ntitle: $:/plugins/TheDiveO/TwTube/commands/mediaserver.js\ntype: application/javascript\nmodule-type: command\n\nServe tiddlers and additionally media(!) resources over HTTP.\nWhen serving media resources, both single requests (\"en bloc\")\nas well as range transfers are supported. Supported media types\nare currently those registered with the TW core.\n\nMedia can be served not only en bloc, but additionally HTTP ranges\nare supported. The only limitation is that only a single range\nper GET request is supported.\n\nOptional parameters:\n\n1. location of media files (and optionally URL path \"prefix\").\n   For instance \"assets/media=media\". Defaults to \"media\".\n2. same as --server parameter.\n3. ...\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif ($tw.node) {\n\tvar fs = require(\"fs\");\n\tvar url = require(\"url\");\n\tvar path = require(\"path\");\n\tvar serverCmd = require(\"$:/core/modules/commands/server.js\");\n}\n\nexports.info = {\n\tname: \"mediaserver\",\n\tsynchronous: true\n};\n\nvar SANITIZE_REGEX = /[|\\\\{}()[\\]^$+*?.]/g;\n\n// The --mediaserver command constructor. In our specific case,\n// we make use of JavaScript's object-based and prototype-based\n// language/runtime system: in order to inherit the base functionality\n// of the existing --server command, we create an instance of it\n// and then add in our additional stuff.\nvar Command = function(params, commander, callback) {\n\t// The first parameter of the --mediaserver command specifies\n\t// where to find the (subtree of) media files -- and optionally,\n\t// where the HTTP clients can address them in the URL namespace.\n\t// Format(s):\n\t// \"media\" ... media file location, = URL prefix\n\t// \"assets/media=video\" ... media files in assets/media, URL prefix /video\n\tvar mediaparam = (params[0] || \"media\").split(\"=\");\n\tvar mediapath = path.resolve(mediaparam[0]);\n\t$tw.utils.log(\"media path: \" + mediapath);\n\n\tvar urlprefix = mediaparam[1];\n\tif (urlprefix) {\n\t\t// URL prefix explicitly specified, so we use that. For convenience,\n\t\t// we accept relative prefixes which are then interpreted as relative\n\t\t// to the prefix \"/\".\n\t\turlprefix = decodeURI(url.resolve(\"/\", url.parse(urlprefix).pathname));\n\t} else {\n\t\t// no URL prefix specified, so let's use either a prefix relative\n\t\t// to the CWD or an absolute prefix in case the media files are\n\t\t// not inside the CWD or any subdir thereof.\n\t\turlprefix = mediapath;\n\t\tvar cwd = path.resolve();\n\t\tif (urlprefix.substr(0, cwd.length) == cwd) {\n\t\t\turlprefix = urlprefix.substr(cwd.length);\n\t\t}\n\t\t// Ensure that the URL prefix is absolutely absolute.\n\t\tif (urlprefix.substr(0, 1) !== \"/\") {\n\t\t\turlprefix = \"/\" + urlprefix;\n\t\t}\n\t}\n\t// Ensure that the URL prefix always end in a slash. This\n\t// simplifies processing later...\n\tif (urlprefix.substr(-1) != \"/\") {\n\t\turlprefix += \"/\";\n\t}\n\t$tw.utils.log(\"url prefix: \" + urlprefix);\n\t// Phew, the ugly preprocessing is finally done, now we can\n\t// do the heavy lifting ... or rather let the TW core server\n\t// command module do the work. :)\n\n\t// Construct an ordinary server command object which does the\n\t// heavy lifting, then add in our media handling. This way we\n\t// don't need to reinvent the wheel. Pass in the remaining\n\t// command parameters.\n\tvar svrcmd = new serverCmd.Command(params.slice(1), commander, callback);\n\n\t// Augment the command execution from the --server logic with\n\t// handling of media resources...\n\tsvrcmd.inheritedExecute = svrcmd.execute;\n\tsvrcmd.execute = function() {\n\t\t$tw.utils.log(\"Media serving from \" + mediapath\n\t\t  + \" at URL path \" + urlprefix\n\t\t\t+ \" (regex: '\" + encodeURI(urlprefix).replace(SANITIZE_REGEX, \"\\\\$&\") + \"')\",\n\t\t\t\"brown/orange\");\n\t\treturn this.inheritedExecute();\n\t};\n\n\t// Add in a new media resources GET handling route that covers\n\t// the URL prefix namespace in requests. Media resource files\n\t// are then served from the local mediapath file space.\n\tsvrcmd.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: new RegExp(\"^\" + encodeURI(urlprefix).replace(SANITIZE_REGEX, \"\\\\$&\") + \"(.+)$\"),\n\t\thandler: function(request, response, state) {\n\t\t\t// Get the URL path and resource name, and make sure\n\t\t\t// that the client cannot play tricks on us by trying\n\t\t\t// to get outside the mediapath root using lots of\n\t\t\t// \"../\" path elements.\n\t\t\ttry {\n\t\t\t\tvar medrsc = mediapath\n\t\t\t\t\t+ decodeURI(url.parse(request.url).pathname)\n\t\t\t\t\t\t\t.substr(urlprefix.length-1);\n\t\t\t} catch (err) {\n\t\t\t\t$tw.utils.log(\"400 \" + request.url, \"brown/orange\");\n\t\t\t\tresponse.writeHead(400, {\n\t\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t\t});\n\t\t\t\tresponse.write(\"400 bad request\");\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Make sure that the requested media exists and that it actually\n\t\t\t// is a file. We need this in order to determine the size of\n\t\t\t// the media to serve.\n\t\t\tvar mediastat;\n\t\t\ttry {\n\t\t\t\tmediastat = fs.statSync(medrsc);\n\t\t\t} catch (err) {\n\t\t\t\t// NOP: leave mediastat undefined.\n\t\t\t}\n\t\t\tif (mediastat === undefined || !mediastat.isFile()) {\n\t\t\t\t$tw.utils.log(\"404 \" + request.url, \"brown/orange\");\n\t\t\t\tresponse.writeHead(404, {\n\t\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t\t});\n\t\t\t\tresponse.write(\"404 media resource not found\");\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar mediasize = mediastat.size;\n\n\t\t\t// Determine the media type from the media file extension.\n\t\t\tvar filetypeinfo = $tw.utils.getFileExtensionInfo(path.extname(medrsc));\n\t\t\tif (filetypeinfo === null) {\n\t\t\t\t$tw.utils.log(\"500 \" + request.url, \"red\");\n\t\t\t\tresponse.writeHead(500, {\n\t\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t\t});\n\t\t\t\tresponse.write(\"500 unknown media type\");\n\t\t\t\t$tw.utils.log(\"unknown media type for \" + med, \"red\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar mediatype = filetypeinfo.type;\n\n\t\t\tvar range = request.headers.range;\n\t\t\tif (range && range.length) {\n\t\t\t\t// an HTTP client requests only part of a media resource, so we\n\t\t\t\t// need to decode the requested range and then check if this\n\t\t\t\t// range is satisfiable. If yes, we respond with 206 partial\n\t\t\t\t// content, otherwise with 416 without content but the allowed\n\t\t\t\t// range.\n\t\t\t\t//\n\t\t\t\t// Ranges can be specified by clients as follows, see also\n\t\t\t\t// RFC 7233 for the gory details -- but note that we don't\n\t\t\t\t// support multiple ranges.\n\t\t\t\t//\n\t\t\t\t// (1) from-to ... range from-to (bytes) including,\n\t\t\t\t// (2) from-   ... range from to end (bytes).\n\t\t\t\t// (3) -last   ... range of only the last (bytes).\n\t\t\t\t//\n\t\t\t\t// In case a range is outside the resource limits, then\n\t\t\t\t// the server must respond with status 416.\n\t\t\t\tvar start = 1, end = 0;\n\t\t\t\tvar parts = range.replace(/bytes=/, \"\").split(\"-\");\n\t\t\t\tif (parts.length == 2) {\n\t\t\t\t\tif (parts[0].length && parts[1].length) {\n\t\t\t\t\t\t// case (1) from-to\n\t\t\t\t\t\tstart = parseInt(parts[0], 10);\n\t\t\t\t\t\tend = parseInt(parts[1], 10);\n\t\t\t\t\t} else if (parts[0].length && !parts[1].length) {\n\t\t\t\t\t\t// case (2) from-\n\t\t\t\t\t\tstart = parseInt(parts[0], 10);\n\t\t\t\t\t\tend = mediasize - 1;\n\t\t\t\t\t} else if (!parts[0].length && parts[1].length) {\n\t\t\t\t\t\t// case (3) -last\n\t\t\t\t\t\tend = mediasize - 1;\n\t\t\t\t\t\tstart = mediasize - parseInt(parts[1], 10);\n\t\t\t\t\t\tif (start < 0) { // see RFC 7233, 2.1\n\t\t\t\t\t\t\tstart = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Now that we've decoded the range the HTTP client asks\n\t\t\t\t// for, let's see if it's satisfiable, then do a partial\n\t\t\t\t// transfer (206) of the media data; otherwise, inform the\n\t\t\t\t// HTTP client of the allowed range (416) for the media\n\t\t\t\t// resource, but don't send any media data.\n\t\t\t\tif (start > end || start >= mediasize || end >= mediasize) {\n\t\t\t\t\t// The range is not satisfiable, so it's time for a\n\t\t\t\t\t// status 416 response with the maximum allowed range.\n\t\t\t\t\t$tw.utils.log(\"416 */\" + mediasize + \" \" + request.url, \"brown/orange\");\n\t\t\t\t\tresponse.writeHead(416, {\n\t\t\t\t\t\t\"Accept-Ranges\": \"bytes\",\n\t\t\t\t\t\t\"Content-Range\": \"bytes */\" + mediasize,\n\t\t\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t\tresponse.write(\"416 requested range not satisfiable\");\n\t\t\t\t\tresponse.end();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$tw.utils.log(\"206 \" + start + \"-\" + end + \"/\" + mediasize + \" \" + request.url, \"green\");\n\t\t\t\tresponse.writeHead(206, {\n\t\t\t\t\t\"Accept-Ranges\": \"bytes\",\n\t\t\t\t\t\"Content-Range\": \"bytes \" + start + \"-\" + end + \"/\" + mediasize,\n\t\t\t\t\t\"Content-Length\": end - start + 1,\n\t\t\t\t\t\"Content-Type\": mediatype\n\t\t\t\t});\n\t\t\t\tfs.createReadStream(medrsc, {start: start, end: end}).pipe(response);\n\t\t\t} else {\n\t\t\t\t// an HTTP client requests a media resource en bloc, so we give\n\t\t\t\t// the response the media file stream to send back. Sweet and simple.\n\t\t\t\t// Nevertheless we indicate to the client that we would accept\n\t\t\t\t// ranges in GET requests to these media resources.\n\t\t\t\t$tw.utils.log(\"200 */\" + mediasize + \" \" + request.url, \"green\");\n\t\t\t\tresponse.writeHead(200, {\n\t\t\t\t\t\"Accept-Ranges\": \"bytes\",\n\t\t\t\t\t\"Content-Type\": mediatype,\n\t\t\t\t\t\"Content-Length\": mediasize\n\t\t\t\t});\n\t\t\t\tfs.createReadStream(medrsc).pipe(response);\n\t\t\t}\n\t\t}\n\t});\n\t// Done.\n\treturn svrcmd;\n};\n\n// Finally export our modified --mediaserver command constructor.\nexports.Command = Command;\n\n})();\n","type":"application/javascript","module-type":"command"},"$:/plugins/TheDiveO/TwTube/history":{"title":"$:/plugins/TheDiveO/TwTube/history","created":"20140902083720188","creator":"TheDiveO","modified":"20180405131101107","modifier":"TheDiveO","type":"text/vnd.tiddlywiki","text":"* ''1.0.8''\n** publishes TwTube plugin as npm package `tw5-twtube`.\n** fixes spelinng.\n\n* ''1.0.7''\n** fixes media URL/path handling in media server.\n** fixes crash in parsing media alias `path=urlpath` parameter handling.\n\n* ''1.0.6''\n** adds media player skin selection to the [[control panel|$:/ControlPanel]]: see tab \"Media Player Skins\". The current selection is stored in [[$:/config/TwTube/skin]] and containes the title of the selected skin plugin, or [[$:/plugins/TheDiveO/TwTube]].\n\n* ''1.0.5''\n** adds support for Video.js plugins.\n** adds Video.js persistent volume plugin.\n** adds Video.js hotkeys plugin.\n** adds pseudo node main package, so you can run the development server also using `$ node ./twtube`.\n** fixes handling of media resources where their paths and/or filename contain URI encoded characters.\n\n* ''1.0.3''\n** adds new ~YouTube-inspired skin, generated with the [[Videojs Skin Generator|http://www.scriptsmashup.com/Video_Skin_Generator/Videojs/videojs-skin-generator.html]] and some tweaking.\n\n* ''1.0.2''\n** fixes `poster` attribute of `<$videjs>` widget to be overwritten with the value of the `preload` attribute.\n\n* ''1.0.0''\n** introduces `<$videojs>` [[Video.js player|https://videojs.com/]] widget to ~TiddlyWiki 5.\n** supports most of the attributes (parameters) the `<video>` and `<video-js>` elements have to offer.\n** an extensive list of supported widget attributes can be found in [[$:/plugins/TheDiveO/TwTube/usage]].\n** supports Video.js player skin plugins, when the default skin isn't enough:\n*** [[Sublime-inspired skin|$:/plugins/TheDiveO/SublimeInspiredVideojsSkin]]\n*** [[iPlayer-inspired skin|$:/plugins/TheDiveO/IPlayerInspiredVideojsSkin]]\n** supports multiple skin plugins installed side-by-side: enable only one skin plugin at a time to avoid funny skinning result.\n** adds media serving functionality to ~TiddlyWiki servers running on Node.js\n*** use the `--mediaserver media-path ...` command instead of `--server ...`.\n*** supports HTTP GET range requests for media resources.\n** supports npm scripts (on *nix only):\n*** `npm start` starts the ~TwTube development ~TiddlyWiki server at http://localhost:8080.\n*** `npm stop` stops the ~TwTube ~TiddlyWiki server.\n*** `npm run-script develop` runs the ~TwTube development ~TiddlyWiki server in the foreground.\n*** `npm run-script release` generates release files in `editions/release/output` of the project file tree.\n"},"$:/plugins/TheDiveO/TwTube/libraries/video.js":{"title":"$:/plugins/TheDiveO/TwTube/libraries/video.js","text":"/*\\\ncreated: 20180113144251310\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/TwTube/libraries/video.js\ntags:\nmodifier: TheDiveO\nmodified: 20180113144952817\ncreator: TheDiveO\nmodule-type: library\n\\*/\n/**\n * @license\n * Video.js 6.6.0 <http://videojs.com/>\n * Copyright Brightcove, Inc. <https://www.brightcove.com/>\n * Available under Apache License Version 2.0\n * <https://github.com/videojs/video.js/blob/master/LICENSE>\n *\n * Includes vtt.js <https://github.com/mozilla/vtt.js>\n * Available under Apache License Version 2.0\n * <https://github.com/mozilla/vtt.js/blob/master/LICENSE>\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.videojs = factory());\n}(this, (function () {\n\nvar version = \"6.6.0\";\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\n\n\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar win;\n\nif (typeof window !== \"undefined\") {\n    win = window;\n} else if (typeof commonjsGlobal !== \"undefined\") {\n    win = commonjsGlobal;\n} else if (typeof self !== \"undefined\"){\n    win = self;\n} else {\n    win = {};\n}\n\nvar window_1 = win;\n\nvar empty = {};\n\n\nvar empty$1 = (Object.freeze || Object)({\n\t'default': empty\n});\n\nvar minDoc = ( empty$1 && empty ) || empty$1;\n\nvar topLevel = typeof commonjsGlobal !== 'undefined' ? commonjsGlobal :\n    typeof window !== 'undefined' ? window : {};\n\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n    doccy = document;\n} else {\n    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n    if (!doccy) {\n        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n    }\n}\n\nvar document_1 = doccy;\n\n/**\n * @file browser.js\n * @module browser\n */\nvar USER_AGENT = window_1.navigator && window_1.navigator.userAgent || '';\nvar webkitVersionMap = /AppleWebKit\\/([\\d.]+)/i.exec(USER_AGENT);\nvar appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;\n\n/*\n * Device is an iPhone\n *\n * @type {Boolean}\n * @constant\n * @private\n */\nvar IS_IPAD = /iPad/i.test(USER_AGENT);\n\n// The Facebook app's UIWebView identifies as both an iPhone and iPad, so\n// to identify iPhones, we need to exclude iPads.\n// http://artsy.github.io/blog/2012/10/18/the-perils-of-ios-user-agent-sniffing/\nvar IS_IPHONE = /iPhone/i.test(USER_AGENT) && !IS_IPAD;\nvar IS_IPOD = /iPod/i.test(USER_AGENT);\nvar IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;\n\nvar IOS_VERSION = function () {\n  var match = USER_AGENT.match(/OS (\\d+)_/i);\n\n  if (match && match[1]) {\n    return match[1];\n  }\n  return null;\n}();\n\nvar IS_ANDROID = /Android/i.test(USER_AGENT);\nvar ANDROID_VERSION = function () {\n  // This matches Android Major.Minor.Patch versions\n  // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned\n  var match = USER_AGENT.match(/Android (\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))*/i);\n\n  if (!match) {\n    return null;\n  }\n\n  var major = match[1] && parseFloat(match[1]);\n  var minor = match[2] && parseFloat(match[2]);\n\n  if (major && minor) {\n    return parseFloat(match[1] + '.' + match[2]);\n  } else if (major) {\n    return major;\n  }\n  return null;\n}();\n\n// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser\nvar IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;\nvar IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;\n\nvar IS_FIREFOX = /Firefox/i.test(USER_AGENT);\nvar IS_EDGE = /Edge/i.test(USER_AGENT);\nvar IS_CHROME = !IS_EDGE && /Chrome/i.test(USER_AGENT);\nvar CHROME_VERSION = function () {\n  var match = USER_AGENT.match(/Chrome\\/(\\d+)/);\n\n  if (match && match[1]) {\n    return parseFloat(match[1]);\n  }\n  return null;\n}();\nvar IS_IE8 = /MSIE\\s8\\.0/.test(USER_AGENT);\nvar IE_VERSION = function () {\n  var result = /MSIE\\s(\\d+)\\.\\d/.exec(USER_AGENT);\n  var version = result && parseFloat(result[1]);\n\n  if (!version && /Trident\\/7.0/i.test(USER_AGENT) && /rv:11.0/.test(USER_AGENT)) {\n    // IE 11 has a different user agent string than other IE versions\n    version = 11.0;\n  }\n\n  return version;\n}();\n\nvar IS_SAFARI = /Safari/i.test(USER_AGENT) && !IS_CHROME && !IS_ANDROID && !IS_EDGE;\nvar IS_ANY_SAFARI = IS_SAFARI || IS_IOS;\n\nvar TOUCH_ENABLED = isReal() && ('ontouchstart' in window_1 || window_1.DocumentTouch && window_1.document instanceof window_1.DocumentTouch);\n\nvar BACKGROUND_SIZE_SUPPORTED = isReal() && 'backgroundSize' in window_1.document.createElement('video').style;\n\nvar browser = (Object.freeze || Object)({\n\tIS_IPAD: IS_IPAD,\n\tIS_IPHONE: IS_IPHONE,\n\tIS_IPOD: IS_IPOD,\n\tIS_IOS: IS_IOS,\n\tIOS_VERSION: IOS_VERSION,\n\tIS_ANDROID: IS_ANDROID,\n\tANDROID_VERSION: ANDROID_VERSION,\n\tIS_OLD_ANDROID: IS_OLD_ANDROID,\n\tIS_NATIVE_ANDROID: IS_NATIVE_ANDROID,\n\tIS_FIREFOX: IS_FIREFOX,\n\tIS_EDGE: IS_EDGE,\n\tIS_CHROME: IS_CHROME,\n\tCHROME_VERSION: CHROME_VERSION,\n\tIS_IE8: IS_IE8,\n\tIE_VERSION: IE_VERSION,\n\tIS_SAFARI: IS_SAFARI,\n\tIS_ANY_SAFARI: IS_ANY_SAFARI,\n\tTOUCH_ENABLED: TOUCH_ENABLED,\n\tBACKGROUND_SIZE_SUPPORTED: BACKGROUND_SIZE_SUPPORTED\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\n\n\n\n\n\n\n\n\n\n\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar taggedTemplateLiteralLoose = function (strings, raw) {\n  strings.raw = raw;\n  return strings;\n};\n\n/**\n * @file obj.js\n * @module obj\n */\n\n/**\n * @callback obj:EachCallback\n *\n * @param {Mixed} value\n *        The current key for the object that is being iterated over.\n *\n * @param {string} key\n *        The current key-value for object that is being iterated over\n */\n\n/**\n * @callback obj:ReduceCallback\n *\n * @param {Mixed} accum\n *        The value that is accumulating over the reduce loop.\n *\n * @param {Mixed} value\n *        The current key for the object that is being iterated over.\n *\n * @param {string} key\n *        The current key-value for object that is being iterated over\n *\n * @return {Mixed}\n *         The new accumulated value.\n */\nvar toString = Object.prototype.toString;\n\n/**\n * Get the keys of an Object\n *\n * @param {Object}\n *        The Object to get the keys from\n *\n * @return {string[]}\n *         An array of the keys from the object. Returns an empty array if the\n *         object passed in was invalid or had no keys.\n *\n * @private\n */\nvar keys = function keys(object) {\n  return isObject(object) ? Object.keys(object) : [];\n};\n\n/**\n * Array-like iteration for objects.\n *\n * @param {Object} object\n *        The object to iterate over\n *\n * @param {obj:EachCallback} fn\n *        The callback function which is called for each key in the object.\n */\nfunction each(object, fn) {\n  keys(object).forEach(function (key) {\n    return fn(object[key], key);\n  });\n}\n\n/**\n * Array-like reduce for objects.\n *\n * @param {Object} object\n *        The Object that you want to reduce.\n *\n * @param {Function} fn\n *         A callback function which is called for each key in the object. It\n *         receives the accumulated value and the per-iteration value and key\n *         as arguments.\n *\n * @param {Mixed} [initial = 0]\n *        Starting value\n *\n * @return {Mixed}\n *         The final accumulated value.\n */\nfunction reduce(object, fn) {\n  var initial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n  return keys(object).reduce(function (accum, key) {\n    return fn(accum, object[key], key);\n  }, initial);\n}\n\n/**\n * Object.assign-style object shallow merge/extend.\n *\n * @param  {Object} target\n * @param  {Object} ...sources\n * @return {Object}\n */\nfunction assign(target) {\n  for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    sources[_key - 1] = arguments[_key];\n  }\n\n  if (Object.assign) {\n    return Object.assign.apply(Object, [target].concat(sources));\n  }\n\n  sources.forEach(function (source) {\n    if (!source) {\n      return;\n    }\n\n    each(source, function (value, key) {\n      target[key] = value;\n    });\n  });\n\n  return target;\n}\n\n/**\n * Returns whether a value is an object of any kind - including DOM nodes,\n * arrays, regular expressions, etc. Not functions, though.\n *\n * This avoids the gotcha where using `typeof` on a `null` value\n * results in `'object'`.\n *\n * @param  {Object} value\n * @return {Boolean}\n */\nfunction isObject(value) {\n  return !!value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object';\n}\n\n/**\n * Returns whether an object appears to be a \"plain\" object - that is, a\n * direct instance of `Object`.\n *\n * @param  {Object} value\n * @return {Boolean}\n */\nfunction isPlain(value) {\n  return isObject(value) && toString.call(value) === '[object Object]' && value.constructor === Object;\n}\n\n/**\n * @file log.js\n * @module log\n */\nvar log = void 0;\n\n// This is the private tracking variable for logging level.\nvar level = 'info';\n\n// This is the private tracking variable for the logging history.\nvar history = [];\n\n/**\n * Log messages to the console and history based on the type of message\n *\n * @private\n * @param  {string} type\n *         The name of the console method to use.\n *\n * @param  {Array} args\n *         The arguments to be passed to the matching console method.\n *\n * @param  {boolean} [stringify]\n *         By default, only old IEs should get console argument stringification,\n *         but this is exposed as a parameter to facilitate testing.\n */\nvar logByType = function logByType(type, args) {\n  var stringify = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : !!IE_VERSION && IE_VERSION < 11;\n\n  var lvl = log.levels[level];\n  var lvlRegExp = new RegExp('^(' + lvl + ')$');\n\n  if (type !== 'log') {\n\n    // Add the type to the front of the message when it's not \"log\".\n    args.unshift(type.toUpperCase() + ':');\n  }\n\n  // Add a clone of the args at this point to history.\n  if (history) {\n    history.push([].concat(args));\n  }\n\n  // Add console prefix after adding to history.\n  args.unshift('VIDEOJS:');\n\n  // If there's no console then don't try to output messages, but they will\n  // still be stored in history.\n  if (!window_1.console) {\n    return;\n  }\n\n  // Was setting these once outside of this function, but containing them\n  // in the function makes it easier to test cases where console doesn't exist\n  // when the module is executed.\n  var fn = window_1.console[type];\n\n  if (!fn && type === 'debug') {\n    // Certain browsers don't have support for console.debug. For those, we\n    // should default to the closest comparable log.\n    fn = window_1.console.info || window_1.console.log;\n  }\n\n  // Bail out if there's no console or if this type is not allowed by the\n  // current logging level.\n  if (!fn || !lvl || !lvlRegExp.test(type)) {\n    return;\n  }\n\n  // IEs previous to 11 log objects uselessly as \"[object Object]\"; so, JSONify\n  // objects and arrays for those less-capable browsers.\n  if (stringify) {\n    args = args.map(function (a) {\n      if (isObject(a) || Array.isArray(a)) {\n        try {\n          return JSON.stringify(a);\n        } catch (x) {\n          return String(a);\n        }\n      }\n\n      // Cast to string before joining, so we get null and undefined explicitly\n      // included in output (as we would in a modern console).\n      return String(a);\n    }).join(' ');\n  }\n\n  // Old IE versions do not allow .apply() for console methods (they are\n  // reported as objects rather than functions).\n  if (!fn.apply) {\n    fn(args);\n  } else {\n    fn[Array.isArray(args) ? 'apply' : 'call'](window_1.console, args);\n  }\n};\n\n/**\n * Logs plain debug messages. Similar to `console.log`.\n *\n * @class\n * @param    {Mixed[]} args\n *           One or more messages or objects that should be logged.\n */\nlog = function log() {\n  for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  logByType('log', args);\n};\n\n/**\n * Enumeration of available logging levels, where the keys are the level names\n * and the values are `|`-separated strings containing logging methods allowed\n * in that logging level. These strings are used to create a regular expression\n * matching the function name being called.\n *\n * Levels provided by video.js are:\n *\n * - `off`: Matches no calls. Any value that can be cast to `false` will have\n *   this effect. The most restrictive.\n * - `all`: Matches only Video.js-provided functions (`debug`, `log`,\n *   `log.warn`, and `log.error`).\n * - `debug`: Matches `log.debug`, `log`, `log.warn`, and `log.error` calls.\n * - `info` (default): Matches `log`, `log.warn`, and `log.error` calls.\n * - `warn`: Matches `log.warn` and `log.error` calls.\n * - `error`: Matches only `log.error` calls.\n *\n * @type {Object}\n */\nlog.levels = {\n  all: 'debug|log|warn|error',\n  off: '',\n  debug: 'debug|log|warn|error',\n  info: 'log|warn|error',\n  warn: 'warn|error',\n  error: 'error',\n  DEFAULT: level\n};\n\n/**\n * Get or set the current logging level. If a string matching a key from\n * {@link log.levels} is provided, acts as a setter. Regardless of argument,\n * returns the current logging level.\n *\n * @param  {string} [lvl]\n *         Pass to set a new logging level.\n *\n * @return {string}\n *         The current logging level.\n */\nlog.level = function (lvl) {\n  if (typeof lvl === 'string') {\n    if (!log.levels.hasOwnProperty(lvl)) {\n      throw new Error('\"' + lvl + '\" in not a valid log level');\n    }\n    level = lvl;\n  }\n  return level;\n};\n\n/**\n * Returns an array containing everything that has been logged to the history.\n *\n * This array is a shallow clone of the internal history record. However, its\n * contents are _not_ cloned; so, mutating objects inside this array will\n * mutate them in history.\n *\n * @return {Array}\n */\nlog.history = function () {\n  return history ? [].concat(history) : [];\n};\n\n/**\n * Clears the internal history tracking, but does not prevent further history\n * tracking.\n */\nlog.history.clear = function () {\n  if (history) {\n    history.length = 0;\n  }\n};\n\n/**\n * Disable history tracking if it is currently enabled.\n */\nlog.history.disable = function () {\n  if (history !== null) {\n    history.length = 0;\n    history = null;\n  }\n};\n\n/**\n * Enable history tracking if it is currently disabled.\n */\nlog.history.enable = function () {\n  if (history === null) {\n    history = [];\n  }\n};\n\n/**\n * Logs error messages. Similar to `console.error`.\n *\n * @param {Mixed[]} args\n *        One or more messages or objects that should be logged as an error\n */\nlog.error = function () {\n  for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    args[_key2] = arguments[_key2];\n  }\n\n  return logByType('error', args);\n};\n\n/**\n * Logs warning messages. Similar to `console.warn`.\n *\n * @param {Mixed[]} args\n *        One or more messages or objects that should be logged as a warning.\n */\nlog.warn = function () {\n  for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n    args[_key3] = arguments[_key3];\n  }\n\n  return logByType('warn', args);\n};\n\n/**\n * Logs debug messages. Similar to `console.debug`, but may also act as a comparable\n * log if `console.debug` is not available\n *\n * @param {Mixed[]} args\n *        One or more messages or objects that should be logged as debug.\n */\nlog.debug = function () {\n  for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n    args[_key4] = arguments[_key4];\n  }\n\n  return logByType('debug', args);\n};\n\nvar log$1 = log;\n\nfunction clean (s) {\n  return s.replace(/\\n\\r?\\s*/g, '')\n}\n\n\nvar tsml = function tsml (sa) {\n  var s = ''\n    , i = 0;\n\n  for (; i < arguments.length; i++)\n    s += clean(sa[i]) + (arguments[i + 1] || '');\n\n  return s\n};\n\n/**\n * @file computed-style.js\n * @module computed-style\n */\n/**\n * A safe getComputedStyle with an IE8 fallback.\n *\n * This is needed because in Firefox, if the player is loaded in an iframe with\n * `display:none`, then `getComputedStyle` returns `null`, so, we do a null-check to\n * make sure  that the player doesn't break in these cases.\n *\n * @param {Element} el\n *        The element you want the computed style of\n *\n * @param {string} prop\n *        The property name you want\n *\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n *\n * @static\n * @const\n */\nfunction computedStyle(el, prop) {\n  if (!el || !prop) {\n    return '';\n  }\n\n  if (typeof window_1.getComputedStyle === 'function') {\n    var cs = window_1.getComputedStyle(el);\n\n    return cs ? cs[prop] : '';\n  }\n\n  return el.currentStyle[prop] || '';\n}\n\nvar _templateObject = taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\\n                has been deprecated. Use the third argument instead.\\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\\n                has been deprecated. Use the third argument instead.\\n                createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);\n\n/**\n * @file dom.js\n * @module dom\n */\n/**\n * Detect if a value is a string with any non-whitespace characters.\n *\n * @param {string} str\n *        The string to check\n *\n * @return {boolean}\n *         - True if the string is non-blank\n *         - False otherwise\n *\n */\nfunction isNonBlankString(str) {\n  return typeof str === 'string' && /\\S/.test(str);\n}\n\n/**\n * Throws an error if the passed string has whitespace. This is used by\n * class methods to be relatively consistent with the classList API.\n *\n * @param {string} str\n *         The string to check for whitespace.\n *\n * @throws {Error}\n *         Throws an error if there is whitespace in the string.\n *\n */\nfunction throwIfWhitespace(str) {\n  if (/\\s/.test(str)) {\n    throw new Error('class has illegal whitespace characters');\n  }\n}\n\n/**\n * Produce a regular expression for matching a className within an elements className.\n *\n * @param {string} className\n *         The className to generate the RegExp for.\n *\n * @return {RegExp}\n *         The RegExp that will check for a specific `className` in an elements\n *         className.\n */\nfunction classRegExp(className) {\n  return new RegExp('(^|\\\\s)' + className + '($|\\\\s)');\n}\n\n/**\n * Whether the current DOM interface appears to be real.\n *\n * @return {Boolean}\n */\nfunction isReal() {\n  return (\n\n    // Both document and window will never be undefined thanks to `global`.\n    document_1 === window_1.document &&\n\n    // In IE < 9, DOM methods return \"object\" as their type, so all we can\n    // confidently check is that it exists.\n    typeof document_1.createElement !== 'undefined'\n  );\n}\n\n/**\n * Determines, via duck typing, whether or not a value is a DOM element.\n *\n * @param {Mixed} value\n *        The thing to check\n *\n * @return {boolean}\n *         - True if it is a DOM element\n *         - False otherwise\n */\nfunction isEl(value) {\n  return isObject(value) && value.nodeType === 1;\n}\n\n/**\n * Determines if the current DOM is embedded in an iframe.\n *\n * @return {boolean}\n *\n */\nfunction isInFrame() {\n\n  // We need a try/catch here because Safari will throw errors when attempting\n  // to get either `parent` or `self`\n  try {\n    return window_1.parent !== window_1.self;\n  } catch (x) {\n    return true;\n  }\n}\n\n/**\n * Creates functions to query the DOM using a given method.\n *\n * @param {string} method\n *         The method to create the query with.\n *\n * @return {Function}\n *         The query method\n */\nfunction createQuerier(method) {\n  return function (selector, context) {\n    if (!isNonBlankString(selector)) {\n      return document_1[method](null);\n    }\n    if (isNonBlankString(context)) {\n      context = document_1.querySelector(context);\n    }\n\n    var ctx = isEl(context) ? context : document_1;\n\n    return ctx[method] && ctx[method](selector);\n  };\n}\n\n/**\n * Creates an element and applies properties.\n *\n * @param {string} [tagName='div']\n *         Name of tag to be created.\n *\n * @param {Object} [properties={}]\n *         Element properties to be applied.\n *\n * @param {Object} [attributes={}]\n *         Element attributes to be applied.\n *\n * @param {String|Element|TextNode|Array|Function} [content]\n *         Contents for the element (see: {@link dom:normalizeContent})\n *\n * @return {Element}\n *         The element that was created.\n */\nfunction createEl() {\n  var tagName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';\n  var properties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var content = arguments[3];\n\n  var el = document_1.createElement(tagName);\n\n  Object.getOwnPropertyNames(properties).forEach(function (propName) {\n    var val = properties[propName];\n\n    // See #2176\n    // We originally were accepting both properties and attributes in the\n    // same object, but that doesn't work so well.\n    if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {\n      log$1.warn(tsml(_templateObject, propName, val));\n      el.setAttribute(propName, val);\n\n      // Handle textContent since it's not supported everywhere and we have a\n      // method for it.\n    } else if (propName === 'textContent') {\n      textContent(el, val);\n    } else {\n      el[propName] = val;\n    }\n  });\n\n  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {\n    el.setAttribute(attrName, attributes[attrName]);\n  });\n\n  if (content) {\n    appendContent(el, content);\n  }\n\n  return el;\n}\n\n/**\n * Injects text into an element, replacing any existing contents entirely.\n *\n * @param {Element} el\n *        The element to add text content into\n *\n * @param {string} text\n *        The text content to add.\n *\n * @return {Element}\n *         The element with added text content.\n */\nfunction textContent(el, text) {\n  if (typeof el.textContent === 'undefined') {\n    el.innerText = text;\n  } else {\n    el.textContent = text;\n  }\n  return el;\n}\n\n/**\n * Insert an element as the first child node of another\n *\n * @param {Element} child\n *        Element to insert\n *\n * @param {Element} parent\n *        Element to insert child into\n */\nfunction prependTo(child, parent) {\n  if (parent.firstChild) {\n    parent.insertBefore(child, parent.firstChild);\n  } else {\n    parent.appendChild(child);\n  }\n}\n\n/**\n * Check if an element has a CSS class\n *\n * @param {Element} element\n *        Element to check\n *\n * @param {string} classToCheck\n *        Class name to check for\n *\n * @return {boolean}\n *         - True if the element had the class\n *         - False otherwise.\n *\n * @throws {Error}\n *         Throws an error if `classToCheck` has white space.\n */\nfunction hasClass(element, classToCheck) {\n  throwIfWhitespace(classToCheck);\n  if (element.classList) {\n    return element.classList.contains(classToCheck);\n  }\n  return classRegExp(classToCheck).test(element.className);\n}\n\n/**\n * Add a CSS class name to an element\n *\n * @param {Element} element\n *        Element to add class name to.\n *\n * @param {string} classToAdd\n *        Class name to add.\n *\n * @return {Element}\n *         The dom element with the added class name.\n */\nfunction addClass(element, classToAdd) {\n  if (element.classList) {\n    element.classList.add(classToAdd);\n\n    // Don't need to `throwIfWhitespace` here because `hasElClass` will do it\n    // in the case of classList not being supported.\n  } else if (!hasClass(element, classToAdd)) {\n    element.className = (element.className + ' ' + classToAdd).trim();\n  }\n\n  return element;\n}\n\n/**\n * Remove a CSS class name from an element\n *\n * @param {Element} element\n *        Element to remove a class name from.\n *\n * @param {string} classToRemove\n *        Class name to remove\n *\n * @return {Element}\n *         The dom element with class name removed.\n */\nfunction removeClass(element, classToRemove) {\n  if (element.classList) {\n    element.classList.remove(classToRemove);\n  } else {\n    throwIfWhitespace(classToRemove);\n    element.className = element.className.split(/\\s+/).filter(function (c) {\n      return c !== classToRemove;\n    }).join(' ');\n  }\n\n  return element;\n}\n\n/**\n * The callback definition for toggleElClass.\n *\n * @callback Dom~PredicateCallback\n * @param {Element} element\n *        The DOM element of the Component.\n *\n * @param {string} classToToggle\n *        The `className` that wants to be toggled\n *\n * @return {boolean|undefined}\n *         - If true the `classToToggle` will get added to `element`.\n *         - If false the `classToToggle` will get removed from `element`.\n *         - If undefined this callback will be ignored\n */\n\n/**\n * Adds or removes a CSS class name on an element depending on an optional\n * condition or the presence/absence of the class name.\n *\n * @param {Element} element\n *        The element to toggle a class name on.\n *\n * @param {string} classToToggle\n *        The class that should be toggled\n *\n * @param {boolean|PredicateCallback} [predicate]\n *        See the return value for {@link Dom~PredicateCallback}\n *\n * @return {Element}\n *         The element with a class that has been toggled.\n */\nfunction toggleClass(element, classToToggle, predicate) {\n\n  // This CANNOT use `classList` internally because IE does not support the\n  // second parameter to the `classList.toggle()` method! Which is fine because\n  // `classList` will be used by the add/remove functions.\n  var has = hasClass(element, classToToggle);\n\n  if (typeof predicate === 'function') {\n    predicate = predicate(element, classToToggle);\n  }\n\n  if (typeof predicate !== 'boolean') {\n    predicate = !has;\n  }\n\n  // If the necessary class operation matches the current state of the\n  // element, no action is required.\n  if (predicate === has) {\n    return;\n  }\n\n  if (predicate) {\n    addClass(element, classToToggle);\n  } else {\n    removeClass(element, classToToggle);\n  }\n\n  return element;\n}\n\n/**\n * Apply attributes to an HTML element.\n *\n * @param {Element} el\n *        Element to add attributes to.\n *\n * @param {Object} [attributes]\n *        Attributes to be applied.\n */\nfunction setAttributes(el, attributes) {\n  Object.getOwnPropertyNames(attributes).forEach(function (attrName) {\n    var attrValue = attributes[attrName];\n\n    if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {\n      el.removeAttribute(attrName);\n    } else {\n      el.setAttribute(attrName, attrValue === true ? '' : attrValue);\n    }\n  });\n}\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @param {Element} tag\n *        Element from which to get tag attributes.\n *\n * @return {Object}\n *         All attributes of the element.\n */\nfunction getAttributes(tag) {\n  var obj = {};\n\n  // known boolean attributes\n  // we can check for matching boolean properties, but older browsers\n  // won't know about HTML5 boolean attributes that we still read from\n  var knownBooleans = ',' + 'autoplay,controls,playsinline,loop,muted,default,defaultMuted' + ',';\n\n  if (tag && tag.attributes && tag.attributes.length > 0) {\n    var attrs = tag.attributes;\n\n    for (var i = attrs.length - 1; i >= 0; i--) {\n      var attrName = attrs[i].name;\n      var attrVal = attrs[i].value;\n\n      // check for known booleans\n      // the matching element property will return a value for typeof\n      if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {\n        // the value of an included boolean attribute is typically an empty\n        // string ('') which would equal false if we just check for a false value.\n        // we also don't want support bad code like autoplay='false'\n        attrVal = attrVal !== null ? true : false;\n      }\n\n      obj[attrName] = attrVal;\n    }\n  }\n\n  return obj;\n}\n\n/**\n * Get the value of an element's attribute\n *\n * @param {Element} el\n *        A DOM element\n *\n * @param {string} attribute\n *        Attribute to get the value of\n *\n * @return {string}\n *         value of the attribute\n */\nfunction getAttribute(el, attribute) {\n  return el.getAttribute(attribute);\n}\n\n/**\n * Set the value of an element's attribute\n *\n * @param {Element} el\n *        A DOM element\n *\n * @param {string} attribute\n *        Attribute to set\n *\n * @param {string} value\n *        Value to set the attribute to\n */\nfunction setAttribute(el, attribute, value) {\n  el.setAttribute(attribute, value);\n}\n\n/**\n * Remove an element's attribute\n *\n * @param {Element} el\n *        A DOM element\n *\n * @param {string} attribute\n *        Attribute to remove\n */\nfunction removeAttribute(el, attribute) {\n  el.removeAttribute(attribute);\n}\n\n/**\n * Attempt to block the ability to select text while dragging controls\n */\nfunction blockTextSelection() {\n  document_1.body.focus();\n  document_1.onselectstart = function () {\n    return false;\n  };\n}\n\n/**\n * Turn off text selection blocking\n */\nfunction unblockTextSelection() {\n  document_1.onselectstart = function () {\n    return true;\n  };\n}\n\n/**\n * Identical to the native `getBoundingClientRect` function, but ensures that\n * the method is supported at all (it is in all browsers we claim to support)\n * and that the element is in the DOM before continuing.\n *\n * This wrapper function also shims properties which are not provided by some\n * older browsers (namely, IE8).\n *\n * Additionally, some browsers do not support adding properties to a\n * `ClientRect`/`DOMRect` object; so, we shallow-copy it with the standard\n * properties (except `x` and `y` which are not widely supported). This helps\n * avoid implementations where keys are non-enumerable.\n *\n * @param  {Element} el\n *         Element whose `ClientRect` we want to calculate.\n *\n * @return {Object|undefined}\n *         Always returns a plain\n */\nfunction getBoundingClientRect(el) {\n  if (el && el.getBoundingClientRect && el.parentNode) {\n    var rect = el.getBoundingClientRect();\n    var result = {};\n\n    ['bottom', 'height', 'left', 'right', 'top', 'width'].forEach(function (k) {\n      if (rect[k] !== undefined) {\n        result[k] = rect[k];\n      }\n    });\n\n    if (!result.height) {\n      result.height = parseFloat(computedStyle(el, 'height'));\n    }\n\n    if (!result.width) {\n      result.width = parseFloat(computedStyle(el, 'width'));\n    }\n\n    return result;\n  }\n}\n\n/**\n * The postion of a DOM element on the page.\n *\n * @typedef {Object} module:dom~Position\n *\n * @property {number} left\n *           Pixels to the left\n *\n * @property {number} top\n *           Pixels on top\n */\n\n/**\n * Offset Left.\n * getBoundingClientRect technique from\n * John Resig\n *\n * @see http://ejohn.org/blog/getboundingclientrect-is-awesome/\n *\n * @param {Element} el\n *        Element from which to get offset\n *\n * @return {module:dom~Position}\n *         The position of the element that was passed in.\n */\nfunction findPosition(el) {\n  var box = void 0;\n\n  if (el.getBoundingClientRect && el.parentNode) {\n    box = el.getBoundingClientRect();\n  }\n\n  if (!box) {\n    return {\n      left: 0,\n      top: 0\n    };\n  }\n\n  var docEl = document_1.documentElement;\n  var body = document_1.body;\n\n  var clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  var scrollLeft = window_1.pageXOffset || body.scrollLeft;\n  var left = box.left + scrollLeft - clientLeft;\n\n  var clientTop = docEl.clientTop || body.clientTop || 0;\n  var scrollTop = window_1.pageYOffset || body.scrollTop;\n  var top = box.top + scrollTop - clientTop;\n\n  // Android sometimes returns slightly off decimal values, so need to round\n  return {\n    left: Math.round(left),\n    top: Math.round(top)\n  };\n}\n\n/**\n * x and y coordinates for a dom element or mouse pointer\n *\n * @typedef {Object} Dom~Coordinates\n *\n * @property {number} x\n *           x coordinate in pixels\n *\n * @property {number} y\n *           y coordinate in pixels\n */\n\n/**\n * Get pointer position in element\n * Returns an object with x and y coordinates.\n * The base on the coordinates are the bottom left of the element.\n *\n * @param {Element} el\n *        Element on which to get the pointer position on\n *\n * @param {EventTarget~Event} event\n *        Event object\n *\n * @return {Dom~Coordinates}\n *         A Coordinates object corresponding to the mouse position.\n *\n */\nfunction getPointerPosition(el, event) {\n  var position = {};\n  var box = findPosition(el);\n  var boxW = el.offsetWidth;\n  var boxH = el.offsetHeight;\n\n  var boxY = box.top;\n  var boxX = box.left;\n  var pageY = event.pageY;\n  var pageX = event.pageX;\n\n  if (event.changedTouches) {\n    pageX = event.changedTouches[0].pageX;\n    pageY = event.changedTouches[0].pageY;\n  }\n\n  position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));\n  position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));\n\n  return position;\n}\n\n/**\n * Determines, via duck typing, whether or not a value is a text node.\n *\n * @param {Mixed} value\n *        Check if this value is a text node.\n *\n * @return {boolean}\n *         - True if it is a text node\n *         - False otherwise\n */\nfunction isTextNode(value) {\n  return isObject(value) && value.nodeType === 3;\n}\n\n/**\n * Empties the contents of an element.\n *\n * @param {Element} el\n *        The element to empty children from\n *\n * @return {Element}\n *         The element with no children\n */\nfunction emptyEl(el) {\n  while (el.firstChild) {\n    el.removeChild(el.firstChild);\n  }\n  return el;\n}\n\n/**\n * Normalizes content for eventual insertion into the DOM.\n *\n * This allows a wide range of content definition methods, but protects\n * from falling into the trap of simply writing to `innerHTML`, which is\n * an XSS concern.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * @param {String|Element|TextNode|Array|Function} content\n *        - String: Normalized into a text node.\n *        - Element/TextNode: Passed through.\n *        - Array: A one-dimensional array of strings, elements, nodes, or functions\n *          (which return single strings, elements, or nodes).\n *        - Function: If the sole argument, is expected to produce a string, element,\n *          node, or array as defined above.\n *\n * @return {Array}\n *         All of the content that was passed in normalized.\n */\nfunction normalizeContent(content) {\n\n  // First, invoke content if it is a function. If it produces an array,\n  // that needs to happen before normalization.\n  if (typeof content === 'function') {\n    content = content();\n  }\n\n  // Next up, normalize to an array, so one or many items can be normalized,\n  // filtered, and returned.\n  return (Array.isArray(content) ? content : [content]).map(function (value) {\n\n    // First, invoke value if it is a function to produce a new value,\n    // which will be subsequently normalized to a Node of some kind.\n    if (typeof value === 'function') {\n      value = value();\n    }\n\n    if (isEl(value) || isTextNode(value)) {\n      return value;\n    }\n\n    if (typeof value === 'string' && /\\S/.test(value)) {\n      return document_1.createTextNode(value);\n    }\n  }).filter(function (value) {\n    return value;\n  });\n}\n\n/**\n * Normalizes and appends content to an element.\n *\n * @param {Element} el\n *        Element to append normalized content to.\n *\n *\n * @param {String|Element|TextNode|Array|Function} content\n *        See the `content` argument of {@link dom:normalizeContent}\n *\n * @return {Element}\n *         The element with appended normalized content.\n */\nfunction appendContent(el, content) {\n  normalizeContent(content).forEach(function (node) {\n    return el.appendChild(node);\n  });\n  return el;\n}\n\n/**\n * Normalizes and inserts content into an element; this is identical to\n * `appendContent()`, except it empties the element first.\n *\n * @param {Element} el\n *        Element to insert normalized content into.\n *\n * @param {String|Element|TextNode|Array|Function} content\n *        See the `content` argument of {@link dom:normalizeContent}\n *\n * @return {Element}\n *         The element with inserted normalized content.\n *\n */\nfunction insertContent(el, content) {\n  return appendContent(emptyEl(el), content);\n}\n\n/**\n * Check if event was a single left click\n *\n * @param {EventTarget~Event} event\n *        Event object\n *\n * @return {boolean}\n *         - True if a left click\n *         - False if not a left click\n */\nfunction isSingleLeftClick(event) {\n  // Note: if you create something draggable, be sure to\n  // call it on both `mousedown` and `mousemove` event,\n  // otherwise `mousedown` should be enough for a button\n\n  if (event.button === undefined && event.buttons === undefined) {\n    // Why do we need `butttons` ?\n    // Because, middle mouse sometimes have this:\n    // e.button === 0 and e.buttons === 4\n    // Furthermore, we want to prevent combination click, something like\n    // HOLD middlemouse then left click, that would be\n    // e.button === 0, e.buttons === 5\n    // just `button` is not gonna work\n\n    // Alright, then what this block does ?\n    // this is for chrome `simulate mobile devices`\n    // I want to support this as well\n\n    return true;\n  }\n\n  if (event.button === 0 && event.buttons === undefined) {\n    // Touch screen, sometimes on some specific device, `buttons`\n    // doesn't have anything (safari on ios, blackberry...)\n\n    return true;\n  }\n\n  if (IE_VERSION === 9) {\n    // Ignore IE9\n\n    return true;\n  }\n\n  if (event.button !== 0 || event.buttons !== 1) {\n    // This is the reason we have those if else block above\n    // if any special case we can catch and let it slide\n    // we do it above, when get to here, this definitely\n    // is-not-left-click\n\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Finds a single DOM element matching `selector` within the optional\n * `context` of another DOM element (defaulting to `document`).\n *\n * @param {string} selector\n *        A valid CSS selector, which will be passed to `querySelector`.\n *\n * @param {Element|String} [context=document]\n *        A DOM element within which to query. Can also be a selector\n *        string in which case the first matching element will be used\n *        as context. If missing (or no element matches selector), falls\n *        back to `document`.\n *\n * @return {Element|null}\n *         The element that was found or null.\n */\nvar $ = createQuerier('querySelector');\n\n/**\n * Finds a all DOM elements matching `selector` within the optional\n * `context` of another DOM element (defaulting to `document`).\n *\n * @param {string} selector\n *           A valid CSS selector, which will be passed to `querySelectorAll`.\n *\n * @param {Element|String} [context=document]\n *           A DOM element within which to query. Can also be a selector\n *           string in which case the first matching element will be used\n *           as context. If missing (or no element matches selector), falls\n *           back to `document`.\n *\n * @return {NodeList}\n *         A element list of elements that were found. Will be empty if none were found.\n *\n */\nvar $$ = createQuerier('querySelectorAll');\n\n\n\nvar Dom = (Object.freeze || Object)({\n\tisReal: isReal,\n\tisEl: isEl,\n\tisInFrame: isInFrame,\n\tcreateEl: createEl,\n\ttextContent: textContent,\n\tprependTo: prependTo,\n\thasClass: hasClass,\n\taddClass: addClass,\n\tremoveClass: removeClass,\n\ttoggleClass: toggleClass,\n\tsetAttributes: setAttributes,\n\tgetAttributes: getAttributes,\n\tgetAttribute: getAttribute,\n\tsetAttribute: setAttribute,\n\tremoveAttribute: removeAttribute,\n\tblockTextSelection: blockTextSelection,\n\tunblockTextSelection: unblockTextSelection,\n\tgetBoundingClientRect: getBoundingClientRect,\n\tfindPosition: findPosition,\n\tgetPointerPosition: getPointerPosition,\n\tisTextNode: isTextNode,\n\temptyEl: emptyEl,\n\tnormalizeContent: normalizeContent,\n\tappendContent: appendContent,\n\tinsertContent: insertContent,\n\tisSingleLeftClick: isSingleLeftClick,\n\t$: $,\n\t$$: $$\n});\n\n/**\n * @file guid.js\n * @module guid\n */\n\n/**\n * Unique ID for an element or function\n * @type {Number}\n */\nvar _guid = 1;\n\n/**\n * Get a unique auto-incrementing ID by number that has not been returned before.\n *\n * @return {number}\n *         A new unique ID.\n */\nfunction newGUID() {\n  return _guid++;\n}\n\n/**\n * @file dom-data.js\n * @module dom-data\n */\n/**\n * Element Data Store.\n *\n * Allows for binding data to an element without putting it directly on the\n * element. Ex. Event listeners are stored here.\n * (also from jsninja.com, slightly modified and updated for closure compiler)\n *\n * @type {Object}\n * @private\n */\nvar elData = {};\n\n/*\n * Unique attribute name to store an element's guid in\n *\n * @type {String}\n * @constant\n * @private\n */\nvar elIdAttr = 'vdata' + new Date().getTime();\n\n/**\n * Returns the cache object where data for an element is stored\n *\n * @param {Element} el\n *        Element to store data for.\n *\n * @return {Object}\n *         The cache object for that el that was passed in.\n */\nfunction getData(el) {\n  var id = el[elIdAttr];\n\n  if (!id) {\n    id = el[elIdAttr] = newGUID();\n  }\n\n  if (!elData[id]) {\n    elData[id] = {};\n  }\n\n  return elData[id];\n}\n\n/**\n * Returns whether or not an element has cached data\n *\n * @param {Element} el\n *        Check if this element has cached data.\n *\n * @return {boolean}\n *         - True if the DOM element has cached data.\n *         - False otherwise.\n */\nfunction hasData(el) {\n  var id = el[elIdAttr];\n\n  if (!id) {\n    return false;\n  }\n\n  return !!Object.getOwnPropertyNames(elData[id]).length;\n}\n\n/**\n * Delete data for the element from the cache and the guid attr from getElementById\n *\n * @param {Element} el\n *        Remove cached data for this element.\n */\nfunction removeData(el) {\n  var id = el[elIdAttr];\n\n  if (!id) {\n    return;\n  }\n\n  // Remove all stored data\n  delete elData[id];\n\n  // Remove the elIdAttr property from the DOM node\n  try {\n    delete el[elIdAttr];\n  } catch (e) {\n    if (el.removeAttribute) {\n      el.removeAttribute(elIdAttr);\n    } else {\n      // IE doesn't appear to support removeAttribute on the document element\n      el[elIdAttr] = null;\n    }\n  }\n}\n\n/**\n * @file events.js. An Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)\n * (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)\n * This should work very similarly to jQuery's events, however it's based off the book version which isn't as\n * robust as jquery's, so there's probably some differences.\n *\n * @module events\n */\n\n/**\n * Clean up the listener cache and dispatchers\n *\n * @param {Element|Object} elem\n *        Element to clean up\n *\n * @param {string} type\n *        Type of event to clean up\n */\nfunction _cleanUpEvents(elem, type) {\n  var data = getData(elem);\n\n  // Remove the events of a particular type if there are none left\n  if (data.handlers[type].length === 0) {\n    delete data.handlers[type];\n    // data.handlers[type] = null;\n    // Setting to null was causing an error with data.handlers\n\n    // Remove the meta-handler from the element\n    if (elem.removeEventListener) {\n      elem.removeEventListener(type, data.dispatcher, false);\n    } else if (elem.detachEvent) {\n      elem.detachEvent('on' + type, data.dispatcher);\n    }\n  }\n\n  // Remove the events object if there are no types left\n  if (Object.getOwnPropertyNames(data.handlers).length <= 0) {\n    delete data.handlers;\n    delete data.dispatcher;\n    delete data.disabled;\n  }\n\n  // Finally remove the element data if there is no data left\n  if (Object.getOwnPropertyNames(data).length === 0) {\n    removeData(elem);\n  }\n}\n\n/**\n * Loops through an array of event types and calls the requested method for each type.\n *\n * @param {Function} fn\n *        The event method we want to use.\n *\n * @param {Element|Object} elem\n *        Element or object to bind listeners to\n *\n * @param {string} type\n *        Type of event to bind to.\n *\n * @param {EventTarget~EventListener} callback\n *        Event listener.\n */\nfunction _handleMultipleEvents(fn, elem, types, callback) {\n  types.forEach(function (type) {\n    // Call the event method for each one of the types\n    fn(elem, type, callback);\n  });\n}\n\n/**\n * Fix a native event to have standard property values\n *\n * @param {Object} event\n *        Event object to fix.\n *\n * @return {Object}\n *         Fixed event object.\n */\nfunction fixEvent(event) {\n\n  function returnTrue() {\n    return true;\n  }\n\n  function returnFalse() {\n    return false;\n  }\n\n  // Test if fixing up is needed\n  // Used to check if !event.stopPropagation instead of isPropagationStopped\n  // But native events return true for stopPropagation, but don't have\n  // other expected methods like isPropagationStopped. Seems to be a problem\n  // with the Javascript Ninja code. So we're just overriding all events now.\n  if (!event || !event.isPropagationStopped) {\n    var old = event || window_1.event;\n\n    event = {};\n    // Clone the old object so that we can modify the values event = {};\n    // IE8 Doesn't like when you mess with native event properties\n    // Firefox returns false for event.hasOwnProperty('type') and other props\n    //  which makes copying more difficult.\n    // TODO: Probably best to create a whitelist of event props\n    for (var key in old) {\n      // Safari 6.0.3 warns you if you try to copy deprecated layerX/Y\n      // Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation\n      // and webkitMovementX/Y\n      if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {\n        // Chrome 32+ warns if you try to copy deprecated returnValue, but\n        // we still want to if preventDefault isn't supported (IE8).\n        if (!(key === 'returnValue' && old.preventDefault)) {\n          event[key] = old[key];\n        }\n      }\n    }\n\n    // The event occurred on this element\n    if (!event.target) {\n      event.target = event.srcElement || document_1;\n    }\n\n    // Handle which other element the event is related to\n    if (!event.relatedTarget) {\n      event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;\n    }\n\n    // Stop the default browser action\n    event.preventDefault = function () {\n      if (old.preventDefault) {\n        old.preventDefault();\n      }\n      event.returnValue = false;\n      old.returnValue = false;\n      event.defaultPrevented = true;\n    };\n\n    event.defaultPrevented = false;\n\n    // Stop the event from bubbling\n    event.stopPropagation = function () {\n      if (old.stopPropagation) {\n        old.stopPropagation();\n      }\n      event.cancelBubble = true;\n      old.cancelBubble = true;\n      event.isPropagationStopped = returnTrue;\n    };\n\n    event.isPropagationStopped = returnFalse;\n\n    // Stop the event from bubbling and executing other handlers\n    event.stopImmediatePropagation = function () {\n      if (old.stopImmediatePropagation) {\n        old.stopImmediatePropagation();\n      }\n      event.isImmediatePropagationStopped = returnTrue;\n      event.stopPropagation();\n    };\n\n    event.isImmediatePropagationStopped = returnFalse;\n\n    // Handle mouse position\n    if (event.clientX !== null && event.clientX !== undefined) {\n      var doc = document_1.documentElement;\n      var body = document_1.body;\n\n      event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n      event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n    }\n\n    // Handle key presses\n    event.which = event.charCode || event.keyCode;\n\n    // Fix button for mouse clicks:\n    // 0 == left; 1 == middle; 2 == right\n    if (event.button !== null && event.button !== undefined) {\n\n      // The following is disabled because it does not pass videojs-standard\n      // and... yikes.\n      /* eslint-disable */\n      event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;\n      /* eslint-enable */\n    }\n  }\n\n  // Returns fixed-up instance\n  return event;\n}\n\n/**\n * Whether passive event listeners are supported\n */\nvar _supportsPassive = false;\n\n(function () {\n  try {\n    var opts = Object.defineProperty({}, 'passive', {\n      get: function get() {\n        _supportsPassive = true;\n      }\n    });\n\n    window_1.addEventListener('test', null, opts);\n    window_1.removeEventListener('test', null, opts);\n  } catch (e) {\n    // disregard\n  }\n})();\n\n/**\n * Touch events Chrome expects to be passive\n */\nvar passiveEvents = ['touchstart', 'touchmove'];\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @param {Element|Object} elem\n *        Element or object to bind listeners to\n *\n * @param {string|string[]} type\n *        Type of event to bind to.\n *\n * @param {EventTarget~EventListener} fn\n *        Event listener.\n */\nfunction on(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(on, elem, type, fn);\n  }\n\n  var data = getData(elem);\n\n  // We need a place to store all our handler data\n  if (!data.handlers) {\n    data.handlers = {};\n  }\n\n  if (!data.handlers[type]) {\n    data.handlers[type] = [];\n  }\n\n  if (!fn.guid) {\n    fn.guid = newGUID();\n  }\n\n  data.handlers[type].push(fn);\n\n  if (!data.dispatcher) {\n    data.disabled = false;\n\n    data.dispatcher = function (event, hash) {\n\n      if (data.disabled) {\n        return;\n      }\n\n      event = fixEvent(event);\n\n      var handlers = data.handlers[event.type];\n\n      if (handlers) {\n        // Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.\n        var handlersCopy = handlers.slice(0);\n\n        for (var m = 0, n = handlersCopy.length; m < n; m++) {\n          if (event.isImmediatePropagationStopped()) {\n            break;\n          } else {\n            try {\n              handlersCopy[m].call(elem, event, hash);\n            } catch (e) {\n              log$1.error(e);\n            }\n          }\n        }\n      }\n    };\n  }\n\n  if (data.handlers[type].length === 1) {\n    if (elem.addEventListener) {\n      var options = false;\n\n      if (_supportsPassive && passiveEvents.indexOf(type) > -1) {\n        options = { passive: true };\n      }\n      elem.addEventListener(type, data.dispatcher, options);\n    } else if (elem.attachEvent) {\n      elem.attachEvent('on' + type, data.dispatcher);\n    }\n  }\n}\n\n/**\n * Removes event listeners from an element\n *\n * @param {Element|Object} elem\n *        Object to remove listeners from.\n *\n * @param {string|string[]} [type]\n *        Type of listener to remove. Don't include to remove all events from element.\n *\n * @param {EventTarget~EventListener} [fn]\n *        Specific listener to remove. Don't include to remove listeners for an event\n *        type.\n */\nfunction off(elem, type, fn) {\n  // Don't want to add a cache object through getElData if not needed\n  if (!hasData(elem)) {\n    return;\n  }\n\n  var data = getData(elem);\n\n  // If no events exist, nothing to unbind\n  if (!data.handlers) {\n    return;\n  }\n\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(off, elem, type, fn);\n  }\n\n  // Utility function\n  var removeType = function removeType(el, t) {\n    data.handlers[t] = [];\n    _cleanUpEvents(el, t);\n  };\n\n  // Are we removing all bound events?\n  if (type === undefined) {\n    for (var t in data.handlers) {\n      if (Object.prototype.hasOwnProperty.call(data.handlers || {}, t)) {\n        removeType(elem, t);\n      }\n    }\n    return;\n  }\n\n  var handlers = data.handlers[type];\n\n  // If no handlers exist, nothing to unbind\n  if (!handlers) {\n    return;\n  }\n\n  // If no listener was provided, remove all listeners for type\n  if (!fn) {\n    removeType(elem, type);\n    return;\n  }\n\n  // We're only removing a single handler\n  if (fn.guid) {\n    for (var n = 0; n < handlers.length; n++) {\n      if (handlers[n].guid === fn.guid) {\n        handlers.splice(n--, 1);\n      }\n    }\n  }\n\n  _cleanUpEvents(elem, type);\n}\n\n/**\n * Trigger an event for an element\n *\n * @param {Element|Object} elem\n *        Element to trigger an event on\n *\n * @param {EventTarget~Event|string} event\n *        A string (the type) or an event object with a type attribute\n *\n * @param {Object} [hash]\n *        data hash to pass along with the event\n *\n * @return {boolean|undefined}\n *         - Returns the opposite of `defaultPrevented` if default was prevented\n *         - Otherwise returns undefined\n */\nfunction trigger(elem, event, hash) {\n  // Fetches element data and a reference to the parent (for bubbling).\n  // Don't want to add a data object to cache for every parent,\n  // so checking hasElData first.\n  var elemData = hasData(elem) ? getData(elem) : {};\n  var parent = elem.parentNode || elem.ownerDocument;\n  // type = event.type || event,\n  // handler;\n\n  // If an event name was passed as a string, creates an event out of it\n  if (typeof event === 'string') {\n    event = { type: event, target: elem };\n  }\n  // Normalizes the event properties.\n  event = fixEvent(event);\n\n  // If the passed element has a dispatcher, executes the established handlers.\n  if (elemData.dispatcher) {\n    elemData.dispatcher.call(elem, event, hash);\n  }\n\n  // Unless explicitly stopped or the event does not bubble (e.g. media events)\n  // recursively calls this function to bubble the event up the DOM.\n  if (parent && !event.isPropagationStopped() && event.bubbles === true) {\n    trigger.call(null, parent, event, hash);\n\n    // If at the top of the DOM, triggers the default action unless disabled.\n  } else if (!parent && !event.defaultPrevented) {\n    var targetData = getData(event.target);\n\n    // Checks if the target has a default action for this event.\n    if (event.target[event.type]) {\n      // Temporarily disables event dispatching on the target as we have already executed the handler.\n      targetData.disabled = true;\n      // Executes the default action.\n      if (typeof event.target[event.type] === 'function') {\n        event.target[event.type]();\n      }\n      // Re-enables event dispatching.\n      targetData.disabled = false;\n    }\n  }\n\n  // Inform the triggerer if the default was prevented by returning false\n  return !event.defaultPrevented;\n}\n\n/**\n * Trigger a listener only once for an event\n *\n * @param {Element|Object} elem\n *        Element or object to bind to.\n *\n * @param {string|string[]} type\n *        Name/type of event\n *\n * @param {Event~EventListener} fn\n *        Event Listener function\n */\nfunction one(elem, type, fn) {\n  if (Array.isArray(type)) {\n    return _handleMultipleEvents(one, elem, type, fn);\n  }\n  var func = function func() {\n    off(elem, type, func);\n    fn.apply(this, arguments);\n  };\n\n  // copy the guid to the new function so it can removed using the original function's ID\n  func.guid = fn.guid = fn.guid || newGUID();\n  on(elem, type, func);\n}\n\nvar Events = (Object.freeze || Object)({\n\tfixEvent: fixEvent,\n\ton: on,\n\toff: off,\n\ttrigger: trigger,\n\tone: one\n});\n\n/**\n * @file setup.js - Functions for setting up a player without\n * user interaction based on the data-setup `attribute` of the video tag.\n *\n * @module setup\n */\nvar _windowLoaded = false;\nvar videojs$2 = void 0;\n\n/**\n * Set up any tags that have a data-setup `attribute` when the player is started.\n */\nvar autoSetup = function autoSetup() {\n\n  // Protect against breakage in non-browser environments.\n  if (!isReal()) {\n    return;\n  }\n\n  // One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*\n  // var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));\n  // var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));\n  // var mediaEls = vids.concat(audios);\n\n  // Because IE8 doesn't support calling slice on a node list, we need to loop\n  // through each list of elements to build up a new, combined list of elements.\n  var vids = document_1.getElementsByTagName('video');\n  var audios = document_1.getElementsByTagName('audio');\n  var divs = document_1.getElementsByTagName('video-js');\n  var mediaEls = [];\n\n  if (vids && vids.length > 0) {\n    for (var i = 0, e = vids.length; i < e; i++) {\n      mediaEls.push(vids[i]);\n    }\n  }\n\n  if (audios && audios.length > 0) {\n    for (var _i = 0, _e = audios.length; _i < _e; _i++) {\n      mediaEls.push(audios[_i]);\n    }\n  }\n\n  if (divs && divs.length > 0) {\n    for (var _i2 = 0, _e2 = divs.length; _i2 < _e2; _i2++) {\n      mediaEls.push(divs[_i2]);\n    }\n  }\n\n  // Check if any media elements exist\n  if (mediaEls && mediaEls.length > 0) {\n\n    for (var _i3 = 0, _e3 = mediaEls.length; _i3 < _e3; _i3++) {\n      var mediaEl = mediaEls[_i3];\n\n      // Check if element exists, has getAttribute func.\n      // IE seems to consider typeof el.getAttribute == 'object' instead of\n      // 'function' like expected, at least when loading the player immediately.\n      if (mediaEl && mediaEl.getAttribute) {\n\n        // Make sure this player hasn't already been set up.\n        if (mediaEl.player === undefined) {\n          var options = mediaEl.getAttribute('data-setup');\n\n          // Check if data-setup attr exists.\n          // We only auto-setup if they've added the data-setup attr.\n          if (options !== null) {\n            // Create new video.js instance.\n            videojs$2(mediaEl);\n          }\n        }\n\n        // If getAttribute isn't defined, we need to wait for the DOM.\n      } else {\n        autoSetupTimeout(1);\n        break;\n      }\n    }\n\n    // No videos were found, so keep looping unless page is finished loading.\n  } else if (!_windowLoaded) {\n    autoSetupTimeout(1);\n  }\n};\n\n/**\n * Wait until the page is loaded before running autoSetup. This will be called in\n * autoSetup if `hasLoaded` returns false.\n *\n * @param {number} wait\n *        How long to wait in ms\n *\n * @param {module:videojs} [vjs]\n *        The videojs library function\n */\nfunction autoSetupTimeout(wait, vjs) {\n  if (vjs) {\n    videojs$2 = vjs;\n  }\n\n  window_1.setTimeout(autoSetup, wait);\n}\n\nif (isReal() && document_1.readyState === 'complete') {\n  _windowLoaded = true;\n} else {\n  /**\n   * Listen for the load event on window, and set _windowLoaded to true.\n   *\n   * @listens load\n   */\n  one(window_1, 'load', function () {\n    _windowLoaded = true;\n  });\n}\n\n/**\n * @file stylesheet.js\n * @module stylesheet\n */\n/**\n * Create a DOM syle element given a className for it.\n *\n * @param {string} className\n *        The className to add to the created style element.\n *\n * @return {Element}\n *         The element that was created.\n */\nvar createStyleElement = function createStyleElement(className) {\n  var style = document_1.createElement('style');\n\n  style.className = className;\n\n  return style;\n};\n\n/**\n * Add text to a DOM element.\n *\n * @param {Element} el\n *        The Element to add text content to.\n *\n * @param {string} content\n *        The text to add to the element.\n */\nvar setTextContent = function setTextContent(el, content) {\n  if (el.styleSheet) {\n    el.styleSheet.cssText = content;\n  } else {\n    el.textContent = content;\n  }\n};\n\n/**\n * @file fn.js\n * @module fn\n */\n/**\n * Bind (a.k.a proxy or Context). A simple method for changing the context of a function\n * It also stores a unique id on the function so it can be easily removed from events.\n *\n * @param {Mixed} context\n *        The object to bind as scope.\n *\n * @param {Function} fn\n *        The function to be bound to a scope.\n *\n * @param {number} [uid]\n *        An optional unique ID for the function to be set\n *\n * @return {Function}\n *         The new function that will be bound into the context given\n */\nvar bind = function bind(context, fn, uid) {\n  // Make sure the function has a unique ID\n  if (!fn.guid) {\n    fn.guid = newGUID();\n  }\n\n  // Create the new function that changes the context\n  var bound = function bound() {\n    return fn.apply(context, arguments);\n  };\n\n  // Allow for the ability to individualize this function\n  // Needed in the case where multiple objects might share the same prototype\n  // IF both items add an event listener with the same function, then you try to remove just one\n  // it will remove both because they both have the same guid.\n  // when using this, you need to use the bind method when you remove the listener as well.\n  // currently used in text tracks\n  bound.guid = uid ? uid + '_' + fn.guid : fn.guid;\n\n  return bound;\n};\n\n/**\n * Wraps the given function, `fn`, with a new function that only invokes `fn`\n * at most once per every `wait` milliseconds.\n *\n * @param  {Function} fn\n *         The function to be throttled.\n *\n * @param  {Number}   wait\n *         The number of milliseconds by which to throttle.\n *\n * @return {Function}\n */\nvar throttle = function throttle(fn, wait) {\n  var last = Date.now();\n\n  var throttled = function throttled() {\n    var now = Date.now();\n\n    if (now - last >= wait) {\n      fn.apply(undefined, arguments);\n      last = now;\n    }\n  };\n\n  return throttled;\n};\n\n/**\n * @file src/js/event-target.js\n */\n/**\n * `EventTarget` is a class that can have the same API as the DOM `EventTarget`. It\n * adds shorthand functions that wrap around lengthy functions. For example:\n * the `on` function is a wrapper around `addEventListener`.\n *\n * @see [EventTarget Spec]{@link https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget}\n * @class EventTarget\n */\nvar EventTarget = function EventTarget() {};\n\n/**\n * A Custom DOM event.\n *\n * @typedef {Object} EventTarget~Event\n * @see [Properties]{@link https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent}\n */\n\n/**\n * All event listeners should follow the following format.\n *\n * @callback EventTarget~EventListener\n * @this {EventTarget}\n *\n * @param {EventTarget~Event} event\n *        the event that triggered this function\n *\n * @param {Object} [hash]\n *        hash of data sent during the event\n */\n\n/**\n * An object containing event names as keys and booleans as values.\n *\n * > NOTE: If an event name is set to a true value here {@link EventTarget#trigger}\n *         will have extra functionality. See that function for more information.\n *\n * @property EventTarget.prototype.allowedEvents_\n * @private\n */\nEventTarget.prototype.allowedEvents_ = {};\n\n/**\n * Adds an `event listener` to an instance of an `EventTarget`. An `event listener` is a\n * function that will get called when an event with a certain name gets triggered.\n *\n * @param {string|string[]} type\n *        An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n *        The function to call with `EventTarget`s\n */\nEventTarget.prototype.on = function (type, fn) {\n  // Remove the addEventListener alias before calling Events.on\n  // so we don't get into an infinite type loop\n  var ael = this.addEventListener;\n\n  this.addEventListener = function () {};\n  on(this, type, fn);\n  this.addEventListener = ael;\n};\n\n/**\n * An alias of {@link EventTarget#on}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#on}\n */\nEventTarget.prototype.addEventListener = EventTarget.prototype.on;\n\n/**\n * Removes an `event listener` for a specific event from an instance of `EventTarget`.\n * This makes it so that the `event listener` will no longer get called when the\n * named event happens.\n *\n * @param {string|string[]} type\n *        An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n *        The function to remove.\n */\nEventTarget.prototype.off = function (type, fn) {\n  off(this, type, fn);\n};\n\n/**\n * An alias of {@link EventTarget#off}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#off}\n */\nEventTarget.prototype.removeEventListener = EventTarget.prototype.off;\n\n/**\n * This function will add an `event listener` that gets triggered only once. After the\n * first trigger it will get removed. This is like adding an `event listener`\n * with {@link EventTarget#on} that calls {@link EventTarget#off} on itself.\n *\n * @param {string|string[]} type\n *        An event name or an array of event names.\n *\n * @param {EventTarget~EventListener} fn\n *        The function to be called once for each event name.\n */\nEventTarget.prototype.one = function (type, fn) {\n  // Remove the addEventListener alialing Events.on\n  // so we don't get into an infinite type loop\n  var ael = this.addEventListener;\n\n  this.addEventListener = function () {};\n  one(this, type, fn);\n  this.addEventListener = ael;\n};\n\n/**\n * This function causes an event to happen. This will then cause any `event listeners`\n * that are waiting for that event, to get called. If there are no `event listeners`\n * for an event then nothing will happen.\n *\n * If the name of the `Event` that is being triggered is in `EventTarget.allowedEvents_`.\n * Trigger will also call the `on` + `uppercaseEventName` function.\n *\n * Example:\n * 'click' is in `EventTarget.allowedEvents_`, so, trigger will attempt to call\n * `onClick` if it exists.\n *\n * @param {string|EventTarget~Event|Object} event\n *        The name of the event, an `Event`, or an object with a key of type set to\n *        an event name.\n */\nEventTarget.prototype.trigger = function (event) {\n  var type = event.type || event;\n\n  if (typeof event === 'string') {\n    event = { type: type };\n  }\n  event = fixEvent(event);\n\n  if (this.allowedEvents_[type] && this['on' + type]) {\n    this['on' + type](event);\n  }\n\n  trigger(this, event);\n};\n\n/**\n * An alias of {@link EventTarget#trigger}. Allows `EventTarget` to mimic\n * the standard DOM API.\n *\n * @function\n * @see {@link EventTarget#trigger}\n */\nEventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;\n\n/**\n * @file mixins/evented.js\n * @module evented\n */\n/**\n * Returns whether or not an object has had the evented mixin applied.\n *\n * @param  {Object} object\n *         An object to test.\n *\n * @return {boolean}\n *         Whether or not the object appears to be evented.\n */\nvar isEvented = function isEvented(object) {\n  return object instanceof EventTarget || !!object.eventBusEl_ && ['on', 'one', 'off', 'trigger'].every(function (k) {\n    return typeof object[k] === 'function';\n  });\n};\n\n/**\n * Whether a value is a valid event type - non-empty string or array.\n *\n * @private\n * @param  {string|Array} type\n *         The type value to test.\n *\n * @return {boolean}\n *         Whether or not the type is a valid event type.\n */\nvar isValidEventType = function isValidEventType(type) {\n  return (\n    // The regex here verifies that the `type` contains at least one non-\n    // whitespace character.\n    typeof type === 'string' && /\\S/.test(type) || Array.isArray(type) && !!type.length\n  );\n};\n\n/**\n * Validates a value to determine if it is a valid event target. Throws if not.\n *\n * @private\n * @throws {Error}\n *         If the target does not appear to be a valid event target.\n *\n * @param  {Object} target\n *         The object to test.\n */\nvar validateTarget = function validateTarget(target) {\n  if (!target.nodeName && !isEvented(target)) {\n    throw new Error('Invalid target; must be a DOM node or evented object.');\n  }\n};\n\n/**\n * Validates a value to determine if it is a valid event target. Throws if not.\n *\n * @private\n * @throws {Error}\n *         If the type does not appear to be a valid event type.\n *\n * @param  {string|Array} type\n *         The type to test.\n */\nvar validateEventType = function validateEventType(type) {\n  if (!isValidEventType(type)) {\n    throw new Error('Invalid event type; must be a non-empty string or array.');\n  }\n};\n\n/**\n * Validates a value to determine if it is a valid listener. Throws if not.\n *\n * @private\n * @throws {Error}\n *         If the listener is not a function.\n *\n * @param  {Function} listener\n *         The listener to test.\n */\nvar validateListener = function validateListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new Error('Invalid listener; must be a function.');\n  }\n};\n\n/**\n * Takes an array of arguments given to `on()` or `one()`, validates them, and\n * normalizes them into an object.\n *\n * @private\n * @param  {Object} self\n *         The evented object on which `on()` or `one()` was called. This\n *         object will be bound as the `this` value for the listener.\n *\n * @param  {Array} args\n *         An array of arguments passed to `on()` or `one()`.\n *\n * @return {Object}\n *         An object containing useful values for `on()` or `one()` calls.\n */\nvar normalizeListenArgs = function normalizeListenArgs(self, args) {\n\n  // If the number of arguments is less than 3, the target is always the\n  // evented object itself.\n  var isTargetingSelf = args.length < 3 || args[0] === self || args[0] === self.eventBusEl_;\n  var target = void 0;\n  var type = void 0;\n  var listener = void 0;\n\n  if (isTargetingSelf) {\n    target = self.eventBusEl_;\n\n    // Deal with cases where we got 3 arguments, but we are still listening to\n    // the evented object itself.\n    if (args.length >= 3) {\n      args.shift();\n    }\n\n    type = args[0];\n    listener = args[1];\n  } else {\n    target = args[0];\n    type = args[1];\n    listener = args[2];\n  }\n\n  validateTarget(target);\n  validateEventType(type);\n  validateListener(listener);\n\n  listener = bind(self, listener);\n\n  return { isTargetingSelf: isTargetingSelf, target: target, type: type, listener: listener };\n};\n\n/**\n * Adds the listener to the event type(s) on the target, normalizing for\n * the type of target.\n *\n * @private\n * @param  {Element|Object} target\n *         A DOM node or evented object.\n *\n * @param  {string} method\n *         The event binding method to use (\"on\" or \"one\").\n *\n * @param  {string|Array} type\n *         One or more event type(s).\n *\n * @param  {Function} listener\n *         A listener function.\n */\nvar listen = function listen(target, method, type, listener) {\n  validateTarget(target);\n\n  if (target.nodeName) {\n    Events[method](target, type, listener);\n  } else {\n    target[method](type, listener);\n  }\n};\n\n/**\n * Contains methods that provide event capabilites to an object which is passed\n * to {@link module:evented|evented}.\n *\n * @mixin EventedMixin\n */\nvar EventedMixin = {\n\n  /**\n   * Add a listener to an event (or events) on this object or another evented\n   * object.\n   *\n   * @param  {string|Array|Element|Object} targetOrType\n   *         If this is a string or array, it represents the event type(s)\n   *         that will trigger the listener.\n   *\n   *         Another evented object can be passed here instead, which will\n   *         cause the listener to listen for events on _that_ object.\n   *\n   *         In either case, the listener's `this` value will be bound to\n   *         this object.\n   *\n   * @param  {string|Array|Function} typeOrListener\n   *         If the first argument was a string or array, this should be the\n   *         listener function. Otherwise, this is a string or array of event\n   *         type(s).\n   *\n   * @param  {Function} [listener]\n   *         If the first argument was another evented object, this will be\n   *         the listener function.\n   */\n  on: function on$$1() {\n    var _this = this;\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var _normalizeListenArgs = normalizeListenArgs(this, args),\n        isTargetingSelf = _normalizeListenArgs.isTargetingSelf,\n        target = _normalizeListenArgs.target,\n        type = _normalizeListenArgs.type,\n        listener = _normalizeListenArgs.listener;\n\n    listen(target, 'on', type, listener);\n\n    // If this object is listening to another evented object.\n    if (!isTargetingSelf) {\n\n      // If this object is disposed, remove the listener.\n      var removeListenerOnDispose = function removeListenerOnDispose() {\n        return _this.off(target, type, listener);\n      };\n\n      // Use the same function ID as the listener so we can remove it later it\n      // using the ID of the original listener.\n      removeListenerOnDispose.guid = listener.guid;\n\n      // Add a listener to the target's dispose event as well. This ensures\n      // that if the target is disposed BEFORE this object, we remove the\n      // removal listener that was just added. Otherwise, we create a memory leak.\n      var removeRemoverOnTargetDispose = function removeRemoverOnTargetDispose() {\n        return _this.off('dispose', removeListenerOnDispose);\n      };\n\n      // Use the same function ID as the listener so we can remove it later\n      // it using the ID of the original listener.\n      removeRemoverOnTargetDispose.guid = listener.guid;\n\n      listen(this, 'on', 'dispose', removeListenerOnDispose);\n      listen(target, 'on', 'dispose', removeRemoverOnTargetDispose);\n    }\n  },\n\n\n  /**\n   * Add a listener to an event (or events) on this object or another evented\n   * object. The listener will only be called once and then removed.\n   *\n   * @param  {string|Array|Element|Object} targetOrType\n   *         If this is a string or array, it represents the event type(s)\n   *         that will trigger the listener.\n   *\n   *         Another evented object can be passed here instead, which will\n   *         cause the listener to listen for events on _that_ object.\n   *\n   *         In either case, the listener's `this` value will be bound to\n   *         this object.\n   *\n   * @param  {string|Array|Function} typeOrListener\n   *         If the first argument was a string or array, this should be the\n   *         listener function. Otherwise, this is a string or array of event\n   *         type(s).\n   *\n   * @param  {Function} [listener]\n   *         If the first argument was another evented object, this will be\n   *         the listener function.\n   */\n  one: function one$$1() {\n    var _this2 = this;\n\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    var _normalizeListenArgs2 = normalizeListenArgs(this, args),\n        isTargetingSelf = _normalizeListenArgs2.isTargetingSelf,\n        target = _normalizeListenArgs2.target,\n        type = _normalizeListenArgs2.type,\n        listener = _normalizeListenArgs2.listener;\n\n    // Targeting this evented object.\n\n\n    if (isTargetingSelf) {\n      listen(target, 'one', type, listener);\n\n      // Targeting another evented object.\n    } else {\n      var wrapper = function wrapper() {\n        for (var _len3 = arguments.length, largs = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n          largs[_key3] = arguments[_key3];\n        }\n\n        _this2.off(target, type, wrapper);\n        listener.apply(null, largs);\n      };\n\n      // Use the same function ID as the listener so we can remove it later\n      // it using the ID of the original listener.\n      wrapper.guid = listener.guid;\n      listen(target, 'one', type, wrapper);\n    }\n  },\n\n\n  /**\n   * Removes listener(s) from event(s) on an evented object.\n   *\n   * @param  {string|Array|Element|Object} [targetOrType]\n   *         If this is a string or array, it represents the event type(s).\n   *\n   *         Another evented object can be passed here instead, in which case\n   *         ALL 3 arguments are _required_.\n   *\n   * @param  {string|Array|Function} [typeOrListener]\n   *         If the first argument was a string or array, this may be the\n   *         listener function. Otherwise, this is a string or array of event\n   *         type(s).\n   *\n   * @param  {Function} [listener]\n   *         If the first argument was another evented object, this will be\n   *         the listener function; otherwise, _all_ listeners bound to the\n   *         event type(s) will be removed.\n   */\n  off: function off$$1(targetOrType, typeOrListener, listener) {\n\n    // Targeting this evented object.\n    if (!targetOrType || isValidEventType(targetOrType)) {\n      off(this.eventBusEl_, targetOrType, typeOrListener);\n\n      // Targeting another evented object.\n    } else {\n      var target = targetOrType;\n      var type = typeOrListener;\n\n      // Fail fast and in a meaningful way!\n      validateTarget(target);\n      validateEventType(type);\n      validateListener(listener);\n\n      // Ensure there's at least a guid, even if the function hasn't been used\n      listener = bind(this, listener);\n\n      // Remove the dispose listener on this evented object, which was given\n      // the same guid as the event listener in on().\n      this.off('dispose', listener);\n\n      if (target.nodeName) {\n        off(target, type, listener);\n        off(target, 'dispose', listener);\n      } else if (isEvented(target)) {\n        target.off(type, listener);\n        target.off('dispose', listener);\n      }\n    }\n  },\n\n\n  /**\n   * Fire an event on this evented object, causing its listeners to be called.\n   *\n   * @param   {string|Object} event\n   *          An event type or an object with a type property.\n   *\n   * @param   {Object} [hash]\n   *          An additional object to pass along to listeners.\n   *\n   * @returns {boolean}\n   *          Whether or not the default behavior was prevented.\n   */\n  trigger: function trigger$$1(event, hash) {\n    return trigger(this.eventBusEl_, event, hash);\n  }\n};\n\n/**\n * Applies {@link module:evented~EventedMixin|EventedMixin} to a target object.\n *\n * @param  {Object} target\n *         The object to which to add event methods.\n *\n * @param  {Object} [options={}]\n *         Options for customizing the mixin behavior.\n *\n * @param  {String} [options.eventBusKey]\n *         By default, adds a `eventBusEl_` DOM element to the target object,\n *         which is used as an event bus. If the target object already has a\n *         DOM element that should be used, pass its key here.\n *\n * @return {Object}\n *         The target object.\n */\nfunction evented(target) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var eventBusKey = options.eventBusKey;\n\n  // Set or create the eventBusEl_.\n\n  if (eventBusKey) {\n    if (!target[eventBusKey].nodeName) {\n      throw new Error('The eventBusKey \"' + eventBusKey + '\" does not refer to an element.');\n    }\n    target.eventBusEl_ = target[eventBusKey];\n  } else {\n    target.eventBusEl_ = createEl('span', { className: 'vjs-event-bus' });\n  }\n\n  assign(target, EventedMixin);\n\n  // When any evented object is disposed, it removes all its listeners.\n  target.on('dispose', function () {\n    target.off();\n    window_1.setTimeout(function () {\n      target.eventBusEl_ = null;\n    }, 0);\n  });\n\n  return target;\n}\n\n/**\n * @file mixins/stateful.js\n * @module stateful\n */\n/**\n * Contains methods that provide statefulness to an object which is passed\n * to {@link module:stateful}.\n *\n * @mixin StatefulMixin\n */\nvar StatefulMixin = {\n\n  /**\n   * A hash containing arbitrary keys and values representing the state of\n   * the object.\n   *\n   * @type {Object}\n   */\n  state: {},\n\n  /**\n   * Set the state of an object by mutating its\n   * {@link module:stateful~StatefulMixin.state|state} object in place.\n   *\n   * @fires   module:stateful~StatefulMixin#statechanged\n   * @param   {Object|Function} stateUpdates\n   *          A new set of properties to shallow-merge into the plugin state.\n   *          Can be a plain object or a function returning a plain object.\n   *\n   * @returns {Object|undefined}\n   *          An object containing changes that occurred. If no changes\n   *          occurred, returns `undefined`.\n   */\n  setState: function setState(stateUpdates) {\n    var _this = this;\n\n    // Support providing the `stateUpdates` state as a function.\n    if (typeof stateUpdates === 'function') {\n      stateUpdates = stateUpdates();\n    }\n\n    var changes = void 0;\n\n    each(stateUpdates, function (value, key) {\n\n      // Record the change if the value is different from what's in the\n      // current state.\n      if (_this.state[key] !== value) {\n        changes = changes || {};\n        changes[key] = {\n          from: _this.state[key],\n          to: value\n        };\n      }\n\n      _this.state[key] = value;\n    });\n\n    // Only trigger \"statechange\" if there were changes AND we have a trigger\n    // function. This allows us to not require that the target object be an\n    // evented object.\n    if (changes && isEvented(this)) {\n\n      /**\n       * An event triggered on an object that is both\n       * {@link module:stateful|stateful} and {@link module:evented|evented}\n       * indicating that its state has changed.\n       *\n       * @event    module:stateful~StatefulMixin#statechanged\n       * @type     {Object}\n       * @property {Object} changes\n       *           A hash containing the properties that were changed and\n       *           the values they were changed `from` and `to`.\n       */\n      this.trigger({\n        changes: changes,\n        type: 'statechanged'\n      });\n    }\n\n    return changes;\n  }\n};\n\n/**\n * Applies {@link module:stateful~StatefulMixin|StatefulMixin} to a target\n * object.\n *\n * If the target object is {@link module:evented|evented} and has a\n * `handleStateChanged` method, that method will be automatically bound to the\n * `statechanged` event on itself.\n *\n * @param   {Object} target\n *          The object to be made stateful.\n *\n * @param   {Object} [defaultState]\n *          A default set of properties to populate the newly-stateful object's\n *          `state` property.\n *\n * @returns {Object}\n *          Returns the `target`.\n */\nfunction stateful(target, defaultState) {\n  assign(target, StatefulMixin);\n\n  // This happens after the mixing-in because we need to replace the `state`\n  // added in that step.\n  target.state = assign({}, target.state, defaultState);\n\n  // Auto-bind the `handleStateChanged` method of the target object if it exists.\n  if (typeof target.handleStateChanged === 'function' && isEvented(target)) {\n    target.on('statechanged', target.handleStateChanged);\n  }\n\n  return target;\n}\n\n/**\n * @file to-title-case.js\n * @module to-title-case\n */\n\n/**\n * Uppercase the first letter of a string.\n *\n * @param {string} string\n *        String to be uppercased\n *\n * @return {string}\n *         The string with an uppercased first letter\n */\nfunction toTitleCase(string) {\n  if (typeof string !== 'string') {\n    return string;\n  }\n\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\n/**\n * Compares the TitleCase versions of the two strings for equality.\n *\n * @param {string} str1\n *        The first string to compare\n *\n * @param {string} str2\n *        The second string to compare\n *\n * @return {boolean}\n *         Whether the TitleCase versions of the strings are equal\n */\nfunction titleCaseEquals(str1, str2) {\n  return toTitleCase(str1) === toTitleCase(str2);\n}\n\n/**\n * @file merge-options.js\n * @module merge-options\n */\n/**\n * Deep-merge one or more options objects, recursively merging **only** plain\n * object properties.\n *\n * @param   {Object[]} sources\n *          One or more objects to merge into a new object.\n *\n * @returns {Object}\n *          A new object that is the merged result of all sources.\n */\nfunction mergeOptions() {\n  var result = {};\n\n  for (var _len = arguments.length, sources = Array(_len), _key = 0; _key < _len; _key++) {\n    sources[_key] = arguments[_key];\n  }\n\n  sources.forEach(function (source) {\n    if (!source) {\n      return;\n    }\n\n    each(source, function (value, key) {\n      if (!isPlain(value)) {\n        result[key] = value;\n        return;\n      }\n\n      if (!isPlain(result[key])) {\n        result[key] = {};\n      }\n\n      result[key] = mergeOptions(result[key], value);\n    });\n  });\n\n  return result;\n}\n\n/**\n * Player Component - Base class for all UI objects\n *\n * @file component.js\n */\n/**\n * Base class for all UI Components.\n * Components are UI objects which represent both a javascript object and an element\n * in the DOM. They can be children of other components, and can have\n * children themselves.\n *\n * Components can also use methods from {@link EventTarget}\n */\n\nvar Component = function () {\n\n  /**\n   * A callback that is called when a component is ready. Does not have any\n   * paramters and any callback value will be ignored.\n   *\n   * @callback Component~ReadyCallback\n   * @this Component\n   */\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Object[]} [options.children]\n   *        An array of children objects to intialize this component with. Children objects have\n   *        a name property that will be used if more than one component of the same type needs to be\n   *        added.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        Function that gets called when the `Component` is ready.\n   */\n  function Component(player, options, ready) {\n    classCallCheck(this, Component);\n\n\n    // The component might be the player itself and we can't pass `this` to super\n    if (!player && this.play) {\n      this.player_ = player = this; // eslint-disable-line\n    } else {\n      this.player_ = player;\n    }\n\n    // Make a copy of prototype.options_ to protect against overriding defaults\n    this.options_ = mergeOptions({}, this.options_);\n\n    // Updated options with supplied options\n    options = this.options_ = mergeOptions(this.options_, options);\n\n    // Get ID from options or options element if one is supplied\n    this.id_ = options.id || options.el && options.el.id;\n\n    // If there was no ID from the options, generate one\n    if (!this.id_) {\n      // Don't require the player ID function in the case of mock players\n      var id = player && player.id && player.id() || 'no_player';\n\n      this.id_ = id + '_component_' + newGUID();\n    }\n\n    this.name_ = options.name || null;\n\n    // Create element if one wasn't provided in options\n    if (options.el) {\n      this.el_ = options.el;\n    } else if (options.createEl !== false) {\n      this.el_ = this.createEl();\n    }\n\n    // if evented is anything except false, we want to mixin in evented\n    if (options.evented !== false) {\n      // Make this an evented object and use `el_`, if available, as its event bus\n      evented(this, { eventBusKey: this.el_ ? 'el_' : null });\n    }\n    stateful(this, this.constructor.defaultState);\n\n    this.children_ = [];\n    this.childIndex_ = {};\n    this.childNameIndex_ = {};\n\n    // Add any child components in options\n    if (options.initChildren !== false) {\n      this.initChildren();\n    }\n\n    this.ready(ready);\n    // Don't want to trigger ready here or it will before init is actually\n    // finished for all children that run this constructor\n\n    if (options.reportTouchActivity !== false) {\n      this.enableTouchActivity();\n    }\n  }\n\n  /**\n   * Dispose of the `Component` and all child components.\n   *\n   * @fires Component#dispose\n   */\n\n\n  Component.prototype.dispose = function dispose() {\n\n    /**\n     * Triggered when a `Component` is disposed.\n     *\n     * @event Component#dispose\n     * @type {EventTarget~Event}\n     *\n     * @property {boolean} [bubbles=false]\n     *           set to false so that the close event does not\n     *           bubble up\n     */\n    this.trigger({ type: 'dispose', bubbles: false });\n\n    // Dispose all children.\n    if (this.children_) {\n      for (var i = this.children_.length - 1; i >= 0; i--) {\n        if (this.children_[i].dispose) {\n          this.children_[i].dispose();\n        }\n      }\n    }\n\n    // Delete child references\n    this.children_ = null;\n    this.childIndex_ = null;\n    this.childNameIndex_ = null;\n\n    if (this.el_) {\n      // Remove element from DOM\n      if (this.el_.parentNode) {\n        this.el_.parentNode.removeChild(this.el_);\n      }\n\n      removeData(this.el_);\n      this.el_ = null;\n    }\n\n    // remove reference to the player after disposing of the element\n    this.player_ = null;\n  };\n\n  /**\n   * Return the {@link Player} that the `Component` has attached to.\n   *\n   * @return {Player}\n   *         The player that this `Component` has attached to.\n   */\n\n\n  Component.prototype.player = function player() {\n    return this.player_;\n  };\n\n  /**\n   * Deep merge of options objects with new options.\n   * > Note: When both `obj` and `options` contain properties whose values are objects.\n   *         The two properties get merged using {@link module:mergeOptions}\n   *\n   * @param {Object} obj\n   *        The object that contains new options.\n   *\n   * @return {Object}\n   *         A new object of `this.options_` and `obj` merged together.\n   *\n   * @deprecated since version 5\n   */\n\n\n  Component.prototype.options = function options(obj) {\n    log$1.warn('this.options() has been deprecated and will be moved to the constructor in 6.0');\n\n    if (!obj) {\n      return this.options_;\n    }\n\n    this.options_ = mergeOptions(this.options_, obj);\n    return this.options_;\n  };\n\n  /**\n   * Get the `Component`s DOM element\n   *\n   * @return {Element}\n   *         The DOM element for this `Component`.\n   */\n\n\n  Component.prototype.el = function el() {\n    return this.el_;\n  };\n\n  /**\n   * Create the `Component`s DOM element.\n   *\n   * @param {string} [tagName]\n   *        Element's DOM node type. e.g. 'div'\n   *\n   * @param {Object} [properties]\n   *        An object of properties that should be set.\n   *\n   * @param {Object} [attributes]\n   *        An object of attributes that should be set.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  Component.prototype.createEl = function createEl$$1(tagName, properties, attributes) {\n    return createEl(tagName, properties, attributes);\n  };\n\n  /**\n   * Localize a string given the string in english.\n   *\n   * If tokens are provided, it'll try and run a simple token replacement on the provided string.\n   * The tokens it loooks for look like `{1}` with the index being 1-indexed into the tokens array.\n   *\n   * If a `defaultValue` is provided, it'll use that over `string`,\n   * if a value isn't found in provided language files.\n   * This is useful if you want to have a descriptive key for token replacement\n   * but have a succinct localized string and not require `en.json` to be included.\n   *\n   * Currently, it is used for the progress bar timing.\n   * ```js\n   * {\n   *   \"progress bar timing: currentTime={1} duration={2}\": \"{1} of {2}\"\n   * }\n   * ```\n   * It is then used like so:\n   * ```js\n   * this.localize('progress bar timing: currentTime={1} duration{2}',\n   *               [this.player_.currentTime(), this.player_.duration()],\n   *               '{1} of {2}');\n   * ```\n   *\n   * Which outputs something like: `01:23 of 24:56`.\n   *\n   *\n   * @param {string} string\n   *        The string to localize and the key to lookup in the language files.\n   * @param {string[]} [tokens]\n   *        If the current item has token replacements, provide the tokens here.\n   * @param {string} [defaultValue]\n   *        Defaults to `string`. Can be a default value to use for token replacement\n   *        if the lookup key is needed to be separate.\n   *\n   * @return {string}\n   *         The localized string or if no localization exists the english string.\n   */\n\n\n  Component.prototype.localize = function localize(string, tokens) {\n    var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : string;\n\n    var code = this.player_.language && this.player_.language();\n    var languages = this.player_.languages && this.player_.languages();\n    var language = languages && languages[code];\n    var primaryCode = code && code.split('-')[0];\n    var primaryLang = languages && languages[primaryCode];\n\n    var localizedString = defaultValue;\n\n    if (language && language[string]) {\n      localizedString = language[string];\n    } else if (primaryLang && primaryLang[string]) {\n      localizedString = primaryLang[string];\n    }\n\n    if (tokens) {\n      localizedString = localizedString.replace(/\\{(\\d+)\\}/g, function (match, index) {\n        var value = tokens[index - 1];\n        var ret = value;\n\n        if (typeof value === 'undefined') {\n          ret = match;\n        }\n\n        return ret;\n      });\n    }\n\n    return localizedString;\n  };\n\n  /**\n   * Return the `Component`s DOM element. This is where children get inserted.\n   * This will usually be the the same as the element returned in {@link Component#el}.\n   *\n   * @return {Element}\n   *         The content element for this `Component`.\n   */\n\n\n  Component.prototype.contentEl = function contentEl() {\n    return this.contentEl_ || this.el_;\n  };\n\n  /**\n   * Get this `Component`s ID\n   *\n   * @return {string}\n   *         The id of this `Component`\n   */\n\n\n  Component.prototype.id = function id() {\n    return this.id_;\n  };\n\n  /**\n   * Get the `Component`s name. The name gets used to reference the `Component`\n   * and is set during registration.\n   *\n   * @return {string}\n   *         The name of this `Component`.\n   */\n\n\n  Component.prototype.name = function name() {\n    return this.name_;\n  };\n\n  /**\n   * Get an array of all child components\n   *\n   * @return {Array}\n   *         The children\n   */\n\n\n  Component.prototype.children = function children() {\n    return this.children_;\n  };\n\n  /**\n   * Returns the child `Component` with the given `id`.\n   *\n   * @param {string} id\n   *        The id of the child `Component` to get.\n   *\n   * @return {Component|undefined}\n   *         The child `Component` with the given `id` or undefined.\n   */\n\n\n  Component.prototype.getChildById = function getChildById(id) {\n    return this.childIndex_[id];\n  };\n\n  /**\n   * Returns the child `Component` with the given `name`.\n   *\n   * @param {string} name\n   *        The name of the child `Component` to get.\n   *\n   * @return {Component|undefined}\n   *         The child `Component` with the given `name` or undefined.\n   */\n\n\n  Component.prototype.getChild = function getChild(name) {\n    if (!name) {\n      return;\n    }\n\n    name = toTitleCase(name);\n\n    return this.childNameIndex_[name];\n  };\n\n  /**\n   * Add a child `Component` inside the current `Component`.\n   *\n   *\n   * @param {string|Component} child\n   *        The name or instance of a child to add.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of options that will get passed to children of\n   *        the child.\n   *\n   * @param {number} [index=this.children_.length]\n   *        The index to attempt to add a child into.\n   *\n   * @return {Component}\n   *         The `Component` that gets added as a child. When using a string the\n   *         `Component` will get created by this process.\n   */\n\n\n  Component.prototype.addChild = function addChild(child) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.children_.length;\n\n    var component = void 0;\n    var componentName = void 0;\n\n    // If child is a string, create component with options\n    if (typeof child === 'string') {\n      componentName = toTitleCase(child);\n\n      var componentClassName = options.componentClass || componentName;\n\n      // Set name through options\n      options.name = componentName;\n\n      // Create a new object & element for this controls set\n      // If there's no .player_, this is a player\n      var ComponentClass = Component.getComponent(componentClassName);\n\n      if (!ComponentClass) {\n        throw new Error('Component ' + componentClassName + ' does not exist');\n      }\n\n      // data stored directly on the videojs object may be\n      // misidentified as a component to retain\n      // backwards-compatibility with 4.x. check to make sure the\n      // component class can be instantiated.\n      if (typeof ComponentClass !== 'function') {\n        return null;\n      }\n\n      component = new ComponentClass(this.player_ || this, options);\n\n      // child is a component instance\n    } else {\n      component = child;\n    }\n\n    this.children_.splice(index, 0, component);\n\n    if (typeof component.id === 'function') {\n      this.childIndex_[component.id()] = component;\n    }\n\n    // If a name wasn't used to create the component, check if we can use the\n    // name function of the component\n    componentName = componentName || component.name && toTitleCase(component.name());\n\n    if (componentName) {\n      this.childNameIndex_[componentName] = component;\n    }\n\n    // Add the UI object's element to the container div (box)\n    // Having an element is not required\n    if (typeof component.el === 'function' && component.el()) {\n      var childNodes = this.contentEl().children;\n      var refNode = childNodes[index] || null;\n\n      this.contentEl().insertBefore(component.el(), refNode);\n    }\n\n    // Return so it can stored on parent object if desired.\n    return component;\n  };\n\n  /**\n   * Remove a child `Component` from this `Component`s list of children. Also removes\n   * the child `Component`s element from this `Component`s element.\n   *\n   * @param {Component} component\n   *        The child `Component` to remove.\n   */\n\n\n  Component.prototype.removeChild = function removeChild(component) {\n    if (typeof component === 'string') {\n      component = this.getChild(component);\n    }\n\n    if (!component || !this.children_) {\n      return;\n    }\n\n    var childFound = false;\n\n    for (var i = this.children_.length - 1; i >= 0; i--) {\n      if (this.children_[i] === component) {\n        childFound = true;\n        this.children_.splice(i, 1);\n        break;\n      }\n    }\n\n    if (!childFound) {\n      return;\n    }\n\n    this.childIndex_[component.id()] = null;\n    this.childNameIndex_[component.name()] = null;\n\n    var compEl = component.el();\n\n    if (compEl && compEl.parentNode === this.contentEl()) {\n      this.contentEl().removeChild(component.el());\n    }\n  };\n\n  /**\n   * Add and initialize default child `Component`s based upon options.\n   */\n\n\n  Component.prototype.initChildren = function initChildren() {\n    var _this = this;\n\n    var children = this.options_.children;\n\n    if (children) {\n      // `this` is `parent`\n      var parentOptions = this.options_;\n\n      var handleAdd = function handleAdd(child) {\n        var name = child.name;\n        var opts = child.opts;\n\n        // Allow options for children to be set at the parent options\n        // e.g. videojs(id, { controlBar: false });\n        // instead of videojs(id, { children: { controlBar: false });\n        if (parentOptions[name] !== undefined) {\n          opts = parentOptions[name];\n        }\n\n        // Allow for disabling default components\n        // e.g. options['children']['posterImage'] = false\n        if (opts === false) {\n          return;\n        }\n\n        // Allow options to be passed as a simple boolean if no configuration\n        // is necessary.\n        if (opts === true) {\n          opts = {};\n        }\n\n        // We also want to pass the original player options\n        // to each component as well so they don't need to\n        // reach back into the player for options later.\n        opts.playerOptions = _this.options_.playerOptions;\n\n        // Create and add the child component.\n        // Add a direct reference to the child by name on the parent instance.\n        // If two of the same component are used, different names should be supplied\n        // for each\n        var newChild = _this.addChild(name, opts);\n\n        if (newChild) {\n          _this[name] = newChild;\n        }\n      };\n\n      // Allow for an array of children details to passed in the options\n      var workingChildren = void 0;\n      var Tech = Component.getComponent('Tech');\n\n      if (Array.isArray(children)) {\n        workingChildren = children;\n      } else {\n        workingChildren = Object.keys(children);\n      }\n\n      workingChildren\n      // children that are in this.options_ but also in workingChildren  would\n      // give us extra children we do not want. So, we want to filter them out.\n      .concat(Object.keys(this.options_).filter(function (child) {\n        return !workingChildren.some(function (wchild) {\n          if (typeof wchild === 'string') {\n            return child === wchild;\n          }\n          return child === wchild.name;\n        });\n      })).map(function (child) {\n        var name = void 0;\n        var opts = void 0;\n\n        if (typeof child === 'string') {\n          name = child;\n          opts = children[name] || _this.options_[name] || {};\n        } else {\n          name = child.name;\n          opts = child;\n        }\n\n        return { name: name, opts: opts };\n      }).filter(function (child) {\n        // we have to make sure that child.name isn't in the techOrder since\n        // techs are registerd as Components but can't aren't compatible\n        // See https://github.com/videojs/video.js/issues/2772\n        var c = Component.getComponent(child.opts.componentClass || toTitleCase(child.name));\n\n        return c && !Tech.isTech(c);\n      }).forEach(handleAdd);\n    }\n  };\n\n  /**\n   * Builds the default DOM class name. Should be overriden by sub-components.\n   *\n   * @return {string}\n   *         The DOM class name for this object.\n   *\n   * @abstract\n   */\n\n\n  Component.prototype.buildCSSClass = function buildCSSClass() {\n    // Child classes can include a function that does:\n    // return 'CLASS NAME' + this._super();\n    return '';\n  };\n\n  /**\n   * Bind a listener to the component's ready state.\n   * Different from event listeners in that if the ready event has already happened\n   * it will trigger the function immediately.\n   *\n   * @return {Component}\n   *         Returns itself; method can be chained.\n   */\n\n\n  Component.prototype.ready = function ready(fn) {\n    var sync = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    if (!fn) {\n      return;\n    }\n\n    if (!this.isReady_) {\n      this.readyQueue_ = this.readyQueue_ || [];\n      this.readyQueue_.push(fn);\n      return;\n    }\n\n    if (sync) {\n      fn.call(this);\n    } else {\n      // Call the function asynchronously by default for consistency\n      this.setTimeout(fn, 1);\n    }\n  };\n\n  /**\n   * Trigger all the ready listeners for this `Component`.\n   *\n   * @fires Component#ready\n   */\n\n\n  Component.prototype.triggerReady = function triggerReady() {\n    this.isReady_ = true;\n\n    // Ensure ready is triggerd asynchronously\n    this.setTimeout(function () {\n      var readyQueue = this.readyQueue_;\n\n      // Reset Ready Queue\n      this.readyQueue_ = [];\n\n      if (readyQueue && readyQueue.length > 0) {\n        readyQueue.forEach(function (fn) {\n          fn.call(this);\n        }, this);\n      }\n\n      // Allow for using event listeners also\n      /**\n       * Triggered when a `Component` is ready.\n       *\n       * @event Component#ready\n       * @type {EventTarget~Event}\n       */\n      this.trigger('ready');\n    }, 1);\n  };\n\n  /**\n   * Find a single DOM element matching a `selector`. This can be within the `Component`s\n   * `contentEl()` or another custom context.\n   *\n   * @param {string} selector\n   *        A valid CSS selector, which will be passed to `querySelector`.\n   *\n   * @param {Element|string} [context=this.contentEl()]\n   *        A DOM element within which to query. Can also be a selector string in\n   *        which case the first matching element will get used as context. If\n   *        missing `this.contentEl()` gets used. If  `this.contentEl()` returns\n   *        nothing it falls back to `document`.\n   *\n   * @return {Element|null}\n   *         the dom element that was found, or null\n   *\n   * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors)\n   */\n\n\n  Component.prototype.$ = function $$$1(selector, context) {\n    return $(selector, context || this.contentEl());\n  };\n\n  /**\n   * Finds all DOM element matching a `selector`. This can be within the `Component`s\n   * `contentEl()` or another custom context.\n   *\n   * @param {string} selector\n   *        A valid CSS selector, which will be passed to `querySelectorAll`.\n   *\n   * @param {Element|string} [context=this.contentEl()]\n   *        A DOM element within which to query. Can also be a selector string in\n   *        which case the first matching element will get used as context. If\n   *        missing `this.contentEl()` gets used. If  `this.contentEl()` returns\n   *        nothing it falls back to `document`.\n   *\n   * @return {NodeList}\n   *         a list of dom elements that were found\n   *\n   * @see [Information on CSS Selectors](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_Started/Selectors)\n   */\n\n\n  Component.prototype.$$ = function $$$$1(selector, context) {\n    return $$(selector, context || this.contentEl());\n  };\n\n  /**\n   * Check if a component's element has a CSS class name.\n   *\n   * @param {string} classToCheck\n   *        CSS class name to check.\n   *\n   * @return {boolean}\n   *         - True if the `Component` has the class.\n   *         - False if the `Component` does not have the class`\n   */\n\n\n  Component.prototype.hasClass = function hasClass$$1(classToCheck) {\n    return hasClass(this.el_, classToCheck);\n  };\n\n  /**\n   * Add a CSS class name to the `Component`s element.\n   *\n   * @param {string} classToAdd\n   *        CSS class name to add\n   */\n\n\n  Component.prototype.addClass = function addClass$$1(classToAdd) {\n    addClass(this.el_, classToAdd);\n  };\n\n  /**\n   * Remove a CSS class name from the `Component`s element.\n   *\n   * @param {string} classToRemove\n   *        CSS class name to remove\n   */\n\n\n  Component.prototype.removeClass = function removeClass$$1(classToRemove) {\n    removeClass(this.el_, classToRemove);\n  };\n\n  /**\n   * Add or remove a CSS class name from the component's element.\n   * - `classToToggle` gets added when {@link Component#hasClass} would return false.\n   * - `classToToggle` gets removed when {@link Component#hasClass} would return true.\n   *\n   * @param  {string} classToToggle\n   *         The class to add or remove based on (@link Component#hasClass}\n   *\n   * @param  {boolean|Dom~predicate} [predicate]\n   *         An {@link Dom~predicate} function or a boolean\n   */\n\n\n  Component.prototype.toggleClass = function toggleClass$$1(classToToggle, predicate) {\n    toggleClass(this.el_, classToToggle, predicate);\n  };\n\n  /**\n   * Show the `Component`s element if it is hidden by removing the\n   * 'vjs-hidden' class name from it.\n   */\n\n\n  Component.prototype.show = function show() {\n    this.removeClass('vjs-hidden');\n  };\n\n  /**\n   * Hide the `Component`s element if it is currently showing by adding the\n   * 'vjs-hidden` class name to it.\n   */\n\n\n  Component.prototype.hide = function hide() {\n    this.addClass('vjs-hidden');\n  };\n\n  /**\n   * Lock a `Component`s element in its visible state by adding the 'vjs-lock-showing'\n   * class name to it. Used during fadeIn/fadeOut.\n   *\n   * @private\n   */\n\n\n  Component.prototype.lockShowing = function lockShowing() {\n    this.addClass('vjs-lock-showing');\n  };\n\n  /**\n   * Unlock a `Component`s element from its visible state by removing the 'vjs-lock-showing'\n   * class name from it. Used during fadeIn/fadeOut.\n   *\n   * @private\n   */\n\n\n  Component.prototype.unlockShowing = function unlockShowing() {\n    this.removeClass('vjs-lock-showing');\n  };\n\n  /**\n   * Get the value of an attribute on the `Component`s element.\n   *\n   * @param {string} attribute\n   *        Name of the attribute to get the value from.\n   *\n   * @return {string|null}\n   *         - The value of the attribute that was asked for.\n   *         - Can be an empty string on some browsers if the attribute does not exist\n   *           or has no value\n   *         - Most browsers will return null if the attibute does not exist or has\n   *           no value.\n   *\n   * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute}\n   */\n\n\n  Component.prototype.getAttribute = function getAttribute$$1(attribute) {\n    return getAttribute(this.el_, attribute);\n  };\n\n  /**\n   * Set the value of an attribute on the `Component`'s element\n   *\n   * @param {string} attribute\n   *        Name of the attribute to set.\n   *\n   * @param {string} value\n   *        Value to set the attribute to.\n   *\n   * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute}\n   */\n\n\n  Component.prototype.setAttribute = function setAttribute$$1(attribute, value) {\n    setAttribute(this.el_, attribute, value);\n  };\n\n  /**\n   * Remove an attribute from the `Component`s element.\n   *\n   * @param {string} attribute\n   *        Name of the attribute to remove.\n   *\n   * @see [DOM API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute}\n   */\n\n\n  Component.prototype.removeAttribute = function removeAttribute$$1(attribute) {\n    removeAttribute(this.el_, attribute);\n  };\n\n  /**\n   * Get or set the width of the component based upon the CSS styles.\n   * See {@link Component#dimension} for more detailed information.\n   *\n   * @param {number|string} [num]\n   *        The width that you want to set postfixed with '%', 'px' or nothing.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the componentresize event trigger\n   *\n   * @return {number|string}\n   *         The width when getting, zero if there is no width. Can be a string\n   *           postpixed with '%' or 'px'.\n   */\n\n\n  Component.prototype.width = function width(num, skipListeners) {\n    return this.dimension('width', num, skipListeners);\n  };\n\n  /**\n   * Get or set the height of the component based upon the CSS styles.\n   * See {@link Component#dimension} for more detailed information.\n   *\n   * @param {number|string} [num]\n   *        The height that you want to set postfixed with '%', 'px' or nothing.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the componentresize event trigger\n   *\n   * @return {number|string}\n   *         The width when getting, zero if there is no width. Can be a string\n   *         postpixed with '%' or 'px'.\n   */\n\n\n  Component.prototype.height = function height(num, skipListeners) {\n    return this.dimension('height', num, skipListeners);\n  };\n\n  /**\n   * Set both the width and height of the `Component` element at the same time.\n   *\n   * @param  {number|string} width\n   *         Width to set the `Component`s element to.\n   *\n   * @param  {number|string} height\n   *         Height to set the `Component`s element to.\n   */\n\n\n  Component.prototype.dimensions = function dimensions(width, height) {\n    // Skip componentresize listeners on width for optimization\n    this.width(width, true);\n    this.height(height);\n  };\n\n  /**\n   * Get or set width or height of the `Component` element. This is the shared code\n   * for the {@link Component#width} and {@link Component#height}.\n   *\n   * Things to know:\n   * - If the width or height in an number this will return the number postfixed with 'px'.\n   * - If the width/height is a percent this will return the percent postfixed with '%'\n   * - Hidden elements have a width of 0 with `window.getComputedStyle`. This function\n   *   defaults to the `Component`s `style.width` and falls back to `window.getComputedStyle`.\n   *   See [this]{@link http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/}\n   *   for more information\n   * - If you want the computed style of the component, use {@link Component#currentWidth}\n   *   and {@link {Component#currentHeight}\n   *\n   * @fires Component#componentresize\n   *\n   * @param {string} widthOrHeight\n   8        'width' or 'height'\n   *\n   * @param  {number|string} [num]\n   8         New dimension\n   *\n   * @param  {boolean} [skipListeners]\n   *         Skip componentresize event trigger\n   *\n   * @return {number}\n   *         The dimension when getting or 0 if unset\n   */\n\n\n  Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {\n    if (num !== undefined) {\n      // Set to zero if null or literally NaN (NaN !== NaN)\n      if (num === null || num !== num) {\n        num = 0;\n      }\n\n      // Check if using css width/height (% or px) and adjust\n      if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {\n        this.el_.style[widthOrHeight] = num;\n      } else if (num === 'auto') {\n        this.el_.style[widthOrHeight] = '';\n      } else {\n        this.el_.style[widthOrHeight] = num + 'px';\n      }\n\n      // skipListeners allows us to avoid triggering the resize event when setting both width and height\n      if (!skipListeners) {\n        /**\n         * Triggered when a component is resized.\n         *\n         * @event Component#componentresize\n         * @type {EventTarget~Event}\n         */\n        this.trigger('componentresize');\n      }\n\n      return;\n    }\n\n    // Not setting a value, so getting it\n    // Make sure element exists\n    if (!this.el_) {\n      return 0;\n    }\n\n    // Get dimension value from style\n    var val = this.el_.style[widthOrHeight];\n    var pxIndex = val.indexOf('px');\n\n    if (pxIndex !== -1) {\n      // Return the pixel value with no 'px'\n      return parseInt(val.slice(0, pxIndex), 10);\n    }\n\n    // No px so using % or no style was set, so falling back to offsetWidth/height\n    // If component has display:none, offset will return 0\n    // TODO: handle display:none and no dimension style using px\n    return parseInt(this.el_['offset' + toTitleCase(widthOrHeight)], 10);\n  };\n\n  /**\n   * Get the width or the height of the `Component` elements computed style. Uses\n   * `window.getComputedStyle`.\n   *\n   * @param {string} widthOrHeight\n   *        A string containing 'width' or 'height'. Whichever one you want to get.\n   *\n   * @return {number}\n   *         The dimension that gets asked for or 0 if nothing was set\n   *         for that dimension.\n   */\n\n\n  Component.prototype.currentDimension = function currentDimension(widthOrHeight) {\n    var computedWidthOrHeight = 0;\n\n    if (widthOrHeight !== 'width' && widthOrHeight !== 'height') {\n      throw new Error('currentDimension only accepts width or height value');\n    }\n\n    if (typeof window_1.getComputedStyle === 'function') {\n      var computedStyle = window_1.getComputedStyle(this.el_);\n\n      computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight];\n    }\n\n    // remove 'px' from variable and parse as integer\n    computedWidthOrHeight = parseFloat(computedWidthOrHeight);\n\n    // if the computed value is still 0, it's possible that the browser is lying\n    // and we want to check the offset values.\n    // This code also runs on IE8 and wherever getComputedStyle doesn't exist.\n    if (computedWidthOrHeight === 0) {\n      var rule = 'offset' + toTitleCase(widthOrHeight);\n\n      computedWidthOrHeight = this.el_[rule];\n    }\n\n    return computedWidthOrHeight;\n  };\n\n  /**\n   * An object that contains width and height values of the `Component`s\n   * computed style. Uses `window.getComputedStyle`.\n   *\n   * @typedef {Object} Component~DimensionObject\n   *\n   * @property {number} width\n   *           The width of the `Component`s computed style.\n   *\n   * @property {number} height\n   *           The height of the `Component`s computed style.\n   */\n\n  /**\n   * Get an object that contains width and height values of the `Component`s\n   * computed style.\n   *\n   * @return {Component~DimensionObject}\n   *         The dimensions of the components element\n   */\n\n\n  Component.prototype.currentDimensions = function currentDimensions() {\n    return {\n      width: this.currentDimension('width'),\n      height: this.currentDimension('height')\n    };\n  };\n\n  /**\n   * Get the width of the `Component`s computed style. Uses `window.getComputedStyle`.\n   *\n   * @return {number} width\n   *           The width of the `Component`s computed style.\n   */\n\n\n  Component.prototype.currentWidth = function currentWidth() {\n    return this.currentDimension('width');\n  };\n\n  /**\n   * Get the height of the `Component`s computed style. Uses `window.getComputedStyle`.\n   *\n   * @return {number} height\n   *           The height of the `Component`s computed style.\n   */\n\n\n  Component.prototype.currentHeight = function currentHeight() {\n    return this.currentDimension('height');\n  };\n\n  /**\n   * Set the focus to this component\n   */\n\n\n  Component.prototype.focus = function focus() {\n    this.el_.focus();\n  };\n\n  /**\n   * Remove the focus from this component\n   */\n\n\n  Component.prototype.blur = function blur() {\n    this.el_.blur();\n  };\n\n  /**\n   * Emit a 'tap' events when touch event support gets detected. This gets used to\n   * support toggling the controls through a tap on the video. They get enabled\n   * because every sub-component would have extra overhead otherwise.\n   *\n   * @private\n   * @fires Component#tap\n   * @listens Component#touchstart\n   * @listens Component#touchmove\n   * @listens Component#touchleave\n   * @listens Component#touchcancel\n   * @listens Component#touchend\n    */\n\n\n  Component.prototype.emitTapEvents = function emitTapEvents() {\n    // Track the start time so we can determine how long the touch lasted\n    var touchStart = 0;\n    var firstTouch = null;\n\n    // Maximum movement allowed during a touch event to still be considered a tap\n    // Other popular libs use anywhere from 2 (hammer.js) to 15,\n    // so 10 seems like a nice, round number.\n    var tapMovementThreshold = 10;\n\n    // The maximum length a touch can be while still being considered a tap\n    var touchTimeThreshold = 200;\n\n    var couldBeTap = void 0;\n\n    this.on('touchstart', function (event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length === 1) {\n        // Copy pageX/pageY from the object\n        firstTouch = {\n          pageX: event.touches[0].pageX,\n          pageY: event.touches[0].pageY\n        };\n        // Record start time so we can detect a tap vs. \"touch and hold\"\n        touchStart = new Date().getTime();\n        // Reset couldBeTap tracking\n        couldBeTap = true;\n      }\n    });\n\n    this.on('touchmove', function (event) {\n      // If more than one finger, don't consider treating this as a click\n      if (event.touches.length > 1) {\n        couldBeTap = false;\n      } else if (firstTouch) {\n        // Some devices will throw touchmoves for all but the slightest of taps.\n        // So, if we moved only a small distance, this could still be a tap\n        var xdiff = event.touches[0].pageX - firstTouch.pageX;\n        var ydiff = event.touches[0].pageY - firstTouch.pageY;\n        var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n\n        if (touchDistance > tapMovementThreshold) {\n          couldBeTap = false;\n        }\n      }\n    });\n\n    var noTap = function noTap() {\n      couldBeTap = false;\n    };\n\n    // TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s\n    this.on('touchleave', noTap);\n    this.on('touchcancel', noTap);\n\n    // When the touch ends, measure how long it took and trigger the appropriate\n    // event\n    this.on('touchend', function (event) {\n      firstTouch = null;\n      // Proceed only if the touchmove/leave/cancel event didn't happen\n      if (couldBeTap === true) {\n        // Measure how long the touch lasted\n        var touchTime = new Date().getTime() - touchStart;\n\n        // Make sure the touch was less than the threshold to be considered a tap\n        if (touchTime < touchTimeThreshold) {\n          // Don't let browser turn this into a click\n          event.preventDefault();\n          /**\n           * Triggered when a `Component` is tapped.\n           *\n           * @event Component#tap\n           * @type {EventTarget~Event}\n           */\n          this.trigger('tap');\n          // It may be good to copy the touchend event object and change the\n          // type to tap, if the other event properties aren't exact after\n          // Events.fixEvent runs (e.g. event.target)\n        }\n      }\n    });\n  };\n\n  /**\n   * This function reports user activity whenever touch events happen. This can get\n   * turned off by any sub-components that wants touch events to act another way.\n   *\n   * Report user touch activity when touch events occur. User activity gets used to\n   * determine when controls should show/hide. It is simple when it comes to mouse\n   * events, because any mouse event should show the controls. So we capture mouse\n   * events that bubble up to the player and report activity when that happens.\n   * With touch events it isn't as easy as `touchstart` and `touchend` toggle player\n   * controls. So touch events can't help us at the player level either.\n   *\n   * User activity gets checked asynchronously. So what could happen is a tap event\n   * on the video turns the controls off. Then the `touchend` event bubbles up to\n   * the player. Which, if it reported user activity, would turn the controls right\n   * back on. We also don't want to completely block touch events from bubbling up.\n   * Furthermore a `touchmove` event and anything other than a tap, should not turn\n   * controls back on.\n   *\n   * @listens Component#touchstart\n   * @listens Component#touchmove\n   * @listens Component#touchend\n   * @listens Component#touchcancel\n   */\n\n\n  Component.prototype.enableTouchActivity = function enableTouchActivity() {\n    // Don't continue if the root player doesn't support reporting user activity\n    if (!this.player() || !this.player().reportUserActivity) {\n      return;\n    }\n\n    // listener for reporting that the user is active\n    var report = bind(this.player(), this.player().reportUserActivity);\n\n    var touchHolding = void 0;\n\n    this.on('touchstart', function () {\n      report();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(touchHolding);\n      // report at the same interval as activityCheck\n      touchHolding = this.setInterval(report, 250);\n    });\n\n    var touchEnd = function touchEnd(event) {\n      report();\n      // stop the interval that maintains activity if the touch is holding\n      this.clearInterval(touchHolding);\n    };\n\n    this.on('touchmove', report);\n    this.on('touchend', touchEnd);\n    this.on('touchcancel', touchEnd);\n  };\n\n  /**\n   * A callback that has no parameters and is bound into `Component`s context.\n   *\n   * @callback Component~GenericCallback\n   * @this Component\n   */\n\n  /**\n   * Creates a function that runs after an `x` millisecond timeout. This function is a\n   * wrapper around `window.setTimeout`. There are a few reasons to use this one\n   * instead though:\n   * 1. It gets cleared via  {@link Component#clearTimeout} when\n   *    {@link Component#dispose} gets called.\n   * 2. The function callback will gets turned into a {@link Component~GenericCallback}\n   *\n   * > Note: You can use `window.clearTimeout` on the id returned by this function. This\n   *         will cause its dispose listener not to get cleaned up! Please use\n   *         {@link Component#clearTimeout} or {@link Component#dispose}.\n   *\n   * @param {Component~GenericCallback} fn\n   *        The function that will be run after `timeout`.\n   *\n   * @param {number} timeout\n   *        Timeout in milliseconds to delay before executing the specified function.\n   *\n   * @return {number}\n   *         Returns a timeout ID that gets used to identify the timeout. It can also\n   *         get used in {@link Component#clearTimeout} to clear the timeout that\n   *         was set.\n   *\n   * @listens Component#dispose\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout}\n   */\n\n\n  Component.prototype.setTimeout = function setTimeout(fn, timeout) {\n    var _this2 = this;\n\n    fn = bind(this, fn);\n\n    var timeoutId = window_1.setTimeout(fn, timeout);\n    var disposeFn = function disposeFn() {\n      return _this2.clearTimeout(timeoutId);\n    };\n\n    disposeFn.guid = 'vjs-timeout-' + timeoutId;\n\n    this.on('dispose', disposeFn);\n\n    return timeoutId;\n  };\n\n  /**\n   * Clears a timeout that gets created via `window.setTimeout` or\n   * {@link Component#setTimeout}. If you set a timeout via {@link Component#setTimeout}\n   * use this function instead of `window.clearTimout`. If you don't your dispose\n   * listener will not get cleaned up until {@link Component#dispose}!\n   *\n   * @param {number} timeoutId\n   *        The id of the timeout to clear. The return value of\n   *        {@link Component#setTimeout} or `window.setTimeout`.\n   *\n   * @return {number}\n   *         Returns the timeout id that was cleared.\n   *\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearTimeout}\n   */\n\n\n  Component.prototype.clearTimeout = function clearTimeout(timeoutId) {\n    window_1.clearTimeout(timeoutId);\n\n    var disposeFn = function disposeFn() {};\n\n    disposeFn.guid = 'vjs-timeout-' + timeoutId;\n\n    this.off('dispose', disposeFn);\n\n    return timeoutId;\n  };\n\n  /**\n   * Creates a function that gets run every `x` milliseconds. This function is a wrapper\n   * around `window.setInterval`. There are a few reasons to use this one instead though.\n   * 1. It gets cleared via  {@link Component#clearInterval} when\n   *    {@link Component#dispose} gets called.\n   * 2. The function callback will be a {@link Component~GenericCallback}\n   *\n   * @param {Component~GenericCallback} fn\n   *        The function to run every `x` seconds.\n   *\n   * @param {number} interval\n   *        Execute the specified function every `x` milliseconds.\n   *\n   * @return {number}\n   *         Returns an id that can be used to identify the interval. It can also be be used in\n   *         {@link Component#clearInterval} to clear the interval.\n   *\n   * @listens Component#dispose\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval}\n   */\n\n\n  Component.prototype.setInterval = function setInterval(fn, interval) {\n    var _this3 = this;\n\n    fn = bind(this, fn);\n\n    var intervalId = window_1.setInterval(fn, interval);\n\n    var disposeFn = function disposeFn() {\n      return _this3.clearInterval(intervalId);\n    };\n\n    disposeFn.guid = 'vjs-interval-' + intervalId;\n\n    this.on('dispose', disposeFn);\n\n    return intervalId;\n  };\n\n  /**\n   * Clears an interval that gets created via `window.setInterval` or\n   * {@link Component#setInterval}. If you set an inteval via {@link Component#setInterval}\n   * use this function instead of `window.clearInterval`. If you don't your dispose\n   * listener will not get cleaned up until {@link Component#dispose}!\n   *\n   * @param {number} intervalId\n   *        The id of the interval to clear. The return value of\n   *        {@link Component#setInterval} or `window.setInterval`.\n   *\n   * @return {number}\n   *         Returns the interval id that was cleared.\n   *\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/clearInterval}\n   */\n\n\n  Component.prototype.clearInterval = function clearInterval(intervalId) {\n    window_1.clearInterval(intervalId);\n\n    var disposeFn = function disposeFn() {};\n\n    disposeFn.guid = 'vjs-interval-' + intervalId;\n\n    this.off('dispose', disposeFn);\n\n    return intervalId;\n  };\n\n  /**\n   * Queues up a callback to be passed to requestAnimationFrame (rAF), but\n   * with a few extra bonuses:\n   *\n   * - Supports browsers that do not support rAF by falling back to\n   *   {@link Component#setTimeout}.\n   *\n   * - The callback is turned into a {@link Component~GenericCallback} (i.e.\n   *   bound to the component).\n   *\n   * - Automatic cancellation of the rAF callback is handled if the component\n   *   is disposed before it is called.\n   *\n   * @param  {Component~GenericCallback} fn\n   *         A function that will be bound to this component and executed just\n   *         before the browser's next repaint.\n   *\n   * @return {number}\n   *         Returns an rAF ID that gets used to identify the timeout. It can\n   *         also be used in {@link Component#cancelAnimationFrame} to cancel\n   *         the animation frame callback.\n   *\n   * @listens Component#dispose\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame}\n   */\n\n\n  Component.prototype.requestAnimationFrame = function requestAnimationFrame(fn) {\n    var _this4 = this;\n\n    if (this.supportsRaf_) {\n      fn = bind(this, fn);\n\n      var id = window_1.requestAnimationFrame(fn);\n      var disposeFn = function disposeFn() {\n        return _this4.cancelAnimationFrame(id);\n      };\n\n      disposeFn.guid = 'vjs-raf-' + id;\n      this.on('dispose', disposeFn);\n\n      return id;\n    }\n\n    // Fall back to using a timer.\n    return this.setTimeout(fn, 1000 / 60);\n  };\n\n  /**\n   * Cancels a queued callback passed to {@link Component#requestAnimationFrame}\n   * (rAF).\n   *\n   * If you queue an rAF callback via {@link Component#requestAnimationFrame},\n   * use this function instead of `window.cancelAnimationFrame`. If you don't,\n   * your dispose listener will not get cleaned up until {@link Component#dispose}!\n   *\n   * @param {number} id\n   *        The rAF ID to clear. The return value of {@link Component#requestAnimationFrame}.\n   *\n   * @return {number}\n   *         Returns the rAF ID that was cleared.\n   *\n   * @see [Similar to]{@link https://developer.mozilla.org/en-US/docs/Web/API/window/cancelAnimationFrame}\n   */\n\n\n  Component.prototype.cancelAnimationFrame = function cancelAnimationFrame(id) {\n    if (this.supportsRaf_) {\n      window_1.cancelAnimationFrame(id);\n\n      var disposeFn = function disposeFn() {};\n\n      disposeFn.guid = 'vjs-raf-' + id;\n\n      this.off('dispose', disposeFn);\n\n      return id;\n    }\n\n    // Fall back to using a timer.\n    return this.clearTimeout(id);\n  };\n\n  /**\n   * Register a `Component` with `videojs` given the name and the component.\n   *\n   * > NOTE: {@link Tech}s should not be registered as a `Component`. {@link Tech}s\n   *         should be registered using {@link Tech.registerTech} or\n   *         {@link videojs:videojs.registerTech}.\n   *\n   * > NOTE: This function can also be seen on videojs as\n   *         {@link videojs:videojs.registerComponent}.\n   *\n   * @param {string} name\n   *        The name of the `Component` to register.\n   *\n   * @param {Component} ComponentToRegister\n   *        The `Component` class to register.\n   *\n   * @return {Component}\n   *         The `Component` that was registered.\n   */\n\n\n  Component.registerComponent = function registerComponent(name, ComponentToRegister) {\n    if (typeof name !== 'string' || !name) {\n      throw new Error('Illegal component name, \"' + name + '\"; must be a non-empty string.');\n    }\n\n    var Tech = Component.getComponent('Tech');\n\n    // We need to make sure this check is only done if Tech has been registered.\n    var isTech = Tech && Tech.isTech(ComponentToRegister);\n    var isComp = Component === ComponentToRegister || Component.prototype.isPrototypeOf(ComponentToRegister.prototype);\n\n    if (isTech || !isComp) {\n      var reason = void 0;\n\n      if (isTech) {\n        reason = 'techs must be registered using Tech.registerTech()';\n      } else {\n        reason = 'must be a Component subclass';\n      }\n\n      throw new Error('Illegal component, \"' + name + '\"; ' + reason + '.');\n    }\n\n    name = toTitleCase(name);\n\n    if (!Component.components_) {\n      Component.components_ = {};\n    }\n\n    var Player = Component.getComponent('Player');\n\n    if (name === 'Player' && Player && Player.players) {\n      var players = Player.players;\n      var playerNames = Object.keys(players);\n\n      // If we have players that were disposed, then their name will still be\n      // in Players.players. So, we must loop through and verify that the value\n      // for each item is not null. This allows registration of the Player component\n      // after all players have been disposed or before any were created.\n      if (players && playerNames.length > 0 && playerNames.map(function (pname) {\n        return players[pname];\n      }).every(Boolean)) {\n        throw new Error('Can not register Player component after player has been created.');\n      }\n    }\n\n    Component.components_[name] = ComponentToRegister;\n\n    return ComponentToRegister;\n  };\n\n  /**\n   * Get a `Component` based on the name it was registered with.\n   *\n   * @param {string} name\n   *        The Name of the component to get.\n   *\n   * @return {Component}\n   *         The `Component` that got registered under the given name.\n   *\n   * @deprecated In `videojs` 6 this will not return `Component`s that were not\n   *             registered using {@link Component.registerComponent}. Currently we\n   *             check the global `videojs` object for a `Component` name and\n   *             return that if it exists.\n   */\n\n\n  Component.getComponent = function getComponent(name) {\n    if (!name) {\n      return;\n    }\n\n    name = toTitleCase(name);\n\n    if (Component.components_ && Component.components_[name]) {\n      return Component.components_[name];\n    }\n  };\n\n  return Component;\n}();\n\n/**\n * Whether or not this component supports `requestAnimationFrame`.\n *\n * This is exposed primarily for testing purposes.\n *\n * @private\n * @type {Boolean}\n */\n\n\nComponent.prototype.supportsRaf_ = typeof window_1.requestAnimationFrame === 'function' && typeof window_1.cancelAnimationFrame === 'function';\n\nComponent.registerComponent('Component', Component);\n\n/**\n * @file time-ranges.js\n * @module time-ranges\n */\n\n/**\n * Returns the time for the specified index at the start or end\n * of a TimeRange object.\n *\n * @function time-ranges:indexFunction\n *\n * @param {number} [index=0]\n *        The range number to return the time for.\n *\n * @return {number}\n *         The time that offset at the specified index.\n *\n * @depricated index must be set to a value, in the future this will throw an error.\n */\n\n/**\n * An object that contains ranges of time for various reasons.\n *\n * @typedef {Object} TimeRange\n *\n * @property {number} length\n *           The number of time ranges represented by this Object\n *\n * @property {time-ranges:indexFunction} start\n *           Returns the time offset at which a specified time range begins.\n *\n * @property {time-ranges:indexFunction} end\n *           Returns the time offset at which a specified time range begins.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges\n */\n\n/**\n * Check if any of the time ranges are over the maximum index.\n *\n * @param {string} fnName\n *        The function name to use for logging\n *\n * @param {number} index\n *        The index to check\n *\n * @param {number} maxIndex\n *        The maximum possible index\n *\n * @throws {Error} if the timeRanges provided are over the maxIndex\n */\nfunction rangeCheck(fnName, index, maxIndex) {\n  if (typeof index !== 'number' || index < 0 || index > maxIndex) {\n    throw new Error('Failed to execute \\'' + fnName + '\\' on \\'TimeRanges\\': The index provided (' + index + ') is non-numeric or out of bounds (0-' + maxIndex + ').');\n  }\n}\n\n/**\n * Check if any of the time ranges are over the maximum index.\n *\n * @param {string} fnName\n *        The function name to use for logging\n *\n * @param {string} valueIndex\n *        The proprety that should be used to get the time. should be 'start' or 'end'\n *\n * @param {Array} ranges\n *        An array of time ranges\n *\n * @param {Array} [rangeIndex=0]\n *        The index to start the search at\n *\n * @return {number}\n *         The time that offset at the specified index.\n *\n *\n * @depricated rangeIndex must be set to a value, in the future this will throw an error.\n * @throws {Error} if rangeIndex is more than the length of ranges\n */\nfunction getRange(fnName, valueIndex, ranges, rangeIndex) {\n  rangeCheck(fnName, rangeIndex, ranges.length - 1);\n  return ranges[rangeIndex][valueIndex];\n}\n\n/**\n * Create a time range object givent ranges of time.\n *\n * @param {Array} [ranges]\n *        An array of time ranges.\n */\nfunction createTimeRangesObj(ranges) {\n  if (ranges === undefined || ranges.length === 0) {\n    return {\n      length: 0,\n      start: function start() {\n        throw new Error('This TimeRanges object is empty');\n      },\n      end: function end() {\n        throw new Error('This TimeRanges object is empty');\n      }\n    };\n  }\n  return {\n    length: ranges.length,\n    start: getRange.bind(null, 'start', 0, ranges),\n    end: getRange.bind(null, 'end', 1, ranges)\n  };\n}\n\n/**\n * Should create a fake `TimeRange` object which mimics an HTML5 time range instance.\n *\n * @param {number|Array} start\n *        The start of a single range or an array of ranges\n *\n * @param {number} end\n *        The end of a single range.\n *\n * @private\n */\nfunction createTimeRanges(start, end) {\n  if (Array.isArray(start)) {\n    return createTimeRangesObj(start);\n  } else if (start === undefined || end === undefined) {\n    return createTimeRangesObj();\n  }\n  return createTimeRangesObj([[start, end]]);\n}\n\n/**\n * @file buffer.js\n * @module buffer\n */\n/**\n * Compute the percentage of the media that has been buffered.\n *\n * @param {TimeRange} buffered\n *        The current `TimeRange` object representing buffered time ranges\n *\n * @param {number} duration\n *        Total duration of the media\n *\n * @return {number}\n *         Percent buffered of the total duration in decimal form.\n */\nfunction bufferedPercent(buffered, duration) {\n  var bufferedDuration = 0;\n  var start = void 0;\n  var end = void 0;\n\n  if (!duration) {\n    return 0;\n  }\n\n  if (!buffered || !buffered.length) {\n    buffered = createTimeRanges(0, 0);\n  }\n\n  for (var i = 0; i < buffered.length; i++) {\n    start = buffered.start(i);\n    end = buffered.end(i);\n\n    // buffered end can be bigger than duration by a very small fraction\n    if (end > duration) {\n      end = duration;\n    }\n\n    bufferedDuration += end - start;\n  }\n\n  return bufferedDuration / duration;\n}\n\n/**\n * @file fullscreen-api.js\n * @module fullscreen-api\n * @private\n */\n/**\n * Store the browser-specific methods for the fullscreen API.\n *\n * @type {Object}\n * @see [Specification]{@link https://fullscreen.spec.whatwg.org}\n * @see [Map Approach From Screenfull.js]{@link https://github.com/sindresorhus/screenfull.js}\n */\nvar FullscreenApi = {};\n\n// browser API methods\nvar apiMap = [['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],\n// WebKit\n['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],\n// Old WebKit (Safari 5.1)\n['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],\n// Mozilla\n['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],\n// Microsoft\n['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];\n\nvar specApi = apiMap[0];\nvar browserApi = void 0;\n\n// determine the supported set of functions\nfor (var i = 0; i < apiMap.length; i++) {\n  // check for exitFullscreen function\n  if (apiMap[i][1] in document_1) {\n    browserApi = apiMap[i];\n    break;\n  }\n}\n\n// map the browser API names to the spec API names\nif (browserApi) {\n  for (var _i = 0; _i < browserApi.length; _i++) {\n    FullscreenApi[specApi[_i]] = browserApi[_i];\n  }\n}\n\n/**\n * @file media-error.js\n */\n/**\n * A Custom `MediaError` class which mimics the standard HTML5 `MediaError` class.\n *\n * @param {number|string|Object|MediaError} value\n *        This can be of multiple types:\n *        - number: should be a standard error code\n *        - string: an error message (the code will be 0)\n *        - Object: arbitrary properties\n *        - `MediaError` (native): used to populate a video.js `MediaError` object\n *        - `MediaError` (video.js): will return itself if it's already a\n *          video.js `MediaError` object.\n *\n * @see [MediaError Spec]{@link https://dev.w3.org/html5/spec-author-view/video.html#mediaerror}\n * @see [Encrypted MediaError Spec]{@link https://www.w3.org/TR/2013/WD-encrypted-media-20130510/#error-codes}\n *\n * @class MediaError\n */\nfunction MediaError(value) {\n\n  // Allow redundant calls to this constructor to avoid having `instanceof`\n  // checks peppered around the code.\n  if (value instanceof MediaError) {\n    return value;\n  }\n\n  if (typeof value === 'number') {\n    this.code = value;\n  } else if (typeof value === 'string') {\n    // default code is zero, so this is a custom error\n    this.message = value;\n  } else if (isObject(value)) {\n\n    // We assign the `code` property manually because native `MediaError` objects\n    // do not expose it as an own/enumerable property of the object.\n    if (typeof value.code === 'number') {\n      this.code = value.code;\n    }\n\n    assign(this, value);\n  }\n\n  if (!this.message) {\n    this.message = MediaError.defaultMessages[this.code] || '';\n  }\n}\n\n/**\n * The error code that refers two one of the defined `MediaError` types\n *\n * @type {Number}\n */\nMediaError.prototype.code = 0;\n\n/**\n * An optional message that to show with the error. Message is not part of the HTML5\n * video spec but allows for more informative custom errors.\n *\n * @type {String}\n */\nMediaError.prototype.message = '';\n\n/**\n * An optional status code that can be set by plugins to allow even more detail about\n * the error. For example a plugin might provide a specific HTTP status code and an\n * error message for that code. Then when the plugin gets that error this class will\n * know how to display an error message for it. This allows a custom message to show\n * up on the `Player` error overlay.\n *\n * @type {Array}\n */\nMediaError.prototype.status = null;\n\n/**\n * Errors indexed by the W3C standard. The order **CANNOT CHANGE**! See the\n * specification listed under {@link MediaError} for more information.\n *\n * @enum {array}\n * @readonly\n * @property {string} 0 - MEDIA_ERR_CUSTOM\n * @property {string} 1 - MEDIA_ERR_CUSTOM\n * @property {string} 2 - MEDIA_ERR_ABORTED\n * @property {string} 3 - MEDIA_ERR_NETWORK\n * @property {string} 4 - MEDIA_ERR_SRC_NOT_SUPPORTED\n * @property {string} 5 - MEDIA_ERR_ENCRYPTED\n */\nMediaError.errorTypes = ['MEDIA_ERR_CUSTOM', 'MEDIA_ERR_ABORTED', 'MEDIA_ERR_NETWORK', 'MEDIA_ERR_DECODE', 'MEDIA_ERR_SRC_NOT_SUPPORTED', 'MEDIA_ERR_ENCRYPTED'];\n\n/**\n * The default `MediaError` messages based on the {@link MediaError.errorTypes}.\n *\n * @type {Array}\n * @constant\n */\nMediaError.defaultMessages = {\n  1: 'You aborted the media playback',\n  2: 'A network error caused the media download to fail part-way.',\n  3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',\n  4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',\n  5: 'The media is encrypted and we do not have the keys to decrypt it.'\n};\n\n// Add types as properties on MediaError\n// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;\nfor (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {\n  MediaError[MediaError.errorTypes[errNum]] = errNum;\n  // values should be accessible on both the class and instance\n  MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;\n}\n\nvar tuple = SafeParseTuple;\n\nfunction SafeParseTuple(obj, reviver) {\n    var json;\n    var error = null;\n\n    try {\n        json = JSON.parse(obj, reviver);\n    } catch (err) {\n        error = err;\n    }\n\n    return [error, json]\n}\n\n/**\n * Returns whether an object is `Promise`-like (i.e. has a `then` method).\n *\n * @param  {Object}  value\n *         An object that may or may not be `Promise`-like.\n *\n * @return {Boolean}\n *         Whether or not the object is `Promise`-like.\n */\nfunction isPromise(value) {\n  return value !== undefined && typeof value.then === 'function';\n}\n\n/**\n * Silence a Promise-like object.\n *\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n *\n * @param  {Object} value\n *         An object that may or may not be `Promise`-like.\n */\nfunction silencePromise(value) {\n  if (isPromise(value)) {\n    value.then(null, function (e) {});\n  }\n}\n\n/**\n * @file text-track-list-converter.js Utilities for capturing text track state and\n * re-creating tracks based on a capture.\n *\n * @module text-track-list-converter\n */\n\n/**\n * Examine a single {@link TextTrack} and return a JSON-compatible javascript object that\n * represents the {@link TextTrack}'s state.\n *\n * @param {TextTrack} track\n *        The text track to query.\n *\n * @return {Object}\n *         A serializable javascript representation of the TextTrack.\n * @private\n */\nvar trackToJson_ = function trackToJson_(track) {\n  var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) {\n\n    if (track[prop]) {\n      acc[prop] = track[prop];\n    }\n\n    return acc;\n  }, {\n    cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {\n      return {\n        startTime: cue.startTime,\n        endTime: cue.endTime,\n        text: cue.text,\n        id: cue.id\n      };\n    })\n  });\n\n  return ret;\n};\n\n/**\n * Examine a {@link Tech} and return a JSON-compatible javascript array that represents the\n * state of all {@link TextTrack}s currently configured. The return array is compatible with\n * {@link text-track-list-converter:jsonToTextTracks}.\n *\n * @param {Tech} tech\n *        The tech object to query\n *\n * @return {Array}\n *         A serializable javascript representation of the {@link Tech}s\n *         {@link TextTrackList}.\n */\nvar textTracksToJson = function textTracksToJson(tech) {\n\n  var trackEls = tech.$$('track');\n\n  var trackObjs = Array.prototype.map.call(trackEls, function (t) {\n    return t.track;\n  });\n  var tracks = Array.prototype.map.call(trackEls, function (trackEl) {\n    var json = trackToJson_(trackEl.track);\n\n    if (trackEl.src) {\n      json.src = trackEl.src;\n    }\n    return json;\n  });\n\n  return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {\n    return trackObjs.indexOf(track) === -1;\n  }).map(trackToJson_));\n};\n\n/**\n * Create a set of remote {@link TextTrack}s on a {@link Tech} based on an array of javascript\n * object {@link TextTrack} representations.\n *\n * @param {Array} json\n *        An array of `TextTrack` representation objects, like those that would be\n *        produced by `textTracksToJson`.\n *\n * @param {Tech} tech\n *        The `Tech` to create the `TextTrack`s on.\n */\nvar jsonToTextTracks = function jsonToTextTracks(json, tech) {\n  json.forEach(function (track) {\n    var addedTrack = tech.addRemoteTextTrack(track).track;\n\n    if (!track.src && track.cues) {\n      track.cues.forEach(function (cue) {\n        return addedTrack.addCue(cue);\n      });\n    }\n  });\n\n  return tech.textTracks();\n};\n\nvar textTrackConverter = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };\n\n/**\n * @file modal-dialog.js\n */\nvar MODAL_CLASS_NAME = 'vjs-modal-dialog';\nvar ESC = 27;\n\n/**\n * The `ModalDialog` displays over the video and its controls, which blocks\n * interaction with the player until it is closed.\n *\n * Modal dialogs include a \"Close\" button and will close when that button\n * is activated - or when ESC is pressed anywhere.\n *\n * @extends Component\n */\n\nvar ModalDialog = function (_Component) {\n  inherits(ModalDialog, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Mixed} [options.content=undefined]\n   *        Provide customized content for this modal.\n   *\n   * @param {string} [options.description]\n   *        A text description for the modal, primarily for accessibility.\n   *\n   * @param {boolean} [options.fillAlways=false]\n   *        Normally, modals are automatically filled only the first time\n   *        they open. This tells the modal to refresh its content\n   *        every time it opens.\n   *\n   * @param {string} [options.label]\n   *        A text label for the modal, primarily for accessibility.\n   *\n   * @param {boolean} [options.temporary=true]\n   *        If `true`, the modal can only be opened once; it will be\n   *        disposed as soon as it's closed.\n   *\n   * @param {boolean} [options.uncloseable=false]\n   *        If `true`, the user will not be able to close the modal\n   *        through the UI in the normal ways. Programmatic closing is\n   *        still possible.\n   */\n  function ModalDialog(player, options) {\n    classCallCheck(this, ModalDialog);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.opened_ = _this.hasBeenOpened_ = _this.hasBeenFilled_ = false;\n\n    _this.closeable(!_this.options_.uncloseable);\n    _this.content(_this.options_.content);\n\n    // Make sure the contentEl is defined AFTER any children are initialized\n    // because we only want the contents of the modal in the contentEl\n    // (not the UI elements like the close button).\n    _this.contentEl_ = createEl('div', {\n      className: MODAL_CLASS_NAME + '-content'\n    }, {\n      role: 'document'\n    });\n\n    _this.descEl_ = createEl('p', {\n      className: MODAL_CLASS_NAME + '-description vjs-control-text',\n      id: _this.el().getAttribute('aria-describedby')\n    });\n\n    textContent(_this.descEl_, _this.description());\n    _this.el_.appendChild(_this.descEl_);\n    _this.el_.appendChild(_this.contentEl_);\n    return _this;\n  }\n\n  /**\n   * Create the `ModalDialog`'s DOM element\n   *\n   * @return {Element}\n   *         The DOM element that gets created.\n   */\n\n\n  ModalDialog.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: this.buildCSSClass(),\n      tabIndex: -1\n    }, {\n      'aria-describedby': this.id() + '_description',\n      'aria-hidden': 'true',\n      'aria-label': this.label(),\n      'role': 'dialog'\n    });\n  };\n\n  ModalDialog.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n    this.descEl_ = null;\n    this.previouslyActiveEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  ModalDialog.prototype.buildCSSClass = function buildCSSClass() {\n    return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Handles `keydown` events on the document, looking for ESC, which closes\n   * the modal.\n   *\n   * @param {EventTarget~Event} e\n   *        The keypress that triggered this event.\n   *\n   * @listens keydown\n   */\n\n\n  ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) {\n    if (e.which === ESC && this.closeable()) {\n      this.close();\n    }\n  };\n\n  /**\n   * Returns the label string for this modal. Primarily used for accessibility.\n   *\n   * @return {string}\n   *         the localized or raw label of this modal.\n   */\n\n\n  ModalDialog.prototype.label = function label() {\n    return this.localize(this.options_.label || 'Modal Window');\n  };\n\n  /**\n   * Returns the description string for this modal. Primarily used for\n   * accessibility.\n   *\n   * @return {string}\n   *         The localized or raw description of this modal.\n   */\n\n\n  ModalDialog.prototype.description = function description() {\n    var desc = this.options_.description || this.localize('This is a modal window.');\n\n    // Append a universal closeability message if the modal is closeable.\n    if (this.closeable()) {\n      desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.');\n    }\n\n    return desc;\n  };\n\n  /**\n   * Opens the modal.\n   *\n   * @fires ModalDialog#beforemodalopen\n   * @fires ModalDialog#modalopen\n   */\n\n\n  ModalDialog.prototype.open = function open() {\n    if (!this.opened_) {\n      var player = this.player();\n\n      /**\n        * Fired just before a `ModalDialog` is opened.\n        *\n        * @event ModalDialog#beforemodalopen\n        * @type {EventTarget~Event}\n        */\n      this.trigger('beforemodalopen');\n      this.opened_ = true;\n\n      // Fill content if the modal has never opened before and\n      // never been filled.\n      if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) {\n        this.fill();\n      }\n\n      // If the player was playing, pause it and take note of its previously\n      // playing state.\n      this.wasPlaying_ = !player.paused();\n\n      if (this.options_.pauseOnOpen && this.wasPlaying_) {\n        player.pause();\n      }\n\n      if (this.closeable()) {\n        this.on(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress));\n      }\n\n      // Hide controls and note if they were enabled.\n      this.hadControls_ = player.controls();\n      player.controls(false);\n\n      this.show();\n      this.conditionalFocus_();\n      this.el().setAttribute('aria-hidden', 'false');\n\n      /**\n        * Fired just after a `ModalDialog` is opened.\n        *\n        * @event ModalDialog#modalopen\n        * @type {EventTarget~Event}\n        */\n      this.trigger('modalopen');\n      this.hasBeenOpened_ = true;\n    }\n  };\n\n  /**\n   * If the `ModalDialog` is currently open or closed.\n   *\n   * @param  {boolean} [value]\n   *         If given, it will open (`true`) or close (`false`) the modal.\n   *\n   * @return {boolean}\n   *         the current open state of the modaldialog\n   */\n\n\n  ModalDialog.prototype.opened = function opened(value) {\n    if (typeof value === 'boolean') {\n      this[value ? 'open' : 'close']();\n    }\n    return this.opened_;\n  };\n\n  /**\n   * Closes the modal, does nothing if the `ModalDialog` is\n   * not open.\n   *\n   * @fires ModalDialog#beforemodalclose\n   * @fires ModalDialog#modalclose\n   */\n\n\n  ModalDialog.prototype.close = function close() {\n    if (!this.opened_) {\n      return;\n    }\n    var player = this.player();\n\n    /**\n      * Fired just before a `ModalDialog` is closed.\n      *\n      * @event ModalDialog#beforemodalclose\n      * @type {EventTarget~Event}\n      */\n    this.trigger('beforemodalclose');\n    this.opened_ = false;\n\n    if (this.wasPlaying_ && this.options_.pauseOnOpen) {\n      player.play();\n    }\n\n    if (this.closeable()) {\n      this.off(this.el_.ownerDocument, 'keydown', bind(this, this.handleKeyPress));\n    }\n\n    if (this.hadControls_) {\n      player.controls(true);\n    }\n\n    this.hide();\n    this.el().setAttribute('aria-hidden', 'true');\n\n    /**\n      * Fired just after a `ModalDialog` is closed.\n      *\n      * @event ModalDialog#modalclose\n      * @type {EventTarget~Event}\n      */\n    this.trigger('modalclose');\n    this.conditionalBlur_();\n\n    if (this.options_.temporary) {\n      this.dispose();\n    }\n  };\n\n  /**\n   * Check to see if the `ModalDialog` is closeable via the UI.\n   *\n   * @param  {boolean} [value]\n   *         If given as a boolean, it will set the `closeable` option.\n   *\n   * @return {boolean}\n   *         Returns the final value of the closable option.\n   */\n\n\n  ModalDialog.prototype.closeable = function closeable(value) {\n    if (typeof value === 'boolean') {\n      var closeable = this.closeable_ = !!value;\n      var close = this.getChild('closeButton');\n\n      // If this is being made closeable and has no close button, add one.\n      if (closeable && !close) {\n\n        // The close button should be a child of the modal - not its\n        // content element, so temporarily change the content element.\n        var temp = this.contentEl_;\n\n        this.contentEl_ = this.el_;\n        close = this.addChild('closeButton', { controlText: 'Close Modal Dialog' });\n        this.contentEl_ = temp;\n        this.on(close, 'close', this.close);\n      }\n\n      // If this is being made uncloseable and has a close button, remove it.\n      if (!closeable && close) {\n        this.off(close, 'close', this.close);\n        this.removeChild(close);\n        close.dispose();\n      }\n    }\n    return this.closeable_;\n  };\n\n  /**\n   * Fill the modal's content element with the modal's \"content\" option.\n   * The content element will be emptied before this change takes place.\n   */\n\n\n  ModalDialog.prototype.fill = function fill() {\n    this.fillWith(this.content());\n  };\n\n  /**\n   * Fill the modal's content element with arbitrary content.\n   * The content element will be emptied before this change takes place.\n   *\n   * @fires ModalDialog#beforemodalfill\n   * @fires ModalDialog#modalfill\n   *\n   * @param {Mixed} [content]\n   *        The same rules apply to this as apply to the `content` option.\n   */\n\n\n  ModalDialog.prototype.fillWith = function fillWith(content) {\n    var contentEl = this.contentEl();\n    var parentEl = contentEl.parentNode;\n    var nextSiblingEl = contentEl.nextSibling;\n\n    /**\n     * Fired just before a `ModalDialog` is filled with content.\n     *\n     * @event ModalDialog#beforemodalfill\n     * @type {EventTarget~Event}\n     */\n    this.trigger('beforemodalfill');\n    this.hasBeenFilled_ = true;\n\n    // Detach the content element from the DOM before performing\n    // manipulation to avoid modifying the live DOM multiple times.\n    parentEl.removeChild(contentEl);\n    this.empty();\n    insertContent(contentEl, content);\n    /**\n     * Fired just after a `ModalDialog` is filled with content.\n     *\n     * @event ModalDialog#modalfill\n     * @type {EventTarget~Event}\n     */\n    this.trigger('modalfill');\n\n    // Re-inject the re-filled content element.\n    if (nextSiblingEl) {\n      parentEl.insertBefore(contentEl, nextSiblingEl);\n    } else {\n      parentEl.appendChild(contentEl);\n    }\n\n    // make sure that the close button is last in the dialog DOM\n    var closeButton = this.getChild('closeButton');\n\n    if (closeButton) {\n      parentEl.appendChild(closeButton.el_);\n    }\n  };\n\n  /**\n   * Empties the content element. This happens anytime the modal is filled.\n   *\n   * @fires ModalDialog#beforemodalempty\n   * @fires ModalDialog#modalempty\n   */\n\n\n  ModalDialog.prototype.empty = function empty() {\n    /**\n     * Fired just before a `ModalDialog` is emptied.\n     *\n     * @event ModalDialog#beforemodalempty\n     * @type {EventTarget~Event}\n     */\n    this.trigger('beforemodalempty');\n    emptyEl(this.contentEl());\n\n    /**\n     * Fired just after a `ModalDialog` is emptied.\n     *\n     * @event ModalDialog#modalempty\n     * @type {EventTarget~Event}\n     */\n    this.trigger('modalempty');\n  };\n\n  /**\n   * Gets or sets the modal content, which gets normalized before being\n   * rendered into the DOM.\n   *\n   * This does not update the DOM or fill the modal, but it is called during\n   * that process.\n   *\n   * @param  {Mixed} [value]\n   *         If defined, sets the internal content value to be used on the\n   *         next call(s) to `fill`. This value is normalized before being\n   *         inserted. To \"clear\" the internal content value, pass `null`.\n   *\n   * @return {Mixed}\n   *         The current content of the modal dialog\n   */\n\n\n  ModalDialog.prototype.content = function content(value) {\n    if (typeof value !== 'undefined') {\n      this.content_ = value;\n    }\n    return this.content_;\n  };\n\n  /**\n   * conditionally focus the modal dialog if focus was previously on the player.\n   *\n   * @private\n   */\n\n\n  ModalDialog.prototype.conditionalFocus_ = function conditionalFocus_() {\n    var activeEl = document_1.activeElement;\n    var playerEl = this.player_.el_;\n\n    this.previouslyActiveEl_ = null;\n\n    if (playerEl.contains(activeEl) || playerEl === activeEl) {\n      this.previouslyActiveEl_ = activeEl;\n\n      this.focus();\n\n      this.on(document_1, 'keydown', this.handleKeyDown);\n    }\n  };\n\n  /**\n   * conditionally blur the element and refocus the last focused element\n   *\n   * @private\n   */\n\n\n  ModalDialog.prototype.conditionalBlur_ = function conditionalBlur_() {\n    if (this.previouslyActiveEl_) {\n      this.previouslyActiveEl_.focus();\n      this.previouslyActiveEl_ = null;\n    }\n\n    this.off(document_1, 'keydown', this.handleKeyDown);\n  };\n\n  /**\n   * Keydown handler. Attached when modal is focused.\n   *\n   * @listens keydown\n   */\n\n\n  ModalDialog.prototype.handleKeyDown = function handleKeyDown(event) {\n    // exit early if it isn't a tab key\n    if (event.which !== 9) {\n      return;\n    }\n\n    var focusableEls = this.focusableEls_();\n    var activeEl = this.el_.querySelector(':focus');\n    var focusIndex = void 0;\n\n    for (var i = 0; i < focusableEls.length; i++) {\n      if (activeEl === focusableEls[i]) {\n        focusIndex = i;\n        break;\n      }\n    }\n\n    if (document_1.activeElement === this.el_) {\n      focusIndex = 0;\n    }\n\n    if (event.shiftKey && focusIndex === 0) {\n      focusableEls[focusableEls.length - 1].focus();\n      event.preventDefault();\n    } else if (!event.shiftKey && focusIndex === focusableEls.length - 1) {\n      focusableEls[0].focus();\n      event.preventDefault();\n    }\n  };\n\n  /**\n   * get all focusable elements\n   *\n   * @private\n   */\n\n\n  ModalDialog.prototype.focusableEls_ = function focusableEls_() {\n    var allChildren = this.el_.querySelectorAll('*');\n\n    return Array.prototype.filter.call(allChildren, function (child) {\n      return (child instanceof window_1.HTMLAnchorElement || child instanceof window_1.HTMLAreaElement) && child.hasAttribute('href') || (child instanceof window_1.HTMLInputElement || child instanceof window_1.HTMLSelectElement || child instanceof window_1.HTMLTextAreaElement || child instanceof window_1.HTMLButtonElement) && !child.hasAttribute('disabled') || child instanceof window_1.HTMLIFrameElement || child instanceof window_1.HTMLObjectElement || child instanceof window_1.HTMLEmbedElement || child.hasAttribute('tabindex') && child.getAttribute('tabindex') !== -1 || child.hasAttribute('contenteditable');\n    });\n  };\n\n  return ModalDialog;\n}(Component);\n\n/**\n * Default options for `ModalDialog` default options.\n *\n * @type {Object}\n * @private\n */\n\n\nModalDialog.prototype.options_ = {\n  pauseOnOpen: true,\n  temporary: true\n};\n\nComponent.registerComponent('ModalDialog', ModalDialog);\n\n/**\n * @file track-list.js\n */\n/**\n * Common functionaliy between {@link TextTrackList}, {@link AudioTrackList}, and\n * {@link VideoTrackList}\n *\n * @extends EventTarget\n */\n\nvar TrackList = function (_EventTarget) {\n  inherits(TrackList, _EventTarget);\n\n  /**\n   * Create an instance of this class\n   *\n   * @param {Track[]} tracks\n   *        A list of tracks to initialize the list with.\n   *\n   * @param {Object} [list]\n   *        The child object with inheritance done manually for ie8.\n   *\n   * @abstract\n   */\n  function TrackList() {\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    var _ret;\n\n    var list = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n    classCallCheck(this, TrackList);\n\n    var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n    if (!list) {\n      list = _this; // eslint-disable-line\n      if (IS_IE8) {\n        list = document_1.createElement('custom');\n        for (var prop in TrackList.prototype) {\n          if (prop !== 'constructor') {\n            list[prop] = TrackList.prototype[prop];\n          }\n        }\n      }\n    }\n\n    list.tracks_ = [];\n\n    /**\n     * @memberof TrackList\n     * @member {number} length\n     *         The current number of `Track`s in the this Trackist.\n     * @instance\n     */\n    Object.defineProperty(list, 'length', {\n      get: function get$$1() {\n        return this.tracks_.length;\n      }\n    });\n\n    for (var i = 0; i < tracks.length; i++) {\n      list.addTrack(tracks[i]);\n    }\n\n    // must return the object, as for ie8 it will not be this\n    // but a reference to a document object\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a {@link Track} to the `TrackList`\n   *\n   * @param {Track} track\n   *        The audio, video, or text track to add to the list.\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  TrackList.prototype.addTrack = function addTrack(track) {\n    var index = this.tracks_.length;\n\n    if (!('' + index in this)) {\n      Object.defineProperty(this, index, {\n        get: function get$$1() {\n          return this.tracks_[index];\n        }\n      });\n    }\n\n    // Do not add duplicate tracks\n    if (this.tracks_.indexOf(track) === -1) {\n      this.tracks_.push(track);\n      /**\n       * Triggered when a track is added to a track list.\n       *\n       * @event TrackList#addtrack\n       * @type {EventTarget~Event}\n       * @property {Track} track\n       *           A reference to track that was added.\n       */\n      this.trigger({\n        track: track,\n        type: 'addtrack'\n      });\n    }\n  };\n\n  /**\n   * Remove a {@link Track} from the `TrackList`\n   *\n   * @param {Track} rtrack\n   *        The audio, video, or text track to remove from the list.\n   *\n   * @fires TrackList#removetrack\n   */\n\n\n  TrackList.prototype.removeTrack = function removeTrack(rtrack) {\n    var track = void 0;\n\n    for (var i = 0, l = this.length; i < l; i++) {\n      if (this[i] === rtrack) {\n        track = this[i];\n        if (track.off) {\n          track.off();\n        }\n\n        this.tracks_.splice(i, 1);\n\n        break;\n      }\n    }\n\n    if (!track) {\n      return;\n    }\n\n    /**\n     * Triggered when a track is removed from track list.\n     *\n     * @event TrackList#removetrack\n     * @type {EventTarget~Event}\n     * @property {Track} track\n     *           A reference to track that was removed.\n     */\n    this.trigger({\n      track: track,\n      type: 'removetrack'\n    });\n  };\n\n  /**\n   * Get a Track from the TrackList by a tracks id\n   *\n   * @param {String} id - the id of the track to get\n   * @method getTrackById\n   * @return {Track}\n   * @private\n   */\n\n\n  TrackList.prototype.getTrackById = function getTrackById(id) {\n    var result = null;\n\n    for (var i = 0, l = this.length; i < l; i++) {\n      var track = this[i];\n\n      if (track.id === id) {\n        result = track;\n        break;\n      }\n    }\n\n    return result;\n  };\n\n  return TrackList;\n}(EventTarget);\n\n/**\n * Triggered when a different track is selected/enabled.\n *\n * @event TrackList#change\n * @type {EventTarget~Event}\n */\n\n/**\n * Events that can be called with on + eventName. See {@link EventHandler}.\n *\n * @property {Object} TrackList#allowedEvents_\n * @private\n */\n\n\nTrackList.prototype.allowedEvents_ = {\n  change: 'change',\n  addtrack: 'addtrack',\n  removetrack: 'removetrack'\n};\n\n// emulate attribute EventHandler support to allow for feature detection\nfor (var event in TrackList.prototype.allowedEvents_) {\n  TrackList.prototype['on' + event] = null;\n}\n\n/**\n * @file audio-track-list.js\n */\n/**\n * Anywhere we call this function we diverge from the spec\n * as we only support one enabled audiotrack at a time\n *\n * @param {AudioTrackList} list\n *        list to work on\n *\n * @param {AudioTrack} track\n *        The track to skip\n *\n * @private\n */\nvar disableOthers = function disableOthers(list, track) {\n  for (var i = 0; i < list.length; i++) {\n    if (!Object.keys(list[i]).length || track.id === list[i].id) {\n      continue;\n    }\n    // another audio track is enabled, disable it\n    list[i].enabled = false;\n  }\n};\n\n/**\n * The current list of {@link AudioTrack} for a media file.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist}\n * @extends TrackList\n */\n\nvar AudioTrackList = function (_TrackList) {\n  inherits(AudioTrackList, _TrackList);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {AudioTrack[]} [tracks=[]]\n   *        A list of `AudioTrack` to instantiate the list with.\n   */\n  function AudioTrackList() {\n    var _this, _ret;\n\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, AudioTrackList);\n\n    var list = void 0;\n\n    // make sure only 1 track is enabled\n    // sorted from last index to first index\n    for (var i = tracks.length - 1; i >= 0; i--) {\n      if (tracks[i].enabled) {\n        disableOthers(tracks, tracks[i]);\n        break;\n      }\n    }\n\n    // IE8 forces us to implement inheritance ourselves\n    // as it does not support Object.defineProperty properly\n    if (IS_IE8) {\n      list = document_1.createElement('custom');\n      for (var prop in TrackList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TrackList.prototype[prop];\n        }\n      }\n      for (var _prop in AudioTrackList.prototype) {\n        if (_prop !== 'constructor') {\n          list[_prop] = AudioTrackList.prototype[_prop];\n        }\n      }\n    }\n\n    list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n    list.changing_ = false;\n\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add an {@link AudioTrack} to the `AudioTrackList`.\n   *\n   * @param {AudioTrack} track\n   *        The AudioTrack to add to the list\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  AudioTrackList.prototype.addTrack = function addTrack(track) {\n    var _this2 = this;\n\n    if (track.enabled) {\n      disableOthers(this, track);\n    }\n\n    _TrackList.prototype.addTrack.call(this, track);\n    // native tracks don't have this\n    if (!track.addEventListener) {\n      return;\n    }\n\n    /**\n     * @listens AudioTrack#enabledchange\n     * @fires TrackList#change\n     */\n    track.addEventListener('enabledchange', function () {\n      // when we are disabling other tracks (since we don't support\n      // more than one track at a time) we will set changing_\n      // to true so that we don't trigger additional change events\n      if (_this2.changing_) {\n        return;\n      }\n      _this2.changing_ = true;\n      disableOthers(_this2, track);\n      _this2.changing_ = false;\n      _this2.trigger('change');\n    });\n  };\n\n  return AudioTrackList;\n}(TrackList);\n\n/**\n * @file video-track-list.js\n */\n/**\n * Un-select all other {@link VideoTrack}s that are selected.\n *\n * @param {VideoTrackList} list\n *        list to work on\n *\n * @param {VideoTrack} track\n *        The track to skip\n *\n * @private\n */\nvar disableOthers$1 = function disableOthers(list, track) {\n  for (var i = 0; i < list.length; i++) {\n    if (!Object.keys(list[i]).length || track.id === list[i].id) {\n      continue;\n    }\n    // another video track is enabled, disable it\n    list[i].selected = false;\n  }\n};\n\n/**\n * The current list of {@link VideoTrack} for a video.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist}\n * @extends TrackList\n */\n\nvar VideoTrackList = function (_TrackList) {\n  inherits(VideoTrackList, _TrackList);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {VideoTrack[]} [tracks=[]]\n   *        A list of `VideoTrack` to instantiate the list with.\n   */\n  function VideoTrackList() {\n    var _this, _ret;\n\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, VideoTrackList);\n\n    var list = void 0;\n\n    // make sure only 1 track is enabled\n    // sorted from last index to first index\n    for (var i = tracks.length - 1; i >= 0; i--) {\n      if (tracks[i].selected) {\n        disableOthers$1(tracks, tracks[i]);\n        break;\n      }\n    }\n\n    // IE8 forces us to implement inheritance ourselves\n    // as it does not support Object.defineProperty properly\n    if (IS_IE8) {\n      list = document_1.createElement('custom');\n      for (var prop in TrackList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TrackList.prototype[prop];\n        }\n      }\n      for (var _prop in VideoTrackList.prototype) {\n        if (_prop !== 'constructor') {\n          list[_prop] = VideoTrackList.prototype[_prop];\n        }\n      }\n    }\n\n    list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n    list.changing_ = false;\n\n    /**\n     * @member {number} VideoTrackList#selectedIndex\n     *         The current index of the selected {@link VideoTrack`}.\n     */\n    Object.defineProperty(list, 'selectedIndex', {\n      get: function get$$1() {\n        for (var _i = 0; _i < this.length; _i++) {\n          if (this[_i].selected) {\n            return _i;\n          }\n        }\n        return -1;\n      },\n      set: function set$$1() {}\n    });\n\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a {@link VideoTrack} to the `VideoTrackList`.\n   *\n   * @param {VideoTrack} track\n   *        The VideoTrack to add to the list\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  VideoTrackList.prototype.addTrack = function addTrack(track) {\n    var _this2 = this;\n\n    if (track.selected) {\n      disableOthers$1(this, track);\n    }\n\n    _TrackList.prototype.addTrack.call(this, track);\n    // native tracks don't have this\n    if (!track.addEventListener) {\n      return;\n    }\n\n    /**\n     * @listens VideoTrack#selectedchange\n     * @fires TrackList#change\n     */\n    track.addEventListener('selectedchange', function () {\n      if (_this2.changing_) {\n        return;\n      }\n      _this2.changing_ = true;\n      disableOthers$1(_this2, track);\n      _this2.changing_ = false;\n      _this2.trigger('change');\n    });\n  };\n\n  return VideoTrackList;\n}(TrackList);\n\n/**\n * @file text-track-list.js\n */\n/**\n * The current list of {@link TextTrack} for a media file.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist}\n * @extends TrackList\n */\n\nvar TextTrackList = function (_TrackList) {\n  inherits(TextTrackList, _TrackList);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {TextTrack[]} [tracks=[]]\n   *        A list of `TextTrack` to instantiate the list with.\n   */\n  function TextTrackList() {\n    var _this, _ret;\n\n    var tracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, TextTrackList);\n\n    var list = void 0;\n\n    // IE8 forces us to implement inheritance ourselves\n    // as it does not support Object.defineProperty properly\n    if (IS_IE8) {\n      list = document_1.createElement('custom');\n      for (var prop in TrackList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TrackList.prototype[prop];\n        }\n      }\n      for (var _prop in TextTrackList.prototype) {\n        if (_prop !== 'constructor') {\n          list[_prop] = TextTrackList.prototype[_prop];\n        }\n      }\n    }\n\n    list = (_this = possibleConstructorReturn(this, _TrackList.call(this, tracks, list)), _this);\n    return _ret = list, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a {@link TextTrack} to the `TextTrackList`\n   *\n   * @param {TextTrack} track\n   *        The text track to add to the list.\n   *\n   * @fires TrackList#addtrack\n   */\n\n\n  TextTrackList.prototype.addTrack = function addTrack(track) {\n    _TrackList.prototype.addTrack.call(this, track);\n\n    /**\n     * @listens TextTrack#modechange\n     * @fires TrackList#change\n     */\n    track.addEventListener('modechange', bind(this, function () {\n      this.trigger('change');\n    }));\n\n    var nonLanguageTextTrackKind = ['metadata', 'chapters'];\n\n    if (nonLanguageTextTrackKind.indexOf(track.kind) === -1) {\n      track.addEventListener('modechange', bind(this, function () {\n        this.trigger('selectedlanguagechange');\n      }));\n    }\n  };\n\n  return TextTrackList;\n}(TrackList);\n\n/**\n * @file html-track-element-list.js\n */\n\n/**\n * The current list of {@link HtmlTrackElement}s.\n */\n\nvar HtmlTrackElementList = function () {\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {HtmlTrackElement[]} [tracks=[]]\n   *        A list of `HtmlTrackElement` to instantiate the list with.\n   */\n  function HtmlTrackElementList() {\n    var trackElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    classCallCheck(this, HtmlTrackElementList);\n\n    var list = this; // eslint-disable-line\n\n    if (IS_IE8) {\n      list = document_1.createElement('custom');\n\n      for (var prop in HtmlTrackElementList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = HtmlTrackElementList.prototype[prop];\n        }\n      }\n    }\n\n    list.trackElements_ = [];\n\n    /**\n     * @memberof HtmlTrackElementList\n     * @member {number} length\n     *         The current number of `Track`s in the this Trackist.\n     * @instance\n     */\n    Object.defineProperty(list, 'length', {\n      get: function get$$1() {\n        return this.trackElements_.length;\n      }\n    });\n\n    for (var i = 0, length = trackElements.length; i < length; i++) {\n      list.addTrackElement_(trackElements[i]);\n    }\n\n    if (IS_IE8) {\n      return list;\n    }\n  }\n\n  /**\n   * Add an {@link HtmlTrackElement} to the `HtmlTrackElementList`\n   *\n   * @param {HtmlTrackElement} trackElement\n   *        The track element to add to the list.\n   *\n   * @private\n   */\n\n\n  HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) {\n    var index = this.trackElements_.length;\n\n    if (!('' + index in this)) {\n      Object.defineProperty(this, index, {\n        get: function get$$1() {\n          return this.trackElements_[index];\n        }\n      });\n    }\n\n    // Do not add duplicate elements\n    if (this.trackElements_.indexOf(trackElement) === -1) {\n      this.trackElements_.push(trackElement);\n    }\n  };\n\n  /**\n   * Get an {@link HtmlTrackElement} from the `HtmlTrackElementList` given an\n   * {@link TextTrack}.\n   *\n   * @param {TextTrack} track\n   *        The track associated with a track element.\n   *\n   * @return {HtmlTrackElement|undefined}\n   *         The track element that was found or undefined.\n   *\n   * @private\n   */\n\n\n  HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) {\n    var trackElement_ = void 0;\n\n    for (var i = 0, length = this.trackElements_.length; i < length; i++) {\n      if (track === this.trackElements_[i].track) {\n        trackElement_ = this.trackElements_[i];\n\n        break;\n      }\n    }\n\n    return trackElement_;\n  };\n\n  /**\n   * Remove a {@link HtmlTrackElement} from the `HtmlTrackElementList`\n   *\n   * @param {HtmlTrackElement} trackElement\n   *        The track element to remove from the list.\n   *\n   * @private\n   */\n\n\n  HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) {\n    for (var i = 0, length = this.trackElements_.length; i < length; i++) {\n      if (trackElement === this.trackElements_[i]) {\n        this.trackElements_.splice(i, 1);\n\n        break;\n      }\n    }\n  };\n\n  return HtmlTrackElementList;\n}();\n\n/**\n * @file text-track-cue-list.js\n */\n/**\n * @typedef {Object} TextTrackCueList~TextTrackCue\n *\n * @property {string} id\n *           The unique id for this text track cue\n *\n * @property {number} startTime\n *           The start time for this text track cue\n *\n * @property {number} endTime\n *           The end time for this text track cue\n *\n * @property {boolean} pauseOnExit\n *           Pause when the end time is reached if true.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcue}\n */\n\n/**\n * A List of TextTrackCues.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist}\n */\n\nvar TextTrackCueList = function () {\n\n  /**\n   * Create an instance of this class..\n   *\n   * @param {Array} cues\n   *        A list of cues to be initialized with\n   */\n  function TextTrackCueList(cues) {\n    classCallCheck(this, TextTrackCueList);\n\n    var list = this; // eslint-disable-line\n\n    if (IS_IE8) {\n      list = document_1.createElement('custom');\n\n      for (var prop in TextTrackCueList.prototype) {\n        if (prop !== 'constructor') {\n          list[prop] = TextTrackCueList.prototype[prop];\n        }\n      }\n    }\n\n    TextTrackCueList.prototype.setCues_.call(list, cues);\n\n    /**\n     * @memberof TextTrackCueList\n     * @member {number} length\n     *         The current number of `TextTrackCue`s in the TextTrackCueList.\n     * @instance\n     */\n    Object.defineProperty(list, 'length', {\n      get: function get$$1() {\n        return this.length_;\n      }\n    });\n\n    if (IS_IE8) {\n      return list;\n    }\n  }\n\n  /**\n   * A setter for cues in this list. Creates getters\n   * an an index for the cues.\n   *\n   * @param {Array} cues\n   *        An array of cues to set\n   *\n   * @private\n   */\n\n\n  TextTrackCueList.prototype.setCues_ = function setCues_(cues) {\n    var oldLength = this.length || 0;\n    var i = 0;\n    var l = cues.length;\n\n    this.cues_ = cues;\n    this.length_ = cues.length;\n\n    var defineProp = function defineProp(index) {\n      if (!('' + index in this)) {\n        Object.defineProperty(this, '' + index, {\n          get: function get$$1() {\n            return this.cues_[index];\n          }\n        });\n      }\n    };\n\n    if (oldLength < l) {\n      i = oldLength;\n\n      for (; i < l; i++) {\n        defineProp.call(this, i);\n      }\n    }\n  };\n\n  /**\n   * Get a `TextTrackCue` that is currently in the `TextTrackCueList` by id.\n   *\n   * @param {string} id\n   *        The id of the cue that should be searched for.\n   *\n   * @return {TextTrackCueList~TextTrackCue|null}\n   *         A single cue or null if none was found.\n   */\n\n\n  TextTrackCueList.prototype.getCueById = function getCueById(id) {\n    var result = null;\n\n    for (var i = 0, l = this.length; i < l; i++) {\n      var cue = this[i];\n\n      if (cue.id === id) {\n        result = cue;\n        break;\n      }\n    }\n\n    return result;\n  };\n\n  return TextTrackCueList;\n}();\n\n/**\n * @file track-kinds.js\n */\n\n/**\n * All possible `VideoTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-videotrack-kind\n * @typedef VideoTrack~Kind\n * @enum\n */\nvar VideoTrackKind = {\n  alternative: 'alternative',\n  captions: 'captions',\n  main: 'main',\n  sign: 'sign',\n  subtitles: 'subtitles',\n  commentary: 'commentary'\n};\n\n/**\n * All possible `AudioTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-audiotrack-kind\n * @typedef AudioTrack~Kind\n * @enum\n */\nvar AudioTrackKind = {\n  'alternative': 'alternative',\n  'descriptions': 'descriptions',\n  'main': 'main',\n  'main-desc': 'main-desc',\n  'translation': 'translation',\n  'commentary': 'commentary'\n};\n\n/**\n * All possible `TextTrackKind`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-texttrack-kind\n * @typedef TextTrack~Kind\n * @enum\n */\nvar TextTrackKind = {\n  subtitles: 'subtitles',\n  captions: 'captions',\n  descriptions: 'descriptions',\n  chapters: 'chapters',\n  metadata: 'metadata'\n};\n\n/**\n * All possible `TextTrackMode`s\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode\n * @typedef TextTrack~Mode\n * @enum\n */\nvar TextTrackMode = {\n  disabled: 'disabled',\n  hidden: 'hidden',\n  showing: 'showing'\n};\n\n/**\n * @file track.js\n */\n/**\n * A Track class that contains all of the common functionality for {@link AudioTrack},\n * {@link VideoTrack}, and {@link TextTrack}.\n *\n * > Note: This class should not be used directly\n *\n * @see {@link https://html.spec.whatwg.org/multipage/embedded-content.html}\n * @extends EventTarget\n * @abstract\n */\n\nvar Track = function (_EventTarget) {\n  inherits(Track, _EventTarget);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} [options={}]\n   *        Object of option names and values\n   *\n   * @param {string} [options.kind='']\n   *        A valid kind for the track type you are creating.\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this AudioTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @abstract\n   */\n  function Track() {\n    var _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, Track);\n\n    var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n    var track = _this; // eslint-disable-line\n\n    if (IS_IE8) {\n      track = document_1.createElement('custom');\n      for (var prop in Track.prototype) {\n        if (prop !== 'constructor') {\n          track[prop] = Track.prototype[prop];\n        }\n      }\n    }\n\n    var trackProps = {\n      id: options.id || 'vjs_track_' + newGUID(),\n      kind: options.kind || '',\n      label: options.label || '',\n      language: options.language || ''\n    };\n\n    /**\n     * @memberof Track\n     * @member {string} id\n     *         The id of this track. Cannot be changed after creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    /**\n     * @memberof Track\n     * @member {string} kind\n     *         The kind of track that this is. Cannot be changed after creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    /**\n     * @memberof Track\n     * @member {string} label\n     *         The label of this track. Cannot be changed after creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    /**\n     * @memberof Track\n     * @member {string} language\n     *         The two letter language code for this track. Cannot be changed after\n     *         creation.\n     * @instance\n     *\n     * @readonly\n     */\n\n    var _loop = function _loop(key) {\n      Object.defineProperty(track, key, {\n        get: function get$$1() {\n          return trackProps[key];\n        },\n        set: function set$$1() {}\n      });\n    };\n\n    for (var key in trackProps) {\n      _loop(key);\n    }\n\n    return _ret = track, possibleConstructorReturn(_this, _ret);\n  }\n\n  return Track;\n}(EventTarget);\n\n/**\n * @file url.js\n * @module url\n */\n/**\n * @typedef {Object} url:URLObject\n *\n * @property {string} protocol\n *           The protocol of the url that was parsed.\n *\n * @property {string} hostname\n *           The hostname of the url that was parsed.\n *\n * @property {string} port\n *           The port of the url that was parsed.\n *\n * @property {string} pathname\n *           The pathname of the url that was parsed.\n *\n * @property {string} search\n *           The search query of the url that was parsed.\n *\n * @property {string} hash\n *           The hash of the url that was parsed.\n *\n * @property {string} host\n *           The host of the url that was parsed.\n */\n\n/**\n * Resolve and parse the elements of a URL.\n *\n * @param  {String} url\n *         The url to parse\n *\n * @return {url:URLObject}\n *         An object of url details\n */\nvar parseUrl = function parseUrl(url) {\n  var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];\n\n  // add the url to an anchor and let the browser parse the URL\n  var a = document_1.createElement('a');\n\n  a.href = url;\n\n  // IE8 (and 9?) Fix\n  // ie8 doesn't parse the URL correctly until the anchor is actually\n  // added to the body, and an innerHTML is needed to trigger the parsing\n  var addToBody = a.host === '' && a.protocol !== 'file:';\n  var div = void 0;\n\n  if (addToBody) {\n    div = document_1.createElement('div');\n    div.innerHTML = '<a href=\"' + url + '\"></a>';\n    a = div.firstChild;\n    // prevent the div from affecting layout\n    div.setAttribute('style', 'display:none; position:absolute;');\n    document_1.body.appendChild(div);\n  }\n\n  // Copy the specific URL properties to a new object\n  // This is also needed for IE8 because the anchor loses its\n  // properties when it's removed from the dom\n  var details = {};\n\n  for (var i = 0; i < props.length; i++) {\n    details[props[i]] = a[props[i]];\n  }\n\n  // IE9 adds the port to the host property unlike everyone else. If\n  // a port identifier is added for standard ports, strip it.\n  if (details.protocol === 'http:') {\n    details.host = details.host.replace(/:80$/, '');\n  }\n\n  if (details.protocol === 'https:') {\n    details.host = details.host.replace(/:443$/, '');\n  }\n\n  if (!details.protocol) {\n    details.protocol = window_1.location.protocol;\n  }\n\n  if (addToBody) {\n    document_1.body.removeChild(div);\n  }\n\n  return details;\n};\n\n/**\n * Get absolute version of relative URL. Used to tell flash correct URL.\n *\n *\n * @param  {string} url\n *         URL to make absolute\n *\n * @return {string}\n *         Absolute URL\n *\n * @see http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue\n */\nvar getAbsoluteURL = function getAbsoluteURL(url) {\n  // Check if absolute URL\n  if (!url.match(/^https?:\\/\\//)) {\n    // Convert to absolute URL. Flash hosted off-site needs an absolute URL.\n    var div = document_1.createElement('div');\n\n    div.innerHTML = '<a href=\"' + url + '\">x</a>';\n    url = div.firstChild.href;\n  }\n\n  return url;\n};\n\n/**\n * Returns the extension of the passed file name. It will return an empty string\n * if passed an invalid path.\n *\n * @param {string} path\n *        The fileName path like '/path/to/file.mp4'\n *\n * @returns {string}\n *          The extension in lower case or an empty string if no\n *          extension could be found.\n */\nvar getFileExtension = function getFileExtension(path) {\n  if (typeof path === 'string') {\n    var splitPathRe = /^(\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?)(\\.([^\\.\\/\\?]+)))(?:[\\/]*|[\\?].*)$/i;\n    var pathParts = splitPathRe.exec(path);\n\n    if (pathParts) {\n      return pathParts.pop().toLowerCase();\n    }\n  }\n\n  return '';\n};\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @param {string} url\n *        The url to check.\n *\n * @return {boolean}\n *         Whether it is a cross domain request or not.\n */\nvar isCrossOrigin = function isCrossOrigin(url) {\n  var winLoc = window_1.location;\n  var urlInfo = parseUrl(url);\n\n  // IE8 protocol relative urls will return ':' for protocol\n  var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;\n\n  // Check if url is for another domain/origin\n  // IE8 doesn't know location.origin, so we won't rely on it here\n  var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;\n\n  return crossOrigin;\n};\n\nvar Url = (Object.freeze || Object)({\n\tparseUrl: parseUrl,\n\tgetAbsoluteURL: getAbsoluteURL,\n\tgetFileExtension: getFileExtension,\n\tisCrossOrigin: isCrossOrigin\n});\n\nvar isFunction_1 = isFunction;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction isFunction (fn) {\n  var string = toString$1.call(fn);\n  return string === '[object Function]' ||\n    (typeof fn === 'function' && string !== '[object RegExp]') ||\n    (typeof window !== 'undefined' &&\n     // IE8 and below\n     (fn === window.setTimeout ||\n      fn === window.alert ||\n      fn === window.confirm ||\n      fn === window.prompt))\n}\n\nvar trim_1 = createCommonjsModule(function (module, exports) {\nexports = module.exports = trim;\n\nfunction trim(str){\n  return str.replace(/^\\s*|\\s*$/g, '');\n}\n\nexports.left = function(str){\n  return str.replace(/^\\s*/, '');\n};\n\nexports.right = function(str){\n  return str.replace(/\\s*$/, '');\n};\n});\n\nvar forEach_1 = forEach;\n\nvar toString$2 = Object.prototype.toString;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction forEach(list, iterator, context) {\n    if (!isFunction_1(iterator)) {\n        throw new TypeError('iterator must be a function')\n    }\n\n    if (arguments.length < 3) {\n        context = this;\n    }\n\n    if (toString$2.call(list) === '[object Array]')\n        forEachArray$1(list, iterator, context);\n    else if (typeof list === 'string')\n        forEachString(list, iterator, context);\n    else\n        forEachObject(list, iterator, context);\n}\n\nfunction forEachArray$1(array, iterator, context) {\n    for (var i = 0, len = array.length; i < len; i++) {\n        if (hasOwnProperty.call(array, i)) {\n            iterator.call(context, array[i], i, array);\n        }\n    }\n}\n\nfunction forEachString(string, iterator, context) {\n    for (var i = 0, len = string.length; i < len; i++) {\n        // no such thing as a sparse string.\n        iterator.call(context, string.charAt(i), i, string);\n    }\n}\n\nfunction forEachObject(object, iterator, context) {\n    for (var k in object) {\n        if (hasOwnProperty.call(object, k)) {\n            iterator.call(context, object[k], k, object);\n        }\n    }\n}\n\nvar isArray = function(arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n\nvar parseHeaders = function (headers) {\n  if (!headers)\n    return {}\n\n  var result = {};\n\n  forEach_1(\n      trim_1(headers).split('\\n')\n    , function (row) {\n        var index = row.indexOf(':')\n          , key = trim_1(row.slice(0, index)).toLowerCase()\n          , value = trim_1(row.slice(index + 1));\n\n        if (typeof(result[key]) === 'undefined') {\n          result[key] = value;\n        } else if (isArray(result[key])) {\n          result[key].push(value);\n        } else {\n          result[key] = [ result[key], value ];\n        }\n      }\n  );\n\n  return result\n};\n\nvar immutable = extend;\n\nvar hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n    var target = {};\n\n    for (var i = 0; i < arguments.length; i++) {\n        var source = arguments[i];\n\n        for (var key in source) {\n            if (hasOwnProperty$1.call(source, key)) {\n                target[key] = source[key];\n            }\n        }\n    }\n\n    return target\n}\n\nvar xhr = createXHR;\ncreateXHR.XMLHttpRequest = window_1.XMLHttpRequest || noop;\ncreateXHR.XDomainRequest = \"withCredentials\" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window_1.XDomainRequest;\n\nforEachArray([\"get\", \"put\", \"post\", \"patch\", \"head\", \"delete\"], function(method) {\n    createXHR[method === \"delete\" ? \"del\" : method] = function(uri, options, callback) {\n        options = initParams(uri, options, callback);\n        options.method = method.toUpperCase();\n        return _createXHR(options)\n    };\n});\n\nfunction forEachArray(array, iterator) {\n    for (var i = 0; i < array.length; i++) {\n        iterator(array[i]);\n    }\n}\n\nfunction isEmpty(obj){\n    for(var i in obj){\n        if(obj.hasOwnProperty(i)) return false\n    }\n    return true\n}\n\nfunction initParams(uri, options, callback) {\n    var params = uri;\n\n    if (isFunction_1(options)) {\n        callback = options;\n        if (typeof uri === \"string\") {\n            params = {uri:uri};\n        }\n    } else {\n        params = immutable(options, {uri: uri});\n    }\n\n    params.callback = callback;\n    return params\n}\n\nfunction createXHR(uri, options, callback) {\n    options = initParams(uri, options, callback);\n    return _createXHR(options)\n}\n\nfunction _createXHR(options) {\n    if(typeof options.callback === \"undefined\"){\n        throw new Error(\"callback argument missing\")\n    }\n\n    var called = false;\n    var callback = function cbOnce(err, response, body){\n        if(!called){\n            called = true;\n            options.callback(err, response, body);\n        }\n    };\n\n    function readystatechange() {\n        if (xhr.readyState === 4) {\n            setTimeout(loadFunc, 0);\n        }\n    }\n\n    function getBody() {\n        // Chrome with requestType=blob throws errors arround when even testing access to responseText\n        var body = undefined;\n\n        if (xhr.response) {\n            body = xhr.response;\n        } else {\n            body = xhr.responseText || getXml(xhr);\n        }\n\n        if (isJson) {\n            try {\n                body = JSON.parse(body);\n            } catch (e) {}\n        }\n\n        return body\n    }\n\n    function errorFunc(evt) {\n        clearTimeout(timeoutTimer);\n        if(!(evt instanceof Error)){\n            evt = new Error(\"\" + (evt || \"Unknown XMLHttpRequest Error\") );\n        }\n        evt.statusCode = 0;\n        return callback(evt, failureResponse)\n    }\n\n    // will load the data & process the response in a special response object\n    function loadFunc() {\n        if (aborted) return\n        var status;\n        clearTimeout(timeoutTimer);\n        if(options.useXDR && xhr.status===undefined) {\n            //IE8 CORS GET successful response doesn't have a status field, but body is fine\n            status = 200;\n        } else {\n            status = (xhr.status === 1223 ? 204 : xhr.status);\n        }\n        var response = failureResponse;\n        var err = null;\n\n        if (status !== 0){\n            response = {\n                body: getBody(),\n                statusCode: status,\n                method: method,\n                headers: {},\n                url: uri,\n                rawRequest: xhr\n            };\n            if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n                response.headers = parseHeaders(xhr.getAllResponseHeaders());\n            }\n        } else {\n            err = new Error(\"Internal XMLHttpRequest Error\");\n        }\n        return callback(err, response, response.body)\n    }\n\n    var xhr = options.xhr || null;\n\n    if (!xhr) {\n        if (options.cors || options.useXDR) {\n            xhr = new createXHR.XDomainRequest();\n        }else{\n            xhr = new createXHR.XMLHttpRequest();\n        }\n    }\n\n    var key;\n    var aborted;\n    var uri = xhr.url = options.uri || options.url;\n    var method = xhr.method = options.method || \"GET\";\n    var body = options.body || options.data;\n    var headers = xhr.headers = options.headers || {};\n    var sync = !!options.sync;\n    var isJson = false;\n    var timeoutTimer;\n    var failureResponse = {\n        body: undefined,\n        headers: {},\n        statusCode: 0,\n        method: method,\n        url: uri,\n        rawRequest: xhr\n    };\n\n    if (\"json\" in options && options.json !== false) {\n        isJson = true;\n        headers[\"accept\"] || headers[\"Accept\"] || (headers[\"Accept\"] = \"application/json\"); //Don't override existing accept header declared by user\n        if (method !== \"GET\" && method !== \"HEAD\") {\n            headers[\"content-type\"] || headers[\"Content-Type\"] || (headers[\"Content-Type\"] = \"application/json\"); //Don't override existing accept header declared by user\n            body = JSON.stringify(options.json === true ? body : options.json);\n        }\n    }\n\n    xhr.onreadystatechange = readystatechange;\n    xhr.onload = loadFunc;\n    xhr.onerror = errorFunc;\n    // IE9 must have onprogress be set to a unique function.\n    xhr.onprogress = function () {\n        // IE must die\n    };\n    xhr.onabort = function(){\n        aborted = true;\n    };\n    xhr.ontimeout = errorFunc;\n    xhr.open(method, uri, !sync, options.username, options.password);\n    //has to be after open\n    if(!sync) {\n        xhr.withCredentials = !!options.withCredentials;\n    }\n    // Cannot set timeout with sync request\n    // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n    // both npm's request and jquery 1.x use this kind of timeout, so this is being consistent\n    if (!sync && options.timeout > 0 ) {\n        timeoutTimer = setTimeout(function(){\n            if (aborted) return\n            aborted = true;//IE9 may still call readystatechange\n            xhr.abort(\"timeout\");\n            var e = new Error(\"XMLHttpRequest timeout\");\n            e.code = \"ETIMEDOUT\";\n            errorFunc(e);\n        }, options.timeout );\n    }\n\n    if (xhr.setRequestHeader) {\n        for(key in headers){\n            if(headers.hasOwnProperty(key)){\n                xhr.setRequestHeader(key, headers[key]);\n            }\n        }\n    } else if (options.headers && !isEmpty(options.headers)) {\n        throw new Error(\"Headers cannot be set on an XDomainRequest object\")\n    }\n\n    if (\"responseType\" in options) {\n        xhr.responseType = options.responseType;\n    }\n\n    if (\"beforeSend\" in options &&\n        typeof options.beforeSend === \"function\"\n    ) {\n        options.beforeSend(xhr);\n    }\n\n    // Microsoft Edge browser sends \"undefined\" when send is called with undefined value.\n    // XMLHttpRequest spec says to pass null as body to indicate no body\n    // See https://github.com/naugtur/xhr/issues/100.\n    xhr.send(body || null);\n\n    return xhr\n\n\n}\n\nfunction getXml(xhr) {\n    if (xhr.responseType === \"document\") {\n        return xhr.responseXML\n    }\n    var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === \"parsererror\";\n    if (xhr.responseType === \"\" && !firefoxBugTakenEffect) {\n        return xhr.responseXML\n    }\n\n    return null\n}\n\nfunction noop() {}\n\n/**\n * @file text-track.js\n */\n/**\n * Takes a webvtt file contents and parses it into cues\n *\n * @param {string} srcContent\n *        webVTT file contents\n *\n * @param {TextTrack} track\n *        TextTrack to add cues to. Cues come from the srcContent.\n *\n * @private\n */\nvar parseCues = function parseCues(srcContent, track) {\n  var parser = new window_1.WebVTT.Parser(window_1, window_1.vttjs, window_1.WebVTT.StringDecoder());\n  var errors = [];\n\n  parser.oncue = function (cue) {\n    track.addCue(cue);\n  };\n\n  parser.onparsingerror = function (error) {\n    errors.push(error);\n  };\n\n  parser.onflush = function () {\n    track.trigger({\n      type: 'loadeddata',\n      target: track\n    });\n  };\n\n  parser.parse(srcContent);\n  if (errors.length > 0) {\n    if (window_1.console && window_1.console.groupCollapsed) {\n      window_1.console.groupCollapsed('Text Track parsing errors for ' + track.src);\n    }\n    errors.forEach(function (error) {\n      return log$1.error(error);\n    });\n    if (window_1.console && window_1.console.groupEnd) {\n      window_1.console.groupEnd();\n    }\n  }\n\n  parser.flush();\n};\n\n/**\n * Load a `TextTrack` from a specifed url.\n *\n * @param {string} src\n *        Url to load track from.\n *\n * @param {TextTrack} track\n *        Track to add cues to. Comes from the content at the end of `url`.\n *\n * @private\n */\nvar loadTrack = function loadTrack(src, track) {\n  var opts = {\n    uri: src\n  };\n  var crossOrigin = isCrossOrigin(src);\n\n  if (crossOrigin) {\n    opts.cors = crossOrigin;\n  }\n\n  xhr(opts, bind(this, function (err, response, responseBody) {\n    if (err) {\n      return log$1.error(err, response);\n    }\n\n    track.loaded_ = true;\n\n    // Make sure that vttjs has loaded, otherwise, wait till it finished loading\n    // NOTE: this is only used for the alt/video.novtt.js build\n    if (typeof window_1.WebVTT !== 'function') {\n      if (track.tech_) {\n        var loadHandler = function loadHandler() {\n          return parseCues(responseBody, track);\n        };\n\n        track.tech_.on('vttjsloaded', loadHandler);\n        track.tech_.on('vttjserror', function () {\n          log$1.error('vttjs failed to load, stopping trying to process ' + track.src);\n          track.tech_.off('vttjsloaded', loadHandler);\n        });\n      }\n    } else {\n      parseCues(responseBody, track);\n    }\n  }));\n};\n\n/**\n * A representation of a single `TextTrack`.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack}\n * @extends Track\n */\n\nvar TextTrack = function (_Track) {\n  inherits(TextTrack, _Track);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} options={}\n   *        Object of option names and values\n   *\n   * @param {Tech} options.tech\n   *        A reference to the tech that owns this TextTrack.\n   *\n   * @param {TextTrack~Kind} [options.kind='subtitles']\n   *        A valid text track kind.\n   *\n   * @param {TextTrack~Mode} [options.mode='disabled']\n   *        A valid text track mode.\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this TextTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {string} [options.srclang='']\n   *        A valid two character language code. An alternative, but deprioritized\n   *        vesion of `options.language`\n   *\n   * @param {string} [options.src]\n   *        A url to TextTrack cues.\n   *\n   * @param {boolean} [options.default]\n   *        If this track should default to on or off.\n   */\n  function TextTrack() {\n    var _this, _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, TextTrack);\n\n    if (!options.tech) {\n      throw new Error('A tech was not provided.');\n    }\n\n    var settings = mergeOptions(options, {\n      kind: TextTrackKind[options.kind] || 'subtitles',\n      language: options.language || options.srclang || ''\n    });\n    var mode = TextTrackMode[settings.mode] || 'disabled';\n    var default_ = settings['default'];\n\n    if (settings.kind === 'metadata' || settings.kind === 'chapters') {\n      mode = 'hidden';\n    }\n    // on IE8 this will be a document element\n    // for every other browser this will be a normal object\n    var tt = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n\n    tt.tech_ = settings.tech;\n\n    if (IS_IE8) {\n      for (var prop in TextTrack.prototype) {\n        if (prop !== 'constructor') {\n          tt[prop] = TextTrack.prototype[prop];\n        }\n      }\n    }\n\n    tt.cues_ = [];\n    tt.activeCues_ = [];\n\n    var cues = new TextTrackCueList(tt.cues_);\n    var activeCues = new TextTrackCueList(tt.activeCues_);\n    var changed = false;\n    var timeupdateHandler = bind(tt, function () {\n\n      // Accessing this.activeCues for the side-effects of updating itself\n      // due to it's nature as a getter function. Do not remove or cues will\n      // stop updating!\n      /* eslint-disable no-unused-expressions */\n      this.activeCues;\n      /* eslint-enable no-unused-expressions */\n      if (changed) {\n        this.trigger('cuechange');\n        changed = false;\n      }\n    });\n\n    if (mode !== 'disabled') {\n      tt.tech_.ready(function () {\n        tt.tech_.on('timeupdate', timeupdateHandler);\n      }, true);\n    }\n\n    /**\n     * @memberof TextTrack\n     * @member {boolean} default\n     *         If this track was set to be on or off by default. Cannot be changed after\n     *         creation.\n     * @instance\n     *\n     * @readonly\n     */\n    Object.defineProperty(tt, 'default', {\n      get: function get$$1() {\n        return default_;\n      },\n      set: function set$$1() {}\n    });\n\n    /**\n     * @memberof TextTrack\n     * @member {string} mode\n     *         Set the mode of this TextTrack to a valid {@link TextTrack~Mode}. Will\n     *         not be set if setting to an invalid mode.\n     * @instance\n     *\n     * @fires TextTrack#modechange\n     */\n    Object.defineProperty(tt, 'mode', {\n      get: function get$$1() {\n        return mode;\n      },\n      set: function set$$1(newMode) {\n        var _this2 = this;\n\n        if (!TextTrackMode[newMode]) {\n          return;\n        }\n        mode = newMode;\n        if (mode === 'showing') {\n\n          this.tech_.ready(function () {\n            _this2.tech_.on('timeupdate', timeupdateHandler);\n          }, true);\n        }\n        /**\n         * An event that fires when mode changes on this track. This allows\n         * the TextTrackList that holds this track to act accordingly.\n         *\n         * > Note: This is not part of the spec!\n         *\n         * @event TextTrack#modechange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('modechange');\n      }\n    });\n\n    /**\n     * @memberof TextTrack\n     * @member {TextTrackCueList} cues\n     *         The text track cue list for this TextTrack.\n     * @instance\n     */\n    Object.defineProperty(tt, 'cues', {\n      get: function get$$1() {\n        if (!this.loaded_) {\n          return null;\n        }\n\n        return cues;\n      },\n      set: function set$$1() {}\n    });\n\n    /**\n     * @memberof TextTrack\n     * @member {TextTrackCueList} activeCues\n     *         The list text track cues that are currently active for this TextTrack.\n     * @instance\n     */\n    Object.defineProperty(tt, 'activeCues', {\n      get: function get$$1() {\n        if (!this.loaded_) {\n          return null;\n        }\n\n        // nothing to do\n        if (this.cues.length === 0) {\n          return activeCues;\n        }\n\n        var ct = this.tech_.currentTime();\n        var active = [];\n\n        for (var i = 0, l = this.cues.length; i < l; i++) {\n          var cue = this.cues[i];\n\n          if (cue.startTime <= ct && cue.endTime >= ct) {\n            active.push(cue);\n          } else if (cue.startTime === cue.endTime && cue.startTime <= ct && cue.startTime + 0.5 >= ct) {\n            active.push(cue);\n          }\n        }\n\n        changed = false;\n\n        if (active.length !== this.activeCues_.length) {\n          changed = true;\n        } else {\n          for (var _i = 0; _i < active.length; _i++) {\n            if (this.activeCues_.indexOf(active[_i]) === -1) {\n              changed = true;\n            }\n          }\n        }\n\n        this.activeCues_ = active;\n        activeCues.setCues_(this.activeCues_);\n\n        return activeCues;\n      },\n      set: function set$$1() {}\n    });\n\n    if (settings.src) {\n      tt.src = settings.src;\n      loadTrack(settings.src, tt);\n    } else {\n      tt.loaded_ = true;\n    }\n\n    return _ret = tt, possibleConstructorReturn(_this, _ret);\n  }\n\n  /**\n   * Add a cue to the internal list of cues.\n   *\n   * @param {TextTrack~Cue} cue\n   *        The cue to add to our internal list\n   */\n\n\n  TextTrack.prototype.addCue = function addCue(originalCue) {\n    var cue = originalCue;\n\n    if (window_1.vttjs && !(originalCue instanceof window_1.vttjs.VTTCue)) {\n      cue = new window_1.vttjs.VTTCue(originalCue.startTime, originalCue.endTime, originalCue.text);\n\n      for (var prop in originalCue) {\n        if (!(prop in cue)) {\n          cue[prop] = originalCue[prop];\n        }\n      }\n\n      // make sure that `id` is copied over\n      cue.id = originalCue.id;\n      cue.originalCue_ = originalCue;\n    }\n\n    var tracks = this.tech_.textTracks();\n\n    for (var i = 0; i < tracks.length; i++) {\n      if (tracks[i] !== this) {\n        tracks[i].removeCue(cue);\n      }\n    }\n\n    this.cues_.push(cue);\n    this.cues.setCues_(this.cues_);\n  };\n\n  /**\n   * Remove a cue from our internal list\n   *\n   * @param {TextTrack~Cue} removeCue\n   *        The cue to remove from our internal list\n   */\n\n\n  TextTrack.prototype.removeCue = function removeCue(_removeCue) {\n    var i = this.cues_.length;\n\n    while (i--) {\n      var cue = this.cues_[i];\n\n      if (cue === _removeCue || cue.originalCue_ && cue.originalCue_ === _removeCue) {\n        this.cues_.splice(i, 1);\n        this.cues.setCues_(this.cues_);\n        break;\n      }\n    }\n  };\n\n  return TextTrack;\n}(Track);\n\n/**\n * cuechange - One or more cues in the track have become active or stopped being active.\n */\n\n\nTextTrack.prototype.allowedEvents_ = {\n  cuechange: 'cuechange'\n};\n\n/**\n * A representation of a single `AudioTrack`. If it is part of an {@link AudioTrackList}\n * only one `AudioTrack` in the list will be enabled at a time.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack}\n * @extends Track\n */\n\nvar AudioTrack = function (_Track) {\n  inherits(AudioTrack, _Track);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} [options={}]\n   *        Object of option names and values\n   *\n   * @param {AudioTrack~Kind} [options.kind='']\n   *        A valid audio track kind\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this AudioTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {boolean} [options.enabled]\n   *        If this track is the one that is currently playing. If this track is part of\n   *        an {@link AudioTrackList}, only one {@link AudioTrack} will be enabled.\n   */\n  function AudioTrack() {\n    var _this, _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, AudioTrack);\n\n    var settings = mergeOptions(options, {\n      kind: AudioTrackKind[options.kind] || ''\n    });\n    // on IE8 this will be a document element\n    // for every other browser this will be a normal object\n    var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n    var enabled = false;\n\n    if (IS_IE8) {\n      for (var prop in AudioTrack.prototype) {\n        if (prop !== 'constructor') {\n          track[prop] = AudioTrack.prototype[prop];\n        }\n      }\n    }\n    /**\n     * @memberof AudioTrack\n     * @member {boolean} enabled\n     *         If this `AudioTrack` is enabled or not. When setting this will\n     *         fire {@link AudioTrack#enabledchange} if the state of enabled is changed.\n     * @instance\n     *\n     * @fires VideoTrack#selectedchange\n     */\n    Object.defineProperty(track, 'enabled', {\n      get: function get$$1() {\n        return enabled;\n      },\n      set: function set$$1(newEnabled) {\n        // an invalid or unchanged value\n        if (typeof newEnabled !== 'boolean' || newEnabled === enabled) {\n          return;\n        }\n        enabled = newEnabled;\n\n        /**\n         * An event that fires when enabled changes on this track. This allows\n         * the AudioTrackList that holds this track to act accordingly.\n         *\n         * > Note: This is not part of the spec! Native tracks will do\n         *         this internally without an event.\n         *\n         * @event AudioTrack#enabledchange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('enabledchange');\n      }\n    });\n\n    // if the user sets this track to selected then\n    // set selected to that true value otherwise\n    // we keep it false\n    if (settings.enabled) {\n      track.enabled = settings.enabled;\n    }\n    track.loaded_ = true;\n\n    return _ret = track, possibleConstructorReturn(_this, _ret);\n  }\n\n  return AudioTrack;\n}(Track);\n\n/**\n * A representation of a single `VideoTrack`.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#videotrack}\n * @extends Track\n */\n\nvar VideoTrack = function (_Track) {\n  inherits(VideoTrack, _Track);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} [options={}]\n   *        Object of option names and values\n   *\n   * @param {string} [options.kind='']\n   *        A valid {@link VideoTrack~Kind}\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this AudioTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {boolean} [options.selected]\n   *        If this track is the one that is currently playing.\n   */\n  function VideoTrack() {\n    var _this, _ret;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, VideoTrack);\n\n    var settings = mergeOptions(options, {\n      kind: VideoTrackKind[options.kind] || ''\n    });\n\n    // on IE8 this will be a document element\n    // for every other browser this will be a normal object\n    var track = (_this = possibleConstructorReturn(this, _Track.call(this, settings)), _this);\n    var selected = false;\n\n    if (IS_IE8) {\n      for (var prop in VideoTrack.prototype) {\n        if (prop !== 'constructor') {\n          track[prop] = VideoTrack.prototype[prop];\n        }\n      }\n    }\n\n    /**\n     * @memberof VideoTrack\n     * @member {boolean} selected\n     *         If this `VideoTrack` is selected or not. When setting this will\n     *         fire {@link VideoTrack#selectedchange} if the state of selected changed.\n     * @instance\n     *\n     * @fires VideoTrack#selectedchange\n     */\n    Object.defineProperty(track, 'selected', {\n      get: function get$$1() {\n        return selected;\n      },\n      set: function set$$1(newSelected) {\n        // an invalid or unchanged value\n        if (typeof newSelected !== 'boolean' || newSelected === selected) {\n          return;\n        }\n        selected = newSelected;\n\n        /**\n         * An event that fires when selected changes on this track. This allows\n         * the VideoTrackList that holds this track to act accordingly.\n         *\n         * > Note: This is not part of the spec! Native tracks will do\n         *         this internally without an event.\n         *\n         * @event VideoTrack#selectedchange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('selectedchange');\n      }\n    });\n\n    // if the user sets this track to selected then\n    // set selected to that true value otherwise\n    // we keep it false\n    if (settings.selected) {\n      track.selected = settings.selected;\n    }\n\n    return _ret = track, possibleConstructorReturn(_this, _ret);\n  }\n\n  return VideoTrack;\n}(Track);\n\n/**\n * @file html-track-element.js\n */\n\n/**\n * @memberof HTMLTrackElement\n * @typedef {HTMLTrackElement~ReadyState}\n * @enum {number}\n */\nvar NONE = 0;\nvar LOADING = 1;\nvar LOADED = 2;\nvar ERROR = 3;\n\n/**\n * A single track represented in the DOM.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement}\n * @extends EventTarget\n */\n\nvar HTMLTrackElement = function (_EventTarget) {\n  inherits(HTMLTrackElement, _EventTarget);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Object} options={}\n   *        Object of option names and values\n   *\n   * @param {Tech} options.tech\n   *        A reference to the tech that owns this HTMLTrackElement.\n   *\n   * @param {TextTrack~Kind} [options.kind='subtitles']\n   *        A valid text track kind.\n   *\n   * @param {TextTrack~Mode} [options.mode='disabled']\n   *        A valid text track mode.\n   *\n   * @param {string} [options.id='vjs_track_' + Guid.newGUID()]\n   *        A unique id for this TextTrack.\n   *\n   * @param {string} [options.label='']\n   *        The menu label for this track.\n   *\n   * @param {string} [options.language='']\n   *        A valid two character language code.\n   *\n   * @param {string} [options.srclang='']\n   *        A valid two character language code. An alternative, but deprioritized\n   *        vesion of `options.language`\n   *\n   * @param {string} [options.src]\n   *        A url to TextTrack cues.\n   *\n   * @param {boolean} [options.default]\n   *        If this track should default to on or off.\n   */\n  function HTMLTrackElement() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, HTMLTrackElement);\n\n    var _this = possibleConstructorReturn(this, _EventTarget.call(this));\n\n    var readyState = void 0;\n    var trackElement = _this; // eslint-disable-line\n\n    if (IS_IE8) {\n      trackElement = document_1.createElement('custom');\n\n      for (var prop in HTMLTrackElement.prototype) {\n        if (prop !== 'constructor') {\n          trackElement[prop] = HTMLTrackElement.prototype[prop];\n        }\n      }\n    }\n\n    var track = new TextTrack(options);\n\n    trackElement.kind = track.kind;\n    trackElement.src = track.src;\n    trackElement.srclang = track.language;\n    trackElement.label = track.label;\n    trackElement['default'] = track['default'];\n\n    /**\n     * @memberof HTMLTrackElement\n     * @member {HTMLTrackElement~ReadyState} readyState\n     *         The current ready state of the track element.\n     * @instance\n     */\n    Object.defineProperty(trackElement, 'readyState', {\n      get: function get$$1() {\n        return readyState;\n      }\n    });\n\n    /**\n     * @memberof HTMLTrackElement\n     * @member {TextTrack} track\n     *         The underlying TextTrack object.\n     * @instance\n     *\n     */\n    Object.defineProperty(trackElement, 'track', {\n      get: function get$$1() {\n        return track;\n      }\n    });\n\n    readyState = NONE;\n\n    /**\n     * @listens TextTrack#loadeddata\n     * @fires HTMLTrackElement#load\n     */\n    track.addEventListener('loadeddata', function () {\n      readyState = LOADED;\n\n      trackElement.trigger({\n        type: 'load',\n        target: trackElement\n      });\n    });\n\n    if (IS_IE8) {\n      var _ret;\n\n      return _ret = trackElement, possibleConstructorReturn(_this, _ret);\n    }\n    return _this;\n  }\n\n  return HTMLTrackElement;\n}(EventTarget);\n\nHTMLTrackElement.prototype.allowedEvents_ = {\n  load: 'load'\n};\n\nHTMLTrackElement.NONE = NONE;\nHTMLTrackElement.LOADING = LOADING;\nHTMLTrackElement.LOADED = LOADED;\nHTMLTrackElement.ERROR = ERROR;\n\n/*\n * This file contains all track properties that are used in\n * player.js, tech.js, html5.js and possibly other techs in the future.\n */\n\nvar NORMAL = {\n  audio: {\n    ListClass: AudioTrackList,\n    TrackClass: AudioTrack,\n    capitalName: 'Audio'\n  },\n  video: {\n    ListClass: VideoTrackList,\n    TrackClass: VideoTrack,\n    capitalName: 'Video'\n  },\n  text: {\n    ListClass: TextTrackList,\n    TrackClass: TextTrack,\n    capitalName: 'Text'\n  }\n};\n\nObject.keys(NORMAL).forEach(function (type) {\n  NORMAL[type].getterName = type + 'Tracks';\n  NORMAL[type].privateName = type + 'Tracks_';\n});\n\nvar REMOTE = {\n  remoteText: {\n    ListClass: TextTrackList,\n    TrackClass: TextTrack,\n    capitalName: 'RemoteText',\n    getterName: 'remoteTextTracks',\n    privateName: 'remoteTextTracks_'\n  },\n  remoteTextEl: {\n    ListClass: HtmlTrackElementList,\n    TrackClass: HTMLTrackElement,\n    capitalName: 'RemoteTextTrackEls',\n    getterName: 'remoteTextTrackEls',\n    privateName: 'remoteTextTrackEls_'\n  }\n};\n\nvar ALL = mergeOptions(NORMAL, REMOTE);\n\nREMOTE.names = Object.keys(REMOTE);\nNORMAL.names = Object.keys(NORMAL);\nALL.names = [].concat(REMOTE.names).concat(NORMAL.names);\n\n/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */\nvar _objCreate = Object.create || (function() {\n  function F() {}\n  return function(o) {\n    if (arguments.length !== 1) {\n      throw new Error('Object.create shim only accepts one parameter.');\n    }\n    F.prototype = o;\n    return new F();\n  };\n})();\n\n// Creates a new ParserError object from an errorData object. The errorData\n// object should have default code and message properties. The default message\n// property can be overriden by passing in a message parameter.\n// See ParsingError.Errors below for acceptable errors.\nfunction ParsingError(errorData, message) {\n  this.name = \"ParsingError\";\n  this.code = errorData.code;\n  this.message = message || errorData.message;\n}\nParsingError.prototype = _objCreate(Error.prototype);\nParsingError.prototype.constructor = ParsingError;\n\n// ParsingError metadata for acceptable ParsingErrors.\nParsingError.Errors = {\n  BadSignature: {\n    code: 0,\n    message: \"Malformed WebVTT signature.\"\n  },\n  BadTimeStamp: {\n    code: 1,\n    message: \"Malformed time stamp.\"\n  }\n};\n\n// Try to parse input as a time stamp.\nfunction parseTimeStamp(input) {\n\n  function computeSeconds(h, m, s, f) {\n    return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;\n  }\n\n  var m = input.match(/^(\\d+):(\\d{2})(:\\d{2})?\\.(\\d{3})/);\n  if (!m) {\n    return null;\n  }\n\n  if (m[3]) {\n    // Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]\n    return computeSeconds(m[1], m[2], m[3].replace(\":\", \"\"), m[4]);\n  } else if (m[1] > 59) {\n    // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n    // First position is hours as it's over 59.\n    return computeSeconds(m[1], m[2], 0,  m[4]);\n  } else {\n    // Timestamp takes the form of [minutes]:[seconds].[milliseconds]\n    return computeSeconds(0, m[1], m[2], m[4]);\n  }\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nfunction Settings() {\n  this.values = _objCreate(null);\n}\n\nSettings.prototype = {\n  // Only accept the first assignment to any key.\n  set: function(k, v) {\n    if (!this.get(k) && v !== \"\") {\n      this.values[k] = v;\n    }\n  },\n  // Return the value for a key, or a default value.\n  // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n  // a number of possible default values as properties where 'defaultKey' is\n  // the key of the property that will be chosen; otherwise it's assumed to be\n  // a single value.\n  get: function(k, dflt, defaultKey) {\n    if (defaultKey) {\n      return this.has(k) ? this.values[k] : dflt[defaultKey];\n    }\n    return this.has(k) ? this.values[k] : dflt;\n  },\n  // Check whether we have a value for a key.\n  has: function(k) {\n    return k in this.values;\n  },\n  // Accept a setting if its one of the given alternatives.\n  alt: function(k, v, a) {\n    for (var n = 0; n < a.length; ++n) {\n      if (v === a[n]) {\n        this.set(k, v);\n        break;\n      }\n    }\n  },\n  // Accept a setting if its a valid (signed) integer.\n  integer: function(k, v) {\n    if (/^-?\\d+$/.test(v)) { // integer\n      this.set(k, parseInt(v, 10));\n    }\n  },\n  // Accept a setting if its a valid percentage.\n  percent: function(k, v) {\n    var m;\n    if ((m = v.match(/^([\\d]{1,3})(\\.[\\d]*)?%$/))) {\n      v = parseFloat(v);\n      if (v >= 0 && v <= 100) {\n        this.set(k, v);\n        return true;\n      }\n    }\n    return false;\n  }\n};\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interprete each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(input, callback, keyValueDelim, groupDelim) {\n  var groups = groupDelim ? input.split(groupDelim) : [input];\n  for (var i in groups) {\n    if (typeof groups[i] !== \"string\") {\n      continue;\n    }\n    var kv = groups[i].split(keyValueDelim);\n    if (kv.length !== 2) {\n      continue;\n    }\n    var k = kv[0];\n    var v = kv[1];\n    callback(k, v);\n  }\n}\n\nfunction parseCue(input, cue, regionList) {\n  // Remember the original input if we need to throw an error.\n  var oInput = input;\n  // 4.1 WebVTT timestamp\n  function consumeTimeStamp() {\n    var ts = parseTimeStamp(input);\n    if (ts === null) {\n      throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n                            \"Malformed timestamp: \" + oInput);\n    }\n    // Remove time stamp from input.\n    input = input.replace(/^[^\\sa-zA-Z-]+/, \"\");\n    return ts;\n  }\n\n  // 4.4.2 WebVTT cue settings\n  function consumeCueSettings(input, cue) {\n    var settings = new Settings();\n\n    parseOptions(input, function (k, v) {\n      switch (k) {\n      case \"region\":\n        // Find the last region we parsed with the same region id.\n        for (var i = regionList.length - 1; i >= 0; i--) {\n          if (regionList[i].id === v) {\n            settings.set(k, regionList[i].region);\n            break;\n          }\n        }\n        break;\n      case \"vertical\":\n        settings.alt(k, v, [\"rl\", \"lr\"]);\n        break;\n      case \"line\":\n        var vals = v.split(\",\"),\n            vals0 = vals[0];\n        settings.integer(k, vals0);\n        settings.percent(k, vals0) ? settings.set(\"snapToLines\", false) : null;\n        settings.alt(k, vals0, [\"auto\"]);\n        if (vals.length === 2) {\n          settings.alt(\"lineAlign\", vals[1], [\"start\", \"middle\", \"end\"]);\n        }\n        break;\n      case \"position\":\n        vals = v.split(\",\");\n        settings.percent(k, vals[0]);\n        if (vals.length === 2) {\n          settings.alt(\"positionAlign\", vals[1], [\"start\", \"middle\", \"end\"]);\n        }\n        break;\n      case \"size\":\n        settings.percent(k, v);\n        break;\n      case \"align\":\n        settings.alt(k, v, [\"start\", \"middle\", \"end\", \"left\", \"right\"]);\n        break;\n      }\n    }, /:/, /\\s/);\n\n    // Apply default values for any missing fields.\n    cue.region = settings.get(\"region\", null);\n    cue.vertical = settings.get(\"vertical\", \"\");\n    cue.line = settings.get(\"line\", \"auto\");\n    cue.lineAlign = settings.get(\"lineAlign\", \"start\");\n    cue.snapToLines = settings.get(\"snapToLines\", true);\n    cue.size = settings.get(\"size\", 100);\n    cue.align = settings.get(\"align\", \"middle\");\n    cue.position = settings.get(\"position\", {\n      start: 0,\n      left: 0,\n      middle: 50,\n      end: 100,\n      right: 100\n    }, cue.align);\n    cue.positionAlign = settings.get(\"positionAlign\", {\n      start: \"start\",\n      left: \"start\",\n      middle: \"middle\",\n      end: \"end\",\n      right: \"end\"\n    }, cue.align);\n  }\n\n  function skipWhitespace() {\n    input = input.replace(/^\\s+/, \"\");\n  }\n\n  // 4.1 WebVTT cue timings.\n  skipWhitespace();\n  cue.startTime = consumeTimeStamp();   // (1) collect cue start time\n  skipWhitespace();\n  if (input.substr(0, 3) !== \"-->\") {     // (3) next characters must match \"-->\"\n    throw new ParsingError(ParsingError.Errors.BadTimeStamp,\n                           \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n                           oInput);\n  }\n  input = input.substr(3);\n  skipWhitespace();\n  cue.endTime = consumeTimeStamp();     // (5) collect cue end time\n\n  // 4.1 WebVTT cue settings list.\n  skipWhitespace();\n  consumeCueSettings(input, cue);\n}\n\nvar ESCAPE = {\n  \"&amp;\": \"&\",\n  \"&lt;\": \"<\",\n  \"&gt;\": \">\",\n  \"&lrm;\": \"\\u200e\",\n  \"&rlm;\": \"\\u200f\",\n  \"&nbsp;\": \"\\u00a0\"\n};\n\nvar TAG_NAME = {\n  c: \"span\",\n  i: \"i\",\n  b: \"b\",\n  u: \"u\",\n  ruby: \"ruby\",\n  rt: \"rt\",\n  v: \"span\",\n  lang: \"span\"\n};\n\nvar TAG_ANNOTATION = {\n  v: \"title\",\n  lang: \"lang\"\n};\n\nvar NEEDS_PARENT = {\n  rt: \"ruby\"\n};\n\n// Parse content into a document fragment.\nfunction parseContent(window, input) {\n  function nextToken() {\n    // Check for end-of-string.\n    if (!input) {\n      return null;\n    }\n\n    // Consume 'n' characters from the input.\n    function consume(result) {\n      input = input.substr(result.length);\n      return result;\n    }\n\n    var m = input.match(/^([^<]*)(<[^>]+>?)?/);\n    // If there is some text before the next tag, return it, otherwise return\n    // the tag.\n    return consume(m[1] ? m[1] : m[2]);\n  }\n\n  // Unescape a string 's'.\n  function unescape1(e) {\n    return ESCAPE[e];\n  }\n  function unescape(s) {\n    while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {\n      s = s.replace(m[0], unescape1);\n    }\n    return s;\n  }\n\n  function shouldAdd(current, element) {\n    return !NEEDS_PARENT[element.localName] ||\n           NEEDS_PARENT[element.localName] === current.localName;\n  }\n\n  // Create an element for this tag.\n  function createElement(type, annotation) {\n    var tagName = TAG_NAME[type];\n    if (!tagName) {\n      return null;\n    }\n    var element = window.document.createElement(tagName);\n    element.localName = tagName;\n    var name = TAG_ANNOTATION[type];\n    if (name && annotation) {\n      element[name] = annotation.trim();\n    }\n    return element;\n  }\n\n  var rootDiv = window.document.createElement(\"div\"),\n      current = rootDiv,\n      t,\n      tagStack = [];\n\n  while ((t = nextToken()) !== null) {\n    if (t[0] === '<') {\n      if (t[1] === \"/\") {\n        // If the closing tag matches, move back up to the parent node.\n        if (tagStack.length &&\n            tagStack[tagStack.length - 1] === t.substr(2).replace(\">\", \"\")) {\n          tagStack.pop();\n          current = current.parentNode;\n        }\n        // Otherwise just ignore the end tag.\n        continue;\n      }\n      var ts = parseTimeStamp(t.substr(1, t.length - 2));\n      var node;\n      if (ts) {\n        // Timestamps are lead nodes as well.\n        node = window.document.createProcessingInstruction(\"timestamp\", ts);\n        current.appendChild(node);\n        continue;\n      }\n      var m = t.match(/^<([^.\\s/0-9>]+)(\\.[^\\s\\\\>]+)?([^>\\\\]+)?(\\\\?)>?$/);\n      // If we can't parse the tag, skip to the next tag.\n      if (!m) {\n        continue;\n      }\n      // Try to construct an element, and ignore the tag if we couldn't.\n      node = createElement(m[1], m[3]);\n      if (!node) {\n        continue;\n      }\n      // Determine if the tag should be added based on the context of where it\n      // is placed in the cuetext.\n      if (!shouldAdd(current, node)) {\n        continue;\n      }\n      // Set the class list (as a list of classes, separated by space).\n      if (m[2]) {\n        node.className = m[2].substr(1).replace('.', ' ');\n      }\n      // Append the node to the current node, and enter the scope of the new\n      // node.\n      tagStack.push(m[1]);\n      current.appendChild(node);\n      current = node;\n      continue;\n    }\n\n    // Text nodes are leaf nodes.\n    current.appendChild(window.document.createTextNode(unescape(t)));\n  }\n\n  return rootDiv;\n}\n\n// This is a list of all the Unicode characters that have a strong\n// right-to-left category. What this means is that these characters are\n// written right-to-left for sure. It was generated by pulling all the strong\n// right-to-left characters out of the Unicode data table. That table can\n// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\nvar strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6],\n [0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d],\n [0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6],\n [0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5],\n [0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815],\n [0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858],\n [0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f],\n [0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c],\n [0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1],\n [0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc],\n [0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808],\n [0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855],\n [0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f],\n [0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13],\n [0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58],\n [0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72],\n [0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f],\n [0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32],\n [0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42],\n [0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f],\n [0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59],\n [0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62],\n [0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77],\n [0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b],\n [0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];\n\nfunction isStrongRTLChar(charCode) {\n  for (var i = 0; i < strongRTLRanges.length; i++) {\n    var currentRange = strongRTLRanges[i];\n    if (charCode >= currentRange[0] && charCode <= currentRange[1]) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction determineBidi(cueDiv) {\n  var nodeStack = [],\n      text = \"\",\n      charCode;\n\n  if (!cueDiv || !cueDiv.childNodes) {\n    return \"ltr\";\n  }\n\n  function pushNodes(nodeStack, node) {\n    for (var i = node.childNodes.length - 1; i >= 0; i--) {\n      nodeStack.push(node.childNodes[i]);\n    }\n  }\n\n  function nextTextNode(nodeStack) {\n    if (!nodeStack || !nodeStack.length) {\n      return null;\n    }\n\n    var node = nodeStack.pop(),\n        text = node.textContent || node.innerText;\n    if (text) {\n      // TODO: This should match all unicode type B characters (paragraph\n      // separator characters). See issue #115.\n      var m = text.match(/^.*(\\n|\\r)/);\n      if (m) {\n        nodeStack.length = 0;\n        return m[0];\n      }\n      return text;\n    }\n    if (node.tagName === \"ruby\") {\n      return nextTextNode(nodeStack);\n    }\n    if (node.childNodes) {\n      pushNodes(nodeStack, node);\n      return nextTextNode(nodeStack);\n    }\n  }\n\n  pushNodes(nodeStack, cueDiv);\n  while ((text = nextTextNode(nodeStack))) {\n    for (var i = 0; i < text.length; i++) {\n      charCode = text.charCodeAt(i);\n      if (isStrongRTLChar(charCode)) {\n        return \"rtl\";\n      }\n    }\n  }\n  return \"ltr\";\n}\n\nfunction computeLinePos(cue) {\n  if (typeof cue.line === \"number\" &&\n      (cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {\n    return cue.line;\n  }\n  if (!cue.track || !cue.track.textTrackList ||\n      !cue.track.textTrackList.mediaElement) {\n    return -1;\n  }\n  var track = cue.track,\n      trackList = track.textTrackList,\n      count = 0;\n  for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {\n    if (trackList[i].mode === \"showing\") {\n      count++;\n    }\n  }\n  return ++count * -1;\n}\n\nfunction StyleBox() {\n}\n\n// Apply styles to a div. If there is no div passed then it defaults to the\n// div on 'this'.\nStyleBox.prototype.applyStyles = function(styles, div) {\n  div = div || this.div;\n  for (var prop in styles) {\n    if (styles.hasOwnProperty(prop)) {\n      div.style[prop] = styles[prop];\n    }\n  }\n};\n\nStyleBox.prototype.formatStyle = function(val, unit) {\n  return val === 0 ? 0 : val + unit;\n};\n\n// Constructs the computed display state of the cue (a div). Places the div\n// into the overlay which should be a block level element (usually a div).\nfunction CueStyleBox(window, cue, styleOptions) {\n  var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n  var color = \"rgba(255, 255, 255, 1)\";\n  var backgroundColor = \"rgba(0, 0, 0, 0.8)\";\n\n  if (isIE8) {\n    color = \"rgb(255, 255, 255)\";\n    backgroundColor = \"rgb(0, 0, 0)\";\n  }\n\n  StyleBox.call(this);\n  this.cue = cue;\n\n  // Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will\n  // have inline positioning and will function as the cue background box.\n  this.cueDiv = parseContent(window, cue.text);\n  var styles = {\n    color: color,\n    backgroundColor: backgroundColor,\n    position: \"relative\",\n    left: 0,\n    right: 0,\n    top: 0,\n    bottom: 0,\n    display: \"inline\"\n  };\n\n  if (!isIE8) {\n    styles.writingMode = cue.vertical === \"\" ? \"horizontal-tb\"\n                                             : cue.vertical === \"lr\" ? \"vertical-lr\"\n                                                                     : \"vertical-rl\";\n    styles.unicodeBidi = \"plaintext\";\n  }\n  this.applyStyles(styles, this.cueDiv);\n\n  // Create an absolutely positioned div that will be used to position the cue\n  // div. Note, all WebVTT cue-setting alignments are equivalent to the CSS\n  // mirrors of them except \"middle\" which is \"center\" in CSS.\n  this.div = window.document.createElement(\"div\");\n  styles = {\n    textAlign: cue.align === \"middle\" ? \"center\" : cue.align,\n    font: styleOptions.font,\n    whiteSpace: \"pre-line\",\n    position: \"absolute\"\n  };\n\n  if (!isIE8) {\n    styles.direction = determineBidi(this.cueDiv);\n    styles.writingMode = cue.vertical === \"\" ? \"horizontal-tb\"\n                                             : cue.vertical === \"lr\" ? \"vertical-lr\"\n                                                                     : \"vertical-rl\".\n    stylesunicodeBidi =  \"plaintext\";\n  }\n\n  this.applyStyles(styles);\n\n  this.div.appendChild(this.cueDiv);\n\n  // Calculate the distance from the reference edge of the viewport to the text\n  // position of the cue box. The reference edge will be resolved later when\n  // the box orientation styles are applied.\n  var textPos = 0;\n  switch (cue.positionAlign) {\n  case \"start\":\n    textPos = cue.position;\n    break;\n  case \"middle\":\n    textPos = cue.position - (cue.size / 2);\n    break;\n  case \"end\":\n    textPos = cue.position - cue.size;\n    break;\n  }\n\n  // Horizontal box orientation; textPos is the distance from the left edge of the\n  // area to the left edge of the box and cue.size is the distance extending to\n  // the right from there.\n  if (cue.vertical === \"\") {\n    this.applyStyles({\n      left:  this.formatStyle(textPos, \"%\"),\n      width: this.formatStyle(cue.size, \"%\")\n    });\n  // Vertical box orientation; textPos is the distance from the top edge of the\n  // area to the top edge of the box and cue.size is the height extending\n  // downwards from there.\n  } else {\n    this.applyStyles({\n      top: this.formatStyle(textPos, \"%\"),\n      height: this.formatStyle(cue.size, \"%\")\n    });\n  }\n\n  this.move = function(box) {\n    this.applyStyles({\n      top: this.formatStyle(box.top, \"px\"),\n      bottom: this.formatStyle(box.bottom, \"px\"),\n      left: this.formatStyle(box.left, \"px\"),\n      right: this.formatStyle(box.right, \"px\"),\n      height: this.formatStyle(box.height, \"px\"),\n      width: this.formatStyle(box.width, \"px\")\n    });\n  };\n}\nCueStyleBox.prototype = _objCreate(StyleBox.prototype);\nCueStyleBox.prototype.constructor = CueStyleBox;\n\n// Represents the co-ordinates of an Element in a way that we can easily\n// compute things with such as if it overlaps or intersects with another Element.\n// Can initialize it with either a StyleBox or another BoxPosition.\nfunction BoxPosition(obj) {\n  var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n\n  // Either a BoxPosition was passed in and we need to copy it, or a StyleBox\n  // was passed in and we need to copy the results of 'getBoundingClientRect'\n  // as the object returned is readonly. All co-ordinate values are in reference\n  // to the viewport origin (top left).\n  var lh, height, width, top;\n  if (obj.div) {\n    height = obj.div.offsetHeight;\n    width = obj.div.offsetWidth;\n    top = obj.div.offsetTop;\n\n    var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&\n                rects.getClientRects && rects.getClientRects();\n    obj = obj.div.getBoundingClientRect();\n    // In certain cases the outter div will be slightly larger then the sum of\n    // the inner div's lines. This could be due to bold text, etc, on some platforms.\n    // In this case we should get the average line height and use that. This will\n    // result in the desired behaviour.\n    lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)\n               : 0;\n\n  }\n  this.left = obj.left;\n  this.right = obj.right;\n  this.top = obj.top || top;\n  this.height = obj.height || height;\n  this.bottom = obj.bottom || (top + (obj.height || height));\n  this.width = obj.width || width;\n  this.lineHeight = lh !== undefined ? lh : obj.lineHeight;\n\n  if (isIE8 && !this.lineHeight) {\n    this.lineHeight = 13;\n  }\n}\n\n// Move the box along a particular axis. Optionally pass in an amount to move\n// the box. If no amount is passed then the default is the line height of the\n// box.\nBoxPosition.prototype.move = function(axis, toMove) {\n  toMove = toMove !== undefined ? toMove : this.lineHeight;\n  switch (axis) {\n  case \"+x\":\n    this.left += toMove;\n    this.right += toMove;\n    break;\n  case \"-x\":\n    this.left -= toMove;\n    this.right -= toMove;\n    break;\n  case \"+y\":\n    this.top += toMove;\n    this.bottom += toMove;\n    break;\n  case \"-y\":\n    this.top -= toMove;\n    this.bottom -= toMove;\n    break;\n  }\n};\n\n// Check if this box overlaps another box, b2.\nBoxPosition.prototype.overlaps = function(b2) {\n  return this.left < b2.right &&\n         this.right > b2.left &&\n         this.top < b2.bottom &&\n         this.bottom > b2.top;\n};\n\n// Check if this box overlaps any other boxes in boxes.\nBoxPosition.prototype.overlapsAny = function(boxes) {\n  for (var i = 0; i < boxes.length; i++) {\n    if (this.overlaps(boxes[i])) {\n      return true;\n    }\n  }\n  return false;\n};\n\n// Check if this box is within another box.\nBoxPosition.prototype.within = function(container) {\n  return this.top >= container.top &&\n         this.bottom <= container.bottom &&\n         this.left >= container.left &&\n         this.right <= container.right;\n};\n\n// Check if this box is entirely within the container or it is overlapping\n// on the edge opposite of the axis direction passed. For example, if \"+x\" is\n// passed and the box is overlapping on the left edge of the container, then\n// return true.\nBoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {\n  switch (axis) {\n  case \"+x\":\n    return this.left < container.left;\n  case \"-x\":\n    return this.right > container.right;\n  case \"+y\":\n    return this.top < container.top;\n  case \"-y\":\n    return this.bottom > container.bottom;\n  }\n};\n\n// Find the percentage of the area that this box is overlapping with another\n// box.\nBoxPosition.prototype.intersectPercentage = function(b2) {\n  var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),\n      y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),\n      intersectArea = x * y;\n  return intersectArea / (this.height * this.width);\n};\n\n// Convert the positions from this box to CSS compatible positions using\n// the reference container's positions. This has to be done because this\n// box's positions are in reference to the viewport origin, whereas, CSS\n// values are in referecne to their respective edges.\nBoxPosition.prototype.toCSSCompatValues = function(reference) {\n  return {\n    top: this.top - reference.top,\n    bottom: reference.bottom - this.bottom,\n    left: this.left - reference.left,\n    right: reference.right - this.right,\n    height: this.height,\n    width: this.width\n  };\n};\n\n// Get an object that represents the box's position without anything extra.\n// Can pass a StyleBox, HTMLElement, or another BoxPositon.\nBoxPosition.getSimpleBoxPosition = function(obj) {\n  var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;\n  var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;\n  var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;\n\n  obj = obj.div ? obj.div.getBoundingClientRect() :\n                obj.tagName ? obj.getBoundingClientRect() : obj;\n  var ret = {\n    left: obj.left,\n    right: obj.right,\n    top: obj.top || top,\n    height: obj.height || height,\n    bottom: obj.bottom || (top + (obj.height || height)),\n    width: obj.width || width\n  };\n  return ret;\n};\n\n// Move a StyleBox to its specified, or next best, position. The containerBox\n// is the box that contains the StyleBox, such as a div. boxPositions are\n// a list of other boxes that the styleBox can't overlap with.\nfunction moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {\n\n  // Find the best position for a cue box, b, on the video. The axis parameter\n  // is a list of axis, the order of which, it will move the box along. For example:\n  // Passing [\"+x\", \"-x\"] will move the box first along the x axis in the positive\n  // direction. If it doesn't find a good position for it there it will then move\n  // it along the x axis in the negative direction.\n  function findBestPosition(b, axis) {\n    var bestPosition,\n        specifiedPosition = new BoxPosition(b),\n        percentage = 1; // Highest possible so the first thing we get is better.\n\n    for (var i = 0; i < axis.length; i++) {\n      while (b.overlapsOppositeAxis(containerBox, axis[i]) ||\n             (b.within(containerBox) && b.overlapsAny(boxPositions))) {\n        b.move(axis[i]);\n      }\n      // We found a spot where we aren't overlapping anything. This is our\n      // best position.\n      if (b.within(containerBox)) {\n        return b;\n      }\n      var p = b.intersectPercentage(containerBox);\n      // If we're outside the container box less then we were on our last try\n      // then remember this position as the best position.\n      if (percentage > p) {\n        bestPosition = new BoxPosition(b);\n        percentage = p;\n      }\n      // Reset the box position to the specified position.\n      b = new BoxPosition(specifiedPosition);\n    }\n    return bestPosition || specifiedPosition;\n  }\n\n  var boxPosition = new BoxPosition(styleBox),\n      cue = styleBox.cue,\n      linePos = computeLinePos(cue),\n      axis = [];\n\n  // If we have a line number to align the cue to.\n  if (cue.snapToLines) {\n    var size;\n    switch (cue.vertical) {\n    case \"\":\n      axis = [ \"+y\", \"-y\" ];\n      size = \"height\";\n      break;\n    case \"rl\":\n      axis = [ \"+x\", \"-x\" ];\n      size = \"width\";\n      break;\n    case \"lr\":\n      axis = [ \"-x\", \"+x\" ];\n      size = \"width\";\n      break;\n    }\n\n    var step = boxPosition.lineHeight,\n        position = step * Math.round(linePos),\n        maxPosition = containerBox[size] + step,\n        initialAxis = axis[0];\n\n    // If the specified intial position is greater then the max position then\n    // clamp the box to the amount of steps it would take for the box to\n    // reach the max position.\n    if (Math.abs(position) > maxPosition) {\n      position = position < 0 ? -1 : 1;\n      position *= Math.ceil(maxPosition / step) * step;\n    }\n\n    // If computed line position returns negative then line numbers are\n    // relative to the bottom of the video instead of the top. Therefore, we\n    // need to increase our initial position by the length or width of the\n    // video, depending on the writing direction, and reverse our axis directions.\n    if (linePos < 0) {\n      position += cue.vertical === \"\" ? containerBox.height : containerBox.width;\n      axis = axis.reverse();\n    }\n\n    // Move the box to the specified position. This may not be its best\n    // position.\n    boxPosition.move(initialAxis, position);\n\n  } else {\n    // If we have a percentage line value for the cue.\n    var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;\n\n    switch (cue.lineAlign) {\n    case \"middle\":\n      linePos -= (calculatedPercentage / 2);\n      break;\n    case \"end\":\n      linePos -= calculatedPercentage;\n      break;\n    }\n\n    // Apply initial line position to the cue box.\n    switch (cue.vertical) {\n    case \"\":\n      styleBox.applyStyles({\n        top: styleBox.formatStyle(linePos, \"%\")\n      });\n      break;\n    case \"rl\":\n      styleBox.applyStyles({\n        left: styleBox.formatStyle(linePos, \"%\")\n      });\n      break;\n    case \"lr\":\n      styleBox.applyStyles({\n        right: styleBox.formatStyle(linePos, \"%\")\n      });\n      break;\n    }\n\n    axis = [ \"+y\", \"-x\", \"+x\", \"-y\" ];\n\n    // Get the box position again after we've applied the specified positioning\n    // to it.\n    boxPosition = new BoxPosition(styleBox);\n  }\n\n  var bestPosition = findBestPosition(boxPosition, axis);\n  styleBox.move(bestPosition.toCSSCompatValues(containerBox));\n}\n\nfunction WebVTT$1() {\n  // Nothing\n}\n\n// Helper to allow strings to be decoded instead of the default binary utf8 data.\nWebVTT$1.StringDecoder = function() {\n  return {\n    decode: function(data) {\n      if (!data) {\n        return \"\";\n      }\n      if (typeof data !== \"string\") {\n        throw new Error(\"Error - expected string data.\");\n      }\n      return decodeURIComponent(encodeURIComponent(data));\n    }\n  };\n};\n\nWebVTT$1.convertCueToDOMTree = function(window, cuetext) {\n  if (!window || !cuetext) {\n    return null;\n  }\n  return parseContent(window, cuetext);\n};\n\nvar FONT_SIZE_PERCENT = 0.05;\nvar FONT_STYLE = \"sans-serif\";\nvar CUE_BACKGROUND_PADDING = \"1.5%\";\n\n// Runs the processing model over the cues and regions passed to it.\n// @param overlay A block level element (usually a div) that the computed cues\n//                and regions will be placed into.\nWebVTT$1.processCues = function(window, cues, overlay) {\n  if (!window || !cues || !overlay) {\n    return null;\n  }\n\n  // Remove all previous children.\n  while (overlay.firstChild) {\n    overlay.removeChild(overlay.firstChild);\n  }\n\n  var paddedOverlay = window.document.createElement(\"div\");\n  paddedOverlay.style.position = \"absolute\";\n  paddedOverlay.style.left = \"0\";\n  paddedOverlay.style.right = \"0\";\n  paddedOverlay.style.top = \"0\";\n  paddedOverlay.style.bottom = \"0\";\n  paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;\n  overlay.appendChild(paddedOverlay);\n\n  // Determine if we need to compute the display states of the cues. This could\n  // be the case if a cue's state has been changed since the last computation or\n  // if it has not been computed yet.\n  function shouldCompute(cues) {\n    for (var i = 0; i < cues.length; i++) {\n      if (cues[i].hasBeenReset || !cues[i].displayState) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // We don't need to recompute the cues' display states. Just reuse them.\n  if (!shouldCompute(cues)) {\n    for (var i = 0; i < cues.length; i++) {\n      paddedOverlay.appendChild(cues[i].displayState);\n    }\n    return;\n  }\n\n  var boxPositions = [],\n      containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),\n      fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;\n  var styleOptions = {\n    font: fontSize + \"px \" + FONT_STYLE\n  };\n\n  (function() {\n    var styleBox, cue;\n\n    for (var i = 0; i < cues.length; i++) {\n      cue = cues[i];\n\n      // Compute the intial position and styles of the cue div.\n      styleBox = new CueStyleBox(window, cue, styleOptions);\n      paddedOverlay.appendChild(styleBox.div);\n\n      // Move the cue div to it's correct line position.\n      moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);\n\n      // Remember the computed div so that we don't have to recompute it later\n      // if we don't have too.\n      cue.displayState = styleBox.div;\n\n      boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));\n    }\n  })();\n};\n\nWebVTT$1.Parser = function(window, vttjs, decoder) {\n  if (!decoder) {\n    decoder = vttjs;\n    vttjs = {};\n  }\n  if (!vttjs) {\n    vttjs = {};\n  }\n\n  this.window = window;\n  this.vttjs = vttjs;\n  this.state = \"INITIAL\";\n  this.buffer = \"\";\n  this.decoder = decoder || new TextDecoder(\"utf8\");\n  this.regionList = [];\n};\n\nWebVTT$1.Parser.prototype = {\n  // If the error is a ParsingError then report it to the consumer if\n  // possible. If it's not a ParsingError then throw it like normal.\n  reportOrThrowError: function(e) {\n    if (e instanceof ParsingError) {\n      this.onparsingerror && this.onparsingerror(e);\n    } else {\n      throw e;\n    }\n  },\n  parse: function (data) {\n    var self = this;\n\n    // If there is no data then we won't decode it, but will just try to parse\n    // whatever is in buffer already. This may occur in circumstances, for\n    // example when flush() is called.\n    if (data) {\n      // Try to decode the data that we received.\n      self.buffer += self.decoder.decode(data, {stream: true});\n    }\n\n    function collectNextLine() {\n      var buffer = self.buffer;\n      var pos = 0;\n      while (pos < buffer.length && buffer[pos] !== '\\r' && buffer[pos] !== '\\n') {\n        ++pos;\n      }\n      var line = buffer.substr(0, pos);\n      // Advance the buffer early in case we fail below.\n      if (buffer[pos] === '\\r') {\n        ++pos;\n      }\n      if (buffer[pos] === '\\n') {\n        ++pos;\n      }\n      self.buffer = buffer.substr(pos);\n      return line;\n    }\n\n    // 3.4 WebVTT region and WebVTT region settings syntax\n    function parseRegion(input) {\n      var settings = new Settings();\n\n      parseOptions(input, function (k, v) {\n        switch (k) {\n        case \"id\":\n          settings.set(k, v);\n          break;\n        case \"width\":\n          settings.percent(k, v);\n          break;\n        case \"lines\":\n          settings.integer(k, v);\n          break;\n        case \"regionanchor\":\n        case \"viewportanchor\":\n          var xy = v.split(',');\n          if (xy.length !== 2) {\n            break;\n          }\n          // We have to make sure both x and y parse, so use a temporary\n          // settings object here.\n          var anchor = new Settings();\n          anchor.percent(\"x\", xy[0]);\n          anchor.percent(\"y\", xy[1]);\n          if (!anchor.has(\"x\") || !anchor.has(\"y\")) {\n            break;\n          }\n          settings.set(k + \"X\", anchor.get(\"x\"));\n          settings.set(k + \"Y\", anchor.get(\"y\"));\n          break;\n        case \"scroll\":\n          settings.alt(k, v, [\"up\"]);\n          break;\n        }\n      }, /=/, /\\s/);\n\n      // Create the region, using default values for any values that were not\n      // specified.\n      if (settings.has(\"id\")) {\n        var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();\n        region.width = settings.get(\"width\", 100);\n        region.lines = settings.get(\"lines\", 3);\n        region.regionAnchorX = settings.get(\"regionanchorX\", 0);\n        region.regionAnchorY = settings.get(\"regionanchorY\", 100);\n        region.viewportAnchorX = settings.get(\"viewportanchorX\", 0);\n        region.viewportAnchorY = settings.get(\"viewportanchorY\", 100);\n        region.scroll = settings.get(\"scroll\", \"\");\n        // Register the region.\n        self.onregion && self.onregion(region);\n        // Remember the VTTRegion for later in case we parse any VTTCues that\n        // reference it.\n        self.regionList.push({\n          id: settings.get(\"id\"),\n          region: region\n        });\n      }\n    }\n\n    // draft-pantos-http-live-streaming-20\n    // https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5\n    // 3.5 WebVTT\n    function parseTimestampMap(input) {\n      var settings = new Settings();\n\n      parseOptions(input, function(k, v) {\n        switch(k) {\n        case \"MPEGT\":\n          settings.integer(k + 'S', v);\n          break;\n        case \"LOCA\":\n          settings.set(k + 'L', parseTimeStamp(v));\n          break;\n        }\n      }, /[^\\d]:/, /,/);\n\n      self.ontimestampmap && self.ontimestampmap({\n        \"MPEGTS\": settings.get(\"MPEGTS\"),\n        \"LOCAL\": settings.get(\"LOCAL\")\n      });\n    }\n\n    // 3.2 WebVTT metadata header syntax\n    function parseHeader(input) {\n      if (input.match(/X-TIMESTAMP-MAP/)) {\n        // This line contains HLS X-TIMESTAMP-MAP metadata\n        parseOptions(input, function(k, v) {\n          switch(k) {\n          case \"X-TIMESTAMP-MAP\":\n            parseTimestampMap(v);\n            break;\n          }\n        }, /=/);\n      } else {\n        parseOptions(input, function (k, v) {\n          switch (k) {\n          case \"Region\":\n            // 3.3 WebVTT region metadata header syntax\n            parseRegion(v);\n            break;\n          }\n        }, /:/);\n      }\n\n    }\n\n    // 5.1 WebVTT file parsing.\n    try {\n      var line;\n      if (self.state === \"INITIAL\") {\n        // We can't start parsing until we have the first line.\n        if (!/\\r\\n|\\n/.test(self.buffer)) {\n          return this;\n        }\n\n        line = collectNextLine();\n\n        var m = line.match(/^WEBVTT([ \\t].*)?$/);\n        if (!m || !m[0]) {\n          throw new ParsingError(ParsingError.Errors.BadSignature);\n        }\n\n        self.state = \"HEADER\";\n      }\n\n      var alreadyCollectedLine = false;\n      while (self.buffer) {\n        // We can't parse a line until we have the full line.\n        if (!/\\r\\n|\\n/.test(self.buffer)) {\n          return this;\n        }\n\n        if (!alreadyCollectedLine) {\n          line = collectNextLine();\n        } else {\n          alreadyCollectedLine = false;\n        }\n\n        switch (self.state) {\n        case \"HEADER\":\n          // 13-18 - Allow a header (metadata) under the WEBVTT line.\n          if (/:/.test(line)) {\n            parseHeader(line);\n          } else if (!line) {\n            // An empty line terminates the header and starts the body (cues).\n            self.state = \"ID\";\n          }\n          continue;\n        case \"NOTE\":\n          // Ignore NOTE blocks.\n          if (!line) {\n            self.state = \"ID\";\n          }\n          continue;\n        case \"ID\":\n          // Check for the start of NOTE blocks.\n          if (/^NOTE($|[ \\t])/.test(line)) {\n            self.state = \"NOTE\";\n            break;\n          }\n          // 19-29 - Allow any number of line terminators, then initialize new cue values.\n          if (!line) {\n            continue;\n          }\n          self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, \"\");\n          self.state = \"CUE\";\n          // 30-39 - Check if self line contains an optional identifier or timing data.\n          if (line.indexOf(\"-->\") === -1) {\n            self.cue.id = line;\n            continue;\n          }\n          // Process line as start of a cue.\n          /*falls through*/\n        case \"CUE\":\n          // 40 - Collect cue timings and settings.\n          try {\n            parseCue(line, self.cue, self.regionList);\n          } catch (e) {\n            self.reportOrThrowError(e);\n            // In case of an error ignore rest of the cue.\n            self.cue = null;\n            self.state = \"BADCUE\";\n            continue;\n          }\n          self.state = \"CUETEXT\";\n          continue;\n        case \"CUETEXT\":\n          var hasSubstring = line.indexOf(\"-->\") !== -1;\n          // 34 - If we have an empty line then report the cue.\n          // 35 - If we have the special substring '-->' then report the cue,\n          // but do not collect the line as we need to process the current\n          // one as a new cue.\n          if (!line || hasSubstring && (alreadyCollectedLine = true)) {\n            // We are done parsing self cue.\n            self.oncue && self.oncue(self.cue);\n            self.cue = null;\n            self.state = \"ID\";\n            continue;\n          }\n          if (self.cue.text) {\n            self.cue.text += \"\\n\";\n          }\n          self.cue.text += line;\n          continue;\n        case \"BADCUE\": // BADCUE\n          // 54-62 - Collect and discard the remaining cue.\n          if (!line) {\n            self.state = \"ID\";\n          }\n          continue;\n        }\n      }\n    } catch (e) {\n      self.reportOrThrowError(e);\n\n      // If we are currently parsing a cue, report what we have.\n      if (self.state === \"CUETEXT\" && self.cue && self.oncue) {\n        self.oncue(self.cue);\n      }\n      self.cue = null;\n      // Enter BADWEBVTT state if header was not parsed correctly otherwise\n      // another exception occurred so enter BADCUE state.\n      self.state = self.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n    }\n    return this;\n  },\n  flush: function () {\n    var self = this;\n    try {\n      // Finish decoding the stream.\n      self.buffer += self.decoder.decode();\n      // Synthesize the end of the current cue or region.\n      if (self.cue || self.state === \"HEADER\") {\n        self.buffer += \"\\n\\n\";\n        self.parse();\n      }\n      // If we've flushed, parsed, and we're still on the INITIAL state then\n      // that means we don't have enough of the stream to parse the first\n      // line.\n      if (self.state === \"INITIAL\") {\n        throw new ParsingError(ParsingError.Errors.BadSignature);\n      }\n    } catch(e) {\n      self.reportOrThrowError(e);\n    }\n    self.onflush && self.onflush();\n    return this;\n  }\n};\n\nvar vtt$1 = WebVTT$1;\n\n/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar autoKeyword = \"auto\";\nvar directionSetting = {\n  \"\": true,\n  \"lr\": true,\n  \"rl\": true\n};\nvar alignSetting = {\n  \"start\": true,\n  \"middle\": true,\n  \"end\": true,\n  \"left\": true,\n  \"right\": true\n};\n\nfunction findDirectionSetting(value) {\n  if (typeof value !== \"string\") {\n    return false;\n  }\n  var dir = directionSetting[value.toLowerCase()];\n  return dir ? value.toLowerCase() : false;\n}\n\nfunction findAlignSetting(value) {\n  if (typeof value !== \"string\") {\n    return false;\n  }\n  var align = alignSetting[value.toLowerCase()];\n  return align ? value.toLowerCase() : false;\n}\n\nfunction extend$1(obj) {\n  var i = 1;\n  for (; i < arguments.length; i++) {\n    var cobj = arguments[i];\n    for (var p in cobj) {\n      obj[p] = cobj[p];\n    }\n  }\n\n  return obj;\n}\n\nfunction VTTCue(startTime, endTime, text) {\n  var cue = this;\n  var isIE8 = (/MSIE\\s8\\.0/).test(navigator.userAgent);\n  var baseObj = {};\n\n  if (isIE8) {\n    cue = document.createElement('custom');\n  } else {\n    baseObj.enumerable = true;\n  }\n\n  /**\n   * Shim implementation specific properties. These properties are not in\n   * the spec.\n   */\n\n  // Lets us know when the VTTCue's data has changed in such a way that we need\n  // to recompute its display state. This lets us compute its display state\n  // lazily.\n  cue.hasBeenReset = false;\n\n  /**\n   * VTTCue and TextTrackCue properties\n   * http://dev.w3.org/html5/webvtt/#vttcue-interface\n   */\n\n  var _id = \"\";\n  var _pauseOnExit = false;\n  var _startTime = startTime;\n  var _endTime = endTime;\n  var _text = text;\n  var _region = null;\n  var _vertical = \"\";\n  var _snapToLines = true;\n  var _line = \"auto\";\n  var _lineAlign = \"start\";\n  var _position = 50;\n  var _positionAlign = \"middle\";\n  var _size = 50;\n  var _align = \"middle\";\n\n  Object.defineProperty(cue,\n    \"id\", extend$1({}, baseObj, {\n      get: function() {\n        return _id;\n      },\n      set: function(value) {\n        _id = \"\" + value;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"pauseOnExit\", extend$1({}, baseObj, {\n      get: function() {\n        return _pauseOnExit;\n      },\n      set: function(value) {\n        _pauseOnExit = !!value;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"startTime\", extend$1({}, baseObj, {\n      get: function() {\n        return _startTime;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"Start time must be set to a number.\");\n        }\n        _startTime = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"endTime\", extend$1({}, baseObj, {\n      get: function() {\n        return _endTime;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"End time must be set to a number.\");\n        }\n        _endTime = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"text\", extend$1({}, baseObj, {\n      get: function() {\n        return _text;\n      },\n      set: function(value) {\n        _text = \"\" + value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"region\", extend$1({}, baseObj, {\n      get: function() {\n        return _region;\n      },\n      set: function(value) {\n        _region = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"vertical\", extend$1({}, baseObj, {\n      get: function() {\n        return _vertical;\n      },\n      set: function(value) {\n        var setting = findDirectionSetting(value);\n        // Have to check for false because the setting an be an empty string.\n        if (setting === false) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _vertical = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"snapToLines\", extend$1({}, baseObj, {\n      get: function() {\n        return _snapToLines;\n      },\n      set: function(value) {\n        _snapToLines = !!value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"line\", extend$1({}, baseObj, {\n      get: function() {\n        return _line;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\" && value !== autoKeyword) {\n          throw new SyntaxError(\"An invalid number or illegal string was specified.\");\n        }\n        _line = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"lineAlign\", extend$1({}, baseObj, {\n      get: function() {\n        return _lineAlign;\n      },\n      set: function(value) {\n        var setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _lineAlign = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"position\", extend$1({}, baseObj, {\n      get: function() {\n        return _position;\n      },\n      set: function(value) {\n        if (value < 0 || value > 100) {\n          throw new Error(\"Position must be between 0 and 100.\");\n        }\n        _position = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"positionAlign\", extend$1({}, baseObj, {\n      get: function() {\n        return _positionAlign;\n      },\n      set: function(value) {\n        var setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _positionAlign = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"size\", extend$1({}, baseObj, {\n      get: function() {\n        return _size;\n      },\n      set: function(value) {\n        if (value < 0 || value > 100) {\n          throw new Error(\"Size must be between 0 and 100.\");\n        }\n        _size = value;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  Object.defineProperty(cue,\n    \"align\", extend$1({}, baseObj, {\n      get: function() {\n        return _align;\n      },\n      set: function(value) {\n        var setting = findAlignSetting(value);\n        if (!setting) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _align = setting;\n        this.hasBeenReset = true;\n      }\n    }));\n\n  /**\n   * Other <track> spec defined properties\n   */\n\n  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n  cue.displayState = undefined;\n\n  if (isIE8) {\n    return cue;\n  }\n}\n\n/**\n * VTTCue methods\n */\n\nVTTCue.prototype.getCueAsHTML = function() {\n  // Assume WebVTT.convertCueToDOMTree is on the global.\n  return WebVTT.convertCueToDOMTree(window, this.text);\n};\n\nvar vttcue = VTTCue;\n\n/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar scrollSetting = {\n  \"\": true,\n  \"up\": true\n};\n\nfunction findScrollSetting(value) {\n  if (typeof value !== \"string\") {\n    return false;\n  }\n  var scroll = scrollSetting[value.toLowerCase()];\n  return scroll ? value.toLowerCase() : false;\n}\n\nfunction isValidPercentValue(value) {\n  return typeof value === \"number\" && (value >= 0 && value <= 100);\n}\n\n// VTTRegion shim http://dev.w3.org/html5/webvtt/#vttregion-interface\nfunction VTTRegion() {\n  var _width = 100;\n  var _lines = 3;\n  var _regionAnchorX = 0;\n  var _regionAnchorY = 100;\n  var _viewportAnchorX = 0;\n  var _viewportAnchorY = 100;\n  var _scroll = \"\";\n\n  Object.defineProperties(this, {\n    \"width\": {\n      enumerable: true,\n      get: function() {\n        return _width;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"Width must be between 0 and 100.\");\n        }\n        _width = value;\n      }\n    },\n    \"lines\": {\n      enumerable: true,\n      get: function() {\n        return _lines;\n      },\n      set: function(value) {\n        if (typeof value !== \"number\") {\n          throw new TypeError(\"Lines must be set to a number.\");\n        }\n        _lines = value;\n      }\n    },\n    \"regionAnchorY\": {\n      enumerable: true,\n      get: function() {\n        return _regionAnchorY;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"RegionAnchorX must be between 0 and 100.\");\n        }\n        _regionAnchorY = value;\n      }\n    },\n    \"regionAnchorX\": {\n      enumerable: true,\n      get: function() {\n        return _regionAnchorX;\n      },\n      set: function(value) {\n        if(!isValidPercentValue(value)) {\n          throw new Error(\"RegionAnchorY must be between 0 and 100.\");\n        }\n        _regionAnchorX = value;\n      }\n    },\n    \"viewportAnchorY\": {\n      enumerable: true,\n      get: function() {\n        return _viewportAnchorY;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"ViewportAnchorY must be between 0 and 100.\");\n        }\n        _viewportAnchorY = value;\n      }\n    },\n    \"viewportAnchorX\": {\n      enumerable: true,\n      get: function() {\n        return _viewportAnchorX;\n      },\n      set: function(value) {\n        if (!isValidPercentValue(value)) {\n          throw new Error(\"ViewportAnchorX must be between 0 and 100.\");\n        }\n        _viewportAnchorX = value;\n      }\n    },\n    \"scroll\": {\n      enumerable: true,\n      get: function() {\n        return _scroll;\n      },\n      set: function(value) {\n        var setting = findScrollSetting(value);\n        // Have to check for false as an empty string is a legal value.\n        if (setting === false) {\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        }\n        _scroll = setting;\n      }\n    }\n  });\n}\n\nvar vttregion = VTTRegion;\n\nvar browserIndex = createCommonjsModule(function (module) {\n/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Default exports for Node. Export the extended versions of VTTCue and\n// VTTRegion in Node since we likely want the capability to convert back and\n// forth between JSON. If we don't then it's not that big of a deal since we're\n// off browser.\n\n\n\nvar vttjs = module.exports = {\n  WebVTT: vtt$1,\n  VTTCue: vttcue,\n  VTTRegion: vttregion\n};\n\nwindow_1.vttjs = vttjs;\nwindow_1.WebVTT = vttjs.WebVTT;\n\nvar cueShim = vttjs.VTTCue;\nvar regionShim = vttjs.VTTRegion;\nvar nativeVTTCue = window_1.VTTCue;\nvar nativeVTTRegion = window_1.VTTRegion;\n\nvttjs.shim = function() {\n  window_1.VTTCue = cueShim;\n  window_1.VTTRegion = regionShim;\n};\n\nvttjs.restore = function() {\n  window_1.VTTCue = nativeVTTCue;\n  window_1.VTTRegion = nativeVTTRegion;\n};\n\nif (!window_1.VTTCue) {\n  vttjs.shim();\n}\n});\n\n/**\n * @file tech.js\n */\n\n/**\n * An Object containing a structure like: `{src: 'url', type: 'mimetype'}` or string\n * that just contains the src url alone.\n * * `var SourceObject = {src: 'http://ex.com/video.mp4', type: 'video/mp4'};`\n   * `var SourceString = 'http://example.com/some-video.mp4';`\n *\n * @typedef {Object|string} Tech~SourceObject\n *\n * @property {string} src\n *           The url to the source\n *\n * @property {string} type\n *           The mime type of the source\n */\n\n/**\n * A function used by {@link Tech} to create a new {@link TextTrack}.\n *\n * @private\n *\n * @param {Tech} self\n *        An instance of the Tech class.\n *\n * @param {string} kind\n *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n *\n * @param {string} [label]\n *        Label to identify the text track\n *\n * @param {string} [language]\n *        Two letter language abbreviation\n *\n * @param {Object} [options={}]\n *        An object with additional text track options\n *\n * @return {TextTrack}\n *          The text track that was created.\n */\nfunction createTrackHelper(self, kind, label, language) {\n  var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n\n  var tracks = self.textTracks();\n\n  options.kind = kind;\n\n  if (label) {\n    options.label = label;\n  }\n  if (language) {\n    options.language = language;\n  }\n  options.tech = self;\n\n  var track = new ALL.text.TrackClass(options);\n\n  tracks.addTrack(track);\n\n  return track;\n}\n\n/**\n * This is the base class for media playback technology controllers, such as\n * {@link Flash} and {@link HTML5}\n *\n * @extends Component\n */\n\nvar Tech = function (_Component) {\n  inherits(Tech, _Component);\n\n  /**\n   * Create an instance of this Tech.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} ready\n   *        Callback function to call when the `HTML5` Tech is ready.\n   */\n  function Tech() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var ready = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n    classCallCheck(this, Tech);\n\n    // we don't want the tech to report user activity automatically.\n    // This is done manually in addControlsListeners\n    options.reportTouchActivity = false;\n\n    // keep track of whether the current source has played at all to\n    // implement a very limited played()\n    var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready));\n\n    _this.hasStarted_ = false;\n    _this.on('playing', function () {\n      this.hasStarted_ = true;\n    });\n    _this.on('loadstart', function () {\n      this.hasStarted_ = false;\n    });\n\n    ALL.names.forEach(function (name) {\n      var props = ALL[name];\n\n      if (options && options[props.getterName]) {\n        _this[props.privateName] = options[props.getterName];\n      }\n    });\n\n    // Manually track progress in cases where the browser/flash player doesn't report it.\n    if (!_this.featuresProgressEvents) {\n      _this.manualProgressOn();\n    }\n\n    // Manually track timeupdates in cases where the browser/flash player doesn't report it.\n    if (!_this.featuresTimeupdateEvents) {\n      _this.manualTimeUpdatesOn();\n    }\n\n    ['Text', 'Audio', 'Video'].forEach(function (track) {\n      if (options['native' + track + 'Tracks'] === false) {\n        _this['featuresNative' + track + 'Tracks'] = false;\n      }\n    });\n\n    if (options.nativeCaptions === false || options.nativeTextTracks === false) {\n      _this.featuresNativeTextTracks = false;\n    } else if (options.nativeCaptions === true || options.nativeTextTracks === true) {\n      _this.featuresNativeTextTracks = true;\n    }\n\n    if (!_this.featuresNativeTextTracks) {\n      _this.emulateTextTracks();\n    }\n\n    _this.autoRemoteTextTracks_ = new ALL.text.ListClass();\n\n    _this.initTrackListeners();\n\n    // Turn on component tap events only if not using native controls\n    if (!options.nativeControlsForTouch) {\n      _this.emitTapEvents();\n    }\n\n    if (_this.constructor) {\n      _this.name_ = _this.constructor.name || 'Unknown Tech';\n    }\n    return _this;\n  }\n\n  /* Fallbacks for unsupported event types\n  ================================================================================ */\n\n  /**\n   * Polyfill the `progress` event for browsers that don't support it natively.\n   *\n   * @see {@link Tech#trackProgress}\n   */\n\n\n  Tech.prototype.manualProgressOn = function manualProgressOn() {\n    this.on('durationchange', this.onDurationChange);\n\n    this.manualProgress = true;\n\n    // Trigger progress watching when a source begins loading\n    this.one('ready', this.trackProgress);\n  };\n\n  /**\n   * Turn off the polyfill for `progress` events that was created in\n   * {@link Tech#manualProgressOn}\n   */\n\n\n  Tech.prototype.manualProgressOff = function manualProgressOff() {\n    this.manualProgress = false;\n    this.stopTrackingProgress();\n\n    this.off('durationchange', this.onDurationChange);\n  };\n\n  /**\n   * This is used to trigger a `progress` event when the buffered percent changes. It\n   * sets an interval function that will be called every 500 milliseconds to check if the\n   * buffer end percent has changed.\n   *\n   * > This function is called by {@link Tech#manualProgressOn}\n   *\n   * @param {EventTarget~Event} event\n   *        The `ready` event that caused this to run.\n   *\n   * @listens Tech#ready\n   * @fires Tech#progress\n   */\n\n\n  Tech.prototype.trackProgress = function trackProgress(event) {\n    this.stopTrackingProgress();\n    this.progressInterval = this.setInterval(bind(this, function () {\n      // Don't trigger unless buffered amount is greater than last time\n\n      var numBufferedPercent = this.bufferedPercent();\n\n      if (this.bufferedPercent_ !== numBufferedPercent) {\n        /**\n         * See {@link Player#progress}\n         *\n         * @event Tech#progress\n         * @type {EventTarget~Event}\n         */\n        this.trigger('progress');\n      }\n\n      this.bufferedPercent_ = numBufferedPercent;\n\n      if (numBufferedPercent === 1) {\n        this.stopTrackingProgress();\n      }\n    }), 500);\n  };\n\n  /**\n   * Update our internal duration on a `durationchange` event by calling\n   * {@link Tech#duration}.\n   *\n   * @param {EventTarget~Event} event\n   *        The `durationchange` event that caused this to run.\n   *\n   * @listens Tech#durationchange\n   */\n\n\n  Tech.prototype.onDurationChange = function onDurationChange(event) {\n    this.duration_ = this.duration();\n  };\n\n  /**\n   * Get and create a `TimeRange` object for buffering.\n   *\n   * @return {TimeRange}\n   *         The time range object that was created.\n   */\n\n\n  Tech.prototype.buffered = function buffered() {\n    return createTimeRanges(0, 0);\n  };\n\n  /**\n   * Get the percentage of the current video that is currently buffered.\n   *\n   * @return {number}\n   *         A number from 0 to 1 that represents the decimal percentage of the\n   *         video that is buffered.\n   *\n   */\n\n\n  Tech.prototype.bufferedPercent = function bufferedPercent$$1() {\n    return bufferedPercent(this.buffered(), this.duration_);\n  };\n\n  /**\n   * Turn off the polyfill for `progress` events that was created in\n   * {@link Tech#manualProgressOn}\n   * Stop manually tracking progress events by clearing the interval that was set in\n   * {@link Tech#trackProgress}.\n   */\n\n\n  Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {\n    this.clearInterval(this.progressInterval);\n  };\n\n  /**\n   * Polyfill the `timeupdate` event for browsers that don't support it.\n   *\n   * @see {@link Tech#trackCurrentTime}\n   */\n\n\n  Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {\n    this.manualTimeUpdates = true;\n\n    this.on('play', this.trackCurrentTime);\n    this.on('pause', this.stopTrackingCurrentTime);\n  };\n\n  /**\n   * Turn off the polyfill for `timeupdate` events that was created in\n   * {@link Tech#manualTimeUpdatesOn}\n   */\n\n\n  Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {\n    this.manualTimeUpdates = false;\n    this.stopTrackingCurrentTime();\n    this.off('play', this.trackCurrentTime);\n    this.off('pause', this.stopTrackingCurrentTime);\n  };\n\n  /**\n   * Sets up an interval function to track current time and trigger `timeupdate` every\n   * 250 milliseconds.\n   *\n   * @listens Tech#play\n   * @triggers Tech#timeupdate\n   */\n\n\n  Tech.prototype.trackCurrentTime = function trackCurrentTime() {\n    if (this.currentTimeInterval) {\n      this.stopTrackingCurrentTime();\n    }\n    this.currentTimeInterval = this.setInterval(function () {\n      /**\n       * Triggered at an interval of 250ms to indicated that time is passing in the video.\n       *\n       * @event Tech#timeupdate\n       * @type {EventTarget~Event}\n       */\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n\n      // 42 = 24 fps // 250 is what Webkit uses // FF uses 15\n    }, 250);\n  };\n\n  /**\n   * Stop the interval function created in {@link Tech#trackCurrentTime} so that the\n   * `timeupdate` event is no longer triggered.\n   *\n   * @listens {Tech#pause}\n   */\n\n\n  Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {\n    this.clearInterval(this.currentTimeInterval);\n\n    // #1002 - if the video ends right before the next timeupdate would happen,\n    // the progress bar won't make it all the way to the end\n    this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n  };\n\n  /**\n   * Turn off all event polyfills, clear the `Tech`s {@link AudioTrackList},\n   * {@link VideoTrackList}, and {@link TextTrackList}, and dispose of this Tech.\n   *\n   * @fires Component#dispose\n   */\n\n\n  Tech.prototype.dispose = function dispose() {\n\n    // clear out all tracks because we can't reuse them between techs\n    this.clearTracks(NORMAL.names);\n\n    // Turn off any manual progress or timeupdate tracking\n    if (this.manualProgress) {\n      this.manualProgressOff();\n    }\n\n    if (this.manualTimeUpdates) {\n      this.manualTimeUpdatesOff();\n    }\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Clear out a single `TrackList` or an array of `TrackLists` given their names.\n   *\n   * > Note: Techs without source handlers should call this between sources for `video`\n   *         & `audio` tracks. You don't want to use them between tracks!\n   *\n   * @param {string[]|string} types\n   *        TrackList names to clear, valid names are `video`, `audio`, and\n   *        `text`.\n   */\n\n\n  Tech.prototype.clearTracks = function clearTracks(types) {\n    var _this2 = this;\n\n    types = [].concat(types);\n    // clear out all tracks because we can't reuse them between techs\n    types.forEach(function (type) {\n      var list = _this2[type + 'Tracks']() || [];\n      var i = list.length;\n\n      while (i--) {\n        var track = list[i];\n\n        if (type === 'text') {\n          _this2.removeRemoteTextTrack(track);\n        }\n        list.removeTrack(track);\n      }\n    });\n  };\n\n  /**\n   * Remove any TextTracks added via addRemoteTextTrack that are\n   * flagged for automatic garbage collection\n   */\n\n\n  Tech.prototype.cleanupAutoTextTracks = function cleanupAutoTextTracks() {\n    var list = this.autoRemoteTextTracks_ || [];\n    var i = list.length;\n\n    while (i--) {\n      var track = list[i];\n\n      this.removeRemoteTextTrack(track);\n    }\n  };\n\n  /**\n   * Reset the tech, which will removes all sources and reset the internal readyState.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.reset = function reset() {};\n\n  /**\n   * Get or set an error on the Tech.\n   *\n   * @param {MediaError} [err]\n   *        Error to set on the Tech\n   *\n   * @return {MediaError|null}\n   *         The current error object on the tech, or null if there isn't one.\n   */\n\n\n  Tech.prototype.error = function error(err) {\n    if (err !== undefined) {\n      this.error_ = new MediaError(err);\n      this.trigger('error');\n    }\n    return this.error_;\n  };\n\n  /**\n   * Returns the `TimeRange`s that have been played through for the current source.\n   *\n   * > NOTE: This implementation is incomplete. It does not track the played `TimeRange`.\n   *         It only checks wether the source has played at all or not.\n   *\n   * @return {TimeRange}\n   *         - A single time range if this video has played\n   *         - An empty set of ranges if not.\n   */\n\n\n  Tech.prototype.played = function played() {\n    if (this.hasStarted_) {\n      return createTimeRanges(0, 0);\n    }\n    return createTimeRanges();\n  };\n\n  /**\n   * Causes a manual time update to occur if {@link Tech#manualTimeUpdatesOn} was\n   * previously called.\n   *\n   * @fires Tech#timeupdate\n   */\n\n\n  Tech.prototype.setCurrentTime = function setCurrentTime() {\n    // improve the accuracy of manual timeupdates\n    if (this.manualTimeUpdates) {\n      /**\n       * A manual `timeupdate` event.\n       *\n       * @event Tech#timeupdate\n       * @type {EventTarget~Event}\n       */\n      this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    }\n  };\n\n  /**\n   * Turn on listeners for {@link VideoTrackList}, {@link {AudioTrackList}, and\n   * {@link TextTrackList} events.\n   *\n   * This adds {@link EventTarget~EventListeners} for `addtrack`, and  `removetrack`.\n   *\n   * @fires Tech#audiotrackchange\n   * @fires Tech#videotrackchange\n   * @fires Tech#texttrackchange\n   */\n\n\n  Tech.prototype.initTrackListeners = function initTrackListeners() {\n    var _this3 = this;\n\n    /**\n     * Triggered when tracks are added or removed on the Tech {@link AudioTrackList}\n     *\n     * @event Tech#audiotrackchange\n     * @type {EventTarget~Event}\n     */\n\n    /**\n     * Triggered when tracks are added or removed on the Tech {@link VideoTrackList}\n     *\n     * @event Tech#videotrackchange\n     * @type {EventTarget~Event}\n     */\n\n    /**\n     * Triggered when tracks are added or removed on the Tech {@link TextTrackList}\n     *\n     * @event Tech#texttrackchange\n     * @type {EventTarget~Event}\n     */\n    NORMAL.names.forEach(function (name) {\n      var props = NORMAL[name];\n      var trackListChanges = function trackListChanges() {\n        _this3.trigger(name + 'trackchange');\n      };\n\n      var tracks = _this3[props.getterName]();\n\n      tracks.addEventListener('removetrack', trackListChanges);\n      tracks.addEventListener('addtrack', trackListChanges);\n\n      _this3.on('dispose', function () {\n        tracks.removeEventListener('removetrack', trackListChanges);\n        tracks.removeEventListener('addtrack', trackListChanges);\n      });\n    });\n  };\n\n  /**\n   * Emulate TextTracks using vtt.js if necessary\n   *\n   * @fires Tech#vttjsloaded\n   * @fires Tech#vttjserror\n   */\n\n\n  Tech.prototype.addWebVttScript_ = function addWebVttScript_() {\n    var _this4 = this;\n\n    if (window_1.WebVTT) {\n      return;\n    }\n\n    // Initially, Tech.el_ is a child of a dummy-div wait until the Component system\n    // signals that the Tech is ready at which point Tech.el_ is part of the DOM\n    // before inserting the WebVTT script\n    if (document_1.body.contains(this.el())) {\n\n      // load via require if available and vtt.js script location was not passed in\n      // as an option. novtt builds will turn the above require call into an empty object\n      // which will cause this if check to always fail.\n      if (!this.options_['vtt.js'] && isPlain(browserIndex) && Object.keys(browserIndex).length > 0) {\n        this.trigger('vttjsloaded');\n        return;\n      }\n\n      // load vtt.js via the script location option or the cdn of no location was\n      // passed in\n      var script = document_1.createElement('script');\n\n      script.src = this.options_['vtt.js'] || 'https://vjs.zencdn.net/vttjs/0.12.4/vtt.min.js';\n      script.onload = function () {\n        /**\n         * Fired when vtt.js is loaded.\n         *\n         * @event Tech#vttjsloaded\n         * @type {EventTarget~Event}\n         */\n        _this4.trigger('vttjsloaded');\n      };\n      script.onerror = function () {\n        /**\n         * Fired when vtt.js was not loaded due to an error\n         *\n         * @event Tech#vttjsloaded\n         * @type {EventTarget~Event}\n         */\n        _this4.trigger('vttjserror');\n      };\n      this.on('dispose', function () {\n        script.onload = null;\n        script.onerror = null;\n      });\n      // but have not loaded yet and we set it to true before the inject so that\n      // we don't overwrite the injected window.WebVTT if it loads right away\n      window_1.WebVTT = true;\n      this.el().parentNode.appendChild(script);\n    } else {\n      this.ready(this.addWebVttScript_);\n    }\n  };\n\n  /**\n   * Emulate texttracks\n   *\n   */\n\n\n  Tech.prototype.emulateTextTracks = function emulateTextTracks() {\n    var _this5 = this;\n\n    var tracks = this.textTracks();\n    var remoteTracks = this.remoteTextTracks();\n    var handleAddTrack = function handleAddTrack(e) {\n      return tracks.addTrack(e.track);\n    };\n    var handleRemoveTrack = function handleRemoveTrack(e) {\n      return tracks.removeTrack(e.track);\n    };\n\n    remoteTracks.on('addtrack', handleAddTrack);\n    remoteTracks.on('removetrack', handleRemoveTrack);\n\n    this.addWebVttScript_();\n\n    var updateDisplay = function updateDisplay() {\n      return _this5.trigger('texttrackchange');\n    };\n\n    var textTracksChanges = function textTracksChanges() {\n      updateDisplay();\n\n      for (var i = 0; i < tracks.length; i++) {\n        var track = tracks[i];\n\n        track.removeEventListener('cuechange', updateDisplay);\n        if (track.mode === 'showing') {\n          track.addEventListener('cuechange', updateDisplay);\n        }\n      }\n    };\n\n    textTracksChanges();\n    tracks.addEventListener('change', textTracksChanges);\n    tracks.addEventListener('addtrack', textTracksChanges);\n    tracks.addEventListener('removetrack', textTracksChanges);\n\n    this.on('dispose', function () {\n      remoteTracks.off('addtrack', handleAddTrack);\n      remoteTracks.off('removetrack', handleRemoveTrack);\n      tracks.removeEventListener('change', textTracksChanges);\n      tracks.removeEventListener('addtrack', textTracksChanges);\n      tracks.removeEventListener('removetrack', textTracksChanges);\n\n      for (var i = 0; i < tracks.length; i++) {\n        var track = tracks[i];\n\n        track.removeEventListener('cuechange', updateDisplay);\n      }\n    });\n  };\n\n  /**\n   * Create and returns a remote {@link TextTrack} object.\n   *\n   * @param {string} kind\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n   *\n   * @param {string} [label]\n   *        Label to identify the text track\n   *\n   * @param {string} [language]\n   *        Two letter language abbreviation\n   *\n   * @return {TextTrack}\n   *         The TextTrack that gets created.\n   */\n\n\n  Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n    if (!kind) {\n      throw new Error('TextTrack kind is required but was not provided');\n    }\n\n    return createTrackHelper(this, kind, label, language);\n  };\n\n  /**\n   * Create an emulated TextTrack for use by addRemoteTextTrack\n   *\n   * This is intended to be overridden by classes that inherit from\n   * Tech in order to create native or custom TextTracks.\n   *\n   * @param {Object} options\n   *        The object should contain the options to initialize the TextTrack with.\n   *\n   * @param {string} [options.kind]\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata).\n   *\n   * @param {string} [options.label].\n   *        Label to identify the text track\n   *\n   * @param {string} [options.language]\n   *        Two letter language abbreviation.\n   *\n   * @return {HTMLTrackElement}\n   *         The track element that gets created.\n   */\n\n\n  Tech.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) {\n    var track = mergeOptions(options, {\n      tech: this\n    });\n\n    return new REMOTE.remoteTextEl.TrackClass(track);\n  };\n\n  /**\n   * Creates a remote text track object and returns an html track element.\n   *\n   * > Note: This can be an emulated {@link HTMLTrackElement} or a native one.\n   *\n   * @param {Object} options\n   *        See {@link Tech#createRemoteTextTrack} for more detailed properties.\n   *\n   * @param {boolean} [manualCleanup=true]\n   *        - When false: the TextTrack will be automatically removed from the video\n   *          element whenever the source changes\n   *        - When True: The TextTrack will have to be cleaned up manually\n   *\n   * @return {HTMLTrackElement}\n   *         An Html Track Element.\n   *\n   * @deprecated The default functionality for this function will be equivalent\n   *             to \"manualCleanup=false\" in the future. The manualCleanup parameter will\n   *             also be removed.\n   */\n\n\n  Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack() {\n    var _this6 = this;\n\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var manualCleanup = arguments[1];\n\n    var htmlTrackElement = this.createRemoteTextTrack(options);\n\n    if (manualCleanup !== true && manualCleanup !== false) {\n      // deprecation warning\n      log$1.warn('Calling addRemoteTextTrack without explicitly setting the \"manualCleanup\" parameter to `true` is deprecated and default to `false` in future version of video.js');\n      manualCleanup = true;\n    }\n\n    // store HTMLTrackElement and TextTrack to remote list\n    this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);\n    this.remoteTextTracks().addTrack(htmlTrackElement.track);\n\n    if (manualCleanup !== true) {\n      // create the TextTrackList if it doesn't exist\n      this.ready(function () {\n        return _this6.autoRemoteTextTracks_.addTrack(htmlTrackElement.track);\n      });\n    }\n\n    return htmlTrackElement;\n  };\n\n  /**\n   * Remove a remote text track from the remote `TextTrackList`.\n   *\n   * @param {TextTrack} track\n   *        `TextTrack` to remove from the `TextTrackList`\n   */\n\n\n  Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {\n    var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);\n\n    // remove HTMLTrackElement and TextTrack from remote list\n    this.remoteTextTrackEls().removeTrackElement_(trackElement);\n    this.remoteTextTracks().removeTrack(track);\n    this.autoRemoteTextTracks_.removeTrack(track);\n  };\n\n  /**\n   * Gets available media playback quality metrics as specified by the W3C's Media\n   * Playback Quality API.\n   *\n   * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n   *\n   * @return {Object}\n   *         An object with supported media playback quality metrics\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n    return {};\n  };\n\n  /**\n   * A method to set a poster from a `Tech`.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.setPoster = function setPoster() {};\n\n  /**\n   * A method to check for the presence of the 'playsinine' <video> attribute.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.playsinline = function playsinline() {};\n\n  /**\n   * A method to set or unset the 'playsinine' <video> attribute.\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.setPlaysinline = function setPlaysinline() {};\n\n  /*\n   * Check if the tech can support the given mime-type.\n   *\n   * The base tech does not support any type, but source handlers might\n   * overwrite this.\n   *\n   * @param  {string} type\n   *         The mimetype to check for support\n   *\n   * @return {string}\n   *         'probably', 'maybe', or empty string\n   *\n   * @see [Spec]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType}\n   *\n   * @abstract\n   */\n\n\n  Tech.prototype.canPlayType = function canPlayType() {\n    return '';\n  };\n\n  /**\n   * Check if the type is supported by this tech.\n   *\n   * The base tech does not support any type, but source handlers might\n   * overwrite this.\n   *\n   * @param {string} type\n   *        The media type to check\n   * @return {string} Returns the native video element's response\n   */\n\n\n  Tech.canPlayType = function canPlayType() {\n    return '';\n  };\n\n  /**\n   * Check if the tech can support the given source\n   * @param {Object} srcObj\n   *        The source object\n   * @param {Object} options\n   *        The options passed to the tech\n   * @return {string} 'probably', 'maybe', or '' (empty string)\n   */\n\n\n  Tech.canPlaySource = function canPlaySource(srcObj, options) {\n    return Tech.canPlayType(srcObj.type);\n  };\n\n  /*\n   * Return whether the argument is a Tech or not.\n   * Can be passed either a Class like `Html5` or a instance like `player.tech_`\n   *\n   * @param {Object} component\n   *        The item to check\n   *\n   * @return {boolean}\n   *         Whether it is a tech or not\n   *         - True if it is a tech\n   *         - False if it is not\n   */\n\n\n  Tech.isTech = function isTech(component) {\n    return component.prototype instanceof Tech || component instanceof Tech || component === Tech;\n  };\n\n  /**\n   * Registers a `Tech` into a shared list for videojs.\n   *\n   * @param {string} name\n   *        Name of the `Tech` to register.\n   *\n   * @param {Object} tech\n   *        The `Tech` class to register.\n   */\n\n\n  Tech.registerTech = function registerTech(name, tech) {\n    if (!Tech.techs_) {\n      Tech.techs_ = {};\n    }\n\n    if (!Tech.isTech(tech)) {\n      throw new Error('Tech ' + name + ' must be a Tech');\n    }\n\n    if (!Tech.canPlayType) {\n      throw new Error('Techs must have a static canPlayType method on them');\n    }\n    if (!Tech.canPlaySource) {\n      throw new Error('Techs must have a static canPlaySource method on them');\n    }\n\n    name = toTitleCase(name);\n\n    Tech.techs_[name] = tech;\n    if (name !== 'Tech') {\n      // camel case the techName for use in techOrder\n      Tech.defaultTechOrder_.push(name);\n    }\n    return tech;\n  };\n\n  /**\n   * Get a `Tech` from the shared list by name.\n   *\n   * @param {string} name\n   *        `camelCase` or `TitleCase` name of the Tech to get\n   *\n   * @return {Tech|undefined}\n   *         The `Tech` or undefined if there was no tech with the name requsted.\n   */\n\n\n  Tech.getTech = function getTech(name) {\n    if (!name) {\n      return;\n    }\n\n    name = toTitleCase(name);\n\n    if (Tech.techs_ && Tech.techs_[name]) {\n      return Tech.techs_[name];\n    }\n\n    if (window_1 && window_1.videojs && window_1.videojs[name]) {\n      log$1.warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)');\n      return window_1.videojs[name];\n    }\n  };\n\n  return Tech;\n}(Component);\n\n/**\n * Get the {@link VideoTrackList}\n *\n * @returns {VideoTrackList}\n * @method Tech.prototype.videoTracks\n */\n\n/**\n * Get the {@link AudioTrackList}\n *\n * @returns {AudioTrackList}\n * @method Tech.prototype.audioTracks\n */\n\n/**\n * Get the {@link TextTrackList}\n *\n * @returns {TextTrackList}\n * @method Tech.prototype.textTracks\n */\n\n/**\n * Get the remote element {@link TextTrackList}\n *\n * @returns {TextTrackList}\n * @method Tech.prototype.remoteTextTracks\n */\n\n/**\n * Get the remote element {@link HtmlTrackElementList}\n *\n * @returns {HtmlTrackElementList}\n * @method Tech.prototype.remoteTextTrackEls\n */\n\nALL.names.forEach(function (name) {\n  var props = ALL[name];\n\n  Tech.prototype[props.getterName] = function () {\n    this[props.privateName] = this[props.privateName] || new props.ListClass();\n    return this[props.privateName];\n  };\n});\n\n/**\n * List of associated text tracks\n *\n * @type {TextTrackList}\n * @private\n * @property Tech#textTracks_\n */\n\n/**\n * List of associated audio tracks.\n *\n * @type {AudioTrackList}\n * @private\n * @property Tech#audioTracks_\n */\n\n/**\n * List of associated video tracks.\n *\n * @type {VideoTrackList}\n * @private\n * @property Tech#videoTracks_\n */\n\n/**\n * Boolean indicating wether the `Tech` supports volume control.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresVolumeControl = true;\n\n/**\n * Boolean indicating wether the `Tech` support fullscreen resize control.\n * Resizing plugins using request fullscreen reloads the plugin\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresFullscreenResize = false;\n\n/**\n * Boolean indicating wether the `Tech` supports changing the speed at which the video\n * plays. Examples:\n *   - Set player to play 2x (twice) as fast\n *   - Set player to play 0.5x (half) as fast\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresPlaybackRate = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `progress` event. This is currently\n * not triggered by video-js-swf. This will be used to determine if\n * {@link Tech#manualProgressOn} should be called.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresProgressEvents = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the `timeupdate` event. This is currently\n * not triggered by video-js-swf. This will be used to determine if\n * {@link Tech#manualTimeUpdates} should be called.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresTimeupdateEvents = false;\n\n/**\n * Boolean indicating wether the `Tech` supports the native `TextTrack`s.\n * This will help us integrate with native `TextTrack`s if the browser supports them.\n *\n * @type {boolean}\n * @default\n */\nTech.prototype.featuresNativeTextTracks = false;\n\n/**\n * A functional mixin for techs that want to use the Source Handler pattern.\n * Source handlers are scripts for handling specific formats.\n * The source handler pattern is used for adaptive formats (HLS, DASH) that\n * manually load video data and feed it into a Source Buffer (Media Source Extensions)\n * Example: `Tech.withSourceHandlers.call(MyTech);`\n *\n * @param {Tech} _Tech\n *        The tech to add source handler functions to.\n *\n * @mixes Tech~SourceHandlerAdditions\n */\nTech.withSourceHandlers = function (_Tech) {\n\n  /**\n   * Register a source handler\n   *\n   * @param {Function} handler\n   *        The source handler class\n   *\n   * @param {number} [index]\n   *        Register it at the following index\n   */\n  _Tech.registerSourceHandler = function (handler, index) {\n    var handlers = _Tech.sourceHandlers;\n\n    if (!handlers) {\n      handlers = _Tech.sourceHandlers = [];\n    }\n\n    if (index === undefined) {\n      // add to the end of the list\n      index = handlers.length;\n    }\n\n    handlers.splice(index, 0, handler);\n  };\n\n  /**\n   * Check if the tech can support the given type. Also checks the\n   * Techs sourceHandlers.\n   *\n   * @param {string} type\n   *         The mimetype to check.\n   *\n   * @return {string}\n   *         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlayType = function (type) {\n    var handlers = _Tech.sourceHandlers || [];\n    var can = void 0;\n\n    for (var i = 0; i < handlers.length; i++) {\n      can = handlers[i].canPlayType(type);\n\n      if (can) {\n        return can;\n      }\n    }\n\n    return '';\n  };\n\n  /**\n   * Returns the first source handler that supports the source.\n   *\n   * TODO: Answer question: should 'probably' be prioritized over 'maybe'\n   *\n   * @param {Tech~SourceObject} source\n   *        The source object\n   *\n   * @param {Object} options\n   *        The options passed to the tech\n   *\n   * @return {SourceHandler|null}\n   *          The first source handler that supports the source or null if\n   *          no SourceHandler supports the source\n   */\n  _Tech.selectSourceHandler = function (source, options) {\n    var handlers = _Tech.sourceHandlers || [];\n    var can = void 0;\n\n    for (var i = 0; i < handlers.length; i++) {\n      can = handlers[i].canHandleSource(source, options);\n\n      if (can) {\n        return handlers[i];\n      }\n    }\n\n    return null;\n  };\n\n  /**\n   * Check if the tech can support the given source.\n   *\n   * @param {Tech~SourceObject} srcObj\n   *        The source object\n   *\n   * @param {Object} options\n   *        The options passed to the tech\n   *\n   * @return {string}\n   *         'probably', 'maybe', or '' (empty string)\n   */\n  _Tech.canPlaySource = function (srcObj, options) {\n    var sh = _Tech.selectSourceHandler(srcObj, options);\n\n    if (sh) {\n      return sh.canHandleSource(srcObj, options);\n    }\n\n    return '';\n  };\n\n  /**\n   * When using a source handler, prefer its implementation of\n   * any function normally provided by the tech.\n   */\n  var deferrable = ['seekable', 'duration'];\n\n  /**\n   * A wrapper around {@link Tech#seekable} that will call a `SourceHandler`s seekable\n   * function if it exists, with a fallback to the Techs seekable function.\n   *\n   * @method _Tech.seekable\n   */\n\n  /**\n   * A wrapper around {@link Tech#duration} that will call a `SourceHandler`s duration\n   * function if it exists, otherwise it will fallback to the techs duration function.\n   *\n   * @method _Tech.duration\n   */\n\n  deferrable.forEach(function (fnName) {\n    var originalFn = this[fnName];\n\n    if (typeof originalFn !== 'function') {\n      return;\n    }\n\n    this[fnName] = function () {\n      if (this.sourceHandler_ && this.sourceHandler_[fnName]) {\n        return this.sourceHandler_[fnName].apply(this.sourceHandler_, arguments);\n      }\n      return originalFn.apply(this, arguments);\n    };\n  }, _Tech.prototype);\n\n  /**\n   * Create a function for setting the source using a source object\n   * and source handlers.\n   * Should never be called unless a source handler was found.\n   *\n   * @param {Tech~SourceObject} source\n   *        A source object with src and type keys\n   */\n  _Tech.prototype.setSource = function (source) {\n    var sh = _Tech.selectSourceHandler(source, this.options_);\n\n    if (!sh) {\n      // Fall back to a native source hander when unsupported sources are\n      // deliberately set\n      if (_Tech.nativeSourceHandler) {\n        sh = _Tech.nativeSourceHandler;\n      } else {\n        log$1.error('No source hander found for the current source.');\n      }\n    }\n\n    // Dispose any existing source handler\n    this.disposeSourceHandler();\n    this.off('dispose', this.disposeSourceHandler);\n\n    if (sh !== _Tech.nativeSourceHandler) {\n      this.currentSource_ = source;\n    }\n\n    this.sourceHandler_ = sh.handleSource(source, this, this.options_);\n    this.on('dispose', this.disposeSourceHandler);\n  };\n\n  /**\n   * Clean up any existing SourceHandlers and listeners when the Tech is disposed.\n   *\n   * @listens Tech#dispose\n   */\n  _Tech.prototype.disposeSourceHandler = function () {\n    // if we have a source and get another one\n    // then we are loading something new\n    // than clear all of our current tracks\n    if (this.currentSource_) {\n      this.clearTracks(['audio', 'video']);\n      this.currentSource_ = null;\n    }\n\n    // always clean up auto-text tracks\n    this.cleanupAutoTextTracks();\n\n    if (this.sourceHandler_) {\n\n      if (this.sourceHandler_.dispose) {\n        this.sourceHandler_.dispose();\n      }\n\n      this.sourceHandler_ = null;\n    }\n  };\n};\n\n// The base Tech class needs to be registered as a Component. It is the only\n// Tech that can be registered as a Component.\nComponent.registerComponent('Tech', Tech);\nTech.registerTech('Tech', Tech);\n\n/**\n * A list of techs that should be added to techOrder on Players\n *\n * @private\n */\nTech.defaultTechOrder_ = [];\n\nvar middlewares = {};\n\nfunction use(type, middleware) {\n  middlewares[type] = middlewares[type] || [];\n  middlewares[type].push(middleware);\n}\n\n\n\nfunction setSource(player, src, next) {\n  player.setTimeout(function () {\n    return setSourceHelper(src, middlewares[src.type], next, player);\n  }, 1);\n}\n\nfunction setTech(middleware, tech) {\n  middleware.forEach(function (mw) {\n    return mw.setTech && mw.setTech(tech);\n  });\n}\n\nfunction get$1(middleware, tech, method) {\n  return middleware.reduceRight(middlewareIterator(method), tech[method]());\n}\n\nfunction set$1(middleware, tech, method, arg) {\n  return tech[method](middleware.reduce(middlewareIterator(method), arg));\n}\n\nvar allowedGetters = {\n  buffered: 1,\n  currentTime: 1,\n  duration: 1,\n  seekable: 1,\n  played: 1\n};\n\nvar allowedSetters = {\n  setCurrentTime: 1\n};\n\nfunction middlewareIterator(method) {\n  return function (value, mw) {\n    if (mw[method]) {\n      return mw[method](value);\n    }\n\n    return value;\n  };\n}\n\nfunction setSourceHelper() {\n  var src = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var middleware = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var next = arguments[2];\n  var player = arguments[3];\n  var acc = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];\n  var lastRun = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n  var mwFactory = middleware[0],\n      mwrest = middleware.slice(1);\n\n  // if mwFactory is a string, then we're at a fork in the road\n\n  if (typeof mwFactory === 'string') {\n    setSourceHelper(src, middlewares[mwFactory], next, player, acc, lastRun);\n\n    // if we have an mwFactory, call it with the player to get the mw,\n    // then call the mw's setSource method\n  } else if (mwFactory) {\n    var mw = mwFactory(player);\n\n    mw.setSource(assign({}, src), function (err, _src) {\n\n      // something happened, try the next middleware on the current level\n      // make sure to use the old src\n      if (err) {\n        return setSourceHelper(src, mwrest, next, player, acc, lastRun);\n      }\n\n      // we've succeeded, now we need to go deeper\n      acc.push(mw);\n\n      // if it's the same time, continue does the current chain\n      // otherwise, we want to go down the new chain\n      setSourceHelper(_src, src.type === _src.type ? mwrest : middlewares[_src.type], next, player, acc, lastRun);\n    });\n  } else if (mwrest.length) {\n    setSourceHelper(src, mwrest, next, player, acc, lastRun);\n  } else if (lastRun) {\n    next(src, acc);\n  } else {\n    setSourceHelper(src, middlewares['*'], next, player, acc, true);\n  }\n}\n\n/**\n * @module filter-source\n */\n/**\n * Filter out single bad source objects or multiple source objects in an\n * array. Also flattens nested source object arrays into a 1 dimensional\n * array of source objects.\n *\n * @param {Tech~SourceObject|Tech~SourceObject[]} src\n *        The src object to filter\n *\n * @return {Tech~SourceObject[]}\n *         An array of sourceobjects containing only valid sources\n *\n * @private\n */\nvar filterSource = function filterSource(src) {\n  // traverse array\n  if (Array.isArray(src)) {\n    var newsrc = [];\n\n    src.forEach(function (srcobj) {\n      srcobj = filterSource(srcobj);\n\n      if (Array.isArray(srcobj)) {\n        newsrc = newsrc.concat(srcobj);\n      } else if (isObject(srcobj)) {\n        newsrc.push(srcobj);\n      }\n    });\n\n    src = newsrc;\n  } else if (typeof src === 'string' && src.trim()) {\n    // convert string into object\n    src = [{ src: src }];\n  } else if (isObject(src) && typeof src.src === 'string' && src.src && src.src.trim()) {\n    // src is already valid\n    src = [src];\n  } else {\n    // invalid source, turn it into an empty array\n    src = [];\n  }\n\n  return src;\n};\n\n/**\n * @file loader.js\n */\n/**\n * The `MediaLoader` is the `Component` that decides which playback technology to load\n * when a player is initialized.\n *\n * @extends Component\n */\n\nvar MediaLoader = function (_Component) {\n  inherits(MediaLoader, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should attach to.\n   *\n   * @param {Object} [options]\n   *        The key/value stroe of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function that is run when this component is ready.\n   */\n  function MediaLoader(player, options, ready) {\n    classCallCheck(this, MediaLoader);\n\n    // MediaLoader has no element\n    var options_ = mergeOptions({ createEl: false }, options);\n\n    // If there are no sources when the player is initialized,\n    // load the first supported playback technology.\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options_, ready));\n\n    if (!options.playerOptions.sources || options.playerOptions.sources.length === 0) {\n      for (var i = 0, j = options.playerOptions.techOrder; i < j.length; i++) {\n        var techName = toTitleCase(j[i]);\n        var tech = Tech.getTech(techName);\n\n        // Support old behavior of techs being registered as components.\n        // Remove once that deprecated behavior is removed.\n        if (!techName) {\n          tech = Component.getComponent(techName);\n        }\n\n        // Check if the browser supports this technology\n        if (tech && tech.isSupported()) {\n          player.loadTech_(techName);\n          break;\n        }\n      }\n    } else {\n      // Loop through playback technologies (HTML5, Flash) and check for support.\n      // Then load the best source.\n      // A few assumptions here:\n      //   All playback technologies respect preload false.\n      player.src(options.playerOptions.sources);\n    }\n    return _this;\n  }\n\n  return MediaLoader;\n}(Component);\n\nComponent.registerComponent('MediaLoader', MediaLoader);\n\n/**\n * @file button.js\n */\n/**\n * Clickable Component which is clickable or keyboard actionable,\n * but is not a native HTML button.\n *\n * @extends Component\n */\n\nvar ClickableComponent = function (_Component) {\n  inherits(ClickableComponent, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param  {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param  {Object} [options]\n   *         The key/value store of player options.\n   */\n  function ClickableComponent(player, options) {\n    classCallCheck(this, ClickableComponent);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.emitTapEvents();\n\n    _this.enable();\n    return _this;\n  }\n\n  /**\n   * Create the `Component`s DOM element.\n   *\n   * @param {string} [tag=div]\n   *        The element's node type.\n   *\n   * @param {Object} [props={}]\n   *        An object of properties that should be set on the element.\n   *\n   * @param {Object} [attributes={}]\n   *        An object of attributes that should be set on the element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  ClickableComponent.prototype.createEl = function createEl$$1() {\n    var tag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'div';\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    props = assign({\n      innerHTML: '<span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>',\n      className: this.buildCSSClass(),\n      tabIndex: 0\n    }, props);\n\n    if (tag === 'button') {\n      log$1.error('Creating a ClickableComponent with an HTML element of ' + tag + ' is not supported; use a Button instead.');\n    }\n\n    // Add ARIA attributes for clickable element which is not a native HTML button\n    attributes = assign({\n      'role': 'button',\n\n      // let the screen reader user know that the text of the element may change\n      'aria-live': 'polite'\n    }, attributes);\n\n    this.tabIndex_ = props.tabIndex;\n\n    var el = _Component.prototype.createEl.call(this, tag, props, attributes);\n\n    this.createControlTextEl(el);\n\n    return el;\n  };\n\n  ClickableComponent.prototype.dispose = function dispose() {\n    // remove controlTextEl_ on dipose\n    this.controlTextEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create a control text element on this `Component`\n   *\n   * @param {Element} [el]\n   *        Parent element for the control text.\n   *\n   * @return {Element}\n   *         The control text element that gets created.\n   */\n\n\n  ClickableComponent.prototype.createControlTextEl = function createControlTextEl(el) {\n    this.controlTextEl_ = createEl('span', {\n      className: 'vjs-control-text'\n    });\n\n    if (el) {\n      el.appendChild(this.controlTextEl_);\n    }\n\n    this.controlText(this.controlText_, el);\n\n    return this.controlTextEl_;\n  };\n\n  /**\n   * Get or set the localize text to use for the controls on the `Component`.\n   *\n   * @param {string} [text]\n   *        Control text for element.\n   *\n   * @param {Element} [el=this.el()]\n   *        Element to set the title on.\n   *\n   * @return {string}\n   *         - The control text when getting\n   */\n\n\n  ClickableComponent.prototype.controlText = function controlText(text) {\n    var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.el();\n\n    if (text === undefined) {\n      return this.controlText_ || 'Need Text';\n    }\n\n    var localizedText = this.localize(text);\n\n    this.controlText_ = text;\n    textContent(this.controlTextEl_, localizedText);\n    if (!this.nonIconControl) {\n      // Set title attribute if only an icon is shown\n      el.setAttribute('title', localizedText);\n    }\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  ClickableComponent.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Enable this `Component`s element.\n   */\n\n\n  ClickableComponent.prototype.enable = function enable() {\n    if (!this.enabled_) {\n      this.enabled_ = true;\n      this.removeClass('vjs-disabled');\n      this.el_.setAttribute('aria-disabled', 'false');\n      if (typeof this.tabIndex_ !== 'undefined') {\n        this.el_.setAttribute('tabIndex', this.tabIndex_);\n      }\n      this.on(['tap', 'click'], this.handleClick);\n      this.on('focus', this.handleFocus);\n      this.on('blur', this.handleBlur);\n    }\n  };\n\n  /**\n   * Disable this `Component`s element.\n   */\n\n\n  ClickableComponent.prototype.disable = function disable() {\n    this.enabled_ = false;\n    this.addClass('vjs-disabled');\n    this.el_.setAttribute('aria-disabled', 'true');\n    if (typeof this.tabIndex_ !== 'undefined') {\n      this.el_.removeAttribute('tabIndex');\n    }\n    this.off(['tap', 'click'], this.handleClick);\n    this.off('focus', this.handleFocus);\n    this.off('blur', this.handleBlur);\n  };\n\n  /**\n   * This gets called when a `ClickableComponent` gets:\n   * - Clicked (via the `click` event, listening starts in the constructor)\n   * - Tapped (via the `tap` event, listening starts in the constructor)\n   * - The following things happen in order:\n   *   1. {@link ClickableComponent#handleFocus} is called via a `focus` event on the\n   *      `ClickableComponent`.\n   *   2. {@link ClickableComponent#handleFocus} adds a listener for `keydown` on using\n   *      {@link ClickableComponent#handleKeyPress}.\n   *   3. `ClickableComponent` has not had a `blur` event (`blur` means that focus was lost). The user presses\n   *      the space or enter key.\n   *   4. {@link ClickableComponent#handleKeyPress} calls this function with the `keydown`\n   *      event as a parameter.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   * @abstract\n   */\n\n\n  ClickableComponent.prototype.handleClick = function handleClick(event) {};\n\n  /**\n   * This gets called when a `ClickableComponent` gains focus via a `focus` event.\n   * Turns on listening for `keydown` events. When they happen it\n   * calls `this.handleKeyPress`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `focus` event that caused this function to be called.\n   *\n   * @listens focus\n   */\n\n\n  ClickableComponent.prototype.handleFocus = function handleFocus(event) {\n    on(document_1, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  /**\n   * Called when this ClickableComponent has focus and a key gets pressed down. By\n   * default it will call `this.handleClick` when the key is space or enter.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called.\n   *\n   * @listens keydown\n   */\n\n\n  ClickableComponent.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Support Space (32) or Enter (13) key operation to fire a click event\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.trigger('click');\n    } else if (_Component.prototype.handleKeyPress) {\n\n      // Pass keypress handling up for unsupported keys\n      _Component.prototype.handleKeyPress.call(this, event);\n    }\n  };\n\n  /**\n   * Called when a `ClickableComponent` loses focus. Turns off the listener for\n   * `keydown` events. Which Stops `this.handleKeyPress` from getting called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `blur` event that caused this function to be called.\n   *\n   * @listens blur\n   */\n\n\n  ClickableComponent.prototype.handleBlur = function handleBlur(event) {\n    off(document_1, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  return ClickableComponent;\n}(Component);\n\nComponent.registerComponent('ClickableComponent', ClickableComponent);\n\n/**\n * @file poster-image.js\n */\n/**\n * A `ClickableComponent` that handles showing the poster image for the player.\n *\n * @extends ClickableComponent\n */\n\nvar PosterImage = function (_ClickableComponent) {\n  inherits(PosterImage, _ClickableComponent);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should attach to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PosterImage(player, options) {\n    classCallCheck(this, PosterImage);\n\n    var _this = possibleConstructorReturn(this, _ClickableComponent.call(this, player, options));\n\n    _this.update();\n    player.on('posterchange', bind(_this, _this.update));\n    return _this;\n  }\n\n  /**\n   * Clean up and dispose of the `PosterImage`.\n   */\n\n\n  PosterImage.prototype.dispose = function dispose() {\n    this.player().off('posterchange', this.update);\n    _ClickableComponent.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create the `PosterImage`s DOM element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  PosterImage.prototype.createEl = function createEl$$1() {\n    var el = createEl('div', {\n      className: 'vjs-poster',\n\n      // Don't want poster to be tabbable.\n      tabIndex: -1\n    });\n\n    // To ensure the poster image resizes while maintaining its original aspect\n    // ratio, use a div with `background-size` when available. For browsers that\n    // do not support `background-size` (e.g. IE8), fall back on using a regular\n    // img element.\n    if (!BACKGROUND_SIZE_SUPPORTED) {\n      this.fallbackImg_ = createEl('img');\n      el.appendChild(this.fallbackImg_);\n    }\n\n    return el;\n  };\n\n  /**\n   * An {@link EventTarget~EventListener} for {@link Player#posterchange} events.\n   *\n   * @listens Player#posterchange\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `Player#posterchange` event that triggered this function.\n   */\n\n\n  PosterImage.prototype.update = function update(event) {\n    var url = this.player().poster();\n\n    this.setSrc(url);\n\n    // If there's no poster source we should display:none on this component\n    // so it's not still clickable or right-clickable\n    if (url) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  };\n\n  /**\n   * Set the source of the `PosterImage` depending on the display method.\n   *\n   * @param {string} url\n   *        The URL to the source for the `PosterImage`.\n   */\n\n\n  PosterImage.prototype.setSrc = function setSrc(url) {\n    if (this.fallbackImg_) {\n      this.fallbackImg_.src = url;\n    } else {\n      var backgroundImage = '';\n\n      // Any falsey values should stay as an empty string, otherwise\n      // this will throw an extra error\n      if (url) {\n        backgroundImage = 'url(\"' + url + '\")';\n      }\n\n      this.el_.style.backgroundImage = backgroundImage;\n    }\n  };\n\n  /**\n   * An {@link EventTarget~EventListener} for clicks on the `PosterImage`. See\n   * {@link ClickableComponent#handleClick} for instances where this will be triggered.\n   *\n   * @listens tap\n   * @listens click\n   * @listens keydown\n   *\n   * @param {EventTarget~Event} event\n   +        The `click`, `tap` or `keydown` event that caused this function to be called.\n   */\n\n\n  PosterImage.prototype.handleClick = function handleClick(event) {\n    // We don't want a click to trigger playback when controls are disabled\n    if (!this.player_.controls()) {\n      return;\n    }\n\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  };\n\n  return PosterImage;\n}(ClickableComponent);\n\nComponent.registerComponent('PosterImage', PosterImage);\n\n/**\n * @file text-track-display.js\n */\nvar darkGray = '#222';\nvar lightGray = '#ccc';\nvar fontMap = {\n  monospace: 'monospace',\n  sansSerif: 'sans-serif',\n  serif: 'serif',\n  monospaceSansSerif: '\"Andale Mono\", \"Lucida Console\", monospace',\n  monospaceSerif: '\"Courier New\", monospace',\n  proportionalSansSerif: 'sans-serif',\n  proportionalSerif: 'serif',\n  casual: '\"Comic Sans MS\", Impact, fantasy',\n  script: '\"Monotype Corsiva\", cursive',\n  smallcaps: '\"Andale Mono\", \"Lucida Console\", monospace, sans-serif'\n};\n\n/**\n * Construct an rgba color from a given hex color code.\n *\n * @param {number} color\n *        Hex number for color, like #f0e.\n *\n * @param {number} opacity\n *        Value for opacity, 0.0 - 1.0.\n *\n * @return {string}\n *         The rgba color that was created, like 'rgba(255, 0, 0, 0.3)'.\n *\n * @private\n */\nfunction constructColor(color, opacity) {\n  return 'rgba(' +\n  // color looks like \"#f0e\"\n  parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')';\n}\n\n/**\n * Try to update the style of a DOM element. Some style changes will throw an error,\n * particularly in IE8. Those should be noops.\n *\n * @param {Element} el\n *        The DOM element to be styled.\n *\n * @param {string} style\n *        The CSS property on the element that should be styled.\n *\n * @param {string} rule\n *        The style rule that should be applied to the property.\n *\n * @private\n */\nfunction tryUpdateStyle(el, style, rule) {\n  try {\n    el.style[style] = rule;\n  } catch (e) {\n\n    // Satisfies linter.\n    return;\n  }\n}\n\n/**\n * The component for displaying text track cues.\n *\n * @extends Component\n */\n\nvar TextTrackDisplay = function (_Component) {\n  inherits(TextTrackDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when `TextTrackDisplay` is ready.\n   */\n  function TextTrackDisplay(player, options, ready) {\n    classCallCheck(this, TextTrackDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options, ready));\n\n    player.on('loadstart', bind(_this, _this.toggleDisplay));\n    player.on('texttrackchange', bind(_this, _this.updateDisplay));\n    player.on('loadstart', bind(_this, _this.preselectTrack));\n\n    // This used to be called during player init, but was causing an error\n    // if a track should show by default and the display hadn't loaded yet.\n    // Should probably be moved to an external track loader when we support\n    // tracks that don't need a display.\n    player.ready(bind(_this, function () {\n      if (player.tech_ && player.tech_.featuresNativeTextTracks) {\n        this.hide();\n        return;\n      }\n\n      player.on('fullscreenchange', bind(this, this.updateDisplay));\n\n      var tracks = this.options_.playerOptions.tracks || [];\n\n      for (var i = 0; i < tracks.length; i++) {\n        this.player_.addRemoteTextTrack(tracks[i], true);\n      }\n\n      this.preselectTrack();\n    }));\n    return _this;\n  }\n\n  /**\n  * Preselect a track following this precedence:\n  * - matches the previously selected {@link TextTrack}'s language and kind\n  * - matches the previously selected {@link TextTrack}'s language only\n  * - is the first default captions track\n  * - is the first default descriptions track\n  *\n  * @listens Player#loadstart\n  */\n\n\n  TextTrackDisplay.prototype.preselectTrack = function preselectTrack() {\n    var modes = { captions: 1, subtitles: 1 };\n    var trackList = this.player_.textTracks();\n    var userPref = this.player_.cache_.selectedLanguage;\n    var firstDesc = void 0;\n    var firstCaptions = void 0;\n    var preferredTrack = void 0;\n\n    for (var i = 0; i < trackList.length; i++) {\n      var track = trackList[i];\n\n      if (userPref && userPref.enabled && userPref.language === track.language) {\n        // Always choose the track that matches both language and kind\n        if (track.kind === userPref.kind) {\n          preferredTrack = track;\n          // or choose the first track that matches language\n        } else if (!preferredTrack) {\n          preferredTrack = track;\n        }\n\n        // clear everything if offTextTrackMenuItem was clicked\n      } else if (userPref && !userPref.enabled) {\n        preferredTrack = null;\n        firstDesc = null;\n        firstCaptions = null;\n      } else if (track['default']) {\n        if (track.kind === 'descriptions' && !firstDesc) {\n          firstDesc = track;\n        } else if (track.kind in modes && !firstCaptions) {\n          firstCaptions = track;\n        }\n      }\n    }\n\n    // The preferredTrack matches the user preference and takes\n    // precendence over all the other tracks.\n    // So, display the preferredTrack before the first default track\n    // and the subtitles/captions track before the descriptions track\n    if (preferredTrack) {\n      preferredTrack.mode = 'showing';\n    } else if (firstCaptions) {\n      firstCaptions.mode = 'showing';\n    } else if (firstDesc) {\n      firstDesc.mode = 'showing';\n    }\n  };\n\n  /**\n   * Turn display of {@link TextTrack}'s from the current state into the other state.\n   * There are only two states:\n   * - 'shown'\n   * - 'hidden'\n   *\n   * @listens Player#loadstart\n   */\n\n\n  TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {\n    if (this.player_.tech_ && this.player_.tech_.featuresNativeTextTracks) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  };\n\n  /**\n   * Create the {@link Component}'s DOM element.\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  TextTrackDisplay.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-text-track-display'\n    }, {\n      'aria-live': 'off',\n      'aria-atomic': 'true'\n    });\n  };\n\n  /**\n   * Clear all displayed {@link TextTrack}s.\n   */\n\n\n  TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {\n    if (typeof window_1.WebVTT === 'function') {\n      window_1.WebVTT.processCues(window_1, [], this.el_);\n    }\n  };\n\n  /**\n   * Update the displayed TextTrack when a either a {@link Player#texttrackchange} or\n   * a {@link Player#fullscreenchange} is fired.\n   *\n   * @listens Player#texttrackchange\n   * @listens Player#fullscreenchange\n   */\n\n\n  TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {\n    var tracks = this.player_.textTracks();\n\n    this.clearDisplay();\n\n    // Track display prioritization model: if multiple tracks are 'showing',\n    //  display the first 'subtitles' or 'captions' track which is 'showing',\n    //  otherwise display the first 'descriptions' track which is 'showing'\n\n    var descriptionsTrack = null;\n    var captionsSubtitlesTrack = null;\n    var i = tracks.length;\n\n    while (i--) {\n      var track = tracks[i];\n\n      if (track.mode === 'showing') {\n        if (track.kind === 'descriptions') {\n          descriptionsTrack = track;\n        } else {\n          captionsSubtitlesTrack = track;\n        }\n      }\n    }\n\n    if (captionsSubtitlesTrack) {\n      if (this.getAttribute('aria-live') !== 'off') {\n        this.setAttribute('aria-live', 'off');\n      }\n      this.updateForTrack(captionsSubtitlesTrack);\n    } else if (descriptionsTrack) {\n      if (this.getAttribute('aria-live') !== 'assertive') {\n        this.setAttribute('aria-live', 'assertive');\n      }\n      this.updateForTrack(descriptionsTrack);\n    }\n  };\n\n  /**\n   * Add an {@link Texttrack} to to the {@link Tech}s {@link TextTrackList}.\n   *\n   * @param {TextTrack} track\n   *        Text track object to be added to the list.\n   */\n\n\n  TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {\n    if (typeof window_1.WebVTT !== 'function' || !track.activeCues) {\n      return;\n    }\n\n    var overrides = this.player_.textTrackSettings.getValues();\n    var cues = [];\n\n    for (var _i = 0; _i < track.activeCues.length; _i++) {\n      cues.push(track.activeCues[_i]);\n    }\n\n    window_1.WebVTT.processCues(window_1, cues, this.el_);\n\n    var i = cues.length;\n\n    while (i--) {\n      var cue = cues[i];\n\n      if (!cue) {\n        continue;\n      }\n\n      var cueDiv = cue.displayState;\n\n      if (overrides.color) {\n        cueDiv.firstChild.style.color = overrides.color;\n      }\n      if (overrides.textOpacity) {\n        tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));\n      }\n      if (overrides.backgroundColor) {\n        cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;\n      }\n      if (overrides.backgroundOpacity) {\n        tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));\n      }\n      if (overrides.windowColor) {\n        if (overrides.windowOpacity) {\n          tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));\n        } else {\n          cueDiv.style.backgroundColor = overrides.windowColor;\n        }\n      }\n      if (overrides.edgeStyle) {\n        if (overrides.edgeStyle === 'dropshadow') {\n          cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;\n        } else if (overrides.edgeStyle === 'raised') {\n          cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;\n        } else if (overrides.edgeStyle === 'depressed') {\n          cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;\n        } else if (overrides.edgeStyle === 'uniform') {\n          cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;\n        }\n      }\n      if (overrides.fontPercent && overrides.fontPercent !== 1) {\n        var fontSize = window_1.parseFloat(cueDiv.style.fontSize);\n\n        cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';\n        cueDiv.style.height = 'auto';\n        cueDiv.style.top = 'auto';\n        cueDiv.style.bottom = '2px';\n      }\n      if (overrides.fontFamily && overrides.fontFamily !== 'default') {\n        if (overrides.fontFamily === 'small-caps') {\n          cueDiv.firstChild.style.fontVariant = 'small-caps';\n        } else {\n          cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];\n        }\n      }\n    }\n  };\n\n  return TextTrackDisplay;\n}(Component);\n\nComponent.registerComponent('TextTrackDisplay', TextTrackDisplay);\n\n/**\n * @file loading-spinner.js\n */\n/**\n * A loading spinner for use during waiting/loading events.\n *\n * @extends Component\n */\n\nvar LoadingSpinner = function (_Component) {\n  inherits(LoadingSpinner, _Component);\n\n  function LoadingSpinner() {\n    classCallCheck(this, LoadingSpinner);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the `LoadingSpinner`s DOM element.\n   *\n   * @return {Element}\n   *         The dom element that gets created.\n   */\n  LoadingSpinner.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-loading-spinner',\n      dir: 'ltr'\n    });\n  };\n\n  return LoadingSpinner;\n}(Component);\n\nComponent.registerComponent('LoadingSpinner', LoadingSpinner);\n\n/**\n * @file button.js\n */\n/**\n * Base class for all buttons.\n *\n * @extends ClickableComponent\n */\n\nvar Button = function (_ClickableComponent) {\n  inherits(Button, _ClickableComponent);\n\n  function Button() {\n    classCallCheck(this, Button);\n    return possibleConstructorReturn(this, _ClickableComponent.apply(this, arguments));\n  }\n\n  /**\n   * Create the `Button`s DOM element.\n   *\n   * @param {string} [tag=\"button\"]\n   *        The element's node type. This argument is IGNORED: no matter what\n   *        is passed, it will always create a `button` element.\n   *\n   * @param {Object} [props={}]\n   *        An object of properties that should be set on the element.\n   *\n   * @param {Object} [attributes={}]\n   *        An object of attributes that should be set on the element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n  Button.prototype.createEl = function createEl(tag) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    tag = 'button';\n\n    props = assign({\n      innerHTML: '<span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>',\n      className: this.buildCSSClass()\n    }, props);\n\n    // Add attributes for button element\n    attributes = assign({\n\n      // Necessary since the default button type is \"submit\"\n      'type': 'button',\n\n      // let the screen reader user know that the text of the button may change\n      'aria-live': 'polite'\n    }, attributes);\n\n    var el = Component.prototype.createEl.call(this, tag, props, attributes);\n\n    this.createControlTextEl(el);\n\n    return el;\n  };\n\n  /**\n   * Add a child `Component` inside of this `Button`.\n   *\n   * @param {string|Component} child\n   *        The name or instance of a child to add.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of options that will get passed to children of\n   *        the child.\n   *\n   * @return {Component}\n   *         The `Component` that gets added as a child. When using a string the\n   *         `Component` will get created by this process.\n   *\n   * @deprecated since version 5\n   */\n\n\n  Button.prototype.addChild = function addChild(child) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    var className = this.constructor.name;\n\n    log$1.warn('Adding an actionable (user controllable) child to a Button (' + className + ') is not supported; use a ClickableComponent instead.');\n\n    // Avoid the error message generated by ClickableComponent's addChild method\n    return Component.prototype.addChild.call(this, child, options);\n  };\n\n  /**\n   * Enable the `Button` element so that it can be activated or clicked. Use this with\n   * {@link Button#disable}.\n   */\n\n\n  Button.prototype.enable = function enable() {\n    _ClickableComponent.prototype.enable.call(this);\n    this.el_.removeAttribute('disabled');\n  };\n\n  /**\n   * Enable the `Button` element so that it cannot be activated or clicked. Use this with\n   * {@link Button#enable}.\n   */\n\n\n  Button.prototype.disable = function disable() {\n    _ClickableComponent.prototype.disable.call(this);\n    this.el_.setAttribute('disabled', 'disabled');\n  };\n\n  /**\n   * This gets called when a `Button` has focus and `keydown` is triggered via a key\n   * press.\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to get called.\n   *\n   * @listens keydown\n   */\n\n\n  Button.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Ignore Space (32) or Enter (13) key operation, which is handled by the browser for a button.\n    if (event.which === 32 || event.which === 13) {\n      return;\n    }\n\n    // Pass keypress handling up for unsupported keys\n    _ClickableComponent.prototype.handleKeyPress.call(this, event);\n  };\n\n  return Button;\n}(ClickableComponent);\n\nComponent.registerComponent('Button', Button);\n\n/**\n * @file big-play-button.js\n */\n/**\n * The initial play button that shows before the video has played. The hiding of the\n * `BigPlayButton` get done via CSS and `Player` states.\n *\n * @extends Button\n */\n\nvar BigPlayButton = function (_Button) {\n  inherits(BigPlayButton, _Button);\n\n  function BigPlayButton(player, options) {\n    classCallCheck(this, BigPlayButton);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.mouseused_ = false;\n\n    _this.on('mousedown', _this.handleMouseDown);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object. Always returns 'vjs-big-play-button'.\n   */\n\n\n  BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-big-play-button';\n  };\n\n  /**\n   * This gets called when a `BigPlayButton` \"clicked\". See {@link ClickableComponent}\n   * for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  BigPlayButton.prototype.handleClick = function handleClick(event) {\n    var playPromise = this.player_.play();\n\n    // exit early if clicked via the mouse\n    if (this.mouseused_ && event.clientX && event.clientY) {\n      return;\n    }\n\n    var cb = this.player_.getChild('controlBar');\n    var playToggle = cb && cb.getChild('playToggle');\n\n    if (!playToggle) {\n      this.player_.focus();\n      return;\n    }\n\n    var playFocus = function playFocus() {\n      return playToggle.focus();\n    };\n\n    if (isPromise(playPromise)) {\n      playPromise.then(playFocus, function () {});\n    } else {\n      this.setTimeout(playFocus, 1);\n    }\n  };\n\n  BigPlayButton.prototype.handleKeyPress = function handleKeyPress(event) {\n    this.mouseused_ = false;\n\n    _Button.prototype.handleKeyPress.call(this, event);\n  };\n\n  BigPlayButton.prototype.handleMouseDown = function handleMouseDown(event) {\n    this.mouseused_ = true;\n  };\n\n  return BigPlayButton;\n}(Button);\n\n/**\n * The text that should display over the `BigPlayButton`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nBigPlayButton.prototype.controlText_ = 'Play Video';\n\nComponent.registerComponent('BigPlayButton', BigPlayButton);\n\n/**\n * @file close-button.js\n */\n/**\n * The `CloseButton` is a `{@link Button}` that fires a `close` event when\n * it gets clicked.\n *\n * @extends Button\n */\n\nvar CloseButton = function (_Button) {\n  inherits(CloseButton, _Button);\n\n  /**\n   * Creates an instance of the this class.\n   *\n   * @param  {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param  {Object} [options]\n   *         The key/value store of player options.\n   */\n  function CloseButton(player, options) {\n    classCallCheck(this, CloseButton);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.controlText(options && options.controlText || _this.localize('Close'));\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  CloseButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * This gets called when a `CloseButton` gets clicked. See\n   * {@link ClickableComponent#handleClick} for more information on when this will be\n   * triggered\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   * @fires CloseButton#close\n   */\n\n\n  CloseButton.prototype.handleClick = function handleClick(event) {\n\n    /**\n     * Triggered when the a `CloseButton` is clicked.\n     *\n     * @event CloseButton#close\n     * @type {EventTarget~Event}\n     *\n     * @property {boolean} [bubbles=false]\n     *           set to false so that the close event does not\n     *           bubble up to parents if there is no listener\n     */\n    this.trigger({ type: 'close', bubbles: false });\n  };\n\n  return CloseButton;\n}(Button);\n\nComponent.registerComponent('CloseButton', CloseButton);\n\n/**\n * @file play-toggle.js\n */\n/**\n * Button to toggle between play and pause.\n *\n * @extends Button\n */\n\nvar PlayToggle = function (_Button) {\n  inherits(PlayToggle, _Button);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PlayToggle(player, options) {\n    classCallCheck(this, PlayToggle);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.on(player, 'play', _this.handlePlay);\n    _this.on(player, 'pause', _this.handlePause);\n    _this.on(player, 'ended', _this.handleEnded);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  PlayToggle.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * This gets called when an `PlayToggle` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  PlayToggle.prototype.handleClick = function handleClick(event) {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  };\n\n  /**\n   * This gets called once after the video has ended and the user seeks so that\n   * we can change the replay button back to a play button.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#seeked\n   */\n\n\n  PlayToggle.prototype.handleSeeked = function handleSeeked(event) {\n    this.removeClass('vjs-ended');\n\n    if (this.player_.paused()) {\n      this.handlePause(event);\n    } else {\n      this.handlePlay(event);\n    }\n  };\n\n  /**\n   * Add the vjs-playing class to the element so it can change appearance.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#play\n   */\n\n\n  PlayToggle.prototype.handlePlay = function handlePlay(event) {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n    // change the button text to \"Pause\"\n    this.controlText('Pause');\n  };\n\n  /**\n   * Add the vjs-paused class to the element so it can change appearance.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#pause\n   */\n\n\n  PlayToggle.prototype.handlePause = function handlePause(event) {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    // change the button text to \"Play\"\n    this.controlText('Play');\n  };\n\n  /**\n   * Add the vjs-ended class to the element so it can change appearance\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  PlayToggle.prototype.handleEnded = function handleEnded(event) {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-ended');\n    // change the button text to \"Replay\"\n    this.controlText('Replay');\n\n    // on the next seek remove the replay button\n    this.one(this.player_, 'seeked', this.handleSeeked);\n  };\n\n  return PlayToggle;\n}(Button);\n\n/**\n * The text that should display over the `PlayToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlayToggle.prototype.controlText_ = 'Play';\n\nComponent.registerComponent('PlayToggle', PlayToggle);\n\n/**\n * @file format-time.js\n * @module Format-time\n */\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS. Supplying a guide (in seconds)\n * will force a number of leading zeros to cover the length of the guide.\n *\n * @param {number} seconds\n *        Number of seconds to be turned into a string\n *\n * @param {number} guide\n *        Number (in seconds) to model the string after\n *\n * @return {string}\n *         Time formatted as H:MM:SS or M:SS\n */\nfunction formatTime(seconds) {\n  var guide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : seconds;\n\n  seconds = seconds < 0 ? 0 : seconds;\n  var s = Math.floor(seconds % 60);\n  var m = Math.floor(seconds / 60 % 60);\n  var h = Math.floor(seconds / 3600);\n  var gm = Math.floor(guide / 60 % 60);\n  var gh = Math.floor(guide / 3600);\n\n  // handle invalid times\n  if (isNaN(seconds) || seconds === Infinity) {\n    // '-' is false for all relational operators (e.g. <, >=) so this setting\n    // will add the minimum number of fields specified by the guide\n    h = m = s = '-';\n  }\n\n  // Check if we need to show hours\n  h = h > 0 || gh > 0 ? h + ':' : '';\n\n  // If hours are showing, we may need to add a leading zero.\n  // Always show at least one digit of minutes.\n  m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';\n\n  // Check if leading zero is need for seconds\n  s = s < 10 ? '0' + s : s;\n\n  return h + m + s;\n}\n\n/**\n * @file time-display.js\n */\n/**\n * Displays the time left in the video\n *\n * @extends Component\n */\n\nvar TimeDisplay = function (_Component) {\n  inherits(TimeDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function TimeDisplay(player, options) {\n    classCallCheck(this, TimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.throttledUpdateContent = throttle(bind(_this, _this.updateContent), 25);\n    _this.on(player, 'timeupdate', _this.throttledUpdateContent);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  TimeDisplay.prototype.createEl = function createEl$$1(plainName) {\n    var className = this.buildCSSClass();\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      className: className + ' vjs-time-control vjs-control'\n    });\n\n    this.contentEl_ = createEl('div', {\n      className: className + '-display'\n    }, {\n      // tell screen readers not to automatically read the time as it changes\n      'aria-live': 'off'\n    }, createEl('span', {\n      className: 'vjs-control-text',\n      textContent: this.localize(this.controlText_)\n    }));\n\n    this.updateTextNode_();\n    el.appendChild(this.contentEl_);\n    return el;\n  };\n\n  TimeDisplay.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n    this.textNode_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Updates the \"remaining time\" text node with new content using the\n   * contents of the `formattedTime_` property.\n   *\n   * @private\n   */\n\n\n  TimeDisplay.prototype.updateTextNode_ = function updateTextNode_() {\n    if (!this.contentEl_) {\n      return;\n    }\n\n    while (this.contentEl_.firstChild) {\n      this.contentEl_.removeChild(this.contentEl_.firstChild);\n    }\n\n    this.textNode_ = document_1.createTextNode(this.formattedTime_ || '0:00');\n    this.contentEl_.appendChild(this.textNode_);\n  };\n\n  /**\n   * Generates a formatted time for this component to use in display.\n   *\n   * @param  {number} time\n   *         A numeric time, in seconds.\n   *\n   * @return {string}\n   *         A formatted time\n   *\n   * @private\n   */\n\n\n  TimeDisplay.prototype.formatTime_ = function formatTime_(time) {\n    return formatTime(time);\n  };\n\n  /**\n   * Updates the time display text node if it has what was passed in changed\n   * the formatted time.\n   *\n   * @param {number} time\n   *        The time to update to\n   *\n   * @private\n   */\n\n\n  TimeDisplay.prototype.updateFormattedTime_ = function updateFormattedTime_(time) {\n    var formattedTime = this.formatTime_(time);\n\n    if (formattedTime === this.formattedTime_) {\n      return;\n    }\n\n    this.formattedTime_ = formattedTime;\n    this.requestAnimationFrame(this.updateTextNode_);\n  };\n\n  /**\n   * To be filled out in the child class, should update the displayed time\n   * in accordance with the fact that the current time has changed.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate`  event that caused this to run.\n   *\n   * @listens Player#timeupdate\n   */\n\n\n  TimeDisplay.prototype.updateContent = function updateContent(event) {};\n\n  return TimeDisplay;\n}(Component);\n\n/**\n * The text that should display over the `TimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nTimeDisplay.prototype.controlText_ = 'Time';\n\nComponent.registerComponent('TimeDisplay', TimeDisplay);\n\n/**\n * @file current-time-display.js\n */\n/**\n * Displays the current time\n *\n * @extends Component\n */\n\nvar CurrentTimeDisplay = function (_TimeDisplay) {\n  inherits(CurrentTimeDisplay, _TimeDisplay);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function CurrentTimeDisplay(player, options) {\n    classCallCheck(this, CurrentTimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n    _this.on(player, 'ended', _this.handleEnded);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  CurrentTimeDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-current-time';\n  };\n\n  /**\n   * Update current time display\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` event that caused this function to run.\n   *\n   * @listens Player#timeupdate\n   */\n\n\n  CurrentTimeDisplay.prototype.updateContent = function updateContent(event) {\n    // Allows for smooth scrubbing, when player can't keep up.\n    var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();\n\n    this.updateFormattedTime_(time);\n  };\n\n  /**\n   * When the player fires ended there should be no time left. Sadly\n   * this is not always the case, lets make it seem like that is the case\n   * for users.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `ended` event that caused this to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  CurrentTimeDisplay.prototype.handleEnded = function handleEnded(event) {\n    if (!this.player_.duration()) {\n      return;\n    }\n    this.updateFormattedTime_(this.player_.duration());\n  };\n\n  return CurrentTimeDisplay;\n}(TimeDisplay);\n\n/**\n * The text that should display over the `CurrentTimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nCurrentTimeDisplay.prototype.controlText_ = 'Current Time';\n\nComponent.registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);\n\n/**\n * @file duration-display.js\n */\n/**\n * Displays the duration\n *\n * @extends Component\n */\n\nvar DurationDisplay = function (_TimeDisplay) {\n  inherits(DurationDisplay, _TimeDisplay);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function DurationDisplay(player, options) {\n    classCallCheck(this, DurationDisplay);\n\n    // we do not want to/need to throttle duration changes,\n    // as they should always display the changed duration as\n    // it has changed\n    var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n    _this.on(player, 'durationchange', _this.updateContent);\n\n    // Also listen for timeupdate (in the parent) and loadedmetadata because removing those\n    // listeners could have broken dependent applications/libraries. These\n    // can likely be removed for 7.0.\n    _this.on(player, 'loadedmetadata', _this.throttledUpdateContent);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  DurationDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-duration';\n  };\n\n  /**\n   * Update duration time display.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `durationchange`, `timeupdate`, or `loadedmetadata` event that caused\n   *        this function to be called.\n   *\n   * @listens Player#durationchange\n   * @listens Player#timeupdate\n   * @listens Player#loadedmetadata\n   */\n\n\n  DurationDisplay.prototype.updateContent = function updateContent(event) {\n    var duration = this.player_.duration();\n\n    if (duration && this.duration_ !== duration) {\n      this.duration_ = duration;\n      this.updateFormattedTime_(duration);\n    }\n  };\n\n  return DurationDisplay;\n}(TimeDisplay);\n\n/**\n * The text that should display over the `DurationDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nDurationDisplay.prototype.controlText_ = 'Duration Time';\n\nComponent.registerComponent('DurationDisplay', DurationDisplay);\n\n/**\n * @file time-divider.js\n */\n/**\n * The separator between the current time and duration.\n * Can be hidden if it's not needed in the design.\n *\n * @extends Component\n */\n\nvar TimeDivider = function (_Component) {\n  inherits(TimeDivider, _Component);\n\n  function TimeDivider() {\n    classCallCheck(this, TimeDivider);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the component's DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  TimeDivider.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-time-control vjs-time-divider',\n      innerHTML: '<div><span>/</span></div>'\n    });\n  };\n\n  return TimeDivider;\n}(Component);\n\nComponent.registerComponent('TimeDivider', TimeDivider);\n\n/**\n * @file remaining-time-display.js\n */\n/**\n * Displays the time left in the video\n *\n * @extends Component\n */\n\nvar RemainingTimeDisplay = function (_TimeDisplay) {\n  inherits(RemainingTimeDisplay, _TimeDisplay);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function RemainingTimeDisplay(player, options) {\n    classCallCheck(this, RemainingTimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _TimeDisplay.call(this, player, options));\n\n    _this.on(player, 'durationchange', _this.throttledUpdateContent);\n    _this.on(player, 'ended', _this.handleEnded);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  RemainingTimeDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-remaining-time';\n  };\n\n  /**\n   * The remaining time display prefixes numbers with a \"minus\" character.\n   *\n   * @param  {number} time\n   *         A numeric time, in seconds.\n   *\n   * @return {string}\n   *         A formatted time\n   *\n   * @private\n   */\n\n\n  RemainingTimeDisplay.prototype.formatTime_ = function formatTime_(time) {\n    return '-' + _TimeDisplay.prototype.formatTime_.call(this, time);\n  };\n\n  /**\n   * Update remaining time display.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` or `durationchange` event that caused this to run.\n   *\n   * @listens Player#timeupdate\n   * @listens Player#durationchange\n   */\n\n\n  RemainingTimeDisplay.prototype.updateContent = function updateContent(event) {\n    if (!this.player_.duration()) {\n      return;\n    }\n\n    // @deprecated We should only use remainingTimeDisplay\n    // as of video.js 7\n    if (this.player_.remainingTimeDisplay) {\n      this.updateFormattedTime_(this.player_.remainingTimeDisplay());\n    } else {\n      this.updateFormattedTime_(this.player_.remainingTime());\n    }\n  };\n\n  /**\n   * When the player fires ended there should be no time left. Sadly\n   * this is not always the case, lets make it seem like that is the case\n   * for users.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `ended` event that caused this to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  RemainingTimeDisplay.prototype.handleEnded = function handleEnded(event) {\n    if (!this.player_.duration()) {\n      return;\n    }\n    this.updateFormattedTime_(0);\n  };\n\n  return RemainingTimeDisplay;\n}(TimeDisplay);\n\n/**\n * The text that should display over the `RemainingTimeDisplay`s controls. Added to for localization.\n *\n * @type {string}\n * @private\n */\n\n\nRemainingTimeDisplay.prototype.controlText_ = 'Remaining Time';\n\nComponent.registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);\n\n/**\n * @file live-display.js\n */\n// TODO - Future make it click to snap to live\n\n/**\n * Displays the live indicator when duration is Infinity.\n *\n * @extends Component\n */\n\nvar LiveDisplay = function (_Component) {\n  inherits(LiveDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function LiveDisplay(player, options) {\n    classCallCheck(this, LiveDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.updateShowing();\n    _this.on(_this.player(), 'durationchange', _this.updateShowing);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  LiveDisplay.prototype.createEl = function createEl$$1() {\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-live-control vjs-control'\n    });\n\n    this.contentEl_ = createEl('div', {\n      className: 'vjs-live-display',\n      innerHTML: '<span class=\"vjs-control-text\">' + this.localize('Stream Type') + '</span>' + this.localize('LIVE')\n    }, {\n      'aria-live': 'off'\n    });\n\n    el.appendChild(this.contentEl_);\n    return el;\n  };\n\n  LiveDisplay.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Check the duration to see if the LiveDisplay should be showing or not. Then show/hide\n   * it accordingly\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link Player#durationchange} event that caused this function to run.\n   *\n   * @listens Player#durationchange\n   */\n\n\n  LiveDisplay.prototype.updateShowing = function updateShowing(event) {\n    if (this.player().duration() === Infinity) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  };\n\n  return LiveDisplay;\n}(Component);\n\nComponent.registerComponent('LiveDisplay', LiveDisplay);\n\n/**\n * @file slider.js\n */\n/**\n * The base functionality for a slider. Can be vertical or horizontal.\n * For instance the volume bar or the seek bar on a video is a slider.\n *\n * @extends Component\n */\n\nvar Slider = function (_Component) {\n  inherits(Slider, _Component);\n\n  /**\n   * Create an instance of this class\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function Slider(player, options) {\n    classCallCheck(this, Slider);\n\n    // Set property names to bar to match with the child Slider class is looking for\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.bar = _this.getChild(_this.options_.barName);\n\n    // Set a horizontal or vertical class on the slider depending on the slider type\n    _this.vertical(!!_this.options_.vertical);\n\n    _this.enable();\n    return _this;\n  }\n\n  /**\n   * Are controls are currently enabled for this slider or not.\n   *\n   * @return {boolean}\n   *         true if controls are enabled, false otherwise\n   */\n\n\n  Slider.prototype.enabled = function enabled() {\n    return this.enabled_;\n  };\n\n  /**\n   * Enable controls for this slider if they are disabled\n   */\n\n\n  Slider.prototype.enable = function enable() {\n    if (this.enabled()) {\n      return;\n    }\n\n    this.on('mousedown', this.handleMouseDown);\n    this.on('touchstart', this.handleMouseDown);\n    this.on('focus', this.handleFocus);\n    this.on('blur', this.handleBlur);\n    this.on('click', this.handleClick);\n\n    this.on(this.player_, 'controlsvisible', this.update);\n\n    if (this.playerEvent) {\n      this.on(this.player_, this.playerEvent, this.update);\n    }\n\n    this.removeClass('disabled');\n    this.setAttribute('tabindex', 0);\n\n    this.enabled_ = true;\n  };\n\n  /**\n   * Disable controls for this slider if they are enabled\n   */\n\n\n  Slider.prototype.disable = function disable() {\n    if (!this.enabled()) {\n      return;\n    }\n    var doc = this.bar.el_.ownerDocument;\n\n    this.off('mousedown', this.handleMouseDown);\n    this.off('touchstart', this.handleMouseDown);\n    this.off('focus', this.handleFocus);\n    this.off('blur', this.handleBlur);\n    this.off('click', this.handleClick);\n    this.off(this.player_, 'controlsvisible', this.update);\n    this.off(doc, 'mousemove', this.handleMouseMove);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchmove', this.handleMouseMove);\n    this.off(doc, 'touchend', this.handleMouseUp);\n    this.removeAttribute('tabindex');\n\n    this.addClass('disabled');\n\n    if (this.playerEvent) {\n      this.off(this.player_, this.playerEvent, this.update);\n    }\n    this.enabled_ = false;\n  };\n\n  /**\n   * Create the `Button`s DOM element.\n   *\n   * @param {string} type\n   *        Type of element to create.\n   *\n   * @param {Object} [props={}]\n   *        List of properties in Object form.\n   *\n   * @param {Object} [attributes={}]\n   *        list of attributes in Object form.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  Slider.prototype.createEl = function createEl$$1(type) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n    // Add the slider element class to all sub classes\n    props.className = props.className + ' vjs-slider';\n    props = assign({\n      tabIndex: 0\n    }, props);\n\n    attributes = assign({\n      'role': 'slider',\n      'aria-valuenow': 0,\n      'aria-valuemin': 0,\n      'aria-valuemax': 100,\n      'tabIndex': 0\n    }, attributes);\n\n    return _Component.prototype.createEl.call(this, type, props, attributes);\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   * @fires Slider#slideractive\n   */\n\n\n  Slider.prototype.handleMouseDown = function handleMouseDown(event) {\n    var doc = this.bar.el_.ownerDocument;\n\n    event.preventDefault();\n    blockTextSelection();\n\n    this.addClass('vjs-sliding');\n    /**\n     * Triggered when the slider is in an active state\n     *\n     * @event Slider#slideractive\n     * @type {EventTarget~Event}\n     */\n    this.trigger('slideractive');\n\n    this.on(doc, 'mousemove', this.handleMouseMove);\n    this.on(doc, 'mouseup', this.handleMouseUp);\n    this.on(doc, 'touchmove', this.handleMouseMove);\n    this.on(doc, 'touchend', this.handleMouseUp);\n\n    this.handleMouseMove(event);\n  };\n\n  /**\n   * Handle the `mousemove`, `touchmove`, and `mousedown` events on this `Slider`.\n   * The `mousemove` and `touchmove` events will only only trigger this function during\n   * `mousedown` and `touchstart`. This is due to {@link Slider#handleMouseDown} and\n   * {@link Slider#handleMouseUp}.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown`, `mousemove`, `touchstart`, or `touchmove` event that triggered\n   *        this function\n   *\n   * @listens mousemove\n   * @listens touchmove\n   */\n\n\n  Slider.prototype.handleMouseMove = function handleMouseMove(event) {};\n\n  /**\n   * Handle `mouseup` or `touchend` events on the `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mouseup` or `touchend` event that triggered this function.\n   *\n   * @listens touchend\n   * @listens mouseup\n   * @fires Slider#sliderinactive\n   */\n\n\n  Slider.prototype.handleMouseUp = function handleMouseUp() {\n    var doc = this.bar.el_.ownerDocument;\n\n    unblockTextSelection();\n\n    this.removeClass('vjs-sliding');\n    /**\n     * Triggered when the slider is no longer in an active state.\n     *\n     * @event Slider#sliderinactive\n     * @type {EventTarget~Event}\n     */\n    this.trigger('sliderinactive');\n\n    this.off(doc, 'mousemove', this.handleMouseMove);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchmove', this.handleMouseMove);\n    this.off(doc, 'touchend', this.handleMouseUp);\n\n    this.update();\n  };\n\n  /**\n   * Update the progress bar of the `Slider`.\n   *\n   * @returns {number}\n   *          The percentage of progress the progress bar represents as a\n   *          number from 0 to 1.\n   */\n\n\n  Slider.prototype.update = function update() {\n\n    // In VolumeBar init we have a setTimeout for update that pops and update\n    // to the end of the execution stack. The player is destroyed before then\n    // update will cause an error\n    if (!this.el_) {\n      return;\n    }\n\n    // If scrubbing, we could use a cached value to make the handle keep up\n    // with the user's mouse. On HTML5 browsers scrubbing is really smooth, but\n    // some flash players are slow, so we might want to utilize this later.\n    // var progress =  (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();\n    var progress = this.getPercent();\n    var bar = this.bar;\n\n    // If there's no bar...\n    if (!bar) {\n      return;\n    }\n\n    // Protect against no duration and other division issues\n    if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {\n      progress = 0;\n    }\n\n    // Convert to a percentage for setting\n    var percentage = (progress * 100).toFixed(2) + '%';\n    var style = bar.el().style;\n\n    // Set the new bar width or height\n    if (this.vertical()) {\n      style.height = percentage;\n    } else {\n      style.width = percentage;\n    }\n\n    return progress;\n  };\n\n  /**\n   * Calculate distance for slider\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run.\n   *\n   * @return {number}\n   *         The current position of the Slider.\n   *         - postition.x for vertical `Slider`s\n   *         - postition.y for horizontal `Slider`s\n   */\n\n\n  Slider.prototype.calculateDistance = function calculateDistance(event) {\n    var position = getPointerPosition(this.el_, event);\n\n    if (this.vertical()) {\n      return position.y;\n    }\n    return position.x;\n  };\n\n  /**\n   * Handle a `focus` event on this `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `focus` event that caused this function to run.\n   *\n   * @listens focus\n   */\n\n\n  Slider.prototype.handleFocus = function handleFocus() {\n    this.on(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);\n  };\n\n  /**\n   * Handle a `keydown` event on the `Slider`. Watches for left, rigth, up, and down\n   * arrow keys. This function will only be called when the slider has focus. See\n   * {@link Slider#handleFocus} and {@link Slider#handleBlur}.\n   *\n   * @param {EventTarget~Event} event\n   *        the `keydown` event that caused this function to run.\n   *\n   * @listens keydown\n   */\n\n\n  Slider.prototype.handleKeyPress = function handleKeyPress(event) {\n    // Left and Down Arrows\n    if (event.which === 37 || event.which === 40) {\n      event.preventDefault();\n      this.stepBack();\n\n      // Up and Right Arrows\n    } else if (event.which === 38 || event.which === 39) {\n      event.preventDefault();\n      this.stepForward();\n    }\n  };\n\n  /**\n   * Handle a `blur` event on this `Slider`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `blur` event that caused this function to run.\n   *\n   * @listens blur\n   */\n\n  Slider.prototype.handleBlur = function handleBlur() {\n    this.off(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);\n  };\n\n  /**\n   * Listener for click events on slider, used to prevent clicks\n   *   from bubbling up to parent elements like button menus.\n   *\n   * @param {Object} event\n   *        Event that caused this object to run\n   */\n\n\n  Slider.prototype.handleClick = function handleClick(event) {\n    event.stopImmediatePropagation();\n    event.preventDefault();\n  };\n\n  /**\n   * Get/set if slider is horizontal for vertical\n   *\n   * @param {boolean} [bool]\n   *        - true if slider is vertical,\n   *        - false is horizontal\n   *\n   * @return {boolean}\n   *         - true if slider is vertical, and getting\n   *         - false if the slider is horizontal, and getting\n   */\n\n\n  Slider.prototype.vertical = function vertical(bool) {\n    if (bool === undefined) {\n      return this.vertical_ || false;\n    }\n\n    this.vertical_ = !!bool;\n\n    if (this.vertical_) {\n      this.addClass('vjs-slider-vertical');\n    } else {\n      this.addClass('vjs-slider-horizontal');\n    }\n  };\n\n  return Slider;\n}(Component);\n\nComponent.registerComponent('Slider', Slider);\n\n/**\n * @file load-progress-bar.js\n */\n/**\n * Shows loading progress\n *\n * @extends Component\n */\n\nvar LoadProgressBar = function (_Component) {\n  inherits(LoadProgressBar, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function LoadProgressBar(player, options) {\n    classCallCheck(this, LoadProgressBar);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.partEls_ = [];\n    _this.on(player, 'progress', _this.update);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  LoadProgressBar.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-load-progress',\n      innerHTML: '<span class=\"vjs-control-text\"><span>' + this.localize('Loaded') + '</span>: 0%</span>'\n    });\n  };\n\n  LoadProgressBar.prototype.dispose = function dispose() {\n    this.partEls_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Update progress bar\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `progress` event that caused this function to run.\n   *\n   * @listens Player#progress\n   */\n\n\n  LoadProgressBar.prototype.update = function update(event) {\n    var buffered = this.player_.buffered();\n    var duration = this.player_.duration();\n    var bufferedEnd = this.player_.bufferedEnd();\n    var children = this.partEls_;\n\n    // get the percent width of a time compared to the total end\n    var percentify = function percentify(time, end) {\n      // no NaN\n      var percent = time / end || 0;\n\n      return (percent >= 1 ? 1 : percent) * 100 + '%';\n    };\n\n    // update the width of the progress bar\n    this.el_.style.width = percentify(bufferedEnd, duration);\n\n    // add child elements to represent the individual buffered time ranges\n    for (var i = 0; i < buffered.length; i++) {\n      var start = buffered.start(i);\n      var end = buffered.end(i);\n      var part = children[i];\n\n      if (!part) {\n        part = this.el_.appendChild(createEl());\n        children[i] = part;\n      }\n\n      // set the percent based on the width of the progress bar (bufferedEnd)\n      part.style.left = percentify(start, bufferedEnd);\n      part.style.width = percentify(end - start, bufferedEnd);\n    }\n\n    // remove unused buffered range elements\n    for (var _i = children.length; _i > buffered.length; _i--) {\n      this.el_.removeChild(children[_i - 1]);\n    }\n    children.length = buffered.length;\n  };\n\n  return LoadProgressBar;\n}(Component);\n\nComponent.registerComponent('LoadProgressBar', LoadProgressBar);\n\n/**\n * @file time-tooltip.js\n */\n/**\n * Time tooltips display a time above the progress bar.\n *\n * @extends Component\n */\n\nvar TimeTooltip = function (_Component) {\n  inherits(TimeTooltip, _Component);\n\n  function TimeTooltip() {\n    classCallCheck(this, TimeTooltip);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the time tooltip DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  TimeTooltip.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-time-tooltip'\n    });\n  };\n\n  /**\n   * Updates the position of the time tooltip relative to the `SeekBar`.\n   *\n   * @param {Object} seekBarRect\n   *        The `ClientRect` for the {@link SeekBar} element.\n   *\n   * @param {number} seekBarPoint\n   *        A number from 0 to 1, representing a horizontal reference point\n   *        from the left edge of the {@link SeekBar}\n   */\n\n\n  TimeTooltip.prototype.update = function update(seekBarRect, seekBarPoint, content) {\n    var tooltipRect = getBoundingClientRect(this.el_);\n    var playerRect = getBoundingClientRect(this.player_.el());\n    var seekBarPointPx = seekBarRect.width * seekBarPoint;\n\n    // do nothing if either rect isn't available\n    // for example, if the player isn't in the DOM for testing\n    if (!playerRect || !tooltipRect) {\n      return;\n    }\n\n    // This is the space left of the `seekBarPoint` available within the bounds\n    // of the player. We calculate any gap between the left edge of the player\n    // and the left edge of the `SeekBar` and add the number of pixels in the\n    // `SeekBar` before hitting the `seekBarPoint`\n    var spaceLeftOfPoint = seekBarRect.left - playerRect.left + seekBarPointPx;\n\n    // This is the space right of the `seekBarPoint` available within the bounds\n    // of the player. We calculate the number of pixels from the `seekBarPoint`\n    // to the right edge of the `SeekBar` and add to that any gap between the\n    // right edge of the `SeekBar` and the player.\n    var spaceRightOfPoint = seekBarRect.width - seekBarPointPx + (playerRect.right - seekBarRect.right);\n\n    // This is the number of pixels by which the tooltip will need to be pulled\n    // further to the right to center it over the `seekBarPoint`.\n    var pullTooltipBy = tooltipRect.width / 2;\n\n    // Adjust the `pullTooltipBy` distance to the left or right depending on\n    // the results of the space calculations above.\n    if (spaceLeftOfPoint < pullTooltipBy) {\n      pullTooltipBy += pullTooltipBy - spaceLeftOfPoint;\n    } else if (spaceRightOfPoint < pullTooltipBy) {\n      pullTooltipBy = spaceRightOfPoint;\n    }\n\n    // Due to the imprecision of decimal/ratio based calculations and varying\n    // rounding behaviors, there are cases where the spacing adjustment is off\n    // by a pixel or two. This adds insurance to these calculations.\n    if (pullTooltipBy < 0) {\n      pullTooltipBy = 0;\n    } else if (pullTooltipBy > tooltipRect.width) {\n      pullTooltipBy = tooltipRect.width;\n    }\n\n    this.el_.style.right = '-' + pullTooltipBy + 'px';\n    textContent(this.el_, content);\n  };\n\n  return TimeTooltip;\n}(Component);\n\nComponent.registerComponent('TimeTooltip', TimeTooltip);\n\n/**\n * @file play-progress-bar.js\n */\n/**\n * Used by {@link SeekBar} to display media playback progress as part of the\n * {@link ProgressControl}.\n *\n * @extends Component\n */\n\nvar PlayProgressBar = function (_Component) {\n  inherits(PlayProgressBar, _Component);\n\n  function PlayProgressBar() {\n    classCallCheck(this, PlayProgressBar);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the the DOM element for this class.\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  PlayProgressBar.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-play-progress vjs-slider-bar',\n      innerHTML: '<span class=\"vjs-control-text\"><span>' + this.localize('Progress') + '</span>: 0%</span>'\n    });\n  };\n\n  /**\n   * Enqueues updates to its own DOM as well as the DOM of its\n   * {@link TimeTooltip} child.\n   *\n   * @param {Object} seekBarRect\n   *        The `ClientRect` for the {@link SeekBar} element.\n   *\n   * @param {number} seekBarPoint\n   *        A number from 0 to 1, representing a horizontal reference point\n   *        from the left edge of the {@link SeekBar}\n   */\n\n\n  PlayProgressBar.prototype.update = function update(seekBarRect, seekBarPoint) {\n    var _this2 = this;\n\n    // If there is an existing rAF ID, cancel it so we don't over-queue.\n    if (this.rafId_) {\n      this.cancelAnimationFrame(this.rafId_);\n    }\n\n    this.rafId_ = this.requestAnimationFrame(function () {\n      var time = _this2.player_.scrubbing() ? _this2.player_.getCache().currentTime : _this2.player_.currentTime();\n\n      var content = formatTime(time, _this2.player_.duration());\n      var timeTooltip = _this2.getChild('timeTooltip');\n\n      if (timeTooltip) {\n        timeTooltip.update(seekBarRect, seekBarPoint, content);\n      }\n    });\n  };\n\n  return PlayProgressBar;\n}(Component);\n\n/**\n * Default options for {@link PlayProgressBar}.\n *\n * @type {Object}\n * @private\n */\n\n\nPlayProgressBar.prototype.options_ = {\n  children: []\n};\n\n// Time tooltips should not be added to a player on mobile devices or IE8\nif ((!IE_VERSION || IE_VERSION > 8) && !IS_IOS && !IS_ANDROID) {\n  PlayProgressBar.prototype.options_.children.push('timeTooltip');\n}\n\nComponent.registerComponent('PlayProgressBar', PlayProgressBar);\n\n/**\n * @file mouse-time-display.js\n */\n/**\n * The {@link MouseTimeDisplay} component tracks mouse movement over the\n * {@link ProgressControl}. It displays an indicator and a {@link TimeTooltip}\n * indicating the time which is represented by a given point in the\n * {@link ProgressControl}.\n *\n * @extends Component\n */\n\nvar MouseTimeDisplay = function (_Component) {\n  inherits(MouseTimeDisplay, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The {@link Player} that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function MouseTimeDisplay(player, options) {\n    classCallCheck(this, MouseTimeDisplay);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.update = throttle(bind(_this, _this.update), 25);\n    return _this;\n  }\n\n  /**\n   * Create the DOM element for this class.\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  MouseTimeDisplay.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-mouse-display'\n    });\n  };\n\n  /**\n   * Enqueues updates to its own DOM as well as the DOM of its\n   * {@link TimeTooltip} child.\n   *\n   * @param {Object} seekBarRect\n   *        The `ClientRect` for the {@link SeekBar} element.\n   *\n   * @param {number} seekBarPoint\n   *        A number from 0 to 1, representing a horizontal reference point\n   *        from the left edge of the {@link SeekBar}\n   */\n\n\n  MouseTimeDisplay.prototype.update = function update(seekBarRect, seekBarPoint) {\n    var _this2 = this;\n\n    // If there is an existing rAF ID, cancel it so we don't over-queue.\n    if (this.rafId_) {\n      this.cancelAnimationFrame(this.rafId_);\n    }\n\n    this.rafId_ = this.requestAnimationFrame(function () {\n      var duration = _this2.player_.duration();\n      var content = formatTime(seekBarPoint * duration, duration);\n\n      _this2.el_.style.left = seekBarRect.width * seekBarPoint + 'px';\n      _this2.getChild('timeTooltip').update(seekBarRect, seekBarPoint, content);\n    });\n  };\n\n  return MouseTimeDisplay;\n}(Component);\n\n/**\n * Default options for `MouseTimeDisplay`\n *\n * @type {Object}\n * @private\n */\n\n\nMouseTimeDisplay.prototype.options_ = {\n  children: ['timeTooltip']\n};\n\nComponent.registerComponent('MouseTimeDisplay', MouseTimeDisplay);\n\n/**\n * @file seek-bar.js\n */\n// The number of seconds the `step*` functions move the timeline.\nvar STEP_SECONDS = 5;\n\n// The interval at which the bar should update as it progresses.\nvar UPDATE_REFRESH_INTERVAL = 30;\n\n/**\n * Seek bar and container for the progress bars. Uses {@link PlayProgressBar}\n * as its `bar`.\n *\n * @extends Slider\n */\n\nvar SeekBar = function (_Slider) {\n  inherits(SeekBar, _Slider);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function SeekBar(player, options) {\n    classCallCheck(this, SeekBar);\n\n    var _this = possibleConstructorReturn(this, _Slider.call(this, player, options));\n\n    _this.update = throttle(bind(_this, _this.update), UPDATE_REFRESH_INTERVAL);\n\n    _this.on(player, 'timeupdate', _this.update);\n    _this.on(player, 'ended', _this.handleEnded);\n\n    // when playing, let's ensure we smoothly update the play progress bar\n    // via an interval\n    _this.updateInterval = null;\n\n    _this.on(player, ['playing'], function () {\n      _this.clearInterval(_this.updateInterval);\n\n      _this.updateInterval = _this.setInterval(function () {\n        _this.requestAnimationFrame(function () {\n          _this.update();\n        });\n      }, UPDATE_REFRESH_INTERVAL);\n    });\n\n    _this.on(player, ['ended', 'pause', 'waiting'], function () {\n      _this.clearInterval(_this.updateInterval);\n    });\n\n    _this.on(player, ['timeupdate', 'ended'], _this.update);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  SeekBar.prototype.createEl = function createEl$$1() {\n    return _Slider.prototype.createEl.call(this, 'div', {\n      className: 'vjs-progress-holder'\n    }, {\n      'aria-label': this.localize('Progress Bar')\n    });\n  };\n\n  /**\n   * This function updates the play progress bar and accessiblity\n   * attributes to whatever is passed in.\n   *\n   * @param {number} currentTime\n   *        The currentTime value that should be used for accessiblity\n   *\n   * @param {number} percent\n   *        The percentage as a decimal that the bar should be filled from 0-1.\n   *\n   * @private\n   */\n\n\n  SeekBar.prototype.update_ = function update_(currentTime, percent) {\n    var duration = this.player_.duration();\n\n    // machine readable value of progress bar (percentage complete)\n    this.el_.setAttribute('aria-valuenow', (percent * 100).toFixed(2));\n\n    // human readable value of progress bar (time complete)\n    this.el_.setAttribute('aria-valuetext', this.localize('progress bar timing: currentTime={1} duration={2}', [formatTime(currentTime, duration), formatTime(duration, duration)], '{1} of {2}'));\n\n    // Update the `PlayProgressBar`.\n    this.bar.update(getBoundingClientRect(this.el_), percent);\n  };\n\n  /**\n   * Update the seek bar's UI.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` or `ended` event that caused this to run.\n   *\n   * @listens Player#timeupdate\n   *\n   * @returns {number}\n   *          The current percent at a number from 0-1\n   */\n\n\n  SeekBar.prototype.update = function update(event) {\n    var percent = _Slider.prototype.update.call(this);\n\n    this.update_(this.getCurrentTime_(), percent);\n    return percent;\n  };\n\n  /**\n   * Get the value of current time but allows for smooth scrubbing,\n   * when player can't keep up.\n   *\n   * @return {number}\n   *         The current time value to display\n   *\n   * @private\n   */\n\n\n  SeekBar.prototype.getCurrentTime_ = function getCurrentTime_() {\n    return this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();\n  };\n\n  /**\n   * We want the seek bar to be full on ended\n   * no matter what the actual internal values are. so we force it.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `timeupdate` or `ended` event that caused this to run.\n   *\n   * @listens Player#ended\n   */\n\n\n  SeekBar.prototype.handleEnded = function handleEnded(event) {\n    this.update_(this.player_.duration(), 1);\n  };\n\n  /**\n   * Get the percentage of media played so far.\n   *\n   * @return {number}\n   *         The percentage of media played so far (0 to 1).\n   */\n\n\n  SeekBar.prototype.getPercent = function getPercent() {\n    var percent = this.getCurrentTime_() / this.player_.duration();\n\n    return percent >= 1 ? 1 : percent;\n  };\n\n  /**\n   * Handle mouse down on seek bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousedown` event that caused this to run.\n   *\n   * @listens mousedown\n   */\n\n\n  SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    this.player_.scrubbing(true);\n\n    this.videoWasPlaying = !this.player_.paused();\n    this.player_.pause();\n\n    _Slider.prototype.handleMouseDown.call(this, event);\n  };\n\n  /**\n   * Handle mouse move on seek bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousemove` event that caused this to run.\n   *\n   * @listens mousemove\n   */\n\n\n  SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    var newTime = this.calculateDistance(event) * this.player_.duration();\n\n    // Don't let video end while scrubbing.\n    if (newTime === this.player_.duration()) {\n      newTime = newTime - 0.1;\n    }\n\n    // Set new time (tell player to seek to new time)\n    this.player_.currentTime(newTime);\n  };\n\n  SeekBar.prototype.enable = function enable() {\n    _Slider.prototype.enable.call(this);\n    var mouseTimeDisplay = this.getChild('mouseTimeDisplay');\n\n    if (!mouseTimeDisplay) {\n      return;\n    }\n\n    mouseTimeDisplay.show();\n  };\n\n  SeekBar.prototype.disable = function disable() {\n    _Slider.prototype.disable.call(this);\n    var mouseTimeDisplay = this.getChild('mouseTimeDisplay');\n\n    if (!mouseTimeDisplay) {\n      return;\n    }\n\n    mouseTimeDisplay.hide();\n  };\n\n  /**\n   * Handle mouse up on seek bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mouseup` event that caused this to run.\n   *\n   * @listens mouseup\n   */\n\n\n  SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {\n    _Slider.prototype.handleMouseUp.call(this, event);\n\n    this.player_.scrubbing(false);\n\n    /**\n     * Trigger timeupdate because we're done seeking and the time has changed.\n     * This is particularly useful for if the player is paused to time the time displays.\n     *\n     * @event Tech#timeupdate\n     * @type {EventTarget~Event}\n     */\n    this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n    if (this.videoWasPlaying) {\n      this.player_.play();\n    }\n  };\n\n  /**\n   * Move more quickly fast forward for keyboard-only users\n   */\n\n\n  SeekBar.prototype.stepForward = function stepForward() {\n    this.player_.currentTime(this.player_.currentTime() + STEP_SECONDS);\n  };\n\n  /**\n   * Move more quickly rewind for keyboard-only users\n   */\n\n\n  SeekBar.prototype.stepBack = function stepBack() {\n    this.player_.currentTime(this.player_.currentTime() - STEP_SECONDS);\n  };\n\n  /**\n   * Toggles the playback state of the player\n   * This gets called when enter or space is used on the seekbar\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called\n   *\n   */\n\n\n  SeekBar.prototype.handleAction = function handleAction(event) {\n    if (this.player_.paused()) {\n      this.player_.play();\n    } else {\n      this.player_.pause();\n    }\n  };\n\n  /**\n   * Called when this SeekBar has focus and a key gets pressed down. By\n   * default it will call `this.handleAction` when the key is space or enter.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called.\n   *\n   * @listens keydown\n   */\n\n\n  SeekBar.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Support Space (32) or Enter (13) key operation to fire a click event\n    if (event.which === 32 || event.which === 13) {\n      event.preventDefault();\n      this.handleAction(event);\n    } else if (_Slider.prototype.handleKeyPress) {\n\n      // Pass keypress handling up for unsupported keys\n      _Slider.prototype.handleKeyPress.call(this, event);\n    }\n  };\n\n  return SeekBar;\n}(Slider);\n\n/**\n * Default options for the `SeekBar`\n *\n * @type {Object}\n * @private\n */\n\n\nSeekBar.prototype.options_ = {\n  children: ['loadProgressBar', 'playProgressBar'],\n  barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices or IE8\nif ((!IE_VERSION || IE_VERSION > 8) && !IS_IOS && !IS_ANDROID) {\n  SeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\n/**\n * Call the update event for this Slider when this event happens on the player.\n *\n * @type {string}\n */\nSeekBar.prototype.playerEvent = 'timeupdate';\n\nComponent.registerComponent('SeekBar', SeekBar);\n\n/**\n * @file progress-control.js\n */\n/**\n * The Progress Control component contains the seek bar, load progress,\n * and play progress.\n *\n * @extends Component\n */\n\nvar ProgressControl = function (_Component) {\n  inherits(ProgressControl, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function ProgressControl(player, options) {\n    classCallCheck(this, ProgressControl);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.handleMouseMove = throttle(bind(_this, _this.handleMouseMove), 25);\n    _this.throttledHandleMouseSeek = throttle(bind(_this, _this.handleMouseSeek), 25);\n\n    _this.enable();\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  ProgressControl.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-progress-control vjs-control'\n    });\n  };\n\n  /**\n   * When the mouse moves over the `ProgressControl`, the pointer position\n   * gets passed down to the `MouseTimeDisplay` component.\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousemove` event that caused this function to run.\n   *\n   * @listen mousemove\n   */\n\n\n  ProgressControl.prototype.handleMouseMove = function handleMouseMove(event) {\n    var seekBar = this.getChild('seekBar');\n    var mouseTimeDisplay = seekBar.getChild('mouseTimeDisplay');\n    var seekBarEl = seekBar.el();\n    var seekBarRect = getBoundingClientRect(seekBarEl);\n    var seekBarPoint = getPointerPosition(seekBarEl, event).x;\n\n    // The default skin has a gap on either side of the `SeekBar`. This means\n    // that it's possible to trigger this behavior outside the boundaries of\n    // the `SeekBar`. This ensures we stay within it at all times.\n    if (seekBarPoint > 1) {\n      seekBarPoint = 1;\n    } else if (seekBarPoint < 0) {\n      seekBarPoint = 0;\n    }\n\n    if (mouseTimeDisplay) {\n      mouseTimeDisplay.update(seekBarRect, seekBarPoint);\n    }\n  };\n\n  /**\n   * A throttled version of the {@link ProgressControl#handleMouseSeek} listener.\n   *\n   * @method ProgressControl#throttledHandleMouseSeek\n   * @param {EventTarget~Event} event\n   *        The `mousemove` event that caused this function to run.\n   *\n   * @listen mousemove\n   * @listen touchmove\n   */\n\n  /**\n   * Handle `mousemove` or `touchmove` events on the `ProgressControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousemove\n   * @listens touchmove\n   */\n\n\n  ProgressControl.prototype.handleMouseSeek = function handleMouseSeek(event) {\n    var seekBar = this.getChild('seekBar');\n\n    seekBar.handleMouseMove(event);\n  };\n\n  /**\n   * Are controls are currently enabled for this progress control.\n   *\n   * @return {boolean}\n   *         true if controls are enabled, false otherwise\n   */\n\n\n  ProgressControl.prototype.enabled = function enabled() {\n    return this.enabled_;\n  };\n\n  /**\n   * Disable all controls on the progress control and its children\n   */\n\n\n  ProgressControl.prototype.disable = function disable() {\n    this.children().forEach(function (child) {\n      return child.disable && child.disable();\n    });\n\n    if (!this.enabled()) {\n      return;\n    }\n\n    this.off(['mousedown', 'touchstart'], this.handleMouseDown);\n    this.off(this.el_, 'mousemove', this.handleMouseMove);\n    this.handleMouseUp();\n\n    this.addClass('disabled');\n\n    this.enabled_ = false;\n  };\n\n  /**\n   * Enable all controls on the progress control and its children\n   */\n\n\n  ProgressControl.prototype.enable = function enable() {\n    this.children().forEach(function (child) {\n      return child.enable && child.enable();\n    });\n\n    if (this.enabled()) {\n      return;\n    }\n\n    this.on(['mousedown', 'touchstart'], this.handleMouseDown);\n    this.on(this.el_, 'mousemove', this.handleMouseMove);\n    this.removeClass('disabled');\n\n    this.enabled_ = true;\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `ProgressControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   */\n\n\n  ProgressControl.prototype.handleMouseDown = function handleMouseDown(event) {\n    var doc = this.el_.ownerDocument;\n\n    this.on(doc, 'mousemove', this.throttledHandleMouseSeek);\n    this.on(doc, 'touchmove', this.throttledHandleMouseSeek);\n    this.on(doc, 'mouseup', this.handleMouseUp);\n    this.on(doc, 'touchend', this.handleMouseUp);\n  };\n\n  /**\n   * Handle `mouseup` or `touchend` events on the `ProgressControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mouseup` or `touchend` event that triggered this function.\n   *\n   * @listens touchend\n   * @listens mouseup\n   */\n\n\n  ProgressControl.prototype.handleMouseUp = function handleMouseUp(event) {\n    var doc = this.el_.ownerDocument;\n\n    this.off(doc, 'mousemove', this.throttledHandleMouseSeek);\n    this.off(doc, 'touchmove', this.throttledHandleMouseSeek);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchend', this.handleMouseUp);\n  };\n\n  return ProgressControl;\n}(Component);\n\n/**\n * Default options for `ProgressControl`\n *\n * @type {Object}\n * @private\n */\n\n\nProgressControl.prototype.options_ = {\n  children: ['seekBar']\n};\n\nComponent.registerComponent('ProgressControl', ProgressControl);\n\n/**\n * @file fullscreen-toggle.js\n */\n/**\n * Toggle fullscreen video\n *\n * @extends Button\n */\n\nvar FullscreenToggle = function (_Button) {\n  inherits(FullscreenToggle, _Button);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function FullscreenToggle(player, options) {\n    classCallCheck(this, FullscreenToggle);\n\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    _this.on(player, 'fullscreenchange', _this.handleFullscreenChange);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Handles fullscreenchange on the player and change control text accordingly.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link Player#fullscreenchange} event that caused this function to be\n   *        called.\n   *\n   * @listens Player#fullscreenchange\n   */\n\n\n  FullscreenToggle.prototype.handleFullscreenChange = function handleFullscreenChange(event) {\n    if (this.player_.isFullscreen()) {\n      this.controlText('Non-Fullscreen');\n    } else {\n      this.controlText('Fullscreen');\n    }\n  };\n\n  /**\n   * This gets called when an `FullscreenToggle` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  FullscreenToggle.prototype.handleClick = function handleClick(event) {\n    if (!this.player_.isFullscreen()) {\n      this.player_.requestFullscreen();\n    } else {\n      this.player_.exitFullscreen();\n    }\n  };\n\n  return FullscreenToggle;\n}(Button);\n\n/**\n * The text that should display over the `FullscreenToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nFullscreenToggle.prototype.controlText_ = 'Fullscreen';\n\nComponent.registerComponent('FullscreenToggle', FullscreenToggle);\n\n/**\n * Check if volume control is supported and if it isn't hide the\n * `Component` that was passed  using the `vjs-hidden` class.\n *\n * @param {Component} self\n *        The component that should be hidden if volume is unsupported\n *\n * @param {Player} player\n *        A reference to the player\n *\n * @private\n */\nvar checkVolumeSupport = function checkVolumeSupport(self, player) {\n  // hide volume controls when they're not supported by the current tech\n  if (player.tech_ && !player.tech_.featuresVolumeControl) {\n    self.addClass('vjs-hidden');\n  }\n\n  self.on(player, 'loadstart', function () {\n    if (!player.tech_.featuresVolumeControl) {\n      self.addClass('vjs-hidden');\n    } else {\n      self.removeClass('vjs-hidden');\n    }\n  });\n};\n\n/**\n * @file volume-level.js\n */\n/**\n * Shows volume level\n *\n * @extends Component\n */\n\nvar VolumeLevel = function (_Component) {\n  inherits(VolumeLevel, _Component);\n\n  function VolumeLevel() {\n    classCallCheck(this, VolumeLevel);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  VolumeLevel.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-level',\n      innerHTML: '<span class=\"vjs-control-text\"></span>'\n    });\n  };\n\n  return VolumeLevel;\n}(Component);\n\nComponent.registerComponent('VolumeLevel', VolumeLevel);\n\n/**\n * @file volume-bar.js\n */\n// Required children\n/**\n * The bar that contains the volume level and can be clicked on to adjust the level\n *\n * @extends Slider\n */\n\nvar VolumeBar = function (_Slider) {\n  inherits(VolumeBar, _Slider);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function VolumeBar(player, options) {\n    classCallCheck(this, VolumeBar);\n\n    var _this = possibleConstructorReturn(this, _Slider.call(this, player, options));\n\n    _this.on('slideractive', _this.updateLastVolume_);\n    _this.on(player, 'volumechange', _this.updateARIAAttributes);\n    player.ready(function () {\n      return _this.updateARIAAttributes();\n    });\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  VolumeBar.prototype.createEl = function createEl$$1() {\n    return _Slider.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-bar vjs-slider-bar'\n    }, {\n      'aria-label': this.localize('Volume Level'),\n      'aria-live': 'polite'\n    });\n  };\n\n  /**\n   * Handle mouse down on volume bar\n   *\n   * @param {EventTarget~Event} event\n   *        The `mousedown` event that caused this to run.\n   *\n   * @listens mousedown\n   */\n\n\n  VolumeBar.prototype.handleMouseDown = function handleMouseDown(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    _Slider.prototype.handleMouseDown.call(this, event);\n  };\n\n  /**\n   * Handle movement events on the {@link VolumeMenuButton}.\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run.\n   *\n   * @listens mousemove\n   */\n\n\n  VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    this.checkMuted();\n    this.player_.volume(this.calculateDistance(event));\n  };\n\n  /**\n   * If the player is muted unmute it.\n   */\n\n\n  VolumeBar.prototype.checkMuted = function checkMuted() {\n    if (this.player_.muted()) {\n      this.player_.muted(false);\n    }\n  };\n\n  /**\n   * Get percent of volume level\n   *\n   * @return {number}\n   *         Volume level percent as a decimal number.\n   */\n\n\n  VolumeBar.prototype.getPercent = function getPercent() {\n    if (this.player_.muted()) {\n      return 0;\n    }\n    return this.player_.volume();\n  };\n\n  /**\n   * Increase volume level for keyboard users\n   */\n\n\n  VolumeBar.prototype.stepForward = function stepForward() {\n    this.checkMuted();\n    this.player_.volume(this.player_.volume() + 0.1);\n  };\n\n  /**\n   * Decrease volume level for keyboard users\n   */\n\n\n  VolumeBar.prototype.stepBack = function stepBack() {\n    this.checkMuted();\n    this.player_.volume(this.player_.volume() - 0.1);\n  };\n\n  /**\n   * Update ARIA accessibility attributes\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `volumechange` event that caused this function to run.\n   *\n   * @listens Player#volumechange\n   */\n\n\n  VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes(event) {\n    var ariaValue = this.player_.muted() ? 0 : this.volumeAsPercentage_();\n\n    this.el_.setAttribute('aria-valuenow', ariaValue);\n    this.el_.setAttribute('aria-valuetext', ariaValue + '%');\n  };\n\n  /**\n   * Returns the current value of the player volume as a percentage\n   *\n   * @private\n   */\n\n\n  VolumeBar.prototype.volumeAsPercentage_ = function volumeAsPercentage_() {\n    return Math.round(this.player_.volume() * 100);\n  };\n\n  /**\n   * When user starts dragging the VolumeBar, store the volume and listen for\n   * the end of the drag. When the drag ends, if the volume was set to zero,\n   * set lastVolume to the stored volume.\n   *\n   * @listens slideractive\n   * @private\n   */\n\n\n  VolumeBar.prototype.updateLastVolume_ = function updateLastVolume_() {\n    var _this2 = this;\n\n    var volumeBeforeDrag = this.player_.volume();\n\n    this.one('sliderinactive', function () {\n      if (_this2.player_.volume() === 0) {\n        _this2.player_.lastVolume_(volumeBeforeDrag);\n      }\n    });\n  };\n\n  return VolumeBar;\n}(Slider);\n\n/**\n * Default options for the `VolumeBar`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumeBar.prototype.options_ = {\n  children: ['volumeLevel'],\n  barName: 'volumeLevel'\n};\n\n/**\n * Call the update event for this Slider when this event happens on the player.\n *\n * @type {string}\n */\nVolumeBar.prototype.playerEvent = 'volumechange';\n\nComponent.registerComponent('VolumeBar', VolumeBar);\n\n/**\n * @file volume-control.js\n */\n// Required children\n/**\n * The component for controlling the volume level\n *\n * @extends Component\n */\n\nvar VolumeControl = function (_Component) {\n  inherits(VolumeControl, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function VolumeControl(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, VolumeControl);\n\n    options.vertical = options.vertical || false;\n\n    // Pass the vertical option down to the VolumeBar if\n    // the VolumeBar is turned on.\n    if (typeof options.volumeBar === 'undefined' || isPlain(options.volumeBar)) {\n      options.volumeBar = options.volumeBar || {};\n      options.volumeBar.vertical = options.vertical;\n    }\n\n    // hide this control if volume support is missing\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    checkVolumeSupport(_this, player);\n\n    _this.throttledHandleMouseMove = throttle(bind(_this, _this.handleMouseMove), 25);\n\n    _this.on('mousedown', _this.handleMouseDown);\n    _this.on('touchstart', _this.handleMouseDown);\n\n    // while the slider is active (the mouse has been pressed down and\n    // is dragging) or in focus we do not want to hide the VolumeBar\n    _this.on(_this.volumeBar, ['focus', 'slideractive'], function () {\n      _this.volumeBar.addClass('vjs-slider-active');\n      _this.addClass('vjs-slider-active');\n      _this.trigger('slideractive');\n    });\n\n    _this.on(_this.volumeBar, ['blur', 'sliderinactive'], function () {\n      _this.volumeBar.removeClass('vjs-slider-active');\n      _this.removeClass('vjs-slider-active');\n      _this.trigger('sliderinactive');\n    });\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  VolumeControl.prototype.createEl = function createEl() {\n    var orientationClass = 'vjs-volume-horizontal';\n\n    if (this.options_.vertical) {\n      orientationClass = 'vjs-volume-vertical';\n    }\n\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-control vjs-control ' + orientationClass\n    });\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `VolumeControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   */\n\n\n  VolumeControl.prototype.handleMouseDown = function handleMouseDown(event) {\n    var doc = this.el_.ownerDocument;\n\n    this.on(doc, 'mousemove', this.throttledHandleMouseMove);\n    this.on(doc, 'touchmove', this.throttledHandleMouseMove);\n    this.on(doc, 'mouseup', this.handleMouseUp);\n    this.on(doc, 'touchend', this.handleMouseUp);\n  };\n\n  /**\n   * Handle `mouseup` or `touchend` events on the `VolumeControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mouseup` or `touchend` event that triggered this function.\n   *\n   * @listens touchend\n   * @listens mouseup\n   */\n\n\n  VolumeControl.prototype.handleMouseUp = function handleMouseUp(event) {\n    var doc = this.el_.ownerDocument;\n\n    this.off(doc, 'mousemove', this.throttledHandleMouseMove);\n    this.off(doc, 'touchmove', this.throttledHandleMouseMove);\n    this.off(doc, 'mouseup', this.handleMouseUp);\n    this.off(doc, 'touchend', this.handleMouseUp);\n  };\n\n  /**\n   * Handle `mousedown` or `touchstart` events on the `VolumeControl`.\n   *\n   * @param {EventTarget~Event} event\n   *        `mousedown` or `touchstart` event that triggered this function\n   *\n   * @listens mousedown\n   * @listens touchstart\n   */\n\n\n  VolumeControl.prototype.handleMouseMove = function handleMouseMove(event) {\n    this.volumeBar.handleMouseMove(event);\n  };\n\n  return VolumeControl;\n}(Component);\n\n/**\n * Default options for the `VolumeControl`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumeControl.prototype.options_ = {\n  children: ['volumeBar']\n};\n\nComponent.registerComponent('VolumeControl', VolumeControl);\n\n/**\n * @file mute-toggle.js\n */\n/**\n * A button component for muting the audio.\n *\n * @extends Button\n */\n\nvar MuteToggle = function (_Button) {\n  inherits(MuteToggle, _Button);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function MuteToggle(player, options) {\n    classCallCheck(this, MuteToggle);\n\n    // hide this control if volume support is missing\n    var _this = possibleConstructorReturn(this, _Button.call(this, player, options));\n\n    checkVolumeSupport(_this, player);\n\n    _this.on(player, ['loadstart', 'volumechange'], _this.update);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  MuteToggle.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * This gets called when an `MuteToggle` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  MuteToggle.prototype.handleClick = function handleClick(event) {\n    var vol = this.player_.volume();\n    var lastVolume = this.player_.lastVolume_();\n\n    if (vol === 0) {\n      var volumeToSet = lastVolume < 0.1 ? 0.1 : lastVolume;\n\n      this.player_.volume(volumeToSet);\n      this.player_.muted(false);\n    } else {\n      this.player_.muted(this.player_.muted() ? false : true);\n    }\n  };\n\n  /**\n   * Update the `MuteToggle` button based on the state of `volume` and `muted`\n   * on the player.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link Player#loadstart} event if this function was called\n   *        through an event.\n   *\n   * @listens Player#loadstart\n   * @listens Player#volumechange\n   */\n\n\n  MuteToggle.prototype.update = function update(event) {\n    this.updateIcon_();\n    this.updateControlText_();\n  };\n\n  /**\n   * Update the appearance of the `MuteToggle` icon.\n   *\n   * Possible states (given `level` variable below):\n   * - 0: crossed out\n   * - 1: zero bars of volume\n   * - 2: one bar of volume\n   * - 3: two bars of volume\n   *\n   * @private\n   */\n\n\n  MuteToggle.prototype.updateIcon_ = function updateIcon_() {\n    var vol = this.player_.volume();\n    var level = 3;\n\n    if (vol === 0 || this.player_.muted()) {\n      level = 0;\n    } else if (vol < 0.33) {\n      level = 1;\n    } else if (vol < 0.67) {\n      level = 2;\n    }\n\n    // TODO improve muted icon classes\n    for (var i = 0; i < 4; i++) {\n      removeClass(this.el_, 'vjs-vol-' + i);\n    }\n    addClass(this.el_, 'vjs-vol-' + level);\n  };\n\n  /**\n   * If `muted` has changed on the player, update the control text\n   * (`title` attribute on `vjs-mute-control` element and content of\n   * `vjs-control-text` element).\n   *\n   * @private\n   */\n\n\n  MuteToggle.prototype.updateControlText_ = function updateControlText_() {\n    var soundOff = this.player_.muted() || this.player_.volume() === 0;\n    var text = soundOff ? 'Unmute' : 'Mute';\n\n    if (this.controlText() !== text) {\n      this.controlText(text);\n    }\n  };\n\n  return MuteToggle;\n}(Button);\n\n/**\n * The text that should display over the `MuteToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nMuteToggle.prototype.controlText_ = 'Mute';\n\nComponent.registerComponent('MuteToggle', MuteToggle);\n\n/**\n * @file volume-control.js\n */\n// Required children\n/**\n * A Component to contain the MuteToggle and VolumeControl so that\n * they can work together.\n *\n * @extends Component\n */\n\nvar VolumePanel = function (_Component) {\n  inherits(VolumePanel, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function VolumePanel(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, VolumePanel);\n\n    if (typeof options.inline !== 'undefined') {\n      options.inline = options.inline;\n    } else {\n      options.inline = true;\n    }\n\n    // pass the inline option down to the VolumeControl as vertical if\n    // the VolumeControl is on.\n    if (typeof options.volumeControl === 'undefined' || isPlain(options.volumeControl)) {\n      options.volumeControl = options.volumeControl || {};\n      options.volumeControl.vertical = !options.inline;\n    }\n\n    // hide this control if volume support is missing\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    checkVolumeSupport(_this, player);\n\n    // while the slider is active (the mouse has been pressed down and\n    // is dragging) or in focus we do not want to hide the VolumeBar\n    _this.on(_this.volumeControl, ['slideractive'], _this.sliderActive_);\n    _this.on(_this.muteToggle, 'focus', _this.sliderActive_);\n\n    _this.on(_this.volumeControl, ['sliderinactive'], _this.sliderInactive_);\n    _this.on(_this.muteToggle, 'blur', _this.sliderInactive_);\n    return _this;\n  }\n\n  /**\n   * Add vjs-slider-active class to the VolumePanel\n   *\n   * @listens VolumeControl#slideractive\n   * @private\n   */\n\n\n  VolumePanel.prototype.sliderActive_ = function sliderActive_() {\n    this.addClass('vjs-slider-active');\n  };\n\n  /**\n   * Removes vjs-slider-active class to the VolumePanel\n   *\n   * @listens VolumeControl#sliderinactive\n   * @private\n   */\n\n\n  VolumePanel.prototype.sliderInactive_ = function sliderInactive_() {\n    this.removeClass('vjs-slider-active');\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  VolumePanel.prototype.createEl = function createEl() {\n    var orientationClass = 'vjs-volume-panel-horizontal';\n\n    if (!this.options_.inline) {\n      orientationClass = 'vjs-volume-panel-vertical';\n    }\n\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-volume-panel vjs-control ' + orientationClass\n    });\n  };\n\n  return VolumePanel;\n}(Component);\n\n/**\n * Default options for the `VolumeControl`\n *\n * @type {Object}\n * @private\n */\n\n\nVolumePanel.prototype.options_ = {\n  children: ['muteToggle', 'volumeControl']\n};\n\nComponent.registerComponent('VolumePanel', VolumePanel);\n\n/**\n * @file menu.js\n */\n/**\n * The Menu component is used to build popup menus, including subtitle and\n * captions selection menus.\n *\n * @extends Component\n */\n\nvar Menu = function (_Component) {\n  inherits(Menu, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Player} player\n   *        the player that this component should attach to\n   *\n   * @param {Object} [options]\n   *        Object of option names and values\n   *\n   */\n  function Menu(player, options) {\n    classCallCheck(this, Menu);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    if (options) {\n      _this.menuButton_ = options.menuButton;\n    }\n\n    _this.focusedChild_ = -1;\n\n    _this.on('keydown', _this.handleKeyPress);\n    return _this;\n  }\n\n  /**\n   * Add a {@link MenuItem} to the menu.\n   *\n   * @param {Object|string} component\n   *        The name or instance of the `MenuItem` to add.\n   *\n   */\n\n\n  Menu.prototype.addItem = function addItem(component) {\n    this.addChild(component);\n    component.on('click', bind(this, function (event) {\n      // Unpress the associated MenuButton, and move focus back to it\n      if (this.menuButton_) {\n        this.menuButton_.unpressButton();\n\n        // don't focus menu button if item is a caption settings item\n        // because focus will move elsewhere and it logs an error on IE8\n        if (component.name() !== 'CaptionSettingsMenuItem') {\n          this.menuButton_.focus();\n        }\n      }\n    }));\n  };\n\n  /**\n   * Create the `Menu`s DOM element.\n   *\n   * @return {Element}\n   *         the element that was created\n   */\n\n\n  Menu.prototype.createEl = function createEl$$1() {\n    var contentElType = this.options_.contentElType || 'ul';\n\n    this.contentEl_ = createEl(contentElType, {\n      className: 'vjs-menu-content'\n    });\n\n    this.contentEl_.setAttribute('role', 'menu');\n\n    var el = _Component.prototype.createEl.call(this, 'div', {\n      append: this.contentEl_,\n      className: 'vjs-menu'\n    });\n\n    el.appendChild(this.contentEl_);\n\n    // Prevent clicks from bubbling up. Needed for Menu Buttons,\n    // where a click on the parent is significant\n    on(el, 'click', function (event) {\n      event.preventDefault();\n      event.stopImmediatePropagation();\n    });\n\n    return el;\n  };\n\n  Menu.prototype.dispose = function dispose() {\n    this.contentEl_ = null;\n\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Handle a `keydown` event on this menu. This listener is added in the constructor.\n   *\n   * @param {EventTarget~Event} event\n   *        A `keydown` event that happened on the menu.\n   *\n   * @listens keydown\n   */\n\n\n  Menu.prototype.handleKeyPress = function handleKeyPress(event) {\n    // Left and Down Arrows\n    if (event.which === 37 || event.which === 40) {\n      event.preventDefault();\n      this.stepForward();\n\n      // Up and Right Arrows\n    } else if (event.which === 38 || event.which === 39) {\n      event.preventDefault();\n      this.stepBack();\n    }\n  };\n\n  /**\n   * Move to next (lower) menu item for keyboard users.\n   */\n\n\n  Menu.prototype.stepForward = function stepForward() {\n    var stepChild = 0;\n\n    if (this.focusedChild_ !== undefined) {\n      stepChild = this.focusedChild_ + 1;\n    }\n    this.focus(stepChild);\n  };\n\n  /**\n   * Move to previous (higher) menu item for keyboard users.\n   */\n\n\n  Menu.prototype.stepBack = function stepBack() {\n    var stepChild = 0;\n\n    if (this.focusedChild_ !== undefined) {\n      stepChild = this.focusedChild_ - 1;\n    }\n    this.focus(stepChild);\n  };\n\n  /**\n   * Set focus on a {@link MenuItem} in the `Menu`.\n   *\n   * @param {Object|string} [item=0]\n   *        Index of child item set focus on.\n   */\n\n\n  Menu.prototype.focus = function focus() {\n    var item = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n    var children = this.children().slice();\n    var haveTitle = children.length && children[0].className && /vjs-menu-title/.test(children[0].className);\n\n    if (haveTitle) {\n      children.shift();\n    }\n\n    if (children.length > 0) {\n      if (item < 0) {\n        item = 0;\n      } else if (item >= children.length) {\n        item = children.length - 1;\n      }\n\n      this.focusedChild_ = item;\n\n      children[item].el_.focus();\n    }\n  };\n\n  return Menu;\n}(Component);\n\nComponent.registerComponent('Menu', Menu);\n\n/**\n * @file menu-button.js\n */\n/**\n * A `MenuButton` class for any popup {@link Menu}.\n *\n * @extends Component\n */\n\nvar MenuButton = function (_Component) {\n  inherits(MenuButton, _Component);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function MenuButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, MenuButton);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, player, options));\n\n    _this.menuButton_ = new Button(player, options);\n\n    _this.menuButton_.controlText(_this.controlText_);\n    _this.menuButton_.el_.setAttribute('aria-haspopup', 'true');\n\n    // Add buildCSSClass values to the button, not the wrapper\n    var buttonClass = Button.prototype.buildCSSClass();\n\n    _this.menuButton_.el_.className = _this.buildCSSClass() + ' ' + buttonClass;\n    _this.menuButton_.removeClass('vjs-control');\n\n    _this.addChild(_this.menuButton_);\n\n    _this.update();\n\n    _this.enabled_ = true;\n\n    _this.on(_this.menuButton_, 'tap', _this.handleClick);\n    _this.on(_this.menuButton_, 'click', _this.handleClick);\n    _this.on(_this.menuButton_, 'focus', _this.handleFocus);\n    _this.on(_this.menuButton_, 'blur', _this.handleBlur);\n\n    _this.on('keydown', _this.handleSubmenuKeyPress);\n    return _this;\n  }\n\n  /**\n   * Update the menu based on the current state of its items.\n   */\n\n\n  MenuButton.prototype.update = function update() {\n    var menu = this.createMenu();\n\n    if (this.menu) {\n      this.menu.dispose();\n      this.removeChild(this.menu);\n    }\n\n    this.menu = menu;\n    this.addChild(menu);\n\n    /**\n     * Track the state of the menu button\n     *\n     * @type {Boolean}\n     * @private\n     */\n    this.buttonPressed_ = false;\n    this.menuButton_.el_.setAttribute('aria-expanded', 'false');\n\n    if (this.items && this.items.length <= this.hideThreshold_) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  };\n\n  /**\n   * Create the menu and add all items to it.\n   *\n   * @return {Menu}\n   *         The constructed menu\n   */\n\n\n  MenuButton.prototype.createMenu = function createMenu() {\n    var menu = new Menu(this.player_, { menuButton: this });\n\n    /**\n     * Hide the menu if the number of items is less than or equal to this threshold. This defaults\n     * to 0 and whenever we add items which can be hidden to the menu we'll increment it. We list\n     * it here because every time we run `createMenu` we need to reset the value.\n     *\n     * @protected\n     * @type {Number}\n     */\n    this.hideThreshold_ = 0;\n\n    // Add a title list item to the top\n    if (this.options_.title) {\n      var title = createEl('li', {\n        className: 'vjs-menu-title',\n        innerHTML: toTitleCase(this.options_.title),\n        tabIndex: -1\n      });\n\n      this.hideThreshold_ += 1;\n\n      menu.children_.unshift(title);\n      prependTo(title, menu.contentEl());\n    }\n\n    this.items = this.createItems();\n\n    if (this.items) {\n      // Add menu items to the menu\n      for (var i = 0; i < this.items.length; i++) {\n        menu.addItem(this.items[i]);\n      }\n    }\n\n    return menu;\n  };\n\n  /**\n   * Create the list of menu items. Specific to each subclass.\n   *\n   * @abstract\n   */\n\n\n  MenuButton.prototype.createItems = function createItems() {};\n\n  /**\n   * Create the `MenuButtons`s DOM element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  MenuButton.prototype.createEl = function createEl$$1() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: this.buildWrapperCSSClass()\n    }, {});\n  };\n\n  /**\n   * Allow sub components to stack CSS class names for the wrapper element\n   *\n   * @return {string}\n   *         The constructed wrapper DOM `className`\n   */\n\n\n  MenuButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    // TODO: Fix the CSS so that this isn't necessary\n    var buttonClass = Button.prototype.buildCSSClass();\n\n    return 'vjs-menu-button ' + menuButtonClass + ' ' + buttonClass + ' ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  MenuButton.prototype.buildCSSClass = function buildCSSClass() {\n    var menuButtonClass = 'vjs-menu-button';\n\n    // If the inline option is passed, we want to use different styles altogether.\n    if (this.options_.inline === true) {\n      menuButtonClass += '-inline';\n    } else {\n      menuButtonClass += '-popup';\n    }\n\n    return 'vjs-menu-button ' + menuButtonClass + ' ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Get or set the localized control text that will be used for accessibility.\n   *\n   * > NOTE: This will come from the internal `menuButton_` element.\n   *\n   * @param {string} [text]\n   *        Control text for element.\n   *\n   * @param {Element} [el=this.menuButton_.el()]\n   *        Element to set the title on.\n   *\n   * @return {string}\n   *         - The control text when getting\n   */\n\n\n  MenuButton.prototype.controlText = function controlText(text) {\n    var el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.menuButton_.el();\n\n    return this.menuButton_.controlText(text, el);\n  };\n\n  /**\n   * Handle a click on a `MenuButton`.\n   * See {@link ClickableComponent#handleClick} for instances where this is called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  MenuButton.prototype.handleClick = function handleClick(event) {\n    // When you click the button it adds focus, which will show the menu.\n    // So we'll remove focus when the mouse leaves the button. Focus is needed\n    // for tab navigation.\n\n    this.one(this.menu.contentEl(), 'mouseleave', bind(this, function (e) {\n      this.unpressButton();\n      this.el_.blur();\n    }));\n    if (this.buttonPressed_) {\n      this.unpressButton();\n    } else {\n      this.pressButton();\n    }\n  };\n\n  /**\n   * Set the focus to the actual button, not to this element\n   */\n\n\n  MenuButton.prototype.focus = function focus() {\n    this.menuButton_.focus();\n  };\n\n  /**\n   * Remove the focus from the actual button, not this element\n   */\n\n\n  MenuButton.prototype.blur = function blur() {\n    this.menuButton_.blur();\n  };\n\n  /**\n   * This gets called when a `MenuButton` gains focus via a `focus` event.\n   * Turns on listening for `keydown` events. When they happen it\n   * calls `this.handleKeyPress`.\n   *\n   * @param {EventTarget~Event} event\n   *        The `focus` event that caused this function to be called.\n   *\n   * @listens focus\n   */\n\n\n  MenuButton.prototype.handleFocus = function handleFocus() {\n    on(document_1, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  /**\n   * Called when a `MenuButton` loses focus. Turns off the listener for\n   * `keydown` events. Which Stops `this.handleKeyPress` from getting called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `blur` event that caused this function to be called.\n   *\n   * @listens blur\n   */\n\n\n  MenuButton.prototype.handleBlur = function handleBlur() {\n    off(document_1, 'keydown', bind(this, this.handleKeyPress));\n  };\n\n  /**\n   * Handle tab, escape, down arrow, and up arrow keys for `MenuButton`. See\n   * {@link ClickableComponent#handleKeyPress} for instances where this is called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown` event that caused this function to be called.\n   *\n   * @listens keydown\n   */\n\n\n  MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {\n\n    // Escape (27) key or Tab (9) key unpress the 'button'\n    if (event.which === 27 || event.which === 9) {\n      if (this.buttonPressed_) {\n        this.unpressButton();\n      }\n      // Don't preventDefault for Tab key - we still want to lose focus\n      if (event.which !== 9) {\n        event.preventDefault();\n        // Set focus back to the menu button's button\n        this.menuButton_.el_.focus();\n      }\n      // Up (38) key or Down (40) key press the 'button'\n    } else if (event.which === 38 || event.which === 40) {\n      if (!this.buttonPressed_) {\n        this.pressButton();\n        event.preventDefault();\n      }\n    }\n  };\n\n  /**\n   * Handle a `keydown` event on a sub-menu. The listener for this is added in\n   * the constructor.\n   *\n   * @param {EventTarget~Event} event\n   *        Key press event\n   *\n   * @listens keydown\n   */\n\n\n  MenuButton.prototype.handleSubmenuKeyPress = function handleSubmenuKeyPress(event) {\n\n    // Escape (27) key or Tab (9) key unpress the 'button'\n    if (event.which === 27 || event.which === 9) {\n      if (this.buttonPressed_) {\n        this.unpressButton();\n      }\n      // Don't preventDefault for Tab key - we still want to lose focus\n      if (event.which !== 9) {\n        event.preventDefault();\n        // Set focus back to the menu button's button\n        this.menuButton_.el_.focus();\n      }\n    }\n  };\n\n  /**\n   * Put the current `MenuButton` into a pressed state.\n   */\n\n\n  MenuButton.prototype.pressButton = function pressButton() {\n    if (this.enabled_) {\n      this.buttonPressed_ = true;\n      this.menu.lockShowing();\n      this.menuButton_.el_.setAttribute('aria-expanded', 'true');\n\n      // set the focus into the submenu, except on iOS where it is resulting in\n      // undesired scrolling behavior when the player is in an iframe\n      if (IS_IOS && isInFrame()) {\n        // Return early so that the menu isn't focused\n        return;\n      }\n\n      this.menu.focus();\n    }\n  };\n\n  /**\n   * Take the current `MenuButton` out of a pressed state.\n   */\n\n\n  MenuButton.prototype.unpressButton = function unpressButton() {\n    if (this.enabled_) {\n      this.buttonPressed_ = false;\n      this.menu.unlockShowing();\n      this.menuButton_.el_.setAttribute('aria-expanded', 'false');\n    }\n  };\n\n  /**\n   * Disable the `MenuButton`. Don't allow it to be clicked.\n   */\n\n\n  MenuButton.prototype.disable = function disable() {\n    this.unpressButton();\n\n    this.enabled_ = false;\n    this.addClass('vjs-disabled');\n\n    this.menuButton_.disable();\n  };\n\n  /**\n   * Enable the `MenuButton`. Allow it to be clicked.\n   */\n\n\n  MenuButton.prototype.enable = function enable() {\n    this.enabled_ = true;\n    this.removeClass('vjs-disabled');\n\n    this.menuButton_.enable();\n  };\n\n  return MenuButton;\n}(Component);\n\nComponent.registerComponent('MenuButton', MenuButton);\n\n/**\n * @file track-button.js\n */\n/**\n * The base class for buttons that toggle specific  track types (e.g. subtitles).\n *\n * @extends MenuButton\n */\n\nvar TrackButton = function (_MenuButton) {\n  inherits(TrackButton, _MenuButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function TrackButton(player, options) {\n    classCallCheck(this, TrackButton);\n\n    var tracks = options.tracks;\n\n    var _this = possibleConstructorReturn(this, _MenuButton.call(this, player, options));\n\n    if (_this.items.length <= 1) {\n      _this.hide();\n    }\n\n    if (!tracks) {\n      return possibleConstructorReturn(_this);\n    }\n\n    var updateHandler = bind(_this, _this.update);\n\n    tracks.addEventListener('removetrack', updateHandler);\n    tracks.addEventListener('addtrack', updateHandler);\n    _this.player_.on('ready', updateHandler);\n\n    _this.player_.on('dispose', function () {\n      tracks.removeEventListener('removetrack', updateHandler);\n      tracks.removeEventListener('addtrack', updateHandler);\n    });\n    return _this;\n  }\n\n  return TrackButton;\n}(MenuButton);\n\nComponent.registerComponent('TrackButton', TrackButton);\n\n/**\n * @file menu-item.js\n */\n/**\n * The component for a menu item. `<li>`\n *\n * @extends ClickableComponent\n */\n\nvar MenuItem = function (_ClickableComponent) {\n  inherits(MenuItem, _ClickableComponent);\n\n  /**\n   * Creates an instance of the this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   *\n   */\n  function MenuItem(player, options) {\n    classCallCheck(this, MenuItem);\n\n    var _this = possibleConstructorReturn(this, _ClickableComponent.call(this, player, options));\n\n    _this.selectable = options.selectable;\n\n    _this.selected(options.selected);\n\n    if (_this.selectable) {\n      // TODO: May need to be either menuitemcheckbox or menuitemradio,\n      //       and may need logical grouping of menu items.\n      _this.el_.setAttribute('role', 'menuitemcheckbox');\n    } else {\n      _this.el_.setAttribute('role', 'menuitem');\n    }\n    return _this;\n  }\n\n  /**\n   * Create the `MenuItem's DOM element\n   *\n   * @param {string} [type=li]\n   *        Element's node type, not actually used, always set to `li`.\n   *\n   * @param {Object} [props={}]\n   *        An object of properties that should be set on the element\n   *\n   * @param {Object} [attrs={}]\n   *        An object of attributes that should be set on the element\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  MenuItem.prototype.createEl = function createEl(type, props, attrs) {\n    // The control is textual, not just an icon\n    this.nonIconControl = true;\n\n    return _ClickableComponent.prototype.createEl.call(this, 'li', assign({\n      className: 'vjs-menu-item',\n      innerHTML: '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label) + '</span>',\n      tabIndex: -1\n    }, props), attrs);\n  };\n\n  /**\n   * Any click on a `MenuItem` puts int into the selected state.\n   * See {@link ClickableComponent#handleClick} for instances where this is called.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  MenuItem.prototype.handleClick = function handleClick(event) {\n    this.selected(true);\n  };\n\n  /**\n   * Set the state for this menu item as selected or not.\n   *\n   * @param {boolean} selected\n   *        if the menu item is selected or not\n   */\n\n\n  MenuItem.prototype.selected = function selected(_selected) {\n    if (this.selectable) {\n      if (_selected) {\n        this.addClass('vjs-selected');\n        this.el_.setAttribute('aria-checked', 'true');\n        // aria-checked isn't fully supported by browsers/screen readers,\n        // so indicate selected state to screen reader in the control text.\n        this.controlText(', selected');\n      } else {\n        this.removeClass('vjs-selected');\n        this.el_.setAttribute('aria-checked', 'false');\n        // Indicate un-selected state to screen reader\n        this.controlText('');\n      }\n    }\n  };\n\n  return MenuItem;\n}(ClickableComponent);\n\nComponent.registerComponent('MenuItem', MenuItem);\n\n/**\n * @file text-track-menu-item.js\n */\n/**\n * The specific menu item type for selecting a language within a text track kind\n *\n * @extends MenuItem\n */\n\nvar TextTrackMenuItem = function (_MenuItem) {\n  inherits(TextTrackMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function TextTrackMenuItem(player, options) {\n    classCallCheck(this, TextTrackMenuItem);\n\n    var track = options.track;\n    var tracks = player.textTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options.label = track.label || track.language || 'Unknown';\n    options.selected = track.mode === 'showing';\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.track = track;\n    var changeHandler = function changeHandler() {\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      _this.handleTracksChange.apply(_this, args);\n    };\n    var selectedLanguageChangeHandler = function selectedLanguageChangeHandler() {\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      _this.handleSelectedLanguageChange.apply(_this, args);\n    };\n\n    player.on(['loadstart', 'texttrackchange'], changeHandler);\n    tracks.addEventListener('change', changeHandler);\n    tracks.addEventListener('selectedlanguagechange', selectedLanguageChangeHandler);\n    _this.on('dispose', function () {\n      player.off(['loadstart', 'texttrackchange'], changeHandler);\n      tracks.removeEventListener('change', changeHandler);\n      tracks.removeEventListener('selectedlanguagechange', selectedLanguageChangeHandler);\n    });\n\n    // iOS7 doesn't dispatch change events to TextTrackLists when an\n    // associated track's mode changes. Without something like\n    // Object.observe() (also not present on iOS7), it's not\n    // possible to detect changes to the mode attribute and polyfill\n    // the change event. As a poor substitute, we manually dispatch\n    // change events whenever the controls modify the mode.\n    if (tracks.onchange === undefined) {\n      var event = void 0;\n\n      _this.on(['tap', 'click'], function () {\n        if (_typeof(window_1.Event) !== 'object') {\n          // Android 2.3 throws an Illegal Constructor error for window.Event\n          try {\n            event = new window_1.Event('change');\n          } catch (err) {\n            // continue regardless of error\n          }\n        }\n\n        if (!event) {\n          event = document_1.createEvent('Event');\n          event.initEvent('change', true, true);\n        }\n\n        tracks.dispatchEvent(event);\n      });\n    }\n\n    // set the default state based on current tracks\n    _this.handleTracksChange();\n    return _this;\n  }\n\n  /**\n   * This gets called when an `TextTrackMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} event\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  TextTrackMenuItem.prototype.handleClick = function handleClick(event) {\n    var kind = this.track.kind;\n    var kinds = this.track.kinds;\n    var tracks = this.player_.textTracks();\n\n    if (!kinds) {\n      kinds = [kind];\n    }\n\n    _MenuItem.prototype.handleClick.call(this, event);\n\n    if (!tracks) {\n      return;\n    }\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      if (track === this.track && kinds.indexOf(track.kind) > -1) {\n        if (track.mode !== 'showing') {\n          track.mode = 'showing';\n        }\n      } else if (track.mode !== 'disabled') {\n        track.mode = 'disabled';\n      }\n    }\n  };\n\n  /**\n   * Handle text track list change\n   *\n   * @param {EventTarget~Event} event\n   *        The `change` event that caused this function to be called.\n   *\n   * @listens TextTrackList#change\n   */\n\n\n  TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n    this.selected(this.track.mode === 'showing');\n  };\n\n  TextTrackMenuItem.prototype.handleSelectedLanguageChange = function handleSelectedLanguageChange(event) {\n    if (this.track.mode === 'showing') {\n      var selectedLanguage = this.player_.cache_.selectedLanguage;\n\n      // Don't replace the kind of track across the same language\n      if (selectedLanguage && selectedLanguage.enabled && selectedLanguage.language === this.track.language && selectedLanguage.kind !== this.track.kind) {\n        return;\n      }\n\n      this.player_.cache_.selectedLanguage = {\n        enabled: true,\n        language: this.track.language,\n        kind: this.track.kind\n      };\n    }\n  };\n\n  TextTrackMenuItem.prototype.dispose = function dispose() {\n    // remove reference to track object on dispose\n    this.track = null;\n\n    _MenuItem.prototype.dispose.call(this);\n  };\n\n  return TextTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('TextTrackMenuItem', TextTrackMenuItem);\n\n/**\n * @file off-text-track-menu-item.js\n */\n/**\n * A special menu item for turning of a specific type of text track\n *\n * @extends TextTrackMenuItem\n */\n\nvar OffTextTrackMenuItem = function (_TextTrackMenuItem) {\n  inherits(OffTextTrackMenuItem, _TextTrackMenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function OffTextTrackMenuItem(player, options) {\n    classCallCheck(this, OffTextTrackMenuItem);\n\n    // Create pseudo track info\n    // Requires options['kind']\n    options.track = {\n      player: player,\n      kind: options.kind,\n      kinds: options.kinds,\n      'default': false,\n      mode: 'disabled'\n    };\n\n    if (!options.kinds) {\n      options.kinds = [options.kind];\n    }\n\n    if (options.label) {\n      options.track.label = options.label;\n    } else {\n      options.track.label = options.kinds.join(' and ') + ' off';\n    }\n\n    // MenuItem is selectable\n    options.selectable = true;\n\n    return possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options));\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run\n   */\n\n\n  OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n    var tracks = this.player().textTracks();\n    var selected = true;\n\n    for (var i = 0, l = tracks.length; i < l; i++) {\n      var track = tracks[i];\n\n      if (this.options_.kinds.indexOf(track.kind) > -1 && track.mode === 'showing') {\n        selected = false;\n        break;\n      }\n    }\n\n    this.selected(selected);\n  };\n\n  OffTextTrackMenuItem.prototype.handleSelectedLanguageChange = function handleSelectedLanguageChange(event) {\n    var tracks = this.player().textTracks();\n    var allHidden = true;\n\n    for (var i = 0, l = tracks.length; i < l; i++) {\n      var track = tracks[i];\n\n      if (['captions', 'descriptions', 'subtitles'].indexOf(track.kind) > -1 && track.mode === 'showing') {\n        allHidden = false;\n        break;\n      }\n    }\n\n    if (allHidden) {\n      this.player_.cache_.selectedLanguage = {\n        enabled: false\n      };\n    }\n  };\n\n  return OffTextTrackMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);\n\n/**\n * @file text-track-button.js\n */\n/**\n * The base class for buttons that toggle specific text track types (e.g. subtitles)\n *\n * @extends MenuButton\n */\n\nvar TextTrackButton = function (_TrackButton) {\n  inherits(TextTrackButton, _TrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function TextTrackButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, TextTrackButton);\n\n    options.tracks = player.textTracks();\n\n    return possibleConstructorReturn(this, _TrackButton.call(this, player, options));\n  }\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @param {TextTrackMenuItem[]} [items=[]]\n   *        Existing array of items to use during creation\n   *\n   * @return {TextTrackMenuItem[]}\n   *         Array of menu items that were created\n   */\n\n\n  TextTrackButton.prototype.createItems = function createItems() {\n    var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    var TrackMenuItem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : TextTrackMenuItem;\n\n\n    // Label is an overide for the [track] off label\n    // USed to localise captions/subtitles\n    var label = void 0;\n\n    if (this.label_) {\n      label = this.label_ + ' off';\n    }\n    // Add an OFF menu item to turn all tracks off\n    items.push(new OffTextTrackMenuItem(this.player_, {\n      kinds: this.kinds_,\n      kind: this.kind_,\n      label: label\n    }));\n\n    this.hideThreshold_ += 1;\n\n    var tracks = this.player_.textTracks();\n\n    if (!Array.isArray(this.kinds_)) {\n      this.kinds_ = [this.kind_];\n    }\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      // only add tracks that are of an appropriate kind and have a label\n      if (this.kinds_.indexOf(track.kind) > -1) {\n\n        var item = new TrackMenuItem(this.player_, {\n          track: track,\n          // MenuItem is selectable\n          selectable: true\n        });\n\n        item.addClass('vjs-' + track.kind + '-menu-item');\n        items.push(item);\n      }\n    }\n\n    return items;\n  };\n\n  return TextTrackButton;\n}(TrackButton);\n\nComponent.registerComponent('TextTrackButton', TextTrackButton);\n\n/**\n * @file chapters-track-menu-item.js\n */\n/**\n * The chapter track menu item\n *\n * @extends MenuItem\n */\n\nvar ChaptersTrackMenuItem = function (_MenuItem) {\n  inherits(ChaptersTrackMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function ChaptersTrackMenuItem(player, options) {\n    classCallCheck(this, ChaptersTrackMenuItem);\n\n    var track = options.track;\n    var cue = options.cue;\n    var currentTime = player.currentTime();\n\n    // Modify options for parent MenuItem class's init.\n    options.selectable = true;\n    options.label = cue.text;\n    options.selected = cue.startTime <= currentTime && currentTime < cue.endTime;\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.track = track;\n    _this.cue = cue;\n    track.addEventListener('cuechange', bind(_this, _this.update));\n    return _this;\n  }\n\n  /**\n   * This gets called when an `ChaptersTrackMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  ChaptersTrackMenuItem.prototype.handleClick = function handleClick(event) {\n    _MenuItem.prototype.handleClick.call(this);\n    this.player_.currentTime(this.cue.startTime);\n    this.update(this.cue.startTime);\n  };\n\n  /**\n   * Update chapter menu item\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `cuechange` event that caused this function to run.\n   *\n   * @listens TextTrack#cuechange\n   */\n\n\n  ChaptersTrackMenuItem.prototype.update = function update(event) {\n    var cue = this.cue;\n    var currentTime = this.player_.currentTime();\n\n    // vjs.log(currentTime, cue.startTime);\n    this.selected(cue.startTime <= currentTime && currentTime < cue.endTime);\n  };\n\n  return ChaptersTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);\n\n/**\n * @file chapters-button.js\n */\n/**\n * The button component for toggling and selecting chapters\n * Chapters act much differently than other text tracks\n * Cues are navigation vs. other tracks of alternative languages\n *\n * @extends TextTrackButton\n */\n\nvar ChaptersButton = function (_TextTrackButton) {\n  inherits(ChaptersButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this function is ready.\n   */\n  function ChaptersButton(player, options, ready) {\n    classCallCheck(this, ChaptersButton);\n    return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  ChaptersButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Update the menu based on the current state of its items.\n   *\n   * @param {EventTarget~Event} [event]\n   *        An event that triggered this function to run.\n   *\n   * @listens TextTrackList#addtrack\n   * @listens TextTrackList#removetrack\n   * @listens TextTrackList#change\n   */\n\n\n  ChaptersButton.prototype.update = function update(event) {\n    if (!this.track_ || event && (event.type === 'addtrack' || event.type === 'removetrack')) {\n      this.setTrack(this.findChaptersTrack());\n    }\n    _TextTrackButton.prototype.update.call(this);\n  };\n\n  /**\n   * Set the currently selected track for the chapters button.\n   *\n   * @param {TextTrack} track\n   *        The new track to select. Nothing will change if this is the currently selected\n   *        track.\n   */\n\n\n  ChaptersButton.prototype.setTrack = function setTrack(track) {\n    if (this.track_ === track) {\n      return;\n    }\n\n    if (!this.updateHandler_) {\n      this.updateHandler_ = this.update.bind(this);\n    }\n\n    // here this.track_ refers to the old track instance\n    if (this.track_) {\n      var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);\n\n      if (remoteTextTrackEl) {\n        remoteTextTrackEl.removeEventListener('load', this.updateHandler_);\n      }\n\n      this.track_ = null;\n    }\n\n    this.track_ = track;\n\n    // here this.track_ refers to the new track instance\n    if (this.track_) {\n      this.track_.mode = 'hidden';\n\n      var _remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(this.track_);\n\n      if (_remoteTextTrackEl) {\n        _remoteTextTrackEl.addEventListener('load', this.updateHandler_);\n      }\n    }\n  };\n\n  /**\n   * Find the track object that is currently in use by this ChaptersButton\n   *\n   * @return {TextTrack|undefined}\n   *         The current track or undefined if none was found.\n   */\n\n\n  ChaptersButton.prototype.findChaptersTrack = function findChaptersTrack() {\n    var tracks = this.player_.textTracks() || [];\n\n    for (var i = tracks.length - 1; i >= 0; i--) {\n      // We will always choose the last track as our chaptersTrack\n      var track = tracks[i];\n\n      if (track.kind === this.kind_) {\n        return track;\n      }\n    }\n  };\n\n  /**\n   * Get the caption for the ChaptersButton based on the track label. This will also\n   * use the current tracks localized kind as a fallback if a label does not exist.\n   *\n   * @return {string}\n   *         The tracks current label or the localized track kind.\n   */\n\n\n  ChaptersButton.prototype.getMenuCaption = function getMenuCaption() {\n    if (this.track_ && this.track_.label) {\n      return this.track_.label;\n    }\n    return this.localize(toTitleCase(this.kind_));\n  };\n\n  /**\n   * Create menu from chapter track\n   *\n   * @return {Menu}\n   *         New menu for the chapter buttons\n   */\n\n\n  ChaptersButton.prototype.createMenu = function createMenu() {\n    this.options_.title = this.getMenuCaption();\n    return _TextTrackButton.prototype.createMenu.call(this);\n  };\n\n  /**\n   * Create a menu item for each text track\n   *\n   * @return {TextTrackMenuItem[]}\n   *         Array of menu items\n   */\n\n\n  ChaptersButton.prototype.createItems = function createItems() {\n    var items = [];\n\n    if (!this.track_) {\n      return items;\n    }\n\n    var cues = this.track_.cues;\n\n    if (!cues) {\n      return items;\n    }\n\n    for (var i = 0, l = cues.length; i < l; i++) {\n      var cue = cues[i];\n      var mi = new ChaptersTrackMenuItem(this.player_, { track: this.track_, cue: cue });\n\n      items.push(mi);\n    }\n\n    return items;\n  };\n\n  return ChaptersButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nChaptersButton.prototype.kind_ = 'chapters';\n\n/**\n * The text that should display over the `ChaptersButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nChaptersButton.prototype.controlText_ = 'Chapters';\n\nComponent.registerComponent('ChaptersButton', ChaptersButton);\n\n/**\n * @file descriptions-button.js\n */\n/**\n * The button component for toggling and selecting descriptions\n *\n * @extends TextTrackButton\n */\n\nvar DescriptionsButton = function (_TextTrackButton) {\n  inherits(DescriptionsButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this component is ready.\n   */\n  function DescriptionsButton(player, options, ready) {\n    classCallCheck(this, DescriptionsButton);\n\n    var _this = possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n\n    var tracks = player.textTracks();\n    var changeHandler = bind(_this, _this.handleTracksChange);\n\n    tracks.addEventListener('change', changeHandler);\n    _this.on('dispose', function () {\n      tracks.removeEventListener('change', changeHandler);\n    });\n    return _this;\n  }\n\n  /**\n   * Handle text track change\n   *\n   * @param {EventTarget~Event} event\n   *        The event that caused this function to run\n   *\n   * @listens TextTrackList#change\n   */\n\n\n  DescriptionsButton.prototype.handleTracksChange = function handleTracksChange(event) {\n    var tracks = this.player().textTracks();\n    var disabled = false;\n\n    // Check whether a track of a different kind is showing\n    for (var i = 0, l = tracks.length; i < l; i++) {\n      var track = tracks[i];\n\n      if (track.kind !== this.kind_ && track.mode === 'showing') {\n        disabled = true;\n        break;\n      }\n    }\n\n    // If another track is showing, disable this menu button\n    if (disabled) {\n      this.disable();\n    } else {\n      this.enable();\n    }\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  DescriptionsButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  DescriptionsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  return DescriptionsButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nDescriptionsButton.prototype.kind_ = 'descriptions';\n\n/**\n * The text that should display over the `DescriptionsButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nDescriptionsButton.prototype.controlText_ = 'Descriptions';\n\nComponent.registerComponent('DescriptionsButton', DescriptionsButton);\n\n/**\n * @file subtitles-button.js\n */\n/**\n * The button component for toggling and selecting subtitles\n *\n * @extends TextTrackButton\n */\n\nvar SubtitlesButton = function (_TextTrackButton) {\n  inherits(SubtitlesButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this component is ready.\n   */\n  function SubtitlesButton(player, options, ready) {\n    classCallCheck(this, SubtitlesButton);\n    return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  SubtitlesButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  return SubtitlesButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nSubtitlesButton.prototype.kind_ = 'subtitles';\n\n/**\n * The text that should display over the `SubtitlesButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nSubtitlesButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubtitlesButton', SubtitlesButton);\n\n/**\n * @file caption-settings-menu-item.js\n */\n/**\n * The menu item for caption track settings menu\n *\n * @extends TextTrackMenuItem\n */\n\nvar CaptionSettingsMenuItem = function (_TextTrackMenuItem) {\n  inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function CaptionSettingsMenuItem(player, options) {\n    classCallCheck(this, CaptionSettingsMenuItem);\n\n    options.track = {\n      player: player,\n      kind: options.kind,\n      label: options.kind + ' settings',\n      selectable: false,\n      'default': false,\n      mode: 'disabled'\n    };\n\n    // CaptionSettingsMenuItem has no concept of 'selected'\n    options.selectable = false;\n\n    options.name = 'CaptionSettingsMenuItem';\n\n    var _this = possibleConstructorReturn(this, _TextTrackMenuItem.call(this, player, options));\n\n    _this.addClass('vjs-texttrack-settings');\n    _this.controlText(', opens ' + options.kind + ' settings dialog');\n    return _this;\n  }\n\n  /**\n   * This gets called when an `CaptionSettingsMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  CaptionSettingsMenuItem.prototype.handleClick = function handleClick(event) {\n    this.player().getChild('textTrackSettings').open();\n  };\n\n  return CaptionSettingsMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);\n\n/**\n * @file captions-button.js\n */\n/**\n * The button component for toggling and selecting captions\n *\n * @extends TextTrackButton\n */\n\nvar CaptionsButton = function (_TextTrackButton) {\n  inherits(CaptionsButton, _TextTrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        The function to call when this component is ready.\n   */\n  function CaptionsButton(player, options, ready) {\n    classCallCheck(this, CaptionsButton);\n    return possibleConstructorReturn(this, _TextTrackButton.call(this, player, options, ready));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  CaptionsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-captions-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create caption menu items\n   *\n   * @return {CaptionSettingsMenuItem[]}\n   *         The array of current menu items.\n   */\n\n\n  CaptionsButton.prototype.createItems = function createItems() {\n    var items = [];\n\n    if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks)) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { kind: this.kind_ }));\n\n      this.hideThreshold_ += 1;\n    }\n\n    return _TextTrackButton.prototype.createItems.call(this, items);\n  };\n\n  return CaptionsButton;\n}(TextTrackButton);\n\n/**\n * `kind` of TextTrack to look for to associate it with this menu.\n *\n * @type {string}\n * @private\n */\n\n\nCaptionsButton.prototype.kind_ = 'captions';\n\n/**\n * The text that should display over the `CaptionsButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\nCaptionsButton.prototype.controlText_ = 'Captions';\n\nComponent.registerComponent('CaptionsButton', CaptionsButton);\n\n/**\n * @file subs-caps-menu-item.js\n */\n/**\n * SubsCapsMenuItem has an [cc] icon to distinguish captions from subtitles\n * in the SubsCapsMenu.\n *\n * @extends TextTrackMenuItem\n */\n\nvar SubsCapsMenuItem = function (_TextTrackMenuItem) {\n  inherits(SubsCapsMenuItem, _TextTrackMenuItem);\n\n  function SubsCapsMenuItem() {\n    classCallCheck(this, SubsCapsMenuItem);\n    return possibleConstructorReturn(this, _TextTrackMenuItem.apply(this, arguments));\n  }\n\n  SubsCapsMenuItem.prototype.createEl = function createEl(type, props, attrs) {\n    var innerHTML = '<span class=\"vjs-menu-item-text\">' + this.localize(this.options_.label);\n\n    if (this.options_.track.kind === 'captions') {\n      innerHTML += '\\n        <span aria-hidden=\"true\" class=\"vjs-icon-placeholder\"></span>\\n        <span class=\"vjs-control-text\"> ' + this.localize('Captions') + '</span>\\n      ';\n    }\n\n    innerHTML += '</span>';\n\n    var el = _TextTrackMenuItem.prototype.createEl.call(this, type, assign({\n      innerHTML: innerHTML\n    }, props), attrs);\n\n    return el;\n  };\n\n  return SubsCapsMenuItem;\n}(TextTrackMenuItem);\n\nComponent.registerComponent('SubsCapsMenuItem', SubsCapsMenuItem);\n\n/**\n * @file sub-caps-button.js\n */\n/**\n * The button component for toggling and selecting captions and/or subtitles\n *\n * @extends TextTrackButton\n */\n\nvar SubsCapsButton = function (_TextTrackButton) {\n  inherits(SubsCapsButton, _TextTrackButton);\n\n  function SubsCapsButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, SubsCapsButton);\n\n    // Although North America uses \"captions\" in most cases for\n    // \"captions and subtitles\" other locales use \"subtitles\"\n    var _this = possibleConstructorReturn(this, _TextTrackButton.call(this, player, options));\n\n    _this.label_ = 'subtitles';\n    if (['en', 'en-us', 'en-ca', 'fr-ca'].indexOf(_this.player_.language_) > -1) {\n      _this.label_ = 'captions';\n    }\n    _this.menuButton_.controlText(toTitleCase(_this.label_));\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  SubsCapsButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-subs-caps-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  SubsCapsButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-subs-caps-button ' + _TextTrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create caption/subtitles menu items\n   *\n   * @return {CaptionSettingsMenuItem[]}\n   *         The array of current menu items.\n   */\n\n\n  SubsCapsButton.prototype.createItems = function createItems() {\n    var items = [];\n\n    if (!(this.player().tech_ && this.player().tech_.featuresNativeTextTracks)) {\n      items.push(new CaptionSettingsMenuItem(this.player_, { kind: this.label_ }));\n\n      this.hideThreshold_ += 1;\n    }\n\n    items = _TextTrackButton.prototype.createItems.call(this, items, SubsCapsMenuItem);\n    return items;\n  };\n\n  return SubsCapsButton;\n}(TextTrackButton);\n\n/**\n * `kind`s of TextTrack to look for to associate it with this menu.\n *\n * @type {array}\n * @private\n */\n\n\nSubsCapsButton.prototype.kinds_ = ['captions', 'subtitles'];\n\n/**\n * The text that should display over the `SubsCapsButton`s controls.\n *\n *\n * @type {string}\n * @private\n */\nSubsCapsButton.prototype.controlText_ = 'Subtitles';\n\nComponent.registerComponent('SubsCapsButton', SubsCapsButton);\n\n/**\n * @file audio-track-menu-item.js\n */\n/**\n * An {@link AudioTrack} {@link MenuItem}\n *\n * @extends MenuItem\n */\n\nvar AudioTrackMenuItem = function (_MenuItem) {\n  inherits(AudioTrackMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function AudioTrackMenuItem(player, options) {\n    classCallCheck(this, AudioTrackMenuItem);\n\n    var track = options.track;\n    var tracks = player.audioTracks();\n\n    // Modify options for parent MenuItem class's init.\n    options.label = track.label || track.language || 'Unknown';\n    options.selected = track.enabled;\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.track = track;\n\n    var changeHandler = bind(_this, _this.handleTracksChange);\n\n    tracks.addEventListener('change', changeHandler);\n    _this.on('dispose', function () {\n      tracks.removeEventListener('change', changeHandler);\n    });\n    return _this;\n  }\n\n  /**\n   * This gets called when an `AudioTrackMenuItem is \"clicked\". See {@link ClickableComponent}\n   * for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  AudioTrackMenuItem.prototype.handleClick = function handleClick(event) {\n    var tracks = this.player_.audioTracks();\n\n    _MenuItem.prototype.handleClick.call(this, event);\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      track.enabled = track === this.track;\n    }\n  };\n\n  /**\n   * Handle any {@link AudioTrack} change.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The {@link AudioTrackList#change} event that caused this to run.\n   *\n   * @listens AudioTrackList#change\n   */\n\n\n  AudioTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {\n    this.selected(this.track.enabled);\n  };\n\n  return AudioTrackMenuItem;\n}(MenuItem);\n\nComponent.registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);\n\n/**\n * @file audio-track-button.js\n */\n/**\n * The base class for buttons that toggle specific {@link AudioTrack} types.\n *\n * @extends TrackButton\n */\n\nvar AudioTrackButton = function (_TrackButton) {\n  inherits(AudioTrackButton, _TrackButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options={}]\n   *        The key/value store of player options.\n   */\n  function AudioTrackButton(player) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, AudioTrackButton);\n\n    options.tracks = player.audioTracks();\n\n    return possibleConstructorReturn(this, _TrackButton.call(this, player, options));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  AudioTrackButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-audio-button ' + _TrackButton.prototype.buildCSSClass.call(this);\n  };\n\n  AudioTrackButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-audio-button ' + _TrackButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create a menu item for each audio track\n   *\n   * @param {AudioTrackMenuItem[]} [items=[]]\n   *        An array of existing menu items to use.\n   *\n   * @return {AudioTrackMenuItem[]}\n   *         An array of menu items\n   */\n\n\n  AudioTrackButton.prototype.createItems = function createItems() {\n    var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    // if there's only one audio track, there no point in showing it\n    this.hideThreshold_ = 1;\n\n    var tracks = this.player_.audioTracks();\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      items.push(new AudioTrackMenuItem(this.player_, {\n        track: track,\n        // MenuItem is selectable\n        selectable: true\n      }));\n    }\n\n    return items;\n  };\n\n  return AudioTrackButton;\n}(TrackButton);\n\n/**\n * The text that should display over the `AudioTrackButton`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nAudioTrackButton.prototype.controlText_ = 'Audio Track';\nComponent.registerComponent('AudioTrackButton', AudioTrackButton);\n\n/**\n * @file playback-rate-menu-item.js\n */\n/**\n * The specific menu item type for selecting a playback rate.\n *\n * @extends MenuItem\n */\n\nvar PlaybackRateMenuItem = function (_MenuItem) {\n  inherits(PlaybackRateMenuItem, _MenuItem);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PlaybackRateMenuItem(player, options) {\n    classCallCheck(this, PlaybackRateMenuItem);\n\n    var label = options.rate;\n    var rate = parseFloat(label, 10);\n\n    // Modify options for parent MenuItem class's init.\n    options.label = label;\n    options.selected = rate === 1;\n    options.selectable = true;\n\n    var _this = possibleConstructorReturn(this, _MenuItem.call(this, player, options));\n\n    _this.label = label;\n    _this.rate = rate;\n\n    _this.on(player, 'ratechange', _this.update);\n    return _this;\n  }\n\n  /**\n   * This gets called when an `PlaybackRateMenuItem` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  PlaybackRateMenuItem.prototype.handleClick = function handleClick(event) {\n    _MenuItem.prototype.handleClick.call(this);\n    this.player().playbackRate(this.rate);\n  };\n\n  /**\n   * Update the PlaybackRateMenuItem when the playbackrate changes.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `ratechange` event that caused this function to run.\n   *\n   * @listens Player#ratechange\n   */\n\n\n  PlaybackRateMenuItem.prototype.update = function update(event) {\n    this.selected(this.player().playbackRate() === this.rate);\n  };\n\n  return PlaybackRateMenuItem;\n}(MenuItem);\n\n/**\n * The text that should display over the `PlaybackRateMenuItem`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlaybackRateMenuItem.prototype.contentElType = 'button';\n\nComponent.registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);\n\n/**\n * @file playback-rate-menu-button.js\n */\n/**\n * The component for controlling the playback rate.\n *\n * @extends MenuButton\n */\n\nvar PlaybackRateMenuButton = function (_MenuButton) {\n  inherits(PlaybackRateMenuButton, _MenuButton);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *        The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   */\n  function PlaybackRateMenuButton(player, options) {\n    classCallCheck(this, PlaybackRateMenuButton);\n\n    var _this = possibleConstructorReturn(this, _MenuButton.call(this, player, options));\n\n    _this.updateVisibility();\n    _this.updateLabel();\n\n    _this.on(player, 'loadstart', _this.updateVisibility);\n    _this.on(player, 'ratechange', _this.updateLabel);\n    return _this;\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  PlaybackRateMenuButton.prototype.createEl = function createEl$$1() {\n    var el = _MenuButton.prototype.createEl.call(this);\n\n    this.labelEl_ = createEl('div', {\n      className: 'vjs-playback-rate-value',\n      innerHTML: '1x'\n    });\n\n    el.appendChild(this.labelEl_);\n\n    return el;\n  };\n\n  PlaybackRateMenuButton.prototype.dispose = function dispose() {\n    this.labelEl_ = null;\n\n    _MenuButton.prototype.dispose.call(this);\n  };\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n\n\n  PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);\n  };\n\n  PlaybackRateMenuButton.prototype.buildWrapperCSSClass = function buildWrapperCSSClass() {\n    return 'vjs-playback-rate ' + _MenuButton.prototype.buildWrapperCSSClass.call(this);\n  };\n\n  /**\n   * Create the playback rate menu\n   *\n   * @return {Menu}\n   *         Menu object populated with {@link PlaybackRateMenuItem}s\n   */\n\n\n  PlaybackRateMenuButton.prototype.createMenu = function createMenu() {\n    var menu = new Menu(this.player());\n    var rates = this.playbackRates();\n\n    if (rates) {\n      for (var i = rates.length - 1; i >= 0; i--) {\n        menu.addChild(new PlaybackRateMenuItem(this.player(), { rate: rates[i] + 'x' }));\n      }\n    }\n\n    return menu;\n  };\n\n  /**\n   * Updates ARIA accessibility attributes\n   */\n\n\n  PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {\n    // Current playback rate\n    this.el().setAttribute('aria-valuenow', this.player().playbackRate());\n  };\n\n  /**\n   * This gets called when an `PlaybackRateMenuButton` is \"clicked\". See\n   * {@link ClickableComponent} for more detailed information on what a click can be.\n   *\n   * @param {EventTarget~Event} [event]\n   *        The `keydown`, `tap`, or `click` event that caused this function to be\n   *        called.\n   *\n   * @listens tap\n   * @listens click\n   */\n\n\n  PlaybackRateMenuButton.prototype.handleClick = function handleClick(event) {\n    // select next rate option\n    var currentRate = this.player().playbackRate();\n    var rates = this.playbackRates();\n\n    // this will select first one if the last one currently selected\n    var newRate = rates[0];\n\n    for (var i = 0; i < rates.length; i++) {\n      if (rates[i] > currentRate) {\n        newRate = rates[i];\n        break;\n      }\n    }\n    this.player().playbackRate(newRate);\n  };\n\n  /**\n   * Get possible playback rates\n   *\n   * @return {Array}\n   *         All possible playback rates\n   */\n\n\n  PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {\n    return this.options_.playbackRates || this.options_.playerOptions && this.options_.playerOptions.playbackRates;\n  };\n\n  /**\n   * Get whether playback rates is supported by the tech\n   * and an array of playback rates exists\n   *\n   * @return {boolean}\n   *         Whether changing playback rate is supported\n   */\n\n\n  PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {\n    return this.player().tech_ && this.player().tech_.featuresPlaybackRate && this.playbackRates() && this.playbackRates().length > 0;\n  };\n\n  /**\n   * Hide playback rate controls when they're no playback rate options to select\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#loadstart\n   */\n\n\n  PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility(event) {\n    if (this.playbackRateSupported()) {\n      this.removeClass('vjs-hidden');\n    } else {\n      this.addClass('vjs-hidden');\n    }\n  };\n\n  /**\n   * Update button label when rate changed\n   *\n   * @param {EventTarget~Event} [event]\n   *        The event that caused this function to run.\n   *\n   * @listens Player#ratechange\n   */\n\n\n  PlaybackRateMenuButton.prototype.updateLabel = function updateLabel(event) {\n    if (this.playbackRateSupported()) {\n      this.labelEl_.innerHTML = this.player().playbackRate() + 'x';\n    }\n  };\n\n  return PlaybackRateMenuButton;\n}(MenuButton);\n\n/**\n * The text that should display over the `FullscreenToggle`s controls. Added for localization.\n *\n * @type {string}\n * @private\n */\n\n\nPlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';\n\nComponent.registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);\n\n/**\n * @file spacer.js\n */\n/**\n * Just an empty spacer element that can be used as an append point for plugins, etc.\n * Also can be used to create space between elements when necessary.\n *\n * @extends Component\n */\n\nvar Spacer = function (_Component) {\n  inherits(Spacer, _Component);\n\n  function Spacer() {\n    classCallCheck(this, Spacer);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n  Spacer.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  Spacer.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: this.buildCSSClass()\n    });\n  };\n\n  return Spacer;\n}(Component);\n\nComponent.registerComponent('Spacer', Spacer);\n\n/**\n * @file custom-control-spacer.js\n */\n/**\n * Spacer specifically meant to be used as an insertion point for new plugins, etc.\n *\n * @extends Spacer\n */\n\nvar CustomControlSpacer = function (_Spacer) {\n  inherits(CustomControlSpacer, _Spacer);\n\n  function CustomControlSpacer() {\n    classCallCheck(this, CustomControlSpacer);\n    return possibleConstructorReturn(this, _Spacer.apply(this, arguments));\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   */\n  CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n\n\n  CustomControlSpacer.prototype.createEl = function createEl() {\n    var el = _Spacer.prototype.createEl.call(this, {\n      className: this.buildCSSClass()\n    });\n\n    // No-flex/table-cell mode requires there be some content\n    // in the cell to fill the remaining space of the table.\n    el.innerHTML = '&nbsp;';\n    return el;\n  };\n\n  return CustomControlSpacer;\n}(Spacer);\n\nComponent.registerComponent('CustomControlSpacer', CustomControlSpacer);\n\n/**\n * @file control-bar.js\n */\n// Required children\n/**\n * Container of main controls.\n *\n * @extends Component\n */\n\nvar ControlBar = function (_Component) {\n  inherits(ControlBar, _Component);\n\n  function ControlBar() {\n    classCallCheck(this, ControlBar);\n    return possibleConstructorReturn(this, _Component.apply(this, arguments));\n  }\n\n  /**\n   * Create the `Component`'s DOM element\n   *\n   * @return {Element}\n   *         The element that was created.\n   */\n  ControlBar.prototype.createEl = function createEl() {\n    return _Component.prototype.createEl.call(this, 'div', {\n      className: 'vjs-control-bar',\n      dir: 'ltr'\n    }, {\n      // The control bar is a group, but we don't aria-label it to avoid\n      //  over-announcing by JAWS\n      role: 'group'\n    });\n  };\n\n  return ControlBar;\n}(Component);\n\n/**\n * Default options for `ControlBar`\n *\n * @type {Object}\n * @private\n */\n\n\nControlBar.prototype.options_ = {\n  children: ['playToggle', 'volumePanel', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'descriptionsButton', 'subsCapsButton', 'audioTrackButton', 'fullscreenToggle']\n};\n\nComponent.registerComponent('ControlBar', ControlBar);\n\n/**\n * @file error-display.js\n */\n/**\n * A display that indicates an error has occurred. This means that the video\n * is unplayable.\n *\n * @extends ModalDialog\n */\n\nvar ErrorDisplay = function (_ModalDialog) {\n  inherits(ErrorDisplay, _ModalDialog);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param  {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param  {Object} [options]\n   *         The key/value store of player options.\n   */\n  function ErrorDisplay(player, options) {\n    classCallCheck(this, ErrorDisplay);\n\n    var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options));\n\n    _this.on(player, 'error', _this.open);\n    return _this;\n  }\n\n  /**\n   * Builds the default DOM `className`.\n   *\n   * @return {string}\n   *         The DOM `className` for this object.\n   *\n   * @deprecated Since version 5.\n   */\n\n\n  ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() {\n    return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this);\n  };\n\n  /**\n   * Gets the localized error message based on the `Player`s error.\n   *\n   * @return {string}\n   *         The `Player`s error message localized or an empty string.\n   */\n\n\n  ErrorDisplay.prototype.content = function content() {\n    var error = this.player().error();\n\n    return error ? this.localize(error.message) : '';\n  };\n\n  return ErrorDisplay;\n}(ModalDialog);\n\n/**\n * The default options for an `ErrorDisplay`.\n *\n * @private\n */\n\n\nErrorDisplay.prototype.options_ = mergeOptions(ModalDialog.prototype.options_, {\n  pauseOnOpen: false,\n  fillAlways: true,\n  temporary: false,\n  uncloseable: true\n});\n\nComponent.registerComponent('ErrorDisplay', ErrorDisplay);\n\n/**\n * @file text-track-settings.js\n */\nvar LOCAL_STORAGE_KEY = 'vjs-text-track-settings';\n\nvar COLOR_BLACK = ['#000', 'Black'];\nvar COLOR_BLUE = ['#00F', 'Blue'];\nvar COLOR_CYAN = ['#0FF', 'Cyan'];\nvar COLOR_GREEN = ['#0F0', 'Green'];\nvar COLOR_MAGENTA = ['#F0F', 'Magenta'];\nvar COLOR_RED = ['#F00', 'Red'];\nvar COLOR_WHITE = ['#FFF', 'White'];\nvar COLOR_YELLOW = ['#FF0', 'Yellow'];\n\nvar OPACITY_OPAQUE = ['1', 'Opaque'];\nvar OPACITY_SEMI = ['0.5', 'Semi-Transparent'];\nvar OPACITY_TRANS = ['0', 'Transparent'];\n\n// Configuration for the various <select> elements in the DOM of this component.\n//\n// Possible keys include:\n//\n// `default`:\n//   The default option index. Only needs to be provided if not zero.\n// `parser`:\n//   A function which is used to parse the value from the selected option in\n//   a customized way.\n// `selector`:\n//   The selector used to find the associated <select> element.\nvar selectConfigs = {\n  backgroundColor: {\n    selector: '.vjs-bg-color > select',\n    id: 'captions-background-color-%s',\n    label: 'Color',\n    options: [COLOR_BLACK, COLOR_WHITE, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]\n  },\n\n  backgroundOpacity: {\n    selector: '.vjs-bg-opacity > select',\n    id: 'captions-background-opacity-%s',\n    label: 'Transparency',\n    options: [OPACITY_OPAQUE, OPACITY_SEMI, OPACITY_TRANS]\n  },\n\n  color: {\n    selector: '.vjs-fg-color > select',\n    id: 'captions-foreground-color-%s',\n    label: 'Color',\n    options: [COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_MAGENTA, COLOR_CYAN]\n  },\n\n  edgeStyle: {\n    selector: '.vjs-edge-style > select',\n    id: '%s',\n    label: 'Text Edge Style',\n    options: [['none', 'None'], ['raised', 'Raised'], ['depressed', 'Depressed'], ['uniform', 'Uniform'], ['dropshadow', 'Dropshadow']]\n  },\n\n  fontFamily: {\n    selector: '.vjs-font-family > select',\n    id: 'captions-font-family-%s',\n    label: 'Font Family',\n    options: [['proportionalSansSerif', 'Proportional Sans-Serif'], ['monospaceSansSerif', 'Monospace Sans-Serif'], ['proportionalSerif', 'Proportional Serif'], ['monospaceSerif', 'Monospace Serif'], ['casual', 'Casual'], ['script', 'Script'], ['small-caps', 'Small Caps']]\n  },\n\n  fontPercent: {\n    selector: '.vjs-font-percent > select',\n    id: 'captions-font-size-%s',\n    label: 'Font Size',\n    options: [['0.50', '50%'], ['0.75', '75%'], ['1.00', '100%'], ['1.25', '125%'], ['1.50', '150%'], ['1.75', '175%'], ['2.00', '200%'], ['3.00', '300%'], ['4.00', '400%']],\n    'default': 2,\n    parser: function parser(v) {\n      return v === '1.00' ? null : Number(v);\n    }\n  },\n\n  textOpacity: {\n    selector: '.vjs-text-opacity > select',\n    id: 'captions-foreground-opacity-%s',\n    label: 'Transparency',\n    options: [OPACITY_OPAQUE, OPACITY_SEMI]\n  },\n\n  // Options for this object are defined below.\n  windowColor: {\n    selector: '.vjs-window-color > select',\n    id: 'captions-window-color-%s',\n    label: 'Color'\n  },\n\n  // Options for this object are defined below.\n  windowOpacity: {\n    selector: '.vjs-window-opacity > select',\n    id: 'captions-window-opacity-%s',\n    label: 'Transparency',\n    options: [OPACITY_TRANS, OPACITY_SEMI, OPACITY_OPAQUE]\n  }\n};\n\nselectConfigs.windowColor.options = selectConfigs.backgroundColor.options;\n\n/**\n * Get the actual value of an option.\n *\n * @param  {string} value\n *         The value to get\n *\n * @param  {Function} [parser]\n *         Optional function to adjust the value.\n *\n * @return {Mixed}\n *         - Will be `undefined` if no value exists\n *         - Will be `undefined` if the given value is \"none\".\n *         - Will be the actual value otherwise.\n *\n * @private\n */\nfunction parseOptionValue(value, parser) {\n  if (parser) {\n    value = parser(value);\n  }\n\n  if (value && value !== 'none') {\n    return value;\n  }\n}\n\n/**\n * Gets the value of the selected <option> element within a <select> element.\n *\n * @param  {Element} el\n *         the element to look in\n *\n * @param  {Function} [parser]\n *         Optional function to adjust the value.\n *\n * @return {Mixed}\n *         - Will be `undefined` if no value exists\n *         - Will be `undefined` if the given value is \"none\".\n *         - Will be the actual value otherwise.\n *\n * @private\n */\nfunction getSelectedOptionValue(el, parser) {\n  var value = el.options[el.options.selectedIndex].value;\n\n  return parseOptionValue(value, parser);\n}\n\n/**\n * Sets the selected <option> element within a <select> element based on a\n * given value.\n *\n * @param {Element} el\n *        The element to look in.\n *\n * @param {string} value\n *        the property to look on.\n *\n * @param {Function} [parser]\n *        Optional function to adjust the value before comparing.\n *\n * @private\n */\nfunction setSelectedOption(el, value, parser) {\n  if (!value) {\n    return;\n  }\n\n  for (var i = 0; i < el.options.length; i++) {\n    if (parseOptionValue(el.options[i].value, parser) === value) {\n      el.selectedIndex = i;\n      break;\n    }\n  }\n}\n\n/**\n * Manipulate Text Tracks settings.\n *\n * @extends ModalDialog\n */\n\nvar TextTrackSettings = function (_ModalDialog) {\n  inherits(TextTrackSettings, _ModalDialog);\n\n  /**\n   * Creates an instance of this class.\n   *\n   * @param {Player} player\n   *         The `Player` that this class should be attached to.\n   *\n   * @param {Object} [options]\n   *         The key/value store of player options.\n   */\n  function TextTrackSettings(player, options) {\n    classCallCheck(this, TextTrackSettings);\n\n    options.temporary = false;\n\n    var _this = possibleConstructorReturn(this, _ModalDialog.call(this, player, options));\n\n    _this.updateDisplay = bind(_this, _this.updateDisplay);\n\n    // fill the modal and pretend we have opened it\n    _this.fill();\n    _this.hasBeenOpened_ = _this.hasBeenFilled_ = true;\n\n    _this.endDialog = createEl('p', {\n      className: 'vjs-control-text',\n      textContent: _this.localize('End of dialog window.')\n    });\n    _this.el().appendChild(_this.endDialog);\n\n    _this.setDefaults();\n\n    // Grab `persistTextTrackSettings` from the player options if not passed in child options\n    if (options.persistTextTrackSettings === undefined) {\n      _this.options_.persistTextTrackSettings = _this.options_.playerOptions.persistTextTrackSettings;\n    }\n\n    _this.on(_this.$('.vjs-done-button'), 'click', function () {\n      _this.saveSettings();\n      _this.close();\n    });\n\n    _this.on(_this.$('.vjs-default-button'), 'click', function () {\n      _this.setDefaults();\n      _this.updateDisplay();\n    });\n\n    each(selectConfigs, function (config) {\n      _this.on(_this.$(config.selector), 'change', _this.updateDisplay);\n    });\n\n    if (_this.options_.persistTextTrackSettings) {\n      _this.restoreSettings();\n    }\n    return _this;\n  }\n\n  TextTrackSettings.prototype.dispose = function dispose() {\n    this.endDialog = null;\n\n    _ModalDialog.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create a <select> element with configured options.\n   *\n   * @param {string} key\n   *        Configuration key to use during creation.\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElSelect_ = function createElSelect_(key) {\n    var _this2 = this;\n\n    var legendId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n    var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'label';\n\n    var config = selectConfigs[key];\n    var id = config.id.replace('%s', this.id_);\n\n    return ['<' + type + ' id=\"' + id + '\" class=\"' + (type === 'label' ? 'vjs-label' : '') + '\">', this.localize(config.label), '</' + type + '>', '<select aria-labelledby=\"' + (legendId !== '' ? legendId + ' ' : '') + id + '\">'].concat(config.options.map(function (o) {\n      var optionId = id + '-' + o[1];\n\n      return ['<option id=\"' + optionId + '\" value=\"' + o[0] + '\" ', 'aria-labelledby=\"' + (legendId !== '' ? legendId + ' ' : '') + id + ' ' + optionId + '\">', _this2.localize(o[1]), '</option>'].join('');\n    })).concat('</select>').join('');\n  };\n\n  /**\n   * Create foreground color element for the component\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElFgColor_ = function createElFgColor_() {\n    var legendId = 'captions-text-legend-' + this.id_;\n\n    return ['<fieldset class=\"vjs-fg-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Text'), '</legend>', this.createElSelect_('color', legendId), '<span class=\"vjs-text-opacity vjs-opacity\">', this.createElSelect_('textOpacity', legendId), '</span>', '</fieldset>'].join('');\n  };\n\n  /**\n   * Create background color element for the component\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElBgColor_ = function createElBgColor_() {\n    var legendId = 'captions-background-' + this.id_;\n\n    return ['<fieldset class=\"vjs-bg-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Background'), '</legend>', this.createElSelect_('backgroundColor', legendId), '<span class=\"vjs-bg-opacity vjs-opacity\">', this.createElSelect_('backgroundOpacity', legendId), '</span>', '</fieldset>'].join('');\n  };\n\n  /**\n   * Create window color element for the component\n   *\n   * @return {string}\n   *         An HTML string.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElWinColor_ = function createElWinColor_() {\n    var legendId = 'captions-window-' + this.id_;\n\n    return ['<fieldset class=\"vjs-window-color vjs-track-setting\">', '<legend id=\"' + legendId + '\">', this.localize('Window'), '</legend>', this.createElSelect_('windowColor', legendId), '<span class=\"vjs-window-opacity vjs-opacity\">', this.createElSelect_('windowOpacity', legendId), '</span>', '</fieldset>'].join('');\n  };\n\n  /**\n   * Create color elements for the component\n   *\n   * @return {Element}\n   *         The element that was created\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElColors_ = function createElColors_() {\n    return createEl('div', {\n      className: 'vjs-track-settings-colors',\n      innerHTML: [this.createElFgColor_(), this.createElBgColor_(), this.createElWinColor_()].join('')\n    });\n  };\n\n  /**\n   * Create font elements for the component\n   *\n   * @return {Element}\n   *         The element that was created.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElFont_ = function createElFont_() {\n    return createEl('div', {\n      className: 'vjs-track-settings-font\">',\n      innerHTML: ['<fieldset class=\"vjs-font-percent vjs-track-setting\">', this.createElSelect_('fontPercent', '', 'legend'), '</fieldset>', '<fieldset class=\"vjs-edge-style vjs-track-setting\">', this.createElSelect_('edgeStyle', '', 'legend'), '</fieldset>', '<fieldset class=\"vjs-font-family vjs-track-setting\">', this.createElSelect_('fontFamily', '', 'legend'), '</fieldset>'].join('')\n    });\n  };\n\n  /**\n   * Create controls for the component\n   *\n   * @return {Element}\n   *         The element that was created.\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.createElControls_ = function createElControls_() {\n    var defaultsDescription = this.localize('restore all settings to the default values');\n\n    return createEl('div', {\n      className: 'vjs-track-settings-controls',\n      innerHTML: ['<button class=\"vjs-default-button\" title=\"' + defaultsDescription + '\">', this.localize('Reset'), '<span class=\"vjs-control-text\"> ' + defaultsDescription + '</span>', '</button>', '<button class=\"vjs-done-button\">' + this.localize('Done') + '</button>'].join('')\n    });\n  };\n\n  TextTrackSettings.prototype.content = function content() {\n    return [this.createElColors_(), this.createElFont_(), this.createElControls_()];\n  };\n\n  TextTrackSettings.prototype.label = function label() {\n    return this.localize('Caption Settings Dialog');\n  };\n\n  TextTrackSettings.prototype.description = function description() {\n    return this.localize('Beginning of dialog window. Escape will cancel and close the window.');\n  };\n\n  TextTrackSettings.prototype.buildCSSClass = function buildCSSClass() {\n    return _ModalDialog.prototype.buildCSSClass.call(this) + ' vjs-text-track-settings';\n  };\n\n  /**\n   * Gets an object of text track settings (or null).\n   *\n   * @return {Object}\n   *         An object with config values parsed from the DOM or localStorage.\n   */\n\n\n  TextTrackSettings.prototype.getValues = function getValues() {\n    var _this3 = this;\n\n    return reduce(selectConfigs, function (accum, config, key) {\n      var value = getSelectedOptionValue(_this3.$(config.selector), config.parser);\n\n      if (value !== undefined) {\n        accum[key] = value;\n      }\n\n      return accum;\n    }, {});\n  };\n\n  /**\n   * Sets text track settings from an object of values.\n   *\n   * @param {Object} values\n   *        An object with config values parsed from the DOM or localStorage.\n   */\n\n\n  TextTrackSettings.prototype.setValues = function setValues(values) {\n    var _this4 = this;\n\n    each(selectConfigs, function (config, key) {\n      setSelectedOption(_this4.$(config.selector), values[key], config.parser);\n    });\n  };\n\n  /**\n   * Sets all `<select>` elements to their default values.\n   */\n\n\n  TextTrackSettings.prototype.setDefaults = function setDefaults() {\n    var _this5 = this;\n\n    each(selectConfigs, function (config) {\n      var index = config.hasOwnProperty('default') ? config['default'] : 0;\n\n      _this5.$(config.selector).selectedIndex = index;\n    });\n  };\n\n  /**\n   * Restore texttrack settings from localStorage\n   */\n\n\n  TextTrackSettings.prototype.restoreSettings = function restoreSettings() {\n    var values = void 0;\n\n    try {\n      values = JSON.parse(window_1.localStorage.getItem(LOCAL_STORAGE_KEY));\n    } catch (err) {\n      log$1.warn(err);\n    }\n\n    if (values) {\n      this.setValues(values);\n    }\n  };\n\n  /**\n   * Save text track settings to localStorage\n   */\n\n\n  TextTrackSettings.prototype.saveSettings = function saveSettings() {\n    if (!this.options_.persistTextTrackSettings) {\n      return;\n    }\n\n    var values = this.getValues();\n\n    try {\n      if (Object.keys(values).length) {\n        window_1.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(values));\n      } else {\n        window_1.localStorage.removeItem(LOCAL_STORAGE_KEY);\n      }\n    } catch (err) {\n      log$1.warn(err);\n    }\n  };\n\n  /**\n   * Update display of text track settings\n   */\n\n\n  TextTrackSettings.prototype.updateDisplay = function updateDisplay() {\n    var ttDisplay = this.player_.getChild('textTrackDisplay');\n\n    if (ttDisplay) {\n      ttDisplay.updateDisplay();\n    }\n  };\n\n  /**\n   * conditionally blur the element and refocus the captions button\n   *\n   * @private\n   */\n\n\n  TextTrackSettings.prototype.conditionalBlur_ = function conditionalBlur_() {\n    this.previouslyActiveEl_ = null;\n    this.off(document_1, 'keydown', this.handleKeyDown);\n\n    var cb = this.player_.controlBar;\n    var subsCapsBtn = cb && cb.subsCapsButton;\n    var ccBtn = cb && cb.captionsButton;\n\n    if (subsCapsBtn) {\n      subsCapsBtn.focus();\n    } else if (ccBtn) {\n      ccBtn.focus();\n    }\n  };\n\n  return TextTrackSettings;\n}(ModalDialog);\n\nComponent.registerComponent('TextTrackSettings', TextTrackSettings);\n\nvar _templateObject$2 = taggedTemplateLiteralLoose(['Text Tracks are being loaded from another origin but the crossorigin attribute isn\\'t used.\\n            This may prevent text tracks from loading.'], ['Text Tracks are being loaded from another origin but the crossorigin attribute isn\\'t used.\\n            This may prevent text tracks from loading.']);\n\n/**\n * @file html5.js\n */\n/**\n * HTML5 Media Controller - Wrapper for HTML5 Media API\n *\n * @mixes Tech~SouceHandlerAdditions\n * @extends Tech\n */\n\nvar Html5 = function (_Tech) {\n  inherits(Html5, _Tech);\n\n  /**\n   * Create an instance of this Tech.\n   *\n   * @param {Object} [options]\n   *        The key/value store of player options.\n   *\n   * @param {Component~ReadyCallback} ready\n   *        Callback function to call when the `HTML5` Tech is ready.\n   */\n  function Html5(options, ready) {\n    classCallCheck(this, Html5);\n\n    var _this = possibleConstructorReturn(this, _Tech.call(this, options, ready));\n\n    var source = options.source;\n    var crossoriginTracks = false;\n\n    // Set the source if one is provided\n    // 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)\n    // 2) Check to see if the network state of the tag was failed at init, and if so, reset the source\n    // anyway so the error gets fired.\n    if (source && (_this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {\n      _this.setSource(source);\n    } else {\n      _this.handleLateInit_(_this.el_);\n    }\n\n    if (_this.el_.hasChildNodes()) {\n\n      var nodes = _this.el_.childNodes;\n      var nodesLength = nodes.length;\n      var removeNodes = [];\n\n      while (nodesLength--) {\n        var node = nodes[nodesLength];\n        var nodeName = node.nodeName.toLowerCase();\n\n        if (nodeName === 'track') {\n          if (!_this.featuresNativeTextTracks) {\n            // Empty video tag tracks so the built-in player doesn't use them also.\n            // This may not be fast enough to stop HTML5 browsers from reading the tags\n            // so we'll need to turn off any default tracks if we're manually doing\n            // captions and subtitles. videoElement.textTracks\n            removeNodes.push(node);\n          } else {\n            // store HTMLTrackElement and TextTrack to remote list\n            _this.remoteTextTrackEls().addTrackElement_(node);\n            _this.remoteTextTracks().addTrack(node.track);\n            _this.textTracks().addTrack(node.track);\n            if (!crossoriginTracks && !_this.el_.hasAttribute('crossorigin') && isCrossOrigin(node.src)) {\n              crossoriginTracks = true;\n            }\n          }\n        }\n      }\n\n      for (var i = 0; i < removeNodes.length; i++) {\n        _this.el_.removeChild(removeNodes[i]);\n      }\n    }\n\n    _this.proxyNativeTracks_();\n    if (_this.featuresNativeTextTracks && crossoriginTracks) {\n      log$1.warn(tsml(_templateObject$2));\n    }\n\n    // prevent iOS Safari from disabling metadata text tracks during native playback\n    _this.restoreMetadataTracksInIOSNativePlayer_();\n\n    // Determine if native controls should be used\n    // Our goal should be to get the custom controls on mobile solid everywhere\n    // so we can remove this all together. Right now this will block custom\n    // controls on touch enabled laptops like the Chrome Pixel\n    if ((TOUCH_ENABLED || IS_IPHONE || IS_NATIVE_ANDROID) && options.nativeControlsForTouch === true) {\n      _this.setControls(true);\n    }\n\n    // on iOS, we want to proxy `webkitbeginfullscreen` and `webkitendfullscreen`\n    // into a `fullscreenchange` event\n    _this.proxyWebkitFullscreen_();\n\n    _this.triggerReady();\n    return _this;\n  }\n\n  /**\n   * Dispose of `HTML5` media element and remove all tracks.\n   */\n\n\n  Html5.prototype.dispose = function dispose() {\n    Html5.disposeMediaElement(this.el_);\n    this.options_ = null;\n\n    // tech will handle clearing of the emulated track list\n    _Tech.prototype.dispose.call(this);\n  };\n\n  /**\n   * When a captions track is enabled in the iOS Safari native player, all other\n   * tracks are disabled (including metadata tracks), which nulls all of their\n   * associated cue points. This will restore metadata tracks to their pre-fullscreen\n   * state in those cases so that cue points are not needlessly lost.\n   *\n   * @private\n   */\n\n\n  Html5.prototype.restoreMetadataTracksInIOSNativePlayer_ = function restoreMetadataTracksInIOSNativePlayer_() {\n    var textTracks = this.textTracks();\n    var metadataTracksPreFullscreenState = void 0;\n\n    // captures a snapshot of every metadata track's current state\n    var takeMetadataTrackSnapshot = function takeMetadataTrackSnapshot() {\n      metadataTracksPreFullscreenState = [];\n\n      for (var i = 0; i < textTracks.length; i++) {\n        var track = textTracks[i];\n\n        if (track.kind === 'metadata') {\n          metadataTracksPreFullscreenState.push({\n            track: track,\n            storedMode: track.mode\n          });\n        }\n      }\n    };\n\n    // snapshot each metadata track's initial state, and update the snapshot\n    // each time there is a track 'change' event\n    takeMetadataTrackSnapshot();\n    textTracks.addEventListener('change', takeMetadataTrackSnapshot);\n\n    this.on('dispose', function () {\n      return textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n    });\n\n    var restoreTrackMode = function restoreTrackMode() {\n      for (var i = 0; i < metadataTracksPreFullscreenState.length; i++) {\n        var storedTrack = metadataTracksPreFullscreenState[i];\n\n        if (storedTrack.track.mode === 'disabled' && storedTrack.track.mode !== storedTrack.storedMode) {\n          storedTrack.track.mode = storedTrack.storedMode;\n        }\n      }\n      // we only want this handler to be executed on the first 'change' event\n      textTracks.removeEventListener('change', restoreTrackMode);\n    };\n\n    // when we enter fullscreen playback, stop updating the snapshot and\n    // restore all track modes to their pre-fullscreen state\n    this.on('webkitbeginfullscreen', function () {\n      textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n\n      // remove the listener before adding it just in case it wasn't previously removed\n      textTracks.removeEventListener('change', restoreTrackMode);\n      textTracks.addEventListener('change', restoreTrackMode);\n    });\n\n    // start updating the snapshot again after leaving fullscreen\n    this.on('webkitendfullscreen', function () {\n      // remove the listener before adding it just in case it wasn't previously removed\n      textTracks.removeEventListener('change', takeMetadataTrackSnapshot);\n      textTracks.addEventListener('change', takeMetadataTrackSnapshot);\n\n      // remove the restoreTrackMode handler in case it wasn't triggered during fullscreen playback\n      textTracks.removeEventListener('change', restoreTrackMode);\n    });\n  };\n\n  /**\n   * Proxy all native track list events to our track lists if the browser we are playing\n   * in supports that type of track list.\n   *\n   * @private\n   */\n\n\n  Html5.prototype.proxyNativeTracks_ = function proxyNativeTracks_() {\n    var _this2 = this;\n\n    NORMAL.names.forEach(function (name) {\n      var props = NORMAL[name];\n      var elTracks = _this2.el()[props.getterName];\n      var techTracks = _this2[props.getterName]();\n\n      if (!_this2['featuresNative' + props.capitalName + 'Tracks'] || !elTracks || !elTracks.addEventListener) {\n        return;\n      }\n      var listeners = {\n        change: function change(e) {\n          techTracks.trigger({\n            type: 'change',\n            target: techTracks,\n            currentTarget: techTracks,\n            srcElement: techTracks\n          });\n        },\n        addtrack: function addtrack(e) {\n          techTracks.addTrack(e.track);\n        },\n        removetrack: function removetrack(e) {\n          techTracks.removeTrack(e.track);\n        }\n      };\n      var removeOldTracks = function removeOldTracks() {\n        var removeTracks = [];\n\n        for (var i = 0; i < techTracks.length; i++) {\n          var found = false;\n\n          for (var j = 0; j < elTracks.length; j++) {\n            if (elTracks[j] === techTracks[i]) {\n              found = true;\n              break;\n            }\n          }\n\n          if (!found) {\n            removeTracks.push(techTracks[i]);\n          }\n        }\n\n        while (removeTracks.length) {\n          techTracks.removeTrack(removeTracks.shift());\n        }\n      };\n\n      Object.keys(listeners).forEach(function (eventName) {\n        var listener = listeners[eventName];\n\n        elTracks.addEventListener(eventName, listener);\n        _this2.on('dispose', function (e) {\n          return elTracks.removeEventListener(eventName, listener);\n        });\n      });\n\n      // Remove (native) tracks that are not used anymore\n      _this2.on('loadstart', removeOldTracks);\n      _this2.on('dispose', function (e) {\n        return _this2.off('loadstart', removeOldTracks);\n      });\n    });\n  };\n\n  /**\n   * Create the `Html5` Tech's DOM element.\n   *\n   * @return {Element}\n   *         The element that gets created.\n   */\n\n\n  Html5.prototype.createEl = function createEl$$1() {\n    var el = this.options_.tag;\n\n    // Check if this browser supports moving the element into the box.\n    // On the iPhone video will break if you move the element,\n    // So we have to create a brand new element.\n    // If we ingested the player div, we do not need to move the media element.\n    if (!el || !(this.options_.playerElIngest || this.movingMediaElementInDOM)) {\n\n      // If the original tag is still there, clone and remove it.\n      if (el) {\n        var clone = el.cloneNode(true);\n\n        if (el.parentNode) {\n          el.parentNode.insertBefore(clone, el);\n        }\n        Html5.disposeMediaElement(el);\n        el = clone;\n      } else {\n        el = document_1.createElement('video');\n\n        // determine if native controls should be used\n        var tagAttributes = this.options_.tag && getAttributes(this.options_.tag);\n        var attributes = mergeOptions({}, tagAttributes);\n\n        if (!TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {\n          delete attributes.controls;\n        }\n\n        setAttributes(el, assign(attributes, {\n          id: this.options_.techId,\n          'class': 'vjs-tech'\n        }));\n      }\n\n      el.playerId = this.options_.playerId;\n    }\n\n    if (typeof this.options_.preload !== 'undefined') {\n      setAttribute(el, 'preload', this.options_.preload);\n    }\n\n    // Update specific tag settings, in case they were overridden\n    // `autoplay` has to be *last* so that `muted` and `playsinline` are present\n    // when iOS/Safari or other browsers attempt to autoplay.\n    var settingsAttrs = ['loop', 'muted', 'playsinline', 'autoplay'];\n\n    for (var i = 0; i < settingsAttrs.length; i++) {\n      var attr = settingsAttrs[i];\n      var value = this.options_[attr];\n\n      if (typeof value !== 'undefined') {\n        if (value) {\n          setAttribute(el, attr, attr);\n        } else {\n          removeAttribute(el, attr);\n        }\n        el[attr] = value;\n      }\n    }\n\n    return el;\n  };\n\n  /**\n   * This will be triggered if the loadstart event has already fired, before videojs was\n   * ready. Two known examples of when this can happen are:\n   * 1. If we're loading the playback object after it has started loading\n   * 2. The media is already playing the (often with autoplay on) then\n   *\n   * This function will fire another loadstart so that videojs can catchup.\n   *\n   * @fires Tech#loadstart\n   *\n   * @return {undefined}\n   *         returns nothing.\n   */\n\n\n  Html5.prototype.handleLateInit_ = function handleLateInit_(el) {\n    if (el.networkState === 0 || el.networkState === 3) {\n      // The video element hasn't started loading the source yet\n      // or didn't find a source\n      return;\n    }\n\n    if (el.readyState === 0) {\n      // NetworkState is set synchronously BUT loadstart is fired at the\n      // end of the current stack, usually before setInterval(fn, 0).\n      // So at this point we know loadstart may have already fired or is\n      // about to fire, and either way the player hasn't seen it yet.\n      // We don't want to fire loadstart prematurely here and cause a\n      // double loadstart so we'll wait and see if it happens between now\n      // and the next loop, and fire it if not.\n      // HOWEVER, we also want to make sure it fires before loadedmetadata\n      // which could also happen between now and the next loop, so we'll\n      // watch for that also.\n      var loadstartFired = false;\n      var setLoadstartFired = function setLoadstartFired() {\n        loadstartFired = true;\n      };\n\n      this.on('loadstart', setLoadstartFired);\n\n      var triggerLoadstart = function triggerLoadstart() {\n        // We did miss the original loadstart. Make sure the player\n        // sees loadstart before loadedmetadata\n        if (!loadstartFired) {\n          this.trigger('loadstart');\n        }\n      };\n\n      this.on('loadedmetadata', triggerLoadstart);\n\n      this.ready(function () {\n        this.off('loadstart', setLoadstartFired);\n        this.off('loadedmetadata', triggerLoadstart);\n\n        if (!loadstartFired) {\n          // We did miss the original native loadstart. Fire it now.\n          this.trigger('loadstart');\n        }\n      });\n\n      return;\n    }\n\n    // From here on we know that loadstart already fired and we missed it.\n    // The other readyState events aren't as much of a problem if we double\n    // them, so not going to go to as much trouble as loadstart to prevent\n    // that unless we find reason to.\n    var eventsToTrigger = ['loadstart'];\n\n    // loadedmetadata: newly equal to HAVE_METADATA (1) or greater\n    eventsToTrigger.push('loadedmetadata');\n\n    // loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater\n    if (el.readyState >= 2) {\n      eventsToTrigger.push('loadeddata');\n    }\n\n    // canplay: newly increased to HAVE_FUTURE_DATA (3) or greater\n    if (el.readyState >= 3) {\n      eventsToTrigger.push('canplay');\n    }\n\n    // canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)\n    if (el.readyState >= 4) {\n      eventsToTrigger.push('canplaythrough');\n    }\n\n    // We still need to give the player time to add event listeners\n    this.ready(function () {\n      eventsToTrigger.forEach(function (type) {\n        this.trigger(type);\n      }, this);\n    });\n  };\n\n  /**\n   * Set current time for the `HTML5` tech.\n   *\n   * @param {number} seconds\n   *        Set the current time of the media to this.\n   */\n\n\n  Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {\n    try {\n      this.el_.currentTime = seconds;\n    } catch (e) {\n      log$1(e, 'Video is not ready. (Video.js)');\n      // this.warning(VideoJS.warnings.videoNotReady);\n    }\n  };\n\n  /**\n   * Get the current duration of the HTML5 media element.\n   *\n   * @return {number}\n   *         The duration of the media or 0 if there is no duration.\n   */\n\n\n  Html5.prototype.duration = function duration() {\n    var _this3 = this;\n\n    // Android Chrome will report duration as Infinity for VOD HLS until after\n    // playback has started, which triggers the live display erroneously.\n    // Return NaN if playback has not started and trigger a durationupdate once\n    // the duration can be reliably known.\n    if (this.el_.duration === Infinity && IS_ANDROID && IS_CHROME && this.el_.currentTime === 0) {\n      // Wait for the first `timeupdate` with currentTime > 0 - there may be\n      // several with 0\n      var checkProgress = function checkProgress() {\n        if (_this3.el_.currentTime > 0) {\n          // Trigger durationchange for genuinely live video\n          if (_this3.el_.duration === Infinity) {\n            _this3.trigger('durationchange');\n          }\n          _this3.off('timeupdate', checkProgress);\n        }\n      };\n\n      this.on('timeupdate', checkProgress);\n      return NaN;\n    }\n    return this.el_.duration || NaN;\n  };\n\n  /**\n   * Get the current width of the HTML5 media element.\n   *\n   * @return {number}\n   *         The width of the HTML5 media element.\n   */\n\n\n  Html5.prototype.width = function width() {\n    return this.el_.offsetWidth;\n  };\n\n  /**\n   * Get the current height of the HTML5 media element.\n   *\n   * @return {number}\n   *         The heigth of the HTML5 media element.\n   */\n\n\n  Html5.prototype.height = function height() {\n    return this.el_.offsetHeight;\n  };\n\n  /**\n   * Proxy iOS `webkitbeginfullscreen` and `webkitendfullscreen` into\n   * `fullscreenchange` event.\n   *\n   * @private\n   * @fires fullscreenchange\n   * @listens webkitendfullscreen\n   * @listens webkitbeginfullscreen\n   * @listens webkitbeginfullscreen\n   */\n\n\n  Html5.prototype.proxyWebkitFullscreen_ = function proxyWebkitFullscreen_() {\n    var _this4 = this;\n\n    if (!('webkitDisplayingFullscreen' in this.el_)) {\n      return;\n    }\n\n    var endFn = function endFn() {\n      this.trigger('fullscreenchange', { isFullscreen: false });\n    };\n\n    var beginFn = function beginFn() {\n      if ('webkitPresentationMode' in this.el_ && this.el_.webkitPresentationMode !== 'picture-in-picture') {\n        this.one('webkitendfullscreen', endFn);\n\n        this.trigger('fullscreenchange', { isFullscreen: true });\n      }\n    };\n\n    this.on('webkitbeginfullscreen', beginFn);\n    this.on('dispose', function () {\n      _this4.off('webkitbeginfullscreen', beginFn);\n      _this4.off('webkitendfullscreen', endFn);\n    });\n  };\n\n  /**\n   * Check if fullscreen is supported on the current playback device.\n   *\n   * @return {boolean}\n   *         - True if fullscreen is supported.\n   *         - False if fullscreen is not supported.\n   */\n\n\n  Html5.prototype.supportsFullScreen = function supportsFullScreen() {\n    if (typeof this.el_.webkitEnterFullScreen === 'function') {\n      var userAgent = window_1.navigator && window_1.navigator.userAgent || '';\n\n      // Seems to be broken in Chromium/Chrome && Safari in Leopard\n      if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  /**\n   * Request that the `HTML5` Tech enter fullscreen.\n   */\n\n\n  Html5.prototype.enterFullScreen = function enterFullScreen() {\n    var video = this.el_;\n\n    if (video.paused && video.networkState <= video.HAVE_METADATA) {\n      // attempt to prime the video element for programmatic access\n      // this isn't necessary on the desktop but shouldn't hurt\n      this.el_.play();\n\n      // playing and pausing synchronously during the transition to fullscreen\n      // can get iOS ~6.1 devices into a play/pause loop\n      this.setTimeout(function () {\n        video.pause();\n        video.webkitEnterFullScreen();\n      }, 0);\n    } else {\n      video.webkitEnterFullScreen();\n    }\n  };\n\n  /**\n   * Request that the `HTML5` Tech exit fullscreen.\n   */\n\n\n  Html5.prototype.exitFullScreen = function exitFullScreen() {\n    this.el_.webkitExitFullScreen();\n  };\n\n  /**\n   * A getter/setter for the `Html5` Tech's source object.\n   * > Note: Please use {@link Html5#setSource}\n   *\n   * @param {Tech~SourceObject} [src]\n   *        The source object you want to set on the `HTML5` techs element.\n   *\n   * @return {Tech~SourceObject|undefined}\n   *         - The current source object when a source is not passed in.\n   *         - undefined when setting\n   *\n   * @deprecated Since version 5.\n   */\n\n\n  Html5.prototype.src = function src(_src) {\n    if (_src === undefined) {\n      return this.el_.src;\n    }\n\n    // Setting src through `src` instead of `setSrc` will be deprecated\n    this.setSrc(_src);\n  };\n\n  /**\n   * Reset the tech by removing all sources and then calling\n   * {@link Html5.resetMediaElement}.\n   */\n\n\n  Html5.prototype.reset = function reset() {\n    Html5.resetMediaElement(this.el_);\n  };\n\n  /**\n   * Get the current source on the `HTML5` Tech. Falls back to returning the source from\n   * the HTML5 media element.\n   *\n   * @return {Tech~SourceObject}\n   *         The current source object from the HTML5 tech. With a fallback to the\n   *         elements source.\n   */\n\n\n  Html5.prototype.currentSrc = function currentSrc() {\n    if (this.currentSource_) {\n      return this.currentSource_.src;\n    }\n    return this.el_.currentSrc;\n  };\n\n  /**\n   * Set controls attribute for the HTML5 media Element.\n   *\n   * @param {string} val\n   *        Value to set the controls attribute to\n   */\n\n\n  Html5.prototype.setControls = function setControls(val) {\n    this.el_.controls = !!val;\n  };\n\n  /**\n   * Create and returns a remote {@link TextTrack} object.\n   *\n   * @param {string} kind\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata)\n   *\n   * @param {string} [label]\n   *        Label to identify the text track\n   *\n   * @param {string} [language]\n   *        Two letter language abbreviation\n   *\n   * @return {TextTrack}\n   *         The TextTrack that gets created.\n   */\n\n\n  Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n    if (!this.featuresNativeTextTracks) {\n      return _Tech.prototype.addTextTrack.call(this, kind, label, language);\n    }\n\n    return this.el_.addTextTrack(kind, label, language);\n  };\n\n  /**\n   * Creates either native TextTrack or an emulated TextTrack depending\n   * on the value of `featuresNativeTextTracks`\n   *\n   * @param {Object} options\n   *        The object should contain the options to intialize the TextTrack with.\n   *\n   * @param {string} [options.kind]\n   *        `TextTrack` kind (subtitles, captions, descriptions, chapters, or metadata).\n   *\n   * @param {string} [options.label].\n   *        Label to identify the text track\n   *\n   * @param {string} [options.language]\n   *        Two letter language abbreviation.\n   *\n   * @param {boolean} [options.default]\n   *        Default this track to on.\n   *\n   * @param {string} [options.id]\n   *        The internal id to assign this track.\n   *\n   * @param {string} [options.src]\n   *        A source url for the track.\n   *\n   * @return {HTMLTrackElement}\n   *         The track element that gets created.\n   */\n\n\n  Html5.prototype.createRemoteTextTrack = function createRemoteTextTrack(options) {\n    if (!this.featuresNativeTextTracks) {\n      return _Tech.prototype.createRemoteTextTrack.call(this, options);\n    }\n    var htmlTrackElement = document_1.createElement('track');\n\n    if (options.kind) {\n      htmlTrackElement.kind = options.kind;\n    }\n    if (options.label) {\n      htmlTrackElement.label = options.label;\n    }\n    if (options.language || options.srclang) {\n      htmlTrackElement.srclang = options.language || options.srclang;\n    }\n    if (options['default']) {\n      htmlTrackElement['default'] = options['default'];\n    }\n    if (options.id) {\n      htmlTrackElement.id = options.id;\n    }\n    if (options.src) {\n      htmlTrackElement.src = options.src;\n    }\n\n    return htmlTrackElement;\n  };\n\n  /**\n   * Creates a remote text track object and returns an html track element.\n   *\n   * @param {Object} options The object should contain values for\n   * kind, language, label, and src (location of the WebVTT file)\n   * @param {Boolean} [manualCleanup=true] if set to false, the TextTrack will be\n   * automatically removed from the video element whenever the source changes\n   * @return {HTMLTrackElement} An Html Track Element.\n   * This can be an emulated {@link HTMLTrackElement} or a native one.\n   * @deprecated The default value of the \"manualCleanup\" parameter will default\n   * to \"false\" in upcoming versions of Video.js\n   */\n\n\n  Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) {\n    var htmlTrackElement = _Tech.prototype.addRemoteTextTrack.call(this, options, manualCleanup);\n\n    if (this.featuresNativeTextTracks) {\n      this.el().appendChild(htmlTrackElement);\n    }\n\n    return htmlTrackElement;\n  };\n\n  /**\n   * Remove remote `TextTrack` from `TextTrackList` object\n   *\n   * @param {TextTrack} track\n   *        `TextTrack` object to remove\n   */\n\n\n  Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {\n    _Tech.prototype.removeRemoteTextTrack.call(this, track);\n\n    if (this.featuresNativeTextTracks) {\n      var tracks = this.$$('track');\n\n      var i = tracks.length;\n\n      while (i--) {\n        if (track === tracks[i] || track === tracks[i].track) {\n          this.el().removeChild(tracks[i]);\n        }\n      }\n    }\n  };\n\n  /**\n   * Gets available media playback quality metrics as specified by the W3C's Media\n   * Playback Quality API.\n   *\n   * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n   *\n   * @return {Object}\n   *         An object with supported media playback quality metrics\n   */\n\n\n  Html5.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n    if (typeof this.el().getVideoPlaybackQuality === 'function') {\n      return this.el().getVideoPlaybackQuality();\n    }\n\n    var videoPlaybackQuality = {};\n\n    if (typeof this.el().webkitDroppedFrameCount !== 'undefined' && typeof this.el().webkitDecodedFrameCount !== 'undefined') {\n      videoPlaybackQuality.droppedVideoFrames = this.el().webkitDroppedFrameCount;\n      videoPlaybackQuality.totalVideoFrames = this.el().webkitDecodedFrameCount;\n    }\n\n    if (window_1.performance && typeof window_1.performance.now === 'function') {\n      videoPlaybackQuality.creationTime = window_1.performance.now();\n    } else if (window_1.performance && window_1.performance.timing && typeof window_1.performance.timing.navigationStart === 'number') {\n      videoPlaybackQuality.creationTime = window_1.Date.now() - window_1.performance.timing.navigationStart;\n    }\n\n    return videoPlaybackQuality;\n  };\n\n  return Html5;\n}(Tech);\n\n/* HTML5 Support Testing ---------------------------------------------------- */\n\nif (isReal()) {\n\n  /**\n   * Element for testing browser HTML5 media capabilities\n   *\n   * @type {Element}\n   * @constant\n   * @private\n   */\n  Html5.TEST_VID = document_1.createElement('video');\n  var track = document_1.createElement('track');\n\n  track.kind = 'captions';\n  track.srclang = 'en';\n  track.label = 'English';\n  Html5.TEST_VID.appendChild(track);\n}\n\n/**\n * Check if HTML5 media is supported by this browser/device.\n *\n * @return {boolean}\n *         - True if HTML5 media is supported.\n *         - False if HTML5 media is not supported.\n */\nHtml5.isSupported = function () {\n  // IE9 with no Media Player is a LIAR! (#984)\n  try {\n    Html5.TEST_VID.volume = 0.5;\n  } catch (e) {\n    return false;\n  }\n\n  return !!(Html5.TEST_VID && Html5.TEST_VID.canPlayType);\n};\n\n/**\n * Check if the tech can support the given type\n *\n * @param {string} type\n *        The mimetype to check\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\nHtml5.canPlayType = function (type) {\n  return Html5.TEST_VID.canPlayType(type);\n};\n\n/**\n * Check if the tech can support the given source\n * @param {Object} srcObj\n *        The source object\n * @param {Object} options\n *        The options passed to the tech\n * @return {string} 'probably', 'maybe', or '' (empty string)\n */\nHtml5.canPlaySource = function (srcObj, options) {\n  return Html5.canPlayType(srcObj.type);\n};\n\n/**\n * Check if the volume can be changed in this browser/device.\n * Volume cannot be changed in a lot of mobile devices.\n * Specifically, it can't be changed from 1 on iOS.\n *\n * @return {boolean}\n *         - True if volume can be controlled\n *         - False otherwise\n */\nHtml5.canControlVolume = function () {\n  // IE will error if Windows Media Player not installed #3315\n  try {\n    var volume = Html5.TEST_VID.volume;\n\n    Html5.TEST_VID.volume = volume / 2 + 0.1;\n    return volume !== Html5.TEST_VID.volume;\n  } catch (e) {\n    return false;\n  }\n};\n\n/**\n * Check if the playback rate can be changed in this browser/device.\n *\n * @return {boolean}\n *         - True if playback rate can be controlled\n *         - False otherwise\n */\nHtml5.canControlPlaybackRate = function () {\n  // Playback rate API is implemented in Android Chrome, but doesn't do anything\n  // https://github.com/videojs/video.js/issues/3180\n  if (IS_ANDROID && IS_CHROME && CHROME_VERSION < 58) {\n    return false;\n  }\n  // IE will error if Windows Media Player not installed #3315\n  try {\n    var playbackRate = Html5.TEST_VID.playbackRate;\n\n    Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;\n    return playbackRate !== Html5.TEST_VID.playbackRate;\n  } catch (e) {\n    return false;\n  }\n};\n\n/**\n * Check to see if native `TextTrack`s are supported by this browser/device.\n *\n * @return {boolean}\n *         - True if native `TextTrack`s are supported.\n *         - False otherwise\n */\nHtml5.supportsNativeTextTracks = function () {\n  return IS_ANY_SAFARI;\n};\n\n/**\n * Check to see if native `VideoTrack`s are supported by this browser/device\n *\n * @return {boolean}\n *        - True if native `VideoTrack`s are supported.\n *        - False otherwise\n */\nHtml5.supportsNativeVideoTracks = function () {\n  return !!(Html5.TEST_VID && Html5.TEST_VID.videoTracks);\n};\n\n/**\n * Check to see if native `AudioTrack`s are supported by this browser/device\n *\n * @return {boolean}\n *        - True if native `AudioTrack`s are supported.\n *        - False otherwise\n */\nHtml5.supportsNativeAudioTracks = function () {\n  return !!(Html5.TEST_VID && Html5.TEST_VID.audioTracks);\n};\n\n/**\n * An array of events available on the Html5 tech.\n *\n * @private\n * @type {Array}\n */\nHtml5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'resize', 'volumechange'];\n\n/**\n * Boolean indicating whether the `Tech` supports volume control.\n *\n * @type {boolean}\n * @default {@link Html5.canControlVolume}\n */\nHtml5.prototype.featuresVolumeControl = Html5.canControlVolume();\n\n/**\n * Boolean indicating whether the `Tech` supports changing the speed at which the media\n * plays. Examples:\n *   - Set player to play 2x (twice) as fast\n *   - Set player to play 0.5x (half) as fast\n *\n * @type {boolean}\n * @default {@link Html5.canControlPlaybackRate}\n */\nHtml5.prototype.featuresPlaybackRate = Html5.canControlPlaybackRate();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the media element\n * moving in the DOM. iOS breaks if you move the media element, so this is set this to\n * false there. Everywhere else this should be true.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.movingMediaElementInDOM = !IS_IOS;\n\n// TODO: Previous comment: No longer appears to be used. Can probably be removed.\n//       Is this true?\n/**\n * Boolean indicating whether the `HTML5` tech currently supports automatic media resize\n * when going into fullscreen.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresFullscreenResize = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the progress event.\n * If this is false, manual `progress` events will be triggred instead.\n *\n * @type {boolean}\n * @default\n */\nHtml5.prototype.featuresProgressEvents = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports the timeupdate event.\n * If this is false, manual `timeupdate` events will be triggred instead.\n *\n * @default\n */\nHtml5.prototype.featuresTimeupdateEvents = true;\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `TextTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeTextTracks}\n */\nHtml5.prototype.featuresNativeTextTracks = Html5.supportsNativeTextTracks();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `VideoTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeVideoTracks}\n */\nHtml5.prototype.featuresNativeVideoTracks = Html5.supportsNativeVideoTracks();\n\n/**\n * Boolean indicating whether the `HTML5` tech currently supports native `AudioTrack`s.\n *\n * @type {boolean}\n * @default {@link Html5.supportsNativeAudioTracks}\n */\nHtml5.prototype.featuresNativeAudioTracks = Html5.supportsNativeAudioTracks();\n\n// HTML5 Feature detection and Device Fixes --------------------------------- //\nvar canPlayType = Html5.TEST_VID && Html5.TEST_VID.constructor.prototype.canPlayType;\nvar mpegurlRE = /^application\\/(?:x-|vnd\\.apple\\.)mpegurl/i;\nvar mp4RE = /^video\\/mp4/i;\n\nHtml5.patchCanPlayType = function () {\n\n  // Android 4.0 and above can play HLS to some extent but it reports being unable to do so\n  if (ANDROID_VERSION >= 4.0 && !IS_FIREFOX) {\n    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {\n      if (type && mpegurlRE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n\n    // Override Android 2.2 and less canPlayType method which is broken\n  } else if (IS_OLD_ANDROID) {\n    Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {\n      if (type && mp4RE.test(type)) {\n        return 'maybe';\n      }\n      return canPlayType.call(this, type);\n    };\n  }\n};\n\nHtml5.unpatchCanPlayType = function () {\n  var r = Html5.TEST_VID.constructor.prototype.canPlayType;\n\n  Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;\n  return r;\n};\n\n// by default, patch the media element\nHtml5.patchCanPlayType();\n\nHtml5.disposeMediaElement = function (el) {\n  if (!el) {\n    return;\n  }\n\n  if (el.parentNode) {\n    el.parentNode.removeChild(el);\n  }\n\n  // remove any child track or source nodes to prevent their loading\n  while (el.hasChildNodes()) {\n    el.removeChild(el.firstChild);\n  }\n\n  // remove any src reference. not setting `src=''` because that causes a warning\n  // in firefox\n  el.removeAttribute('src');\n\n  // force the media element to update its loading state by calling load()\n  // however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function () {\n      try {\n        el.load();\n      } catch (e) {\n        // not supported\n      }\n    })();\n  }\n};\n\nHtml5.resetMediaElement = function (el) {\n  if (!el) {\n    return;\n  }\n\n  var sources = el.querySelectorAll('source');\n  var i = sources.length;\n\n  while (i--) {\n    el.removeChild(sources[i]);\n  }\n\n  // remove any src reference.\n  // not setting `src=''` because that throws an error\n  el.removeAttribute('src');\n\n  if (typeof el.load === 'function') {\n    // wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)\n    (function () {\n      try {\n        el.load();\n      } catch (e) {\n        // satisfy linter\n      }\n    })();\n  }\n};\n\n/* Native HTML5 element property wrapping ----------------------------------- */\n// Wrap native boolean attributes with getters that check both property and attribute\n// The list is as followed:\n// muted, defaultMuted, autoplay, controls, loop, playsinline\n[\n/**\n * Get the value of `muted` from the media element. `muted` indicates\n * that the volume for the media should be set to silent. This does not actually change\n * the `volume` attribute.\n *\n * @method Html5#muted\n * @return {boolean}\n *         - True if the value of `volume` should be ignored and the audio set to silent.\n *         - False if the value of `volume` should be used.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-muted}\n */\n'muted',\n\n/**\n * Get the value of `defaultMuted` from the media element. `defaultMuted` indicates\n * whether the media should start muted or not. Only changes the default state of the\n * media. `muted` and `defaultMuted` can have different values. {@link Html5#muted} indicates the\n * current state.\n *\n * @method Html5#defaultMuted\n * @return {boolean}\n *         - The value of `defaultMuted` from the media element.\n *         - True indicates that the media should start muted.\n *         - False indicates that the media should not start muted\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultmuted}\n */\n'defaultMuted',\n\n/**\n * Get the value of `autoplay` from the media element. `autoplay` indicates\n * that the media should start to play as soon as the page is ready.\n *\n * @method Html5#autoplay\n * @return {boolean}\n *         - The value of `autoplay` from the media element.\n *         - True indicates that the media should start as soon as the page loads.\n *         - False indicates that the media should not start as soon as the page loads.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-autoplay}\n */\n'autoplay',\n\n/**\n * Get the value of `controls` from the media element. `controls` indicates\n * whether the native media controls should be shown or hidden.\n *\n * @method Html5#controls\n * @return {boolean}\n *         - The value of `controls` from the media element.\n *         - True indicates that native controls should be showing.\n *         - False indicates that native controls should be hidden.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-controls}\n */\n'controls',\n\n/**\n * Get the value of `loop` from the media element. `loop` indicates\n * that the media should return to the start of the media and continue playing once\n * it reaches the end.\n *\n * @method Html5#loop\n * @return {boolean}\n *         - The value of `loop` from the media element.\n *         - True indicates that playback should seek back to start once\n *           the end of a media is reached.\n *         - False indicates that playback should not loop back to the start when the\n *           end of the media is reached.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-loop}\n */\n'loop',\n\n/**\n * Get the value of `playsinline` from the media element. `playsinline` indicates\n * to the browser that non-fullscreen playback is preferred when fullscreen\n * playback is the native default, such as in iOS Safari.\n *\n * @method Html5#playsinline\n * @return {boolean}\n *         - The value of `playsinline` from the media element.\n *         - True indicates that the media should play inline.\n *         - False indicates that the media should not play inline.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n'playsinline'].forEach(function (prop) {\n  Html5.prototype[prop] = function () {\n    return this.el_[prop] || this.el_.hasAttribute(prop);\n  };\n});\n\n// Wrap native boolean attributes with setters that set both property and attribute\n// The list is as followed:\n// setMuted, setDefaultMuted, setAutoplay, setLoop, setPlaysinline\n// setControls is special-cased above\n[\n/**\n * Set the value of `muted` on the media element. `muted` indicates that the current\n * audio level should be silent.\n *\n * @method Html5#setMuted\n * @param {boolean} muted\n *        - True if the audio should be set to silent\n *        - False otherwise\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-muted}\n */\n'muted',\n\n/**\n * Set the value of `defaultMuted` on the media element. `defaultMuted` indicates that the current\n * audio level should be silent, but will only effect the muted level on intial playback..\n *\n * @method Html5.prototype.setDefaultMuted\n * @param {boolean} defaultMuted\n *        - True if the audio should be set to silent\n *        - False otherwise\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultmuted}\n */\n'defaultMuted',\n\n/**\n * Set the value of `autoplay` on the media element. `autoplay` indicates\n * that the media should start to play as soon as the page is ready.\n *\n * @method Html5#setAutoplay\n * @param {boolean} autoplay\n *         - True indicates that the media should start as soon as the page loads.\n *         - False indicates that the media should not start as soon as the page loads.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-autoplay}\n */\n'autoplay',\n\n/**\n * Set the value of `loop` on the media element. `loop` indicates\n * that the media should return to the start of the media and continue playing once\n * it reaches the end.\n *\n * @method Html5#setLoop\n * @param {boolean} loop\n *         - True indicates that playback should seek back to start once\n *           the end of a media is reached.\n *         - False indicates that playback should not loop back to the start when the\n *           end of the media is reached.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-loop}\n */\n'loop',\n\n/**\n * Set the value of `playsinline` from the media element. `playsinline` indicates\n * to the browser that non-fullscreen playback is preferred when fullscreen\n * playback is the native default, such as in iOS Safari.\n *\n * @method Html5#setPlaysinline\n * @param {boolean} playsinline\n *         - True indicates that the media should play inline.\n *         - False indicates that the media should not play inline.\n *\n * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n */\n'playsinline'].forEach(function (prop) {\n  Html5.prototype['set' + toTitleCase(prop)] = function (v) {\n    this.el_[prop] = v;\n\n    if (v) {\n      this.el_.setAttribute(prop, prop);\n    } else {\n      this.el_.removeAttribute(prop);\n    }\n  };\n});\n\n// Wrap native properties with a getter\n// The list is as followed\n// paused, currentTime, buffered, volume, poster, preload, error, seeking\n// seekable, ended, playbackRate, defaultPlaybackRate, played, networkState\n// readyState, videoWidth, videoHeight\n[\n/**\n * Get the value of `paused` from the media element. `paused` indicates whether the media element\n * is currently paused or not.\n *\n * @method Html5#paused\n * @return {boolean}\n *         The value of `paused` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-paused}\n */\n'paused',\n\n/**\n * Get the value of `currentTime` from the media element. `currentTime` indicates\n * the current second that the media is at in playback.\n *\n * @method Html5#currentTime\n * @return {number}\n *         The value of `currentTime` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-currenttime}\n */\n'currentTime',\n\n/**\n * Get the value of `buffered` from the media element. `buffered` is a `TimeRange`\n * object that represents the parts of the media that are already downloaded and\n * available for playback.\n *\n * @method Html5#buffered\n * @return {TimeRange}\n *         The value of `buffered` from the media element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-buffered}\n */\n'buffered',\n\n/**\n * Get the value of `volume` from the media element. `volume` indicates\n * the current playback volume of audio for a media. `volume` will be a value from 0\n * (silent) to 1 (loudest and default).\n *\n * @method Html5#volume\n * @return {number}\n *         The value of `volume` from the media element. Value will be between 0-1.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-a-volume}\n */\n'volume',\n\n/**\n * Get the value of `poster` from the media element. `poster` indicates\n * that the url of an image file that can/will be shown when no media data is available.\n *\n * @method Html5#poster\n * @return {string}\n *         The value of `poster` from the media element. Value will be a url to an\n *         image.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-video-poster}\n */\n'poster',\n\n/**\n * Get the value of `preload` from the media element. `preload` indicates\n * what should download before the media is interacted with. It can have the following\n * values:\n * - none: nothing should be downloaded\n * - metadata: poster and the first few frames of the media may be downloaded to get\n *   media dimensions and other metadata\n * - auto: allow the media and metadata for the media to be downloaded before\n *    interaction\n *\n * @method Html5#preload\n * @return {string}\n *         The value of `preload` from the media element. Will be 'none', 'metadata',\n *         or 'auto'.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload}\n */\n'preload',\n\n/**\n * Get the value of the `error` from the media element. `error` indicates any\n * MediaError that may have occured during playback. If error returns null there is no\n * current error.\n *\n * @method Html5#error\n * @return {MediaError|null}\n *         The value of `error` from the media element. Will be `MediaError` if there\n *         is a current error and null otherwise.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-error}\n */\n'error',\n\n/**\n * Get the value of `seeking` from the media element. `seeking` indicates whether the\n * media is currently seeking to a new position or not.\n *\n * @method Html5#seeking\n * @return {boolean}\n *         - The value of `seeking` from the media element.\n *         - True indicates that the media is currently seeking to a new position.\n *         - Flase indicates that the media is not seeking to a new position at this time.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-seeking}\n */\n'seeking',\n\n/**\n * Get the value of `seekable` from the media element. `seekable` returns a\n * `TimeRange` object indicating ranges of time that can currently be `seeked` to.\n *\n * @method Html5#seekable\n * @return {TimeRange}\n *         The value of `seekable` from the media element. A `TimeRange` object\n *         indicating the current ranges of time that can be seeked to.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-seekable}\n */\n'seekable',\n\n/**\n * Get the value of `ended` from the media element. `ended` indicates whether\n * the media has reached the end or not.\n *\n * @method Html5#ended\n * @return {boolean}\n *         - The value of `ended` from the media element.\n *         - True indicates that the media has ended.\n *         - False indicates that the media has not ended.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-ended}\n */\n'ended',\n\n/**\n * Get the value of `playbackRate` from the media element. `playbackRate` indicates\n * the rate at which the media is currently playing back. Examples:\n *   - if playbackRate is set to 2, media will play twice as fast.\n *   - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5#playbackRate\n * @return {number}\n *         The value of `playbackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'playbackRate',\n\n/**\n * Get the value of `defaultPlaybackRate` from the media element. `defaultPlaybackRate` indicates\n * the rate at which the media is currently playing back. This value will not indicate the current\n * `playbackRate` after playback has started, use {@link Html5#playbackRate} for that.\n *\n * Examples:\n *   - if defaultPlaybackRate is set to 2, media will play twice as fast.\n *   - if defaultPlaybackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5.prototype.defaultPlaybackRate\n * @return {number}\n *         The value of `defaultPlaybackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'defaultPlaybackRate',\n\n/**\n * Get the value of `played` from the media element. `played` returns a `TimeRange`\n * object representing points in the media timeline that have been played.\n *\n * @method Html5#played\n * @return {TimeRange}\n *         The value of `played` from the media element. A `TimeRange` object indicating\n *         the ranges of time that have been played.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-played}\n */\n'played',\n\n/**\n * Get the value of `networkState` from the media element. `networkState` indicates\n * the current network state. It returns an enumeration from the following list:\n * - 0: NETWORK_EMPTY\n * - 1: NEWORK_IDLE\n * - 2: NETWORK_LOADING\n * - 3: NETWORK_NO_SOURCE\n *\n * @method Html5#networkState\n * @return {number}\n *         The value of `networkState` from the media element. This will be a number\n *         from the list in the description.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-networkstate}\n */\n'networkState',\n\n/**\n * Get the value of `readyState` from the media element. `readyState` indicates\n * the current state of the media element. It returns an enumeration from the\n * following list:\n * - 0: HAVE_NOTHING\n * - 1: HAVE_METADATA\n * - 2: HAVE_CURRENT_DATA\n * - 3: HAVE_FUTURE_DATA\n * - 4: HAVE_ENOUGH_DATA\n *\n * @method Html5#readyState\n * @return {number}\n *         The value of `readyState` from the media element. This will be a number\n *         from the list in the description.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#ready-states}\n */\n'readyState',\n\n/**\n * Get the value of `videoWidth` from the video element. `videoWidth` indicates\n * the current width of the video in css pixels.\n *\n * @method Html5#videoWidth\n * @return {number}\n *         The value of `videoWidth` from the video element. This will be a number\n *         in css pixels.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth}\n */\n'videoWidth',\n\n/**\n * Get the value of `videoHeight` from the video element. `videoHeigth` indicates\n * the current height of the video in css pixels.\n *\n * @method Html5#videoHeight\n * @return {number}\n *         The value of `videoHeight` from the video element. This will be a number\n *         in css pixels.\n *\n * @see [Spec] {@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-video-videowidth}\n */\n'videoHeight'].forEach(function (prop) {\n  Html5.prototype[prop] = function () {\n    return this.el_[prop];\n  };\n});\n\n// Wrap native properties with a setter in this format:\n// set + toTitleCase(name)\n// The list is as follows:\n// setVolume, setSrc, setPoster, setPreload, setPlaybackRate, setDefaultPlaybackRate\n[\n/**\n * Set the value of `volume` on the media element. `volume` indicates the current\n * audio level as a percentage in decimal form. This means that 1 is 100%, 0.5 is 50%, and\n * so on.\n *\n * @method Html5#setVolume\n * @param {number} percentAsDecimal\n *        The volume percent as a decimal. Valid range is from 0-1.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-a-volume}\n */\n'volume',\n\n/**\n * Set the value of `src` on the media element. `src` indicates the current\n * {@link Tech~SourceObject} for the media.\n *\n * @method Html5#setSrc\n * @param {Tech~SourceObject} src\n *        The source object to set as the current source.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-src}\n */\n'src',\n\n/**\n * Set the value of `poster` on the media element. `poster` is the url to\n * an image file that can/will be shown when no media data is available.\n *\n * @method Html5#setPoster\n * @param {string} poster\n *        The url to an image that should be used as the `poster` for the media\n *        element.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-poster}\n */\n'poster',\n\n/**\n * Set the value of `preload` on the media element. `preload` indicates\n * what should download before the media is interacted with. It can have the following\n * values:\n * - none: nothing should be downloaded\n * - metadata: poster and the first few frames of the media may be downloaded to get\n *   media dimensions and other metadata\n * - auto: allow the media and metadata for the media to be downloaded before\n *    interaction\n *\n * @method Html5#setPreload\n * @param {string} preload\n *         The value of `preload` to set on the media element. Must be 'none', 'metadata',\n *         or 'auto'.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload}\n */\n'preload',\n\n/**\n * Set the value of `playbackRate` on the media element. `playbackRate` indicates\n * the rate at which the media should play back. Examples:\n *   - if playbackRate is set to 2, media will play twice as fast.\n *   - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5#setPlaybackRate\n * @return {number}\n *         The value of `playbackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-playbackrate}\n */\n'playbackRate',\n\n/**\n * Set the value of `defaultPlaybackRate` on the media element. `defaultPlaybackRate` indicates\n * the rate at which the media should play back upon initial startup. Changing this value\n * after a video has started will do nothing. Instead you should used {@link Html5#setPlaybackRate}.\n *\n * Example Values:\n *   - if playbackRate is set to 2, media will play twice as fast.\n *   - if playbackRate is set to 0.5, media will play half as fast.\n *\n * @method Html5.prototype.setDefaultPlaybackRate\n * @return {number}\n *         The value of `defaultPlaybackRate` from the media element. A number indicating\n *         the current playback speed of the media, where 1 is normal speed.\n *\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-defaultplaybackrate}\n */\n'defaultPlaybackRate'].forEach(function (prop) {\n  Html5.prototype['set' + toTitleCase(prop)] = function (v) {\n    this.el_[prop] = v;\n  };\n});\n\n// wrap native functions with a function\n// The list is as follows:\n// pause, load play\n[\n/**\n * A wrapper around the media elements `pause` function. This will call the `HTML5`\n * media elements `pause` function.\n *\n * @method Html5#pause\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-pause}\n */\n'pause',\n\n/**\n * A wrapper around the media elements `load` function. This will call the `HTML5`s\n * media element `load` function.\n *\n * @method Html5#load\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-load}\n */\n'load',\n\n/**\n * A wrapper around the media elements `play` function. This will call the `HTML5`s\n * media element `play` function.\n *\n * @method Html5#play\n * @see [Spec]{@link https://www.w3.org/TR/html5/embedded-content-0.html#dom-media-play}\n */\n'play'].forEach(function (prop) {\n  Html5.prototype[prop] = function () {\n    return this.el_[prop]();\n  };\n});\n\nTech.withSourceHandlers(Html5);\n\n/**\n * Native source handler for Html5, simply passes the source to the media element.\n *\n * @proprety {Tech~SourceObject} source\n *        The source object\n *\n * @proprety {Html5} tech\n *        The instance of the HTML5 tech.\n */\nHtml5.nativeSourceHandler = {};\n\n/**\n * Check if the media element can play the given mime type.\n *\n * @param {string} type\n *        The mimetype to check\n *\n * @return {string}\n *         'probably', 'maybe', or '' (empty string)\n */\nHtml5.nativeSourceHandler.canPlayType = function (type) {\n  // IE9 on Windows 7 without MediaPlayer throws an error here\n  // https://github.com/videojs/video.js/issues/519\n  try {\n    return Html5.TEST_VID.canPlayType(type);\n  } catch (e) {\n    return '';\n  }\n};\n\n/**\n * Check if the media element can handle a source natively.\n *\n * @param {Tech~SourceObject} source\n *         The source object\n *\n * @param {Object} [options]\n *         Options to be passed to the tech.\n *\n * @return {string}\n *         'probably', 'maybe', or '' (empty string).\n */\nHtml5.nativeSourceHandler.canHandleSource = function (source, options) {\n\n  // If a type was provided we should rely on that\n  if (source.type) {\n    return Html5.nativeSourceHandler.canPlayType(source.type);\n\n    // If no type, fall back to checking 'video/[EXTENSION]'\n  } else if (source.src) {\n    var ext = getFileExtension(source.src);\n\n    return Html5.nativeSourceHandler.canPlayType('video/' + ext);\n  }\n\n  return '';\n};\n\n/**\n * Pass the source to the native media element.\n *\n * @param {Tech~SourceObject} source\n *        The source object\n *\n * @param {Html5} tech\n *        The instance of the Html5 tech\n *\n * @param {Object} [options]\n *        The options to pass to the source\n */\nHtml5.nativeSourceHandler.handleSource = function (source, tech, options) {\n  tech.setSrc(source.src);\n};\n\n/**\n * A noop for the native dispose function, as cleanup is not needed.\n */\nHtml5.nativeSourceHandler.dispose = function () {};\n\n// Register the native source handler\nHtml5.registerSourceHandler(Html5.nativeSourceHandler);\n\nTech.registerTech('Html5', Html5);\n\nvar _templateObject$1 = taggedTemplateLiteralLoose(['\\n        Using the tech directly can be dangerous. I hope you know what you\\'re doing.\\n        See https://github.com/videojs/video.js/issues/2617 for more info.\\n      '], ['\\n        Using the tech directly can be dangerous. I hope you know what you\\'re doing.\\n        See https://github.com/videojs/video.js/issues/2617 for more info.\\n      ']);\n\n/**\n * @file player.js\n */\n// Subclasses Component\n// The following imports are used only to ensure that the corresponding modules\n// are always included in the video.js package. Importing the modules will\n// execute them and they will register themselves with video.js.\n// Import Html5 tech, at least for disposing the original video tag.\n// The following tech events are simply re-triggered\n// on the player when they happen\nvar TECH_EVENTS_RETRIGGER = [\n/**\n * Fired while the user agent is downloading media data.\n *\n * @event Player#progress\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `progress` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechProgress_\n * @fires Player#progress\n * @listens Tech#progress\n */\n'progress',\n\n/**\n * Fires when the loading of an audio/video is aborted.\n *\n * @event Player#abort\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `abort` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechAbort_\n * @fires Player#abort\n * @listens Tech#abort\n */\n'abort',\n\n/**\n * Fires when the browser is intentionally not getting media data.\n *\n * @event Player#suspend\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `suspend` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechSuspend_\n * @fires Player#suspend\n * @listens Tech#suspend\n */\n'suspend',\n\n/**\n * Fires when the current playlist is empty.\n *\n * @event Player#emptied\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `emptied` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechEmptied_\n * @fires Player#emptied\n * @listens Tech#emptied\n */\n'emptied',\n/**\n * Fires when the browser is trying to get media data, but data is not available.\n *\n * @event Player#stalled\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `stalled` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechStalled_\n * @fires Player#stalled\n * @listens Tech#stalled\n */\n'stalled',\n\n/**\n * Fires when the browser has loaded meta data for the audio/video.\n *\n * @event Player#loadedmetadata\n * @type {EventTarget~Event}\n */\n/**\n * Retrigger the `stalled` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechLoadedmetadata_\n * @fires Player#loadedmetadata\n * @listens Tech#loadedmetadata\n */\n'loadedmetadata',\n\n/**\n * Fires when the browser has loaded the current frame of the audio/video.\n *\n * @event Player#loadeddata\n * @type {event}\n */\n/**\n * Retrigger the `loadeddata` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechLoaddeddata_\n * @fires Player#loadeddata\n * @listens Tech#loadeddata\n */\n'loadeddata',\n\n/**\n * Fires when the current playback position has changed.\n *\n * @event Player#timeupdate\n * @type {event}\n */\n/**\n * Retrigger the `timeupdate` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechTimeUpdate_\n * @fires Player#timeupdate\n * @listens Tech#timeupdate\n */\n'timeupdate',\n\n/**\n * Fires when the playing speed of the audio/video is changed\n *\n * @event Player#ratechange\n * @type {event}\n */\n/**\n * Retrigger the `ratechange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechRatechange_\n * @fires Player#ratechange\n * @listens Tech#ratechange\n */\n'ratechange',\n\n/**\n * Fires when the video's intrinsic dimensions change\n *\n * @event Player#resize\n * @type {event}\n */\n/**\n * Retrigger the `resize` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechResize_\n * @fires Player#resize\n * @listens Tech#resize\n */\n'resize',\n\n/**\n * Fires when the volume has been changed\n *\n * @event Player#volumechange\n * @type {event}\n */\n/**\n * Retrigger the `volumechange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechVolumechange_\n * @fires Player#volumechange\n * @listens Tech#volumechange\n */\n'volumechange',\n\n/**\n * Fires when the text track has been changed\n *\n * @event Player#texttrackchange\n * @type {event}\n */\n/**\n * Retrigger the `texttrackchange` event that was triggered by the {@link Tech}.\n *\n * @private\n * @method Player#handleTechTexttrackchange_\n * @fires Player#texttrackchange\n * @listens Tech#texttrackchange\n */\n'texttrackchange'];\n\n/**\n * An instance of the `Player` class is created when any of the Video.js setup methods\n * are used to initialize a video.\n *\n * After an instance has been created it can be accessed globally in two ways:\n * 1. By calling `videojs('example_video_1');`\n * 2. By using it directly via  `videojs.players.example_video_1;`\n *\n * @extends Component\n */\n\nvar Player = function (_Component) {\n  inherits(Player, _Component);\n\n  /**\n   * Create an instance of this class.\n   *\n   * @param {Element} tag\n   *        The original video DOM element used for configuring options.\n   *\n   * @param {Object} [options]\n   *        Object of option names and values.\n   *\n   * @param {Component~ReadyCallback} [ready]\n   *        Ready callback function.\n   */\n  function Player(tag, options, ready) {\n    classCallCheck(this, Player);\n\n    // Make sure tag ID exists\n    tag.id = tag.id || 'vjs_video_' + newGUID();\n\n    // Set Options\n    // The options argument overrides options set in the video tag\n    // which overrides globally set options.\n    // This latter part coincides with the load order\n    // (tag must exist before Player)\n    options = assign(Player.getTagSettings(tag), options);\n\n    // Delay the initialization of children because we need to set up\n    // player properties first, and can't use `this` before `super()`\n    options.initChildren = false;\n\n    // Same with creating the element\n    options.createEl = false;\n\n    // don't auto mixin the evented mixin\n    options.evented = false;\n\n    // we don't want the player to report touch activity on itself\n    // see enableTouchActivity in Component\n    options.reportTouchActivity = false;\n\n    // If language is not set, get the closest lang attribute\n    if (!options.language) {\n      if (typeof tag.closest === 'function') {\n        var closest = tag.closest('[lang]');\n\n        if (closest && closest.getAttribute) {\n          options.language = closest.getAttribute('lang');\n        }\n      } else {\n        var element = tag;\n\n        while (element && element.nodeType === 1) {\n          if (getAttributes(element).hasOwnProperty('lang')) {\n            options.language = element.getAttribute('lang');\n            break;\n          }\n          element = element.parentNode;\n        }\n      }\n    }\n\n    // Run base component initializing with new options\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    var _this = possibleConstructorReturn(this, _Component.call(this, null, options, ready));\n\n    _this.isReady_ = false;\n\n    // Init state hasStarted_\n    _this.hasStarted_ = false;\n\n    // Init state userActive_\n    _this.userActive_ = false;\n\n    // if the global option object was accidentally blown away by\n    // someone, bail early with an informative error\n    if (!_this.options_ || !_this.options_.techOrder || !_this.options_.techOrder.length) {\n      throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');\n    }\n\n    // Store the original tag used to set options\n    _this.tag = tag;\n\n    // Store the tag attributes used to restore html5 element\n    _this.tagAttributes = tag && getAttributes(tag);\n\n    // Update current language\n    _this.language(_this.options_.language);\n\n    // Update Supported Languages\n    if (options.languages) {\n      // Normalise player option languages to lowercase\n      var languagesToLower = {};\n\n      Object.getOwnPropertyNames(options.languages).forEach(function (name$$1) {\n        languagesToLower[name$$1.toLowerCase()] = options.languages[name$$1];\n      });\n      _this.languages_ = languagesToLower;\n    } else {\n      _this.languages_ = Player.prototype.options_.languages;\n    }\n\n    // Cache for video property values.\n    _this.cache_ = {};\n\n    // Set poster\n    _this.poster_ = options.poster || '';\n\n    // Set controls\n    _this.controls_ = !!options.controls;\n\n    // Set default values for lastVolume\n    _this.cache_.lastVolume = 1;\n\n    // Original tag settings stored in options\n    // now remove immediately so native controls don't flash.\n    // May be turned back on by HTML5 tech if nativeControlsForTouch is true\n    tag.controls = false;\n    tag.removeAttribute('controls');\n\n    /*\n     * Store the internal state of scrubbing\n     *\n     * @private\n     * @return {Boolean} True if the user is scrubbing\n     */\n    _this.scrubbing_ = false;\n\n    _this.el_ = _this.createEl();\n\n    // Make this an evented object and use `el_` as its event bus.\n    evented(_this, { eventBusKey: 'el_' });\n\n    // We also want to pass the original player options to each component and plugin\n    // as well so they don't need to reach back into the player for options later.\n    // We also need to do another copy of this.options_ so we don't end up with\n    // an infinite loop.\n    var playerOptionsCopy = mergeOptions(_this.options_);\n\n    // Load plugins\n    if (options.plugins) {\n      var plugins = options.plugins;\n\n      Object.keys(plugins).forEach(function (name$$1) {\n        if (typeof this[name$$1] === 'function') {\n          this[name$$1](plugins[name$$1]);\n        } else {\n          throw new Error('plugin \"' + name$$1 + '\" does not exist');\n        }\n      }, _this);\n    }\n\n    _this.options_.playerOptions = playerOptionsCopy;\n\n    _this.middleware_ = [];\n\n    _this.initChildren();\n\n    // Set isAudio based on whether or not an audio tag was used\n    _this.isAudio(tag.nodeName.toLowerCase() === 'audio');\n\n    // Update controls className. Can't do this when the controls are initially\n    // set because the element doesn't exist yet.\n    if (_this.controls()) {\n      _this.addClass('vjs-controls-enabled');\n    } else {\n      _this.addClass('vjs-controls-disabled');\n    }\n\n    // Set ARIA label and region role depending on player type\n    _this.el_.setAttribute('role', 'region');\n    if (_this.isAudio()) {\n      _this.el_.setAttribute('aria-label', _this.localize('Audio Player'));\n    } else {\n      _this.el_.setAttribute('aria-label', _this.localize('Video Player'));\n    }\n\n    if (_this.isAudio()) {\n      _this.addClass('vjs-audio');\n    }\n\n    if (_this.flexNotSupported_()) {\n      _this.addClass('vjs-no-flex');\n    }\n\n    // TODO: Make this smarter. Toggle user state between touching/mousing\n    // using events, since devices can have both touch and mouse events.\n    // if (browser.TOUCH_ENABLED) {\n    //   this.addClass('vjs-touch-enabled');\n    // }\n\n    // iOS Safari has broken hover handling\n    if (!IS_IOS) {\n      _this.addClass('vjs-workinghover');\n    }\n\n    // Make player easily findable by ID\n    Player.players[_this.id_] = _this;\n\n    // Add a major version class to aid css in plugins\n    var majorVersion = version.split('.')[0];\n\n    _this.addClass('vjs-v' + majorVersion);\n\n    // When the player is first initialized, trigger activity so components\n    // like the control bar show themselves if needed\n    _this.userActive(true);\n    _this.reportUserActivity();\n    _this.listenForUserActivity_();\n\n    _this.on('fullscreenchange', _this.handleFullscreenChange_);\n    _this.on('stageclick', _this.handleStageClick_);\n\n    _this.changingSrc_ = false;\n    _this.playWaitingForReady_ = false;\n    _this.playOnLoadstart_ = null;\n\n    _this.forceAutoplayInChrome_();\n    return _this;\n  }\n\n  /**\n   * Destroys the video player and does any necessary cleanup.\n   *\n   * This is especially helpful if you are dynamically adding and removing videos\n   * to/from the DOM.\n   *\n   * @fires Player#dispose\n   */\n\n\n  Player.prototype.dispose = function dispose() {\n    /**\n     * Called when the player is being disposed of.\n     *\n     * @event Player#dispose\n     * @type {EventTarget~Event}\n     */\n    this.trigger('dispose');\n    // prevent dispose from being called twice\n    this.off('dispose');\n\n    if (this.styleEl_ && this.styleEl_.parentNode) {\n      this.styleEl_.parentNode.removeChild(this.styleEl_);\n      this.styleEl_ = null;\n    }\n\n    // Kill reference to this player\n    Player.players[this.id_] = null;\n\n    if (this.tag && this.tag.player) {\n      this.tag.player = null;\n    }\n\n    if (this.el_ && this.el_.player) {\n      this.el_.player = null;\n    }\n\n    if (this.tech_) {\n      this.tech_.dispose();\n    }\n\n    if (this.playerElIngest_) {\n      this.playerElIngest_ = null;\n    }\n\n    if (this.tag) {\n      this.tag = null;\n    }\n\n    // the actual .el_ is removed here\n    _Component.prototype.dispose.call(this);\n  };\n\n  /**\n   * Create the `Player`'s DOM element.\n   *\n   * @return {Element}\n   *         The DOM element that gets created.\n   */\n\n\n  Player.prototype.createEl = function createEl$$1() {\n    var tag = this.tag;\n    var el = void 0;\n    var playerElIngest = this.playerElIngest_ = tag.parentNode && tag.parentNode.hasAttribute && tag.parentNode.hasAttribute('data-vjs-player');\n    var divEmbed = this.tag.tagName.toLowerCase() === 'video-js';\n\n    if (playerElIngest) {\n      el = this.el_ = tag.parentNode;\n    } else if (!divEmbed) {\n      el = this.el_ = _Component.prototype.createEl.call(this, 'div');\n    }\n\n    // Copy over all the attributes from the tag, including ID and class\n    // ID will now reference player box, not the video tag\n    var attrs = getAttributes(tag);\n\n    if (divEmbed) {\n      el = this.el_ = tag;\n      tag = this.tag = document_1.createElement('video');\n      while (el.children.length) {\n        tag.appendChild(el.firstChild);\n      }\n\n      if (!hasClass(el, 'video-js')) {\n        addClass(el, 'video-js');\n      }\n\n      el.appendChild(tag);\n\n      playerElIngest = this.playerElIngest_ = el;\n    }\n\n    // set tabindex to -1 so we could focus on the player element\n    tag.setAttribute('tabindex', '-1');\n\n    // Remove width/height attrs from tag so CSS can make it 100% width/height\n    tag.removeAttribute('width');\n    tag.removeAttribute('height');\n\n    Object.getOwnPropertyNames(attrs).forEach(function (attr) {\n      // workaround so we don't totally break IE7\n      // http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7\n      if (attr === 'class') {\n        el.className += ' ' + attrs[attr];\n\n        if (divEmbed) {\n          tag.className += ' ' + attrs[attr];\n        }\n      } else {\n        el.setAttribute(attr, attrs[attr]);\n\n        if (divEmbed) {\n          tag.setAttribute(attr, attrs[attr]);\n        }\n      }\n    });\n\n    // Update tag id/class for use as HTML5 playback tech\n    // Might think we should do this after embedding in container so .vjs-tech class\n    // doesn't flash 100% width/height, but class only applies with .video-js parent\n    tag.playerId = tag.id;\n    tag.id += '_html5_api';\n    tag.className = 'vjs-tech';\n\n    // Make player findable on elements\n    tag.player = el.player = this;\n    // Default state of video is paused\n    this.addClass('vjs-paused');\n\n    // Add a style element in the player that we'll use to set the width/height\n    // of the player in a way that's still overrideable by CSS, just like the\n    // video element\n    if (window_1.VIDEOJS_NO_DYNAMIC_STYLE !== true) {\n      this.styleEl_ = createStyleElement('vjs-styles-dimensions');\n      var defaultsStyleEl = $('.vjs-styles-defaults');\n      var head = $('head');\n\n      head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);\n    }\n\n    // Pass in the width/height/aspectRatio options which will update the style el\n    this.width(this.options_.width);\n    this.height(this.options_.height);\n    this.fluid(this.options_.fluid);\n    this.aspectRatio(this.options_.aspectRatio);\n\n    // Hide any links within the video/audio tag, because IE doesn't hide them completely.\n    var links = tag.getElementsByTagName('a');\n\n    for (var i = 0; i < links.length; i++) {\n      var linkEl = links.item(i);\n\n      addClass(linkEl, 'vjs-hidden');\n      linkEl.setAttribute('hidden', 'hidden');\n    }\n\n    // insertElFirst seems to cause the networkState to flicker from 3 to 2, so\n    // keep track of the original for later so we can know if the source originally failed\n    tag.initNetworkState_ = tag.networkState;\n\n    // Wrap video tag in div (el/box) container\n    if (tag.parentNode && !playerElIngest) {\n      tag.parentNode.insertBefore(el, tag);\n    }\n\n    // insert the tag as the first child of the player element\n    // then manually add it to the children array so that this.addChild\n    // will work properly for other components\n    //\n    // Breaks iPhone, fixed in HTML5 setup.\n    prependTo(tag, el);\n    this.children_.unshift(tag);\n\n    // Set lang attr on player to ensure CSS :lang() in consistent with player\n    // if it's been set to something different to the doc\n    this.el_.setAttribute('lang', this.language_);\n\n    this.el_ = el;\n\n    return el;\n  };\n\n  /**\n   * A getter/setter for the `Player`'s width. Returns the player's configured value.\n   * To get the current width use `currentWidth()`.\n   *\n   * @param {number} [value]\n   *        The value to set the `Player`'s width to.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the playerresize event trigger\n   *\n   * @return {number}\n   *         The current width of the `Player` when getting.\n   */\n\n\n  Player.prototype.width = function width(value, skipListeners) {\n    return this.dimension('width', value, skipListeners);\n  };\n\n  /**\n   * A getter/setter for the `Player`'s height. Returns the player's configured value.\n   * To get the current height use `currentheight()`.\n   *\n   * @param {number} [value]\n   *        The value to set the `Player`'s heigth to.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the playerresize event trigger\n   *\n   * @return {number}\n   *         The current height of the `Player` when getting.\n   */\n\n\n  Player.prototype.height = function height(value, skipListeners) {\n    return this.dimension('height', value, skipListeners);\n  };\n\n  /**\n   * A getter/setter for the `Player`'s width & height.\n   *\n   * @fires Player#playerresize\n   *\n   * @param {string} dimension\n   *        This string can be:\n   *        - 'width'\n   *        - 'height'\n   *\n   * @param {number} [value]\n   *        Value for dimension specified in the first argument.\n   *\n   * @param {boolean} [skipListeners]\n   *        Skip the playerresize event trigger\n   *\n   * @return {number}\n   *         The dimension arguments value when getting (width/height).\n   */\n\n\n  Player.prototype.dimension = function dimension(_dimension, value, skipListeners) {\n    var privDimension = _dimension + '_';\n\n    if (value === undefined) {\n      return this[privDimension] || 0;\n    }\n\n    if (value === '') {\n      // If an empty string is given, reset the dimension to be automatic\n      this[privDimension] = undefined;\n      this.updateStyleEl_();\n      return;\n    }\n\n    var parsedVal = parseFloat(value);\n\n    if (isNaN(parsedVal)) {\n      log$1.error('Improper value \"' + value + '\" supplied for for ' + _dimension);\n      return;\n    }\n\n    this[privDimension] = parsedVal;\n    this.updateStyleEl_();\n\n    // skipListeners allows us to avoid triggering the resize event when setting both width and height\n    if (this.isReady_ && !skipListeners) {\n      /**\n       * Triggered when the player is resized.\n       *\n       * @event Player#playerresize\n       * @type {EventTarget~Event}\n       */\n      this.trigger('playerresize');\n    }\n  };\n\n  /**\n   * A getter/setter/toggler for the vjs-fluid `className` on the `Player`.\n   *\n   * @param {boolean} [bool]\n   *        - A value of true adds the class.\n   *        - A value of false removes the class.\n   *        - No value will toggle the fluid class.\n   *\n   * @return {boolean|undefined}\n   *         - The value of fluid when getting.\n   *         - `undefined` when setting.\n   */\n\n\n  Player.prototype.fluid = function fluid(bool) {\n    if (bool === undefined) {\n      return !!this.fluid_;\n    }\n\n    this.fluid_ = !!bool;\n\n    if (bool) {\n      this.addClass('vjs-fluid');\n    } else {\n      this.removeClass('vjs-fluid');\n    }\n\n    this.updateStyleEl_();\n  };\n\n  /**\n   * Get/Set the aspect ratio\n   *\n   * @param {string} [ratio]\n   *        Aspect ratio for player\n   *\n   * @return {string|undefined}\n   *         returns the current aspect ratio when getting\n   */\n\n  /**\n   * A getter/setter for the `Player`'s aspect ratio.\n   *\n   * @param {string} [ratio]\n   *        The value to set the `Player's aspect ratio to.\n   *\n   * @return {string|undefined}\n   *         - The current aspect ratio of the `Player` when getting.\n   *         - undefined when setting\n   */\n\n\n  Player.prototype.aspectRatio = function aspectRatio(ratio) {\n    if (ratio === undefined) {\n      return this.aspectRatio_;\n    }\n\n    // Check for width:height format\n    if (!/^\\d+\\:\\d+$/.test(ratio)) {\n      throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');\n    }\n    this.aspectRatio_ = ratio;\n\n    // We're assuming if you set an aspect ratio you want fluid mode,\n    // because in fixed mode you could calculate width and height yourself.\n    this.fluid(true);\n\n    this.updateStyleEl_();\n  };\n\n  /**\n   * Update styles of the `Player` element (height, width and aspect ratio).\n   *\n   * @private\n   * @listens Tech#loadedmetadata\n   */\n\n\n  Player.prototype.updateStyleEl_ = function updateStyleEl_() {\n    if (window_1.VIDEOJS_NO_DYNAMIC_STYLE === true) {\n      var _width = typeof this.width_ === 'number' ? this.width_ : this.options_.width;\n      var _height = typeof this.height_ === 'number' ? this.height_ : this.options_.height;\n      var techEl = this.tech_ && this.tech_.el();\n\n      if (techEl) {\n        if (_width >= 0) {\n          techEl.width = _width;\n        }\n        if (_height >= 0) {\n          techEl.height = _height;\n        }\n      }\n\n      return;\n    }\n\n    var width = void 0;\n    var height = void 0;\n    var aspectRatio = void 0;\n    var idClass = void 0;\n\n    // The aspect ratio is either used directly or to calculate width and height.\n    if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {\n      // Use any aspectRatio that's been specifically set\n      aspectRatio = this.aspectRatio_;\n    } else if (this.videoWidth() > 0) {\n      // Otherwise try to get the aspect ratio from the video metadata\n      aspectRatio = this.videoWidth() + ':' + this.videoHeight();\n    } else {\n      // Or use a default. The video element's is 2:1, but 16:9 is more common.\n      aspectRatio = '16:9';\n    }\n\n    // Get the ratio as a decimal we can use to calculate dimensions\n    var ratioParts = aspectRatio.split(':');\n    var ratioMultiplier = ratioParts[1] / ratioParts[0];\n\n    if (this.width_ !== undefined) {\n      // Use any width that's been specifically set\n      width = this.width_;\n    } else if (this.height_ !== undefined) {\n      // Or calulate the width from the aspect ratio if a height has been set\n      width = this.height_ / ratioMultiplier;\n    } else {\n      // Or use the video's metadata, or use the video el's default of 300\n      width = this.videoWidth() || 300;\n    }\n\n    if (this.height_ !== undefined) {\n      // Use any height that's been specifically set\n      height = this.height_;\n    } else {\n      // Otherwise calculate the height from the ratio and the width\n      height = width * ratioMultiplier;\n    }\n\n    // Ensure the CSS class is valid by starting with an alpha character\n    if (/^[^a-zA-Z]/.test(this.id())) {\n      idClass = 'dimensions-' + this.id();\n    } else {\n      idClass = this.id() + '-dimensions';\n    }\n\n    // Ensure the right class is still on the player for the style element\n    this.addClass(idClass);\n\n    setTextContent(this.styleEl_, '\\n      .' + idClass + ' {\\n        width: ' + width + 'px;\\n        height: ' + height + 'px;\\n      }\\n\\n      .' + idClass + '.vjs-fluid {\\n        padding-top: ' + ratioMultiplier * 100 + '%;\\n      }\\n    ');\n  };\n\n  /**\n   * Load/Create an instance of playback {@link Tech} including element\n   * and API methods. Then append the `Tech` element in `Player` as a child.\n   *\n   * @param {string} techName\n   *        name of the playback technology\n   *\n   * @param {string} source\n   *        video source\n   *\n   * @private\n   */\n\n\n  Player.prototype.loadTech_ = function loadTech_(techName, source) {\n    var _this2 = this;\n\n    // Pause and remove current playback technology\n    if (this.tech_) {\n      this.unloadTech_();\n    }\n\n    var titleTechName = toTitleCase(techName);\n    var camelTechName = techName.charAt(0).toLowerCase() + techName.slice(1);\n\n    // get rid of the HTML5 video tag as soon as we are using another tech\n    if (titleTechName !== 'Html5' && this.tag) {\n      Tech.getTech('Html5').disposeMediaElement(this.tag);\n      this.tag.player = null;\n      this.tag = null;\n    }\n\n    this.techName_ = titleTechName;\n\n    // Turn off API access because we're loading a new tech that might load asynchronously\n    this.isReady_ = false;\n\n    // Grab tech-specific options from player options and add source and parent element to use.\n    var techOptions = {\n      source: source,\n      'nativeControlsForTouch': this.options_.nativeControlsForTouch,\n      'playerId': this.id(),\n      'techId': this.id() + '_' + titleTechName + '_api',\n      'autoplay': this.options_.autoplay,\n      'playsinline': this.options_.playsinline,\n      'preload': this.options_.preload,\n      'loop': this.options_.loop,\n      'muted': this.options_.muted,\n      'poster': this.poster(),\n      'language': this.language(),\n      'playerElIngest': this.playerElIngest_ || false,\n      'vtt.js': this.options_['vtt.js']\n    };\n\n    ALL.names.forEach(function (name$$1) {\n      var props = ALL[name$$1];\n\n      techOptions[props.getterName] = _this2[props.privateName];\n    });\n\n    assign(techOptions, this.options_[titleTechName]);\n    assign(techOptions, this.options_[camelTechName]);\n    assign(techOptions, this.options_[techName.toLowerCase()]);\n\n    if (this.tag) {\n      techOptions.tag = this.tag;\n    }\n\n    if (source && source.src === this.cache_.src && this.cache_.currentTime > 0) {\n      techOptions.startTime = this.cache_.currentTime;\n    }\n\n    // Initialize tech instance\n    var TechClass = Tech.getTech(techName);\n\n    if (!TechClass) {\n      throw new Error('No Tech named \\'' + titleTechName + '\\' exists! \\'' + titleTechName + '\\' should be registered using videojs.registerTech()\\'');\n    }\n\n    this.tech_ = new TechClass(techOptions);\n\n    // player.triggerReady is always async, so don't need this to be async\n    this.tech_.ready(bind(this, this.handleTechReady_), true);\n\n    textTrackConverter.jsonToTextTracks(this.textTracksJson_ || [], this.tech_);\n\n    // Listen to all HTML5-defined events and trigger them on the player\n    TECH_EVENTS_RETRIGGER.forEach(function (event) {\n      _this2.on(_this2.tech_, event, _this2['handleTech' + toTitleCase(event) + '_']);\n    });\n    this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);\n    this.on(this.tech_, 'waiting', this.handleTechWaiting_);\n    this.on(this.tech_, 'canplay', this.handleTechCanPlay_);\n    this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);\n    this.on(this.tech_, 'playing', this.handleTechPlaying_);\n    this.on(this.tech_, 'ended', this.handleTechEnded_);\n    this.on(this.tech_, 'seeking', this.handleTechSeeking_);\n    this.on(this.tech_, 'seeked', this.handleTechSeeked_);\n    this.on(this.tech_, 'play', this.handleTechPlay_);\n    this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);\n    this.on(this.tech_, 'pause', this.handleTechPause_);\n    this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);\n    this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);\n    this.on(this.tech_, 'error', this.handleTechError_);\n    this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);\n    this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);\n    this.on(this.tech_, 'textdata', this.handleTechTextData_);\n\n    this.usingNativeControls(this.techGet_('controls'));\n\n    if (this.controls() && !this.usingNativeControls()) {\n      this.addTechControlsListeners_();\n    }\n\n    // Add the tech element in the DOM if it was not already there\n    // Make sure to not insert the original video element if using Html5\n    if (this.tech_.el().parentNode !== this.el() && (titleTechName !== 'Html5' || !this.tag)) {\n      prependTo(this.tech_.el(), this.el());\n    }\n\n    // Get rid of the original video tag reference after the first tech is loaded\n    if (this.tag) {\n      this.tag.player = null;\n      this.tag = null;\n    }\n  };\n\n  /**\n   * Unload and dispose of the current playback {@link Tech}.\n   *\n   * @private\n   */\n\n\n  Player.prototype.unloadTech_ = function unloadTech_() {\n    var _this3 = this;\n\n    // Save the current text tracks so that we can reuse the same text tracks with the next tech\n    ALL.names.forEach(function (name$$1) {\n      var props = ALL[name$$1];\n\n      _this3[props.privateName] = _this3[props.getterName]();\n    });\n    this.textTracksJson_ = textTrackConverter.textTracksToJson(this.tech_);\n\n    this.isReady_ = false;\n\n    this.tech_.dispose();\n\n    this.tech_ = false;\n  };\n\n  /**\n   * Return a reference to the current {@link Tech}.\n   * It will print a warning by default about the danger of using the tech directly\n   * but any argument that is passed in will silence the warning.\n   *\n   * @param {*} [safety]\n   *        Anything passed in to silence the warning\n   *\n   * @return {Tech}\n   *         The Tech\n   */\n\n\n  Player.prototype.tech = function tech(safety) {\n    if (safety === undefined) {\n      log$1.warn(tsml(_templateObject$1));\n    }\n\n    return this.tech_;\n  };\n\n  /**\n   * Set up click and touch listeners for the playback element\n   *\n   * - On desktops: a click on the video itself will toggle playback\n   * - On mobile devices: a click on the video toggles controls\n   *   which is done by toggling the user state between active and\n   *   inactive\n   * - A tap can signal that a user has become active or has become inactive\n   *   e.g. a quick tap on an iPhone movie should reveal the controls. Another\n   *   quick tap should hide them again (signaling the user is in an inactive\n   *   viewing state)\n   * - In addition to this, we still want the user to be considered inactive after\n   *   a few seconds of inactivity.\n   *\n   * > Note: the only part of iOS interaction we can't mimic with this setup\n   * is a touch and hold on the video element counting as activity in order to\n   * keep the controls showing, but that shouldn't be an issue. A touch and hold\n   * on any controls will still keep the user active\n   *\n   * @private\n   */\n\n\n  Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {\n    // Make sure to remove all the previous listeners in case we are called multiple times.\n    this.removeTechControlsListeners_();\n\n    // Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do\n    // trigger mousedown/up.\n    // http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object\n    // Any touch events are set to block the mousedown event from happening\n    this.on(this.tech_, 'mousedown', this.handleTechClick_);\n\n    // If the controls were hidden we don't want that to change without a tap event\n    // so we'll check if the controls were already showing before reporting user\n    // activity\n    this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);\n\n    // The tap listener needs to come after the touchend listener because the tap\n    // listener cancels out any reportedUserActivity when setting userActive(false)\n    this.on(this.tech_, 'tap', this.handleTechTap_);\n  };\n\n  /**\n   * Remove the listeners used for click and tap controls. This is needed for\n   * toggling to controls disabled, where a tap/touch should do nothing.\n   *\n   * @private\n   */\n\n\n  Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {\n    // We don't want to just use `this.off()` because there might be other needed\n    // listeners added by techs that extend this.\n    this.off(this.tech_, 'tap', this.handleTechTap_);\n    this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);\n    this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);\n    this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);\n    this.off(this.tech_, 'mousedown', this.handleTechClick_);\n  };\n\n  /**\n   * Player waits for the tech to be ready\n   *\n   * @private\n   */\n\n\n  Player.prototype.handleTechReady_ = function handleTechReady_() {\n    this.triggerReady();\n\n    // Keep the same volume as before\n    if (this.cache_.volume) {\n      this.techCall_('setVolume', this.cache_.volume);\n    }\n\n    // Look if the tech found a higher resolution poster while loading\n    this.handleTechPosterChange_();\n\n    // Update the duration if available\n    this.handleTechDurationChange_();\n\n    // Chrome and Safari both have issues with autoplay.\n    // In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.\n    // In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)\n    // This fixes both issues. Need to wait for API, so it updates displays correctly\n    if ((this.src() || this.currentSrc()) && this.tag && this.options_.autoplay && this.paused()) {\n      try {\n        // Chrome Fix. Fixed in Chrome v16.\n        delete this.tag.poster;\n      } catch (e) {\n        log$1('deleting tag.poster throws in some browsers', e);\n      }\n    }\n  };\n\n  /**\n   * Retrigger the `loadstart` event that was triggered by the {@link Tech}. This\n   * function will also trigger {@link Player#firstplay} if it is the first loadstart\n   * for a video.\n   *\n   * @fires Player#loadstart\n   * @fires Player#firstplay\n   * @listens Tech#loadstart\n   * @private\n   */\n\n\n  Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {\n    // TODO: Update to use `emptied` event instead. See #1277.\n\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-seeking');\n\n    // reset the error state\n    this.error(null);\n\n    // If it's already playing we want to trigger a firstplay event now.\n    // The firstplay event relies on both the play and loadstart events\n    // which can happen in any order for a new source\n    if (!this.paused()) {\n      /**\n       * Fired when the user agent begins looking for media data\n       *\n       * @event Player#loadstart\n       * @type {EventTarget~Event}\n       */\n      this.trigger('loadstart');\n      this.trigger('firstplay');\n    } else {\n      // reset the hasStarted state\n      this.hasStarted(false);\n      this.trigger('loadstart');\n    }\n  };\n\n  /**\n   * Add/remove the vjs-has-started class\n   *\n   * @fires Player#firstplay\n   *\n   * @param {boolean} request\n   *        - true: adds the class\n   *        - false: remove the class\n   *\n   * @return {boolean}\n   *         the boolean value of hasStarted_\n   */\n\n\n  Player.prototype.hasStarted = function hasStarted(request) {\n    if (request === undefined) {\n      // act as getter, if we have no request to change\n      return this.hasStarted_;\n    }\n\n    if (request === this.hasStarted_) {\n      return;\n    }\n\n    this.hasStarted_ = request;\n\n    if (this.hasStarted_) {\n      this.addClass('vjs-has-started');\n      this.trigger('firstplay');\n    } else {\n      this.removeClass('vjs-has-started');\n    }\n  };\n\n  /**\n   * Fired whenever the media begins or resumes playback\n   *\n   * @see [Spec]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play}\n   * @fires Player#play\n   * @listens Tech#play\n   * @private\n   */\n\n\n  Player.prototype.handleTechPlay_ = function handleTechPlay_() {\n    this.removeClass('vjs-ended');\n    this.removeClass('vjs-paused');\n    this.addClass('vjs-playing');\n\n    // hide the poster when the user hits play\n    this.hasStarted(true);\n    /**\n     * Triggered whenever an {@link Tech#play} event happens. Indicates that\n     * playback has started or resumed.\n     *\n     * @event Player#play\n     * @type {EventTarget~Event}\n     */\n    this.trigger('play');\n  };\n\n  /**\n   * Retrigger the `waiting` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#waiting\n   * @listens Tech#waiting\n   * @private\n   */\n\n\n  Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {\n    var _this4 = this;\n\n    this.addClass('vjs-waiting');\n    /**\n     * A readyState change on the DOM element has caused playback to stop.\n     *\n     * @event Player#waiting\n     * @type {EventTarget~Event}\n     */\n    this.trigger('waiting');\n    this.one('timeupdate', function () {\n      return _this4.removeClass('vjs-waiting');\n    });\n  };\n\n  /**\n   * Retrigger the `canplay` event that was triggered by the {@link Tech}.\n   * > Note: This is not consistent between browsers. See #1351\n   *\n   * @fires Player#canplay\n   * @listens Tech#canplay\n   * @private\n   */\n\n\n  Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {\n    this.removeClass('vjs-waiting');\n    /**\n     * The media has a readyState of HAVE_FUTURE_DATA or greater.\n     *\n     * @event Player#canplay\n     * @type {EventTarget~Event}\n     */\n    this.trigger('canplay');\n  };\n\n  /**\n   * Retrigger the `canplaythrough` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#canplaythrough\n   * @listens Tech#canplaythrough\n   * @private\n   */\n\n\n  Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {\n    this.removeClass('vjs-waiting');\n    /**\n     * The media has a readyState of HAVE_ENOUGH_DATA or greater. This means that the\n     * entire media file can be played without buffering.\n     *\n     * @event Player#canplaythrough\n     * @type {EventTarget~Event}\n     */\n    this.trigger('canplaythrough');\n  };\n\n  /**\n   * Retrigger the `playing` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#playing\n   * @listens Tech#playing\n   * @private\n   */\n\n\n  Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {\n    this.removeClass('vjs-waiting');\n    /**\n     * The media is no longer blocked from playback, and has started playing.\n     *\n     * @event Player#playing\n     * @type {EventTarget~Event}\n     */\n    this.trigger('playing');\n  };\n\n  /**\n   * Retrigger the `seeking` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#seeking\n   * @listens Tech#seeking\n   * @private\n   */\n\n\n  Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {\n    this.addClass('vjs-seeking');\n    /**\n     * Fired whenever the player is jumping to a new time\n     *\n     * @event Player#seeking\n     * @type {EventTarget~Event}\n     */\n    this.trigger('seeking');\n  };\n\n  /**\n   * Retrigger the `seeked` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#seeked\n   * @listens Tech#seeked\n   * @private\n   */\n\n\n  Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {\n    this.removeClass('vjs-seeking');\n    /**\n     * Fired when the player has finished jumping to a new time\n     *\n     * @event Player#seeked\n     * @type {EventTarget~Event}\n     */\n    this.trigger('seeked');\n  };\n\n  /**\n   * Retrigger the `firstplay` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#firstplay\n   * @listens Tech#firstplay\n   * @deprecated As of 6.0 firstplay event is deprecated.\n   * @deprecated As of 6.0 passing the `starttime` option to the player and the firstplay event are deprecated.\n   * @private\n   */\n\n\n  Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {\n    // If the first starttime attribute is specified\n    // then we will start at the given offset in seconds\n    if (this.options_.starttime) {\n      log$1.warn('Passing the `starttime` option to the player will be deprecated in 6.0');\n      this.currentTime(this.options_.starttime);\n    }\n\n    this.addClass('vjs-has-started');\n    /**\n     * Fired the first time a video is played. Not part of the HLS spec, and this is\n     * probably not the best implementation yet, so use sparingly. If you don't have a\n     * reason to prevent playback, use `myPlayer.one('play');` instead.\n     *\n     * @event Player#firstplay\n     * @deprecated As of 6.0 firstplay event is deprecated.\n     * @type {EventTarget~Event}\n     */\n    this.trigger('firstplay');\n  };\n\n  /**\n   * Retrigger the `pause` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#pause\n   * @listens Tech#pause\n   * @private\n   */\n\n\n  Player.prototype.handleTechPause_ = function handleTechPause_() {\n    this.removeClass('vjs-playing');\n    this.addClass('vjs-paused');\n    /**\n     * Fired whenever the media has been paused\n     *\n     * @event Player#pause\n     * @type {EventTarget~Event}\n     */\n    this.trigger('pause');\n  };\n\n  /**\n   * Retrigger the `ended` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#ended\n   * @listens Tech#ended\n   * @private\n   */\n\n\n  Player.prototype.handleTechEnded_ = function handleTechEnded_() {\n    this.addClass('vjs-ended');\n    if (this.options_.loop) {\n      this.currentTime(0);\n      this.play();\n    } else if (!this.paused()) {\n      this.pause();\n    }\n\n    /**\n     * Fired when the end of the media resource is reached (currentTime == duration)\n     *\n     * @event Player#ended\n     * @type {EventTarget~Event}\n     */\n    this.trigger('ended');\n  };\n\n  /**\n   * Fired when the duration of the media resource is first known or changed\n   *\n   * @listens Tech#durationchange\n   * @private\n   */\n\n\n  Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {\n    this.duration(this.techGet_('duration'));\n  };\n\n  /**\n   * Handle a click on the media element to play/pause\n   *\n   * @param {EventTarget~Event} event\n   *        the event that caused this function to trigger\n   *\n   * @listens Tech#mousedown\n   * @private\n   */\n\n\n  Player.prototype.handleTechClick_ = function handleTechClick_(event) {\n    if (!isSingleLeftClick(event)) {\n      return;\n    }\n\n    // When controls are disabled a click should not toggle playback because\n    // the click is considered a control\n    if (!this.controls_) {\n      return;\n    }\n\n    if (this.paused()) {\n      this.play();\n    } else {\n      this.pause();\n    }\n  };\n\n  /**\n   * Handle a tap on the media element. It will toggle the user\n   * activity state, which hides and shows the controls.\n   *\n   * @listens Tech#tap\n   * @private\n   */\n\n\n  Player.prototype.handleTechTap_ = function handleTechTap_() {\n    this.userActive(!this.userActive());\n  };\n\n  /**\n   * Handle touch to start\n   *\n   * @listens Tech#touchstart\n   * @private\n   */\n\n\n  Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {\n    this.userWasActive = this.userActive();\n  };\n\n  /**\n   * Handle touch to move\n   *\n   * @listens Tech#touchmove\n   * @private\n   */\n\n\n  Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {\n    if (this.userWasActive) {\n      this.reportUserActivity();\n    }\n  };\n\n  /**\n   * Handle touch to end\n   *\n   * @param {EventTarget~Event} event\n   *        the touchend event that triggered\n   *        this function\n   *\n   * @listens Tech#touchend\n   * @private\n   */\n\n\n  Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {\n    // Stop the mouse events from also happening\n    event.preventDefault();\n  };\n\n  /**\n   * Fired when the player switches in or out of fullscreen mode\n   *\n   * @private\n   * @listens Player#fullscreenchange\n   */\n\n\n  Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {\n    if (this.isFullscreen()) {\n      this.addClass('vjs-fullscreen');\n    } else {\n      this.removeClass('vjs-fullscreen');\n    }\n  };\n\n  /**\n   * native click events on the SWF aren't triggered on IE11, Win8.1RT\n   * use stageclick events triggered from inside the SWF instead\n   *\n   * @private\n   * @listens stageclick\n   */\n\n\n  Player.prototype.handleStageClick_ = function handleStageClick_() {\n    this.reportUserActivity();\n  };\n\n  /**\n   * Handle Tech Fullscreen Change\n   *\n   * @param {EventTarget~Event} event\n   *        the fullscreenchange event that triggered this function\n   *\n   * @param {Object} data\n   *        the data that was sent with the event\n   *\n   * @private\n   * @listens Tech#fullscreenchange\n   * @fires Player#fullscreenchange\n   */\n\n\n  Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {\n    if (data) {\n      this.isFullscreen(data.isFullscreen);\n    }\n    /**\n     * Fired when going in and out of fullscreen.\n     *\n     * @event Player#fullscreenchange\n     * @type {EventTarget~Event}\n     */\n    this.trigger('fullscreenchange');\n  };\n\n  /**\n   * Fires when an error occurred during the loading of an audio/video.\n   *\n   * @private\n   * @listens Tech#error\n   */\n\n\n  Player.prototype.handleTechError_ = function handleTechError_() {\n    var error = this.tech_.error();\n\n    this.error(error);\n  };\n\n  /**\n   * Retrigger the `textdata` event that was triggered by the {@link Tech}.\n   *\n   * @fires Player#textdata\n   * @listens Tech#textdata\n   * @private\n   */\n\n\n  Player.prototype.handleTechTextData_ = function handleTechTextData_() {\n    var data = null;\n\n    if (arguments.length > 1) {\n      data = arguments[1];\n    }\n\n    /**\n     * Fires when we get a textdata event from tech\n     *\n     * @event Player#textdata\n     * @type {EventTarget~Event}\n     */\n    this.trigger('textdata', data);\n  };\n\n  /**\n   * Get object for cached values.\n   *\n   * @return {Object}\n   *         get the current object cache\n   */\n\n\n  Player.prototype.getCache = function getCache() {\n    return this.cache_;\n  };\n\n  /**\n   * Pass values to the playback tech\n   *\n   * @param {string} [method]\n   *        the method to call\n   *\n   * @param {Object} arg\n   *        the argument to pass\n   *\n   * @private\n   */\n\n\n  Player.prototype.techCall_ = function techCall_(method, arg) {\n    // If it's not ready yet, call method when it is\n\n    this.ready(function () {\n      if (method in allowedSetters) {\n        return set$1(this.middleware_, this.tech_, method, arg);\n      }\n\n      try {\n        if (this.tech_) {\n          this.tech_[method](arg);\n        }\n      } catch (e) {\n        log$1(e);\n        throw e;\n      }\n    }, true);\n  };\n\n  /**\n   * Get calls can't wait for the tech, and sometimes don't need to.\n   *\n   * @param {string} method\n   *        Tech method\n   *\n   * @return {Function|undefined}\n   *         the method or undefined\n   *\n   * @private\n   */\n\n\n  Player.prototype.techGet_ = function techGet_(method) {\n    if (!this.tech_ || !this.tech_.isReady_) {\n      return;\n    }\n\n    if (method in allowedGetters) {\n      return get$1(this.middleware_, this.tech_, method);\n    }\n\n    // Flash likes to die and reload when you hide or reposition it.\n    // In these cases the object methods go away and we get errors.\n    // When that happens we'll catch the errors and inform tech that it's not ready any more.\n    try {\n      return this.tech_[method]();\n    } catch (e) {\n\n      // When building additional tech libs, an expected method may not be defined yet\n      if (this.tech_[method] === undefined) {\n        log$1('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);\n        throw e;\n      }\n\n      // When a method isn't available on the object it throws a TypeError\n      if (e.name === 'TypeError') {\n        log$1('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);\n        this.tech_.isReady_ = false;\n        throw e;\n      }\n\n      // If error unknown, just log and throw\n      log$1(e);\n      throw e;\n    }\n  };\n\n  /**\n   * Attempt to begin playback at the first opportunity.\n   *\n   * @return {Promise|undefined}\n   *         Returns a `Promise` only if the browser returns one and the player\n   *         is ready to begin playback. For some browsers and all non-ready\n   *         situations, this will return `undefined`.\n   */\n\n\n  Player.prototype.play = function play() {\n    var _this5 = this;\n\n    // If this is called while we have a play queued up on a loadstart, remove\n    // that listener to avoid getting in a potentially bad state.\n    if (this.playOnLoadstart_) {\n      this.off('loadstart', this.playOnLoadstart_);\n    }\n\n    // If the player/tech is not ready, queue up another call to `play()` for\n    // when it is. This will loop back into this method for another attempt at\n    // playback when the tech is ready.\n    if (!this.isReady_) {\n\n      // Bail out if we're already waiting for `ready`!\n      if (this.playWaitingForReady_) {\n        return;\n      }\n\n      this.playWaitingForReady_ = true;\n      this.ready(function () {\n        _this5.playWaitingForReady_ = false;\n        silencePromise(_this5.play());\n      });\n\n      // If the player/tech is ready and we have a source, we can attempt playback.\n    } else if (!this.changingSrc_ && (this.src() || this.currentSrc())) {\n      return this.techGet_('play');\n\n      // If the tech is ready, but we do not have a source, we'll need to wait\n      // for both the `ready` and a `loadstart` when the source is finally\n      // resolved by middleware and set on the player.\n      //\n      // This can happen if `play()` is called while changing sources or before\n      // one has been set on the player.\n    } else {\n\n      this.playOnLoadstart_ = function () {\n        _this5.playOnLoadstart_ = null;\n        silencePromise(_this5.play());\n      };\n\n      this.one('loadstart', this.playOnLoadstart_);\n    }\n  };\n\n  /**\n   * Pause the video playback\n   *\n   * @return {Player}\n   *         A reference to the player object this function was called on\n   */\n\n\n  Player.prototype.pause = function pause() {\n    this.techCall_('pause');\n  };\n\n  /**\n   * Check if the player is paused or has yet to play\n   *\n   * @return {boolean}\n   *         - false: if the media is currently playing\n   *         - true: if media is not currently playing\n   */\n\n\n  Player.prototype.paused = function paused() {\n    // The initial state of paused should be true (in Safari it's actually false)\n    return this.techGet_('paused') === false ? false : true;\n  };\n\n  /**\n   * Get a TimeRange object representing the current ranges of time that the user\n   * has played.\n   *\n   * @return {TimeRange}\n   *         A time range object that represents all the increments of time that have\n   *         been played.\n   */\n\n\n  Player.prototype.played = function played() {\n    return this.techGet_('played') || createTimeRanges(0, 0);\n  };\n\n  /**\n   * Returns whether or not the user is \"scrubbing\". Scrubbing is\n   * when the user has clicked the progress bar handle and is\n   * dragging it along the progress bar.\n   *\n   * @param {boolean} [isScrubbing]\n   *        wether the user is or is not scrubbing\n   *\n   * @return {boolean}\n   *         The value of scrubbing when getting\n   */\n\n\n  Player.prototype.scrubbing = function scrubbing(isScrubbing) {\n    if (typeof isScrubbing === 'undefined') {\n      return this.scrubbing_;\n    }\n    this.scrubbing_ = !!isScrubbing;\n\n    if (isScrubbing) {\n      this.addClass('vjs-scrubbing');\n    } else {\n      this.removeClass('vjs-scrubbing');\n    }\n  };\n\n  /**\n   * Get or set the current time (in seconds)\n   *\n   * @param {number|string} [seconds]\n   *        The time to seek to in seconds\n   *\n   * @return {number}\n   *         - the current time in seconds when getting\n   */\n\n\n  Player.prototype.currentTime = function currentTime(seconds) {\n    if (typeof seconds !== 'undefined') {\n      if (seconds < 0) {\n        seconds = 0;\n      }\n      this.techCall_('setCurrentTime', seconds);\n      return;\n    }\n\n    // cache last currentTime and return. default to 0 seconds\n    //\n    // Caching the currentTime is meant to prevent a massive amount of reads on the tech's\n    // currentTime when scrubbing, but may not provide much performance benefit afterall.\n    // Should be tested. Also something has to read the actual current time or the cache will\n    // never get updated.\n    this.cache_.currentTime = this.techGet_('currentTime') || 0;\n    return this.cache_.currentTime;\n  };\n\n  /**\n   * Normally gets the length in time of the video in seconds;\n   * in all but the rarest use cases an argument will NOT be passed to the method\n   *\n   * > **NOTE**: The video must have started loading before the duration can be\n   * known, and in the case of Flash, may not be known until the video starts\n   * playing.\n   *\n   * @fires Player#durationchange\n   *\n   * @param {number} [seconds]\n   *        The duration of the video to set in seconds\n   *\n   * @return {number}\n   *         - The duration of the video in seconds when getting\n   */\n\n\n  Player.prototype.duration = function duration(seconds) {\n    if (seconds === undefined) {\n      // return NaN if the duration is not known\n      return this.cache_.duration !== undefined ? this.cache_.duration : NaN;\n    }\n\n    seconds = parseFloat(seconds);\n\n    // Standardize on Inifity for signaling video is live\n    if (seconds < 0) {\n      seconds = Infinity;\n    }\n\n    if (seconds !== this.cache_.duration) {\n      // Cache the last set value for optimized scrubbing (esp. Flash)\n      this.cache_.duration = seconds;\n\n      if (seconds === Infinity) {\n        this.addClass('vjs-live');\n      } else {\n        this.removeClass('vjs-live');\n      }\n      /**\n       * @event Player#durationchange\n       * @type {EventTarget~Event}\n       */\n      this.trigger('durationchange');\n    }\n  };\n\n  /**\n   * Calculates how much time is left in the video. Not part\n   * of the native video API.\n   *\n   * @return {number}\n   *         The time remaining in seconds\n   */\n\n\n  Player.prototype.remainingTime = function remainingTime() {\n    return this.duration() - this.currentTime();\n  };\n\n  /**\n   * A remaining time function that is intented to be used when\n   * the time is to be displayed directly to the user.\n   *\n   * @return {number}\n   *         The rounded time remaining in seconds\n   */\n\n\n  Player.prototype.remainingTimeDisplay = function remainingTimeDisplay() {\n    return Math.floor(this.duration()) - Math.floor(this.currentTime());\n  };\n\n  //\n  // Kind of like an array of portions of the video that have been downloaded.\n\n  /**\n   * Get a TimeRange object with an array of the times of the video\n   * that have been downloaded. If you just want the percent of the\n   * video that's been downloaded, use bufferedPercent.\n   *\n   * @see [Buffered Spec]{@link http://dev.w3.org/html5/spec/video.html#dom-media-buffered}\n   *\n   * @return {TimeRange}\n   *         A mock TimeRange object (following HTML spec)\n   */\n\n\n  Player.prototype.buffered = function buffered() {\n    var buffered = this.techGet_('buffered');\n\n    if (!buffered || !buffered.length) {\n      buffered = createTimeRanges(0, 0);\n    }\n\n    return buffered;\n  };\n\n  /**\n   * Get the percent (as a decimal) of the video that's been downloaded.\n   * This method is not a part of the native HTML video API.\n   *\n   * @return {number}\n   *         A decimal between 0 and 1 representing the percent\n   *         that is bufferred 0 being 0% and 1 being 100%\n   */\n\n\n  Player.prototype.bufferedPercent = function bufferedPercent$$1() {\n    return bufferedPercent(this.buffered(), this.duration());\n  };\n\n  /**\n   * Get the ending time of the last buffered time range\n   * This is used in the progress bar to encapsulate all time ranges.\n   *\n   * @return {number}\n   *         The end of the last buffered time range\n   */\n\n\n  Player.prototype.bufferedEnd = function bufferedEnd() {\n    var buffered = this.buffered();\n    var duration = this.duration();\n    var end = buffered.end(buffered.length - 1);\n\n    if (end > duration) {\n      end = duration;\n    }\n\n    return end;\n  };\n\n  /**\n   * Get or set the current volume of the media\n   *\n   * @param  {number} [percentAsDecimal]\n   *         The new volume as a decimal percent:\n   *         - 0 is muted/0%/off\n   *         - 1.0 is 100%/full\n   *         - 0.5 is half volume or 50%\n   *\n   * @return {number}\n   *         The current volume as a percent when getting\n   */\n\n\n  Player.prototype.volume = function volume(percentAsDecimal) {\n    var vol = void 0;\n\n    if (percentAsDecimal !== undefined) {\n      // Force value to between 0 and 1\n      vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal)));\n      this.cache_.volume = vol;\n      this.techCall_('setVolume', vol);\n\n      if (vol > 0) {\n        this.lastVolume_(vol);\n      }\n\n      return;\n    }\n\n    // Default to 1 when returning current volume.\n    vol = parseFloat(this.techGet_('volume'));\n    return isNaN(vol) ? 1 : vol;\n  };\n\n  /**\n   * Get the current muted state, or turn mute on or off\n   *\n   * @param {boolean} [muted]\n   *        - true to mute\n   *        - false to unmute\n   *\n   * @return {boolean}\n   *         - true if mute is on and getting\n   *         - false if mute is off and getting\n   */\n\n\n  Player.prototype.muted = function muted(_muted) {\n    if (_muted !== undefined) {\n      this.techCall_('setMuted', _muted);\n      return;\n    }\n    return this.techGet_('muted') || false;\n  };\n\n  /**\n   * Get the current defaultMuted state, or turn defaultMuted on or off. defaultMuted\n   * indicates the state of muted on intial playback.\n   *\n   * ```js\n   *   var myPlayer = videojs('some-player-id');\n   *\n   *   myPlayer.src(\"http://www.example.com/path/to/video.mp4\");\n   *\n   *   // get, should be false\n   *   console.log(myPlayer.defaultMuted());\n   *   // set to true\n   *   myPlayer.defaultMuted(true);\n   *   // get should be true\n   *   console.log(myPlayer.defaultMuted());\n   * ```\n   *\n   * @param {boolean} [defaultMuted]\n   *        - true to mute\n   *        - false to unmute\n   *\n   * @return {boolean|Player}\n   *         - true if defaultMuted is on and getting\n   *         - false if defaultMuted is off and getting\n   *         - A reference to the current player when setting\n   */\n\n\n  Player.prototype.defaultMuted = function defaultMuted(_defaultMuted) {\n    if (_defaultMuted !== undefined) {\n      return this.techCall_('setDefaultMuted', _defaultMuted);\n    }\n    return this.techGet_('defaultMuted') || false;\n  };\n\n  /**\n   * Get the last volume, or set it\n   *\n   * @param  {number} [percentAsDecimal]\n   *         The new last volume as a decimal percent:\n   *         - 0 is muted/0%/off\n   *         - 1.0 is 100%/full\n   *         - 0.5 is half volume or 50%\n   *\n   * @return {number}\n   *         the current value of lastVolume as a percent when getting\n   *\n   * @private\n   */\n\n\n  Player.prototype.lastVolume_ = function lastVolume_(percentAsDecimal) {\n    if (percentAsDecimal !== undefined && percentAsDecimal !== 0) {\n      this.cache_.lastVolume = percentAsDecimal;\n      return;\n    }\n    return this.cache_.lastVolume;\n  };\n\n  /**\n   * Check if current tech can support native fullscreen\n   * (e.g. with built in controls like iOS, so not our flash swf)\n   *\n   * @return {boolean}\n   *         if native fullscreen is supported\n   */\n\n\n  Player.prototype.supportsFullScreen = function supportsFullScreen() {\n    return this.techGet_('supportsFullScreen') || false;\n  };\n\n  /**\n   * Check if the player is in fullscreen mode or tell the player that it\n   * is or is not in fullscreen mode.\n   *\n   * > NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official\n   * property and instead document.fullscreenElement is used. But isFullscreen is\n   * still a valuable property for internal player workings.\n   *\n   * @param  {boolean} [isFS]\n   *         Set the players current fullscreen state\n   *\n   * @return {boolean}\n   *         - true if fullscreen is on and getting\n   *         - false if fullscreen is off and getting\n   */\n\n\n  Player.prototype.isFullscreen = function isFullscreen(isFS) {\n    if (isFS !== undefined) {\n      this.isFullscreen_ = !!isFS;\n      return;\n    }\n    return !!this.isFullscreen_;\n  };\n\n  /**\n   * Increase the size of the video to full screen\n   * In some browsers, full screen is not supported natively, so it enters\n   * \"full window mode\", where the video fills the browser window.\n   * In browsers and devices that support native full screen, sometimes the\n   * browser's default controls will be shown, and not the Video.js custom skin.\n   * This includes most mobile devices (iOS, Android) and older versions of\n   * Safari.\n   *\n   * @fires Player#fullscreenchange\n   */\n\n\n  Player.prototype.requestFullscreen = function requestFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(true);\n\n    if (fsApi.requestFullscreen) {\n      // the browser supports going fullscreen at the element level so we can\n      // take the controls fullscreen as well as the video\n\n      // Trigger fullscreenchange event after change\n      // We have to specifically add this each time, and remove\n      // when canceling fullscreen. Otherwise if there's multiple\n      // players on a page, they would all be reacting to the same fullscreen\n      // events\n      on(document_1, fsApi.fullscreenchange, bind(this, function documentFullscreenChange(e) {\n        this.isFullscreen(document_1[fsApi.fullscreenElement]);\n\n        // If cancelling fullscreen, remove event listener.\n        if (this.isFullscreen() === false) {\n          off(document_1, fsApi.fullscreenchange, documentFullscreenChange);\n        }\n        /**\n         * @event Player#fullscreenchange\n         * @type {EventTarget~Event}\n         */\n        this.trigger('fullscreenchange');\n      }));\n\n      this.el_[fsApi.requestFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n      // we can't take the video.js controls fullscreen but we can go fullscreen\n      // with native controls\n      this.techCall_('enterFullScreen');\n    } else {\n      // fullscreen isn't supported so we'll just stretch the video element to\n      // fill the viewport\n      this.enterFullWindow();\n      /**\n       * @event Player#fullscreenchange\n       * @type {EventTarget~Event}\n       */\n      this.trigger('fullscreenchange');\n    }\n  };\n\n  /**\n   * Return the video to its normal size after having been in full screen mode\n   *\n   * @fires Player#fullscreenchange\n   */\n\n\n  Player.prototype.exitFullscreen = function exitFullscreen() {\n    var fsApi = FullscreenApi;\n\n    this.isFullscreen(false);\n\n    // Check for browser element fullscreen support\n    if (fsApi.requestFullscreen) {\n      document_1[fsApi.exitFullscreen]();\n    } else if (this.tech_.supportsFullScreen()) {\n      this.techCall_('exitFullScreen');\n    } else {\n      this.exitFullWindow();\n      /**\n       * @event Player#fullscreenchange\n       * @type {EventTarget~Event}\n       */\n      this.trigger('fullscreenchange');\n    }\n  };\n\n  /**\n   * When fullscreen isn't supported we can stretch the\n   * video container to as wide as the browser will let us.\n   *\n   * @fires Player#enterFullWindow\n   */\n\n\n  Player.prototype.enterFullWindow = function enterFullWindow() {\n    this.isFullWindow = true;\n\n    // Storing original doc overflow value to return to when fullscreen is off\n    this.docOrigOverflow = document_1.documentElement.style.overflow;\n\n    // Add listener for esc key to exit fullscreen\n    on(document_1, 'keydown', bind(this, this.fullWindowOnEscKey));\n\n    // Hide any scroll bars\n    document_1.documentElement.style.overflow = 'hidden';\n\n    // Apply fullscreen styles\n    addClass(document_1.body, 'vjs-full-window');\n\n    /**\n     * @event Player#enterFullWindow\n     * @type {EventTarget~Event}\n     */\n    this.trigger('enterFullWindow');\n  };\n\n  /**\n   * Check for call to either exit full window or\n   * full screen on ESC key\n   *\n   * @param {string} event\n   *        Event to check for key press\n   */\n\n\n  Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {\n    if (event.keyCode === 27) {\n      if (this.isFullscreen() === true) {\n        this.exitFullscreen();\n      } else {\n        this.exitFullWindow();\n      }\n    }\n  };\n\n  /**\n   * Exit full window\n   *\n   * @fires Player#exitFullWindow\n   */\n\n\n  Player.prototype.exitFullWindow = function exitFullWindow() {\n    this.isFullWindow = false;\n    off(document_1, 'keydown', this.fullWindowOnEscKey);\n\n    // Unhide scroll bars.\n    document_1.documentElement.style.overflow = this.docOrigOverflow;\n\n    // Remove fullscreen styles\n    removeClass(document_1.body, 'vjs-full-window');\n\n    // Resize the box, controller, and poster to original sizes\n    // this.positionAll();\n    /**\n     * @event Player#exitFullWindow\n     * @type {EventTarget~Event}\n     */\n    this.trigger('exitFullWindow');\n  };\n\n  /**\n   * Check whether the player can play a given mimetype\n   *\n   * @see https://www.w3.org/TR/2011/WD-html5-20110113/video.html#dom-navigator-canplaytype\n   *\n   * @param {string} type\n   *        The mimetype to check\n   *\n   * @return {string}\n   *         'probably', 'maybe', or '' (empty string)\n   */\n\n\n  Player.prototype.canPlayType = function canPlayType(type) {\n    var can = void 0;\n\n    // Loop through each playback technology in the options order\n    for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {\n      var techName = j[i];\n      var tech = Tech.getTech(techName);\n\n      // Support old behavior of techs being registered as components.\n      // Remove once that deprecated behavior is removed.\n      if (!tech) {\n        tech = Component.getComponent(techName);\n      }\n\n      // Check if the current tech is defined before continuing\n      if (!tech) {\n        log$1.error('The \"' + techName + '\" tech is undefined. Skipped browser support check for that tech.');\n        continue;\n      }\n\n      // Check if the browser supports this technology\n      if (tech.isSupported()) {\n        can = tech.canPlayType(type);\n\n        if (can) {\n          return can;\n        }\n      }\n    }\n\n    return '';\n  };\n\n  /**\n   * Select source based on tech-order or source-order\n   * Uses source-order selection if `options.sourceOrder` is truthy. Otherwise,\n   * defaults to tech-order selection\n   *\n   * @param {Array} sources\n   *        The sources for a media asset\n   *\n   * @return {Object|boolean}\n   *         Object of source and tech order or false\n   */\n\n\n  Player.prototype.selectSource = function selectSource(sources) {\n    var _this6 = this;\n\n    // Get only the techs specified in `techOrder` that exist and are supported by the\n    // current platform\n    var techs = this.options_.techOrder.map(function (techName) {\n      return [techName, Tech.getTech(techName)];\n    }).filter(function (_ref) {\n      var techName = _ref[0],\n          tech = _ref[1];\n\n      // Check if the current tech is defined before continuing\n      if (tech) {\n        // Check if the browser supports this technology\n        return tech.isSupported();\n      }\n\n      log$1.error('The \"' + techName + '\" tech is undefined. Skipped browser support check for that tech.');\n      return false;\n    });\n\n    // Iterate over each `innerArray` element once per `outerArray` element and execute\n    // `tester` with both. If `tester` returns a non-falsy value, exit early and return\n    // that value.\n    var findFirstPassingTechSourcePair = function findFirstPassingTechSourcePair(outerArray, innerArray, tester) {\n      var found = void 0;\n\n      outerArray.some(function (outerChoice) {\n        return innerArray.some(function (innerChoice) {\n          found = tester(outerChoice, innerChoice);\n\n          if (found) {\n            return true;\n          }\n        });\n      });\n\n      return found;\n    };\n\n    var foundSourceAndTech = void 0;\n    var flip = function flip(fn) {\n      return function (a, b) {\n        return fn(b, a);\n      };\n    };\n    var finder = function finder(_ref2, source) {\n      var techName = _ref2[0],\n          tech = _ref2[1];\n\n      if (tech.canPlaySource(source, _this6.options_[techName.toLowerCase()])) {\n        return { source: source, tech: techName };\n      }\n    };\n\n    // Depending on the truthiness of `options.sourceOrder`, we swap the order of techs and sources\n    // to select from them based on their priority.\n    if (this.options_.sourceOrder) {\n      // Source-first ordering\n      foundSourceAndTech = findFirstPassingTechSourcePair(sources, techs, flip(finder));\n    } else {\n      // Tech-first ordering\n      foundSourceAndTech = findFirstPassingTechSourcePair(techs, sources, finder);\n    }\n\n    return foundSourceAndTech || false;\n  };\n\n  /**\n   * Get or set the video source.\n   *\n   * @param {Tech~SourceObject|Tech~SourceObject[]|string} [source]\n   *        A SourceObject, an array of SourceObjects, or a string referencing\n   *        a URL to a media source. It is _highly recommended_ that an object\n   *        or array of objects is used here, so that source selection\n   *        algorithms can take the `type` into account.\n   *\n   *        If not provided, this method acts as a getter.\n   *\n   * @return {string|undefined}\n   *         If the `source` argument is missing, returns the current source\n   *         URL. Otherwise, returns nothing/undefined.\n   */\n\n\n  Player.prototype.src = function src(source) {\n    var _this7 = this;\n\n    // getter usage\n    if (typeof source === 'undefined') {\n      return this.cache_.src || '';\n    }\n    // filter out invalid sources and turn our source into\n    // an array of source objects\n    var sources = filterSource(source);\n\n    // if a source was passed in then it is invalid because\n    // it was filtered to a zero length Array. So we have to\n    // show an error\n    if (!sources.length) {\n      this.setTimeout(function () {\n        this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n      }, 0);\n      return;\n    }\n\n    // intial sources\n    this.cache_.sources = sources;\n    this.changingSrc_ = true;\n\n    // intial source\n    this.cache_.source = sources[0];\n\n    // middlewareSource is the source after it has been changed by middleware\n    setSource(this, sources[0], function (middlewareSource, mws) {\n      _this7.middleware_ = mws;\n\n      var err = _this7.src_(middlewareSource);\n\n      if (err) {\n        if (sources.length > 1) {\n          return _this7.src(sources.slice(1));\n        }\n\n        // We need to wrap this in a timeout to give folks a chance to add error event handlers\n        _this7.setTimeout(function () {\n          this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });\n        }, 0);\n\n        // we could not find an appropriate tech, but let's still notify the delegate that this is it\n        // this needs a better comment about why this is needed\n        _this7.triggerReady();\n\n        return;\n      }\n\n      _this7.changingSrc_ = false;\n      // video element listed source\n      _this7.cache_.src = middlewareSource.src;\n\n      setTech(mws, _this7.tech_);\n    });\n  };\n\n  /**\n   * Set the source object on the tech, returns a boolean that indicates wether\n   * there is a tech that can play the source or not\n   *\n   * @param {Tech~SourceObject} source\n   *        The source object to set on the Tech\n   *\n   * @return {Boolean}\n   *         - True if there is no Tech to playback this source\n   *         - False otherwise\n   *\n   * @private\n   */\n\n\n  Player.prototype.src_ = function src_(source) {\n    var sourceTech = this.selectSource([source]);\n\n    if (!sourceTech) {\n      return true;\n    }\n\n    if (!titleCaseEquals(sourceTech.tech, this.techName_)) {\n      this.changingSrc_ = true;\n\n      // load this technology with the chosen source\n      this.loadTech_(sourceTech.tech, sourceTech.source);\n      return false;\n    }\n\n    // wait until the tech is ready to set the source\n    this.ready(function () {\n\n      // The setSource tech method was added with source handlers\n      // so older techs won't support it\n      // We need to check the direct prototype for the case where subclasses\n      // of the tech do not support source handlers\n      if (this.tech_.constructor.prototype.hasOwnProperty('setSource')) {\n        this.techCall_('setSource', source);\n      } else {\n        this.techCall_('src', source.src);\n      }\n\n      if (this.options_.preload === 'auto') {\n        this.load();\n      }\n\n      // Set the source synchronously if possible (#2326)\n    }, true);\n\n    return false;\n  };\n\n  /**\n   * Begin loading the src data.\n   */\n\n\n  Player.prototype.load = function load() {\n    this.techCall_('load');\n  };\n\n  /**\n   * Reset the player. Loads the first tech in the techOrder,\n   * and calls `reset` on the tech`.\n   */\n\n\n  Player.prototype.reset = function reset() {\n    this.loadTech_(this.options_.techOrder[0], null);\n    this.techCall_('reset');\n  };\n\n  /**\n   * Returns all of the current source objects.\n   *\n   * @return {Tech~SourceObject[]}\n   *         The current source objects\n   */\n\n\n  Player.prototype.currentSources = function currentSources() {\n    var source = this.currentSource();\n    var sources = [];\n\n    // assume `{}` or `{ src }`\n    if (Object.keys(source).length !== 0) {\n      sources.push(source);\n    }\n\n    return this.cache_.sources || sources;\n  };\n\n  /**\n   * Returns the current source object.\n   *\n   * @return {Tech~SourceObject}\n   *         The current source object\n   */\n\n\n  Player.prototype.currentSource = function currentSource() {\n    return this.cache_.source || {};\n  };\n\n  /**\n   * Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4\n   * Can be used in conjuction with `currentType` to assist in rebuilding the current source object.\n   *\n   * @return {string}\n   *         The current source\n   */\n\n\n  Player.prototype.currentSrc = function currentSrc() {\n    return this.currentSource() && this.currentSource().src || '';\n  };\n\n  /**\n   * Get the current source type e.g. video/mp4\n   * This can allow you rebuild the current source object so that you could load the same\n   * source and tech later\n   *\n   * @return {string}\n   *         The source MIME type\n   */\n\n\n  Player.prototype.currentType = function currentType() {\n    return this.currentSource() && this.currentSource().type || '';\n  };\n\n  /**\n   * Get or set the preload attribute\n   *\n   * @param {boolean} [value]\n   *        - true means that we should preload\n   *        - false maens that we should not preload\n   *\n   * @return {string}\n   *         The preload attribute value when getting\n   */\n\n\n  Player.prototype.preload = function preload(value) {\n    if (value !== undefined) {\n      this.techCall_('setPreload', value);\n      this.options_.preload = value;\n      return;\n    }\n    return this.techGet_('preload');\n  };\n\n  /**\n   * Get or set the autoplay attribute.\n   *\n   * @param {boolean} [value]\n   *        - true means that we should autoplay\n   *        - false means that we should not autoplay\n   *\n   * @return {string}\n   *         The current value of autoplay when getting\n   */\n\n\n  Player.prototype.autoplay = function autoplay(value) {\n    if (value !== undefined) {\n      this.techCall_('setAutoplay', value);\n      this.options_.autoplay = value;\n      this.ready(this.forceAutoplayInChrome_);\n      return;\n    }\n    return this.techGet_('autoplay', value);\n  };\n\n  /**\n   * chrome started pausing the video when moving in the DOM\n   * causing autoplay to not continue due to how Video.js functions.\n   * See #4720 for more info.\n   *\n   * @private\n   */\n\n\n  Player.prototype.forceAutoplayInChrome_ = function forceAutoplayInChrome_() {\n    if (this.paused() && (\n    // read from the video element or options\n    this.autoplay() || this.options_.autoplay) &&\n    // only target desktop chrome\n    IS_CHROME && !IS_ANDROID) {\n      this.play();\n    }\n  };\n\n  /**\n   * Set or unset the playsinline attribute.\n   * Playsinline tells the browser that non-fullscreen playback is preferred.\n   *\n   * @param {boolean} [value]\n   *        - true means that we should try to play inline by default\n   *        - false means that we should use the browser's default playback mode,\n   *          which in most cases is inline. iOS Safari is a notable exception\n   *          and plays fullscreen by default.\n   *\n   * @return {string|Player}\n   *         - the current value of playsinline\n   *         - the player when setting\n   *\n   * @see [Spec]{@link https://html.spec.whatwg.org/#attr-video-playsinline}\n   */\n\n\n  Player.prototype.playsinline = function playsinline(value) {\n    if (value !== undefined) {\n      this.techCall_('setPlaysinline', value);\n      this.options_.playsinline = value;\n      return this;\n    }\n    return this.techGet_('playsinline');\n  };\n\n  /**\n   * Get or set the loop attribute on the video element.\n   *\n   * @param {boolean} [value]\n   *        - true means that we should loop the video\n   *        - false means that we should not loop the video\n   *\n   * @return {string}\n   *         The current value of loop when getting\n   */\n\n\n  Player.prototype.loop = function loop(value) {\n    if (value !== undefined) {\n      this.techCall_('setLoop', value);\n      this.options_.loop = value;\n      return;\n    }\n    return this.techGet_('loop');\n  };\n\n  /**\n   * Get or set the poster image source url\n   *\n   * @fires Player#posterchange\n   *\n   * @param {string} [src]\n   *        Poster image source URL\n   *\n   * @return {string}\n   *         The current value of poster when getting\n   */\n\n\n  Player.prototype.poster = function poster(src) {\n    if (src === undefined) {\n      return this.poster_;\n    }\n\n    // The correct way to remove a poster is to set as an empty string\n    // other falsey values will throw errors\n    if (!src) {\n      src = '';\n    }\n\n    // update the internal poster variable\n    this.poster_ = src;\n\n    // update the tech's poster\n    this.techCall_('setPoster', src);\n\n    // alert components that the poster has been set\n    /**\n     * This event fires when the poster image is changed on the player.\n     *\n     * @event Player#posterchange\n     * @type {EventTarget~Event}\n     */\n    this.trigger('posterchange');\n  };\n\n  /**\n   * Some techs (e.g. YouTube) can provide a poster source in an\n   * asynchronous way. We want the poster component to use this\n   * poster source so that it covers up the tech's controls.\n   * (YouTube's play button). However we only want to use this\n   * source if the player user hasn't set a poster through\n   * the normal APIs.\n   *\n   * @fires Player#posterchange\n   * @listens Tech#posterchange\n   * @private\n   */\n\n\n  Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {\n    if (!this.poster_ && this.tech_ && this.tech_.poster) {\n      this.poster_ = this.tech_.poster() || '';\n\n      // Let components know the poster has changed\n      this.trigger('posterchange');\n    }\n  };\n\n  /**\n   * Get or set whether or not the controls are showing.\n   *\n   * @fires Player#controlsenabled\n   *\n   * @param {boolean} [bool]\n   *        - true to turn controls on\n   *        - false to turn controls off\n   *\n   * @return {boolean}\n   *         The current value of controls when getting\n   */\n\n\n  Player.prototype.controls = function controls(bool) {\n    if (bool === undefined) {\n      return !!this.controls_;\n    }\n\n    bool = !!bool;\n\n    // Don't trigger a change event unless it actually changed\n    if (this.controls_ === bool) {\n      return;\n    }\n\n    this.controls_ = bool;\n\n    if (this.usingNativeControls()) {\n      this.techCall_('setControls', bool);\n    }\n\n    if (this.controls_) {\n      this.removeClass('vjs-controls-disabled');\n      this.addClass('vjs-controls-enabled');\n      /**\n       * @event Player#controlsenabled\n       * @type {EventTarget~Event}\n       */\n      this.trigger('controlsenabled');\n      if (!this.usingNativeControls()) {\n        this.addTechControlsListeners_();\n      }\n    } else {\n      this.removeClass('vjs-controls-enabled');\n      this.addClass('vjs-controls-disabled');\n      /**\n       * @event Player#controlsdisabled\n       * @type {EventTarget~Event}\n       */\n      this.trigger('controlsdisabled');\n      if (!this.usingNativeControls()) {\n        this.removeTechControlsListeners_();\n      }\n    }\n  };\n\n  /**\n   * Toggle native controls on/off. Native controls are the controls built into\n   * devices (e.g. default iPhone controls), Flash, or other techs\n   * (e.g. Vimeo Controls)\n   * **This should only be set by the current tech, because only the tech knows\n   * if it can support native controls**\n   *\n   * @fires Player#usingnativecontrols\n   * @fires Player#usingcustomcontrols\n   *\n   * @param {boolean} [bool]\n   *        - true to turn native controls on\n   *        - false to turn native controls off\n   *\n   * @return {boolean}\n   *         The current value of native controls when getting\n   */\n\n\n  Player.prototype.usingNativeControls = function usingNativeControls(bool) {\n    if (bool === undefined) {\n      return !!this.usingNativeControls_;\n    }\n\n    bool = !!bool;\n\n    // Don't trigger a change event unless it actually changed\n    if (this.usingNativeControls_ === bool) {\n      return;\n    }\n\n    this.usingNativeControls_ = bool;\n\n    if (this.usingNativeControls_) {\n      this.addClass('vjs-using-native-controls');\n\n      /**\n       * player is using the native device controls\n       *\n       * @event Player#usingnativecontrols\n       * @type {EventTarget~Event}\n       */\n      this.trigger('usingnativecontrols');\n    } else {\n      this.removeClass('vjs-using-native-controls');\n\n      /**\n       * player is using the custom HTML controls\n       *\n       * @event Player#usingcustomcontrols\n       * @type {EventTarget~Event}\n       */\n      this.trigger('usingcustomcontrols');\n    }\n  };\n\n  /**\n   * Set or get the current MediaError\n   *\n   * @fires Player#error\n   *\n   * @param  {MediaError|string|number} [err]\n   *         A MediaError or a string/number to be turned\n   *         into a MediaError\n   *\n   * @return {MediaError|null}\n   *         The current MediaError when getting (or null)\n   */\n\n\n  Player.prototype.error = function error(err) {\n    if (err === undefined) {\n      return this.error_ || null;\n    }\n\n    // restoring to default\n    if (err === null) {\n      this.error_ = err;\n      this.removeClass('vjs-error');\n      if (this.errorDisplay) {\n        this.errorDisplay.close();\n      }\n      return;\n    }\n\n    this.error_ = new MediaError(err);\n\n    // add the vjs-error classname to the player\n    this.addClass('vjs-error');\n\n    // log the name of the error type and any message\n    // ie8 just logs \"[object object]\" if you just log the error object\n    log$1.error('(CODE:' + this.error_.code + ' ' + MediaError.errorTypes[this.error_.code] + ')', this.error_.message, this.error_);\n\n    /**\n     * @event Player#error\n     * @type {EventTarget~Event}\n     */\n    this.trigger('error');\n\n    return;\n  };\n\n  /**\n   * Report user activity\n   *\n   * @param {Object} event\n   *        Event object\n   */\n\n\n  Player.prototype.reportUserActivity = function reportUserActivity(event) {\n    this.userActivity_ = true;\n  };\n\n  /**\n   * Get/set if user is active\n   *\n   * @fires Player#useractive\n   * @fires Player#userinactive\n   *\n   * @param {boolean} [bool]\n   *        - true if the user is active\n   *        - false if the user is inactive\n   *\n   * @return {boolean}\n   *         The current value of userActive when getting\n   */\n\n\n  Player.prototype.userActive = function userActive(bool) {\n    if (bool === undefined) {\n      return this.userActive_;\n    }\n\n    bool = !!bool;\n\n    if (bool === this.userActive_) {\n      return;\n    }\n\n    this.userActive_ = bool;\n\n    if (this.userActive_) {\n      this.userActivity_ = true;\n      this.removeClass('vjs-user-inactive');\n      this.addClass('vjs-user-active');\n      /**\n       * @event Player#useractive\n       * @type {EventTarget~Event}\n       */\n      this.trigger('useractive');\n      return;\n    }\n\n    // Chrome/Safari/IE have bugs where when you change the cursor it can\n    // trigger a mousemove event. This causes an issue when you're hiding\n    // the cursor when the user is inactive, and a mousemove signals user\n    // activity. Making it impossible to go into inactive mode. Specifically\n    // this happens in fullscreen when we really need to hide the cursor.\n    //\n    // When this gets resolved in ALL browsers it can be removed\n    // https://code.google.com/p/chromium/issues/detail?id=103041\n    if (this.tech_) {\n      this.tech_.one('mousemove', function (e) {\n        e.stopPropagation();\n        e.preventDefault();\n      });\n    }\n\n    this.userActivity_ = false;\n    this.removeClass('vjs-user-active');\n    this.addClass('vjs-user-inactive');\n    /**\n     * @event Player#userinactive\n     * @type {EventTarget~Event}\n     */\n    this.trigger('userinactive');\n  };\n\n  /**\n   * Listen for user activity based on timeout value\n   *\n   * @private\n   */\n\n\n  Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {\n    var mouseInProgress = void 0;\n    var lastMoveX = void 0;\n    var lastMoveY = void 0;\n    var handleActivity = bind(this, this.reportUserActivity);\n\n    var handleMouseMove = function handleMouseMove(e) {\n      // #1068 - Prevent mousemove spamming\n      // Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970\n      if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {\n        lastMoveX = e.screenX;\n        lastMoveY = e.screenY;\n        handleActivity();\n      }\n    };\n\n    var handleMouseDown = function handleMouseDown() {\n      handleActivity();\n      // For as long as the they are touching the device or have their mouse down,\n      // we consider them active even if they're not moving their finger or mouse.\n      // So we want to continue to update that they are active\n      this.clearInterval(mouseInProgress);\n      // Setting userActivity=true now and setting the interval to the same time\n      // as the activityCheck interval (250) should ensure we never miss the\n      // next activityCheck\n      mouseInProgress = this.setInterval(handleActivity, 250);\n    };\n\n    var handleMouseUp = function handleMouseUp(event) {\n      handleActivity();\n      // Stop the interval that maintains activity if the mouse/touch is down\n      this.clearInterval(mouseInProgress);\n    };\n\n    // Any mouse movement will be considered user activity\n    this.on('mousedown', handleMouseDown);\n    this.on('mousemove', handleMouseMove);\n    this.on('mouseup', handleMouseUp);\n\n    // Listen for keyboard navigation\n    // Shouldn't need to use inProgress interval because of key repeat\n    this.on('keydown', handleActivity);\n    this.on('keyup', handleActivity);\n\n    // Run an interval every 250 milliseconds instead of stuffing everything into\n    // the mousemove/touchmove function itself, to prevent performance degradation.\n    // `this.reportUserActivity` simply sets this.userActivity_ to true, which\n    // then gets picked up by this loop\n    // http://ejohn.org/blog/learning-from-twitter/\n    var inactivityTimeout = void 0;\n\n    this.setInterval(function () {\n      // Check to see if mouse/touch activity has happened\n      if (!this.userActivity_) {\n        return;\n      }\n\n      // Reset the activity tracker\n      this.userActivity_ = false;\n\n      // If the user state was inactive, set the state to active\n      this.userActive(true);\n\n      // Clear any existing inactivity timeout to start the timer over\n      this.clearTimeout(inactivityTimeout);\n\n      var timeout = this.options_.inactivityTimeout;\n\n      if (timeout <= 0) {\n        return;\n      }\n\n      // In <timeout> milliseconds, if no more activity has occurred the\n      // user will be considered inactive\n      inactivityTimeout = this.setTimeout(function () {\n        // Protect against the case where the inactivityTimeout can trigger just\n        // before the next user activity is picked up by the activity check loop\n        // causing a flicker\n        if (!this.userActivity_) {\n          this.userActive(false);\n        }\n      }, timeout);\n    }, 250);\n  };\n\n  /**\n   * Gets or sets the current playback rate. A playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed\n   * playback, for instance.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate\n   *\n   * @param {number} [rate]\n   *       New playback rate to set.\n   *\n   * @return {number}\n   *         The current playback rate when getting or 1.0\n   */\n\n\n  Player.prototype.playbackRate = function playbackRate(rate) {\n    if (rate !== undefined) {\n      this.techCall_('setPlaybackRate', rate);\n      return;\n    }\n\n    if (this.tech_ && this.tech_.featuresPlaybackRate) {\n      return this.techGet_('playbackRate');\n    }\n    return 1.0;\n  };\n\n  /**\n   * Gets or sets the current default playback rate. A default playback rate of\n   * 1.0 represents normal speed and 0.5 would indicate half-speed playback, for instance.\n   * defaultPlaybackRate will only represent what the intial playbackRate of a video was, not\n   * not the current playbackRate.\n   *\n   * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-defaultplaybackrate\n   *\n   * @param {number} [rate]\n   *       New default playback rate to set.\n   *\n   * @return {number|Player}\n   *         - The default playback rate when getting or 1.0\n   *         - the player when setting\n   */\n\n\n  Player.prototype.defaultPlaybackRate = function defaultPlaybackRate(rate) {\n    if (rate !== undefined) {\n      return this.techCall_('setDefaultPlaybackRate', rate);\n    }\n\n    if (this.tech_ && this.tech_.featuresPlaybackRate) {\n      return this.techGet_('defaultPlaybackRate');\n    }\n    return 1.0;\n  };\n\n  /**\n   * Gets or sets the audio flag\n   *\n   * @param {boolean} bool\n   *        - true signals that this is an audio player\n   *        - false signals that this is not an audio player\n   *\n   * @return {boolean}\n   *         The current value of isAudio when getting\n   */\n\n\n  Player.prototype.isAudio = function isAudio(bool) {\n    if (bool !== undefined) {\n      this.isAudio_ = !!bool;\n      return;\n    }\n\n    return !!this.isAudio_;\n  };\n\n  /**\n   * A helper method for adding a {@link TextTrack} to our\n   * {@link TextTrackList}.\n   *\n   * In addition to the W3C settings we allow adding additional info through options.\n   *\n   * @see http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack\n   *\n   * @param {string} [kind]\n   *        the kind of TextTrack you are adding\n   *\n   * @param {string} [label]\n   *        the label to give the TextTrack label\n   *\n   * @param {string} [language]\n   *        the language to set on the TextTrack\n   *\n   * @return {TextTrack|undefined}\n   *         the TextTrack that was added or undefined\n   *         if there is no tech\n   */\n\n\n  Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {\n    if (this.tech_) {\n      return this.tech_.addTextTrack(kind, label, language);\n    }\n  };\n\n  /**\n   * Create a remote {@link TextTrack} and an {@link HTMLTrackElement}. It will\n   * automatically removed from the video element whenever the source changes, unless\n   * manualCleanup is set to false.\n   *\n   * @param {Object} options\n   *        Options to pass to {@link HTMLTrackElement} during creation. See\n   *        {@link HTMLTrackElement} for object properties that you should use.\n   *\n   * @param {boolean} [manualCleanup=true] if set to false, the TextTrack will be\n   *\n   * @return {HtmlTrackElement}\n   *         the HTMLTrackElement that was created and added\n   *         to the HtmlTrackElementList and the remote\n   *         TextTrackList\n   *\n   * @deprecated The default value of the \"manualCleanup\" parameter will default\n   *             to \"false\" in upcoming versions of Video.js\n   */\n\n\n  Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options, manualCleanup) {\n    if (this.tech_) {\n      return this.tech_.addRemoteTextTrack(options, manualCleanup);\n    }\n  };\n\n  /**\n   * Remove a remote {@link TextTrack} from the respective\n   * {@link TextTrackList} and {@link HtmlTrackElementList}.\n   *\n   * @param {Object} track\n   *        Remote {@link TextTrack} to remove\n   *\n   * @return {undefined}\n   *         does not return anything\n   */\n\n\n  Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack() {\n    var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref3$track = _ref3.track,\n        track = _ref3$track === undefined ? arguments[0] : _ref3$track;\n\n    // destructure the input into an object with a track argument, defaulting to arguments[0]\n    // default the whole argument to an empty object if nothing was passed in\n\n    if (this.tech_) {\n      return this.tech_.removeRemoteTextTrack(track);\n    }\n  };\n\n  /**\n   * Gets available media playback quality metrics as specified by the W3C's Media\n   * Playback Quality API.\n   *\n   * @see [Spec]{@link https://wicg.github.io/media-playback-quality}\n   *\n   * @return {Object|undefined}\n   *         An object with supported media playback quality metrics or undefined if there\n   *         is no tech or the tech does not support it.\n   */\n\n\n  Player.prototype.getVideoPlaybackQuality = function getVideoPlaybackQuality() {\n    return this.techGet_('getVideoPlaybackQuality');\n  };\n\n  /**\n   * Get video width\n   *\n   * @return {number}\n   *         current video width\n   */\n\n\n  Player.prototype.videoWidth = function videoWidth() {\n    return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;\n  };\n\n  /**\n   * Get video height\n   *\n   * @return {number}\n   *         current video height\n   */\n\n\n  Player.prototype.videoHeight = function videoHeight() {\n    return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;\n  };\n\n  /**\n   * The player's language code\n   * NOTE: The language should be set in the player options if you want the\n   * the controls to be built with a specific language. Changing the lanugage\n   * later will not update controls text.\n   *\n   * @param {string} [code]\n   *        the language code to set the player to\n   *\n   * @return {string}\n   *         The current language code when getting\n   */\n\n\n  Player.prototype.language = function language(code) {\n    if (code === undefined) {\n      return this.language_;\n    }\n\n    this.language_ = String(code).toLowerCase();\n  };\n\n  /**\n   * Get the player's language dictionary\n   * Merge every time, because a newly added plugin might call videojs.addLanguage() at any time\n   * Languages specified directly in the player options have precedence\n   *\n   * @return {Array}\n   *         An array of of supported languages\n   */\n\n\n  Player.prototype.languages = function languages() {\n    return mergeOptions(Player.prototype.options_.languages, this.languages_);\n  };\n\n  /**\n   * returns a JavaScript object reperesenting the current track\n   * information. **DOES not return it as JSON**\n   *\n   * @return {Object}\n   *         Object representing the current of track info\n   */\n\n\n  Player.prototype.toJSON = function toJSON() {\n    var options = mergeOptions(this.options_);\n    var tracks = options.tracks;\n\n    options.tracks = [];\n\n    for (var i = 0; i < tracks.length; i++) {\n      var track = tracks[i];\n\n      // deep merge tracks and null out player so no circular references\n      track = mergeOptions(track);\n      track.player = undefined;\n      options.tracks[i] = track;\n    }\n\n    return options;\n  };\n\n  /**\n   * Creates a simple modal dialog (an instance of the {@link ModalDialog}\n   * component) that immediately overlays the player with arbitrary\n   * content and removes itself when closed.\n   *\n   * @param {string|Function|Element|Array|null} content\n   *        Same as {@link ModalDialog#content}'s param of the same name.\n   *        The most straight-forward usage is to provide a string or DOM\n   *        element.\n   *\n   * @param {Object} [options]\n   *        Extra options which will be passed on to the {@link ModalDialog}.\n   *\n   * @return {ModalDialog}\n   *         the {@link ModalDialog} that was created\n   */\n\n\n  Player.prototype.createModal = function createModal(content, options) {\n    var _this8 = this;\n\n    options = options || {};\n    options.content = content || '';\n\n    var modal = new ModalDialog(this, options);\n\n    this.addChild(modal);\n    modal.on('dispose', function () {\n      _this8.removeChild(modal);\n    });\n\n    modal.open();\n    return modal;\n  };\n\n  /**\n   * Gets tag settings\n   *\n   * @param {Element} tag\n   *        The player tag\n   *\n   * @return {Object}\n   *         An object containing all of the settings\n   *         for a player tag\n   */\n\n\n  Player.getTagSettings = function getTagSettings(tag) {\n    var baseOptions = {\n      sources: [],\n      tracks: []\n    };\n\n    var tagOptions = getAttributes(tag);\n    var dataSetup = tagOptions['data-setup'];\n\n    if (hasClass(tag, 'vjs-fluid')) {\n      tagOptions.fluid = true;\n    }\n\n    // Check if data-setup attr exists.\n    if (dataSetup !== null) {\n      // Parse options JSON\n      // If empty string, make it a parsable json object.\n      var _safeParseTuple = tuple(dataSetup || '{}'),\n          err = _safeParseTuple[0],\n          data = _safeParseTuple[1];\n\n      if (err) {\n        log$1.error(err);\n      }\n      assign(tagOptions, data);\n    }\n\n    assign(baseOptions, tagOptions);\n\n    // Get tag children settings\n    if (tag.hasChildNodes()) {\n      var children = tag.childNodes;\n\n      for (var i = 0, j = children.length; i < j; i++) {\n        var child = children[i];\n        // Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/\n        var childName = child.nodeName.toLowerCase();\n\n        if (childName === 'source') {\n          baseOptions.sources.push(getAttributes(child));\n        } else if (childName === 'track') {\n          baseOptions.tracks.push(getAttributes(child));\n        }\n      }\n    }\n\n    return baseOptions;\n  };\n\n  /**\n   * Determine wether or not flexbox is supported\n   *\n   * @return {boolean}\n   *         - true if flexbox is supported\n   *         - false if flexbox is not supported\n   */\n\n\n  Player.prototype.flexNotSupported_ = function flexNotSupported_() {\n    var elem = document_1.createElement('i');\n\n    // Note: We don't actually use flexBasis (or flexOrder), but it's one of the more\n    // common flex features that we can rely on when checking for flex support.\n    return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style ||\n    // IE10-specific (2012 flex spec)\n    'msFlexOrder' in elem.style);\n  };\n\n  return Player;\n}(Component);\n\n/**\n * Get the {@link VideoTrackList}\n * @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist\n *\n * @return {VideoTrackList}\n *         the current video track list\n *\n * @method Player.prototype.videoTracks\n */\n\n/**\n * Get the {@link AudioTrackList}\n * @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist\n *\n * @return {AudioTrackList}\n *         the current audio track list\n *\n * @method Player.prototype.audioTracks\n */\n\n/**\n * Get the {@link TextTrackList}\n *\n * @link http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks\n *\n * @return {TextTrackList}\n *         the current text track list\n *\n * @method Player.prototype.textTracks\n */\n\n/**\n * Get the remote {@link TextTrackList}\n *\n * @return {TextTrackList}\n *         The current remote text track list\n *\n * @method Player.prototype.remoteTextTracks\n */\n\n/**\n * Get the remote {@link HtmlTrackElementList} tracks.\n *\n * @return {HtmlTrackElementList}\n *         The current remote text track element list\n *\n * @method Player.prototype.remoteTextTrackEls\n */\n\nALL.names.forEach(function (name$$1) {\n  var props = ALL[name$$1];\n\n  Player.prototype[props.getterName] = function () {\n    if (this.tech_) {\n      return this.tech_[props.getterName]();\n    }\n\n    // if we have not yet loadTech_, we create {video,audio,text}Tracks_\n    // these will be passed to the tech during loading\n    this[props.privateName] = this[props.privateName] || new props.ListClass();\n    return this[props.privateName];\n  };\n});\n\n/**\n * Global player list\n *\n * @type {Object}\n */\nPlayer.players = {};\n\nvar navigator$1 = window_1.navigator;\n\n/*\n * Player instance options, surfaced using options\n * options = Player.prototype.options_\n * Make changes in options, not here.\n *\n * @type {Object}\n * @private\n */\nPlayer.prototype.options_ = {\n  // Default order of fallback technology\n  techOrder: Tech.defaultTechOrder_,\n\n  html5: {},\n  flash: {},\n\n  // default inactivity timeout\n  inactivityTimeout: 2000,\n\n  // default playback rates\n  playbackRates: [],\n  // Add playback rate selection by adding rates\n  // 'playbackRates': [0.5, 1, 1.5, 2],\n\n  // Included control sets\n  children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],\n\n  language: navigator$1 && (navigator$1.languages && navigator$1.languages[0] || navigator$1.userLanguage || navigator$1.language) || 'en',\n\n  // locales and their language translations\n  languages: {},\n\n  // Default message to show when a video cannot be played.\n  notSupportedMessage: 'No compatible source was found for this media.'\n};\n\n[\n/**\n * Returns whether or not the player is in the \"ended\" state.\n *\n * @return {Boolean} True if the player is in the ended state, false if not.\n * @method Player#ended\n */\n'ended',\n/**\n * Returns whether or not the player is in the \"seeking\" state.\n *\n * @return {Boolean} True if the player is in the seeking state, false if not.\n * @method Player#seeking\n */\n'seeking',\n/**\n * Returns the TimeRanges of the media that are currently available\n * for seeking to.\n *\n * @return {TimeRanges} the seekable intervals of the media timeline\n * @method Player#seekable\n */\n'seekable',\n/**\n * Returns the current state of network activity for the element, from\n * the codes in the list below.\n * - NETWORK_EMPTY (numeric value 0)\n *   The element has not yet been initialised. All attributes are in\n *   their initial states.\n * - NETWORK_IDLE (numeric value 1)\n *   The element's resource selection algorithm is active and has\n *   selected a resource, but it is not actually using the network at\n *   this time.\n * - NETWORK_LOADING (numeric value 2)\n *   The user agent is actively trying to download data.\n * - NETWORK_NO_SOURCE (numeric value 3)\n *   The element's resource selection algorithm is active, but it has\n *   not yet found a resource to use.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states\n * @return {number} the current network activity state\n * @method Player#networkState\n */\n'networkState',\n/**\n * Returns a value that expresses the current state of the element\n * with respect to rendering the current playback position, from the\n * codes in the list below.\n * - HAVE_NOTHING (numeric value 0)\n *   No information regarding the media resource is available.\n * - HAVE_METADATA (numeric value 1)\n *   Enough of the resource has been obtained that the duration of the\n *   resource is available.\n * - HAVE_CURRENT_DATA (numeric value 2)\n *   Data for the immediate current playback position is available.\n * - HAVE_FUTURE_DATA (numeric value 3)\n *   Data for the immediate current playback position is available, as\n *   well as enough data for the user agent to advance the current\n *   playback position in the direction of playback.\n * - HAVE_ENOUGH_DATA (numeric value 4)\n *   The user agent estimates that enough data is available for\n *   playback to proceed uninterrupted.\n *\n * @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate\n * @return {number} the current playback rendering state\n * @method Player#readyState\n */\n'readyState'].forEach(function (fn) {\n  Player.prototype[fn] = function () {\n    return this.techGet_(fn);\n  };\n});\n\nTECH_EVENTS_RETRIGGER.forEach(function (event) {\n  Player.prototype['handleTech' + toTitleCase(event) + '_'] = function () {\n    return this.trigger(event);\n  };\n});\n\n/**\n * Fired when the player has initial duration and dimension information\n *\n * @event Player#loadedmetadata\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the player has downloaded data at the current playback position\n *\n * @event Player#loadeddata\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the current playback position has changed *\n * During playback this is fired every 15-250 milliseconds, depending on the\n * playback technology in use.\n *\n * @event Player#timeupdate\n * @type {EventTarget~Event}\n */\n\n/**\n * Fired when the volume changes\n *\n * @event Player#volumechange\n * @type {EventTarget~Event}\n */\n\n/**\n * Reports whether or not a player has a plugin available.\n *\n * This does not report whether or not the plugin has ever been initialized\n * on this player. For that, [usingPlugin]{@link Player#usingPlugin}.\n *\n * @method Player#hasPlugin\n * @param  {string}  name\n *         The name of a plugin.\n *\n * @return {boolean}\n *         Whether or not this player has the requested plugin available.\n */\n\n/**\n * Reports whether or not a player is using a plugin by name.\n *\n * For basic plugins, this only reports whether the plugin has _ever_ been\n * initialized on this player.\n *\n * @method Player#usingPlugin\n * @param  {string} name\n *         The name of a plugin.\n *\n * @return {boolean}\n *         Whether or not this player is using the requested plugin.\n */\n\nComponent.registerComponent('Player', Player);\n\n/**\n * @file plugin.js\n */\n/**\n * The base plugin name.\n *\n * @private\n * @constant\n * @type {string}\n */\nvar BASE_PLUGIN_NAME = 'plugin';\n\n/**\n * The key on which a player's active plugins cache is stored.\n *\n * @private\n * @constant\n * @type     {string}\n */\nvar PLUGIN_CACHE_KEY = 'activePlugins_';\n\n/**\n * Stores registered plugins in a private space.\n *\n * @private\n * @type    {Object}\n */\nvar pluginStorage = {};\n\n/**\n * Reports whether or not a plugin has been registered.\n *\n * @private\n * @param   {string} name\n *          The name of a plugin.\n *\n * @returns {boolean}\n *          Whether or not the plugin has been registered.\n */\nvar pluginExists = function pluginExists(name) {\n  return pluginStorage.hasOwnProperty(name);\n};\n\n/**\n * Get a single registered plugin by name.\n *\n * @private\n * @param   {string} name\n *          The name of a plugin.\n *\n * @returns {Function|undefined}\n *          The plugin (or undefined).\n */\nvar getPlugin = function getPlugin(name) {\n  return pluginExists(name) ? pluginStorage[name] : undefined;\n};\n\n/**\n * Marks a plugin as \"active\" on a player.\n *\n * Also, ensures that the player has an object for tracking active plugins.\n *\n * @private\n * @param   {Player} player\n *          A Video.js player instance.\n *\n * @param   {string} name\n *          The name of a plugin.\n */\nvar markPluginAsActive = function markPluginAsActive(player, name) {\n  player[PLUGIN_CACHE_KEY] = player[PLUGIN_CACHE_KEY] || {};\n  player[PLUGIN_CACHE_KEY][name] = true;\n};\n\n/**\n * Triggers a pair of plugin setup events.\n *\n * @private\n * @param  {Player} player\n *         A Video.js player instance.\n *\n * @param  {Plugin~PluginEventHash} hash\n *         A plugin event hash.\n *\n * @param  {Boolean} [before]\n *         If true, prefixes the event name with \"before\". In other words,\n *         use this to trigger \"beforepluginsetup\" instead of \"pluginsetup\".\n */\nvar triggerSetupEvent = function triggerSetupEvent(player, hash, before) {\n  var eventName = (before ? 'before' : '') + 'pluginsetup';\n\n  player.trigger(eventName, hash);\n  player.trigger(eventName + ':' + hash.name, hash);\n};\n\n/**\n * Takes a basic plugin function and returns a wrapper function which marks\n * on the player that the plugin has been activated.\n *\n * @private\n * @param   {string} name\n *          The name of the plugin.\n *\n * @param   {Function} plugin\n *          The basic plugin.\n *\n * @returns {Function}\n *          A wrapper function for the given plugin.\n */\nvar createBasicPlugin = function createBasicPlugin(name, plugin) {\n  var basicPluginWrapper = function basicPluginWrapper() {\n\n    // We trigger the \"beforepluginsetup\" and \"pluginsetup\" events on the player\n    // regardless, but we want the hash to be consistent with the hash provided\n    // for advanced plugins.\n    //\n    // The only potentially counter-intuitive thing here is the `instance` in\n    // the \"pluginsetup\" event is the value returned by the `plugin` function.\n    triggerSetupEvent(this, { name: name, plugin: plugin, instance: null }, true);\n\n    var instance = plugin.apply(this, arguments);\n\n    markPluginAsActive(this, name);\n    triggerSetupEvent(this, { name: name, plugin: plugin, instance: instance });\n\n    return instance;\n  };\n\n  Object.keys(plugin).forEach(function (prop) {\n    basicPluginWrapper[prop] = plugin[prop];\n  });\n\n  return basicPluginWrapper;\n};\n\n/**\n * Takes a plugin sub-class and returns a factory function for generating\n * instances of it.\n *\n * This factory function will replace itself with an instance of the requested\n * sub-class of Plugin.\n *\n * @private\n * @param   {string} name\n *          The name of the plugin.\n *\n * @param   {Plugin} PluginSubClass\n *          The advanced plugin.\n *\n * @returns {Function}\n */\nvar createPluginFactory = function createPluginFactory(name, PluginSubClass) {\n\n  // Add a `name` property to the plugin prototype so that each plugin can\n  // refer to itself by name.\n  PluginSubClass.prototype.name = name;\n\n  return function () {\n    triggerSetupEvent(this, { name: name, plugin: PluginSubClass, instance: null }, true);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var instance = new (Function.prototype.bind.apply(PluginSubClass, [null].concat([this].concat(args))))();\n\n    // The plugin is replaced by a function that returns the current instance.\n    this[name] = function () {\n      return instance;\n    };\n\n    triggerSetupEvent(this, instance.getEventHash());\n\n    return instance;\n  };\n};\n\n/**\n * Parent class for all advanced plugins.\n *\n * @mixes   module:evented~EventedMixin\n * @mixes   module:stateful~StatefulMixin\n * @fires   Player#beforepluginsetup\n * @fires   Player#beforepluginsetup:$name\n * @fires   Player#pluginsetup\n * @fires   Player#pluginsetup:$name\n * @listens Player#dispose\n * @throws  {Error}\n *          If attempting to instantiate the base {@link Plugin} class\n *          directly instead of via a sub-class.\n */\n\nvar Plugin = function () {\n\n  /**\n   * Creates an instance of this class.\n   *\n   * Sub-classes should call `super` to ensure plugins are properly initialized.\n   *\n   * @param {Player} player\n   *        A Video.js player instance.\n   */\n  function Plugin(player) {\n    classCallCheck(this, Plugin);\n\n    if (this.constructor === Plugin) {\n      throw new Error('Plugin must be sub-classed; not directly instantiated.');\n    }\n\n    this.player = player;\n\n    // Make this object evented, but remove the added `trigger` method so we\n    // use the prototype version instead.\n    evented(this);\n    delete this.trigger;\n\n    stateful(this, this.constructor.defaultState);\n    markPluginAsActive(player, this.name);\n\n    // Auto-bind the dispose method so we can use it as a listener and unbind\n    // it later easily.\n    this.dispose = bind(this, this.dispose);\n\n    // If the player is disposed, dispose the plugin.\n    player.on('dispose', this.dispose);\n  }\n\n  /**\n   * Get the version of the plugin that was set on <pluginName>.VERSION\n   */\n\n\n  Plugin.prototype.version = function version() {\n    return this.constructor.VERSION;\n  };\n\n  /**\n   * Each event triggered by plugins includes a hash of additional data with\n   * conventional properties.\n   *\n   * This returns that object or mutates an existing hash.\n   *\n   * @param   {Object} [hash={}]\n   *          An object to be used as event an event hash.\n   *\n   * @returns {Plugin~PluginEventHash}\n   *          An event hash object with provided properties mixed-in.\n   */\n\n\n  Plugin.prototype.getEventHash = function getEventHash() {\n    var hash = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    hash.name = this.name;\n    hash.plugin = this.constructor;\n    hash.instance = this;\n    return hash;\n  };\n\n  /**\n   * Triggers an event on the plugin object and overrides\n   * {@link module:evented~EventedMixin.trigger|EventedMixin.trigger}.\n   *\n   * @param   {string|Object} event\n   *          An event type or an object with a type property.\n   *\n   * @param   {Object} [hash={}]\n   *          Additional data hash to merge with a\n   *          {@link Plugin~PluginEventHash|PluginEventHash}.\n   *\n   * @returns {boolean}\n   *          Whether or not default was prevented.\n   */\n\n\n  Plugin.prototype.trigger = function trigger$$1(event) {\n    var hash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    return trigger(this.eventBusEl_, event, this.getEventHash(hash));\n  };\n\n  /**\n   * Handles \"statechanged\" events on the plugin. No-op by default, override by\n   * subclassing.\n   *\n   * @abstract\n   * @param    {Event} e\n   *           An event object provided by a \"statechanged\" event.\n   *\n   * @param    {Object} e.changes\n   *           An object describing changes that occurred with the \"statechanged\"\n   *           event.\n   */\n\n\n  Plugin.prototype.handleStateChanged = function handleStateChanged(e) {};\n\n  /**\n   * Disposes a plugin.\n   *\n   * Subclasses can override this if they want, but for the sake of safety,\n   * it's probably best to subscribe the \"dispose\" event.\n   *\n   * @fires Plugin#dispose\n   */\n\n\n  Plugin.prototype.dispose = function dispose() {\n    var name = this.name,\n        player = this.player;\n\n    /**\n     * Signals that a advanced plugin is about to be disposed.\n     *\n     * @event Plugin#dispose\n     * @type  {EventTarget~Event}\n     */\n\n    this.trigger('dispose');\n    this.off();\n    player.off('dispose', this.dispose);\n\n    // Eliminate any possible sources of leaking memory by clearing up\n    // references between the player and the plugin instance and nulling out\n    // the plugin's state and replacing methods with a function that throws.\n    player[PLUGIN_CACHE_KEY][name] = false;\n    this.player = this.state = null;\n\n    // Finally, replace the plugin name on the player with a new factory\n    // function, so that the plugin is ready to be set up again.\n    player[name] = createPluginFactory(name, pluginStorage[name]);\n  };\n\n  /**\n   * Determines if a plugin is a basic plugin (i.e. not a sub-class of `Plugin`).\n   *\n   * @param   {string|Function} plugin\n   *          If a string, matches the name of a plugin. If a function, will be\n   *          tested directly.\n   *\n   * @returns {boolean}\n   *          Whether or not a plugin is a basic plugin.\n   */\n\n\n  Plugin.isBasic = function isBasic(plugin) {\n    var p = typeof plugin === 'string' ? getPlugin(plugin) : plugin;\n\n    return typeof p === 'function' && !Plugin.prototype.isPrototypeOf(p.prototype);\n  };\n\n  /**\n   * Register a Video.js plugin.\n   *\n   * @param   {string} name\n   *          The name of the plugin to be registered. Must be a string and\n   *          must not match an existing plugin or a method on the `Player`\n   *          prototype.\n   *\n   * @param   {Function} plugin\n   *          A sub-class of `Plugin` or a function for basic plugins.\n   *\n   * @returns {Function}\n   *          For advanced plugins, a factory function for that plugin. For\n   *          basic plugins, a wrapper function that initializes the plugin.\n   */\n\n\n  Plugin.registerPlugin = function registerPlugin(name, plugin) {\n    if (typeof name !== 'string') {\n      throw new Error('Illegal plugin name, \"' + name + '\", must be a string, was ' + (typeof name === 'undefined' ? 'undefined' : _typeof(name)) + '.');\n    }\n\n    if (pluginExists(name)) {\n      log$1.warn('A plugin named \"' + name + '\" already exists. You may want to avoid re-registering plugins!');\n    } else if (Player.prototype.hasOwnProperty(name)) {\n      throw new Error('Illegal plugin name, \"' + name + '\", cannot share a name with an existing player method!');\n    }\n\n    if (typeof plugin !== 'function') {\n      throw new Error('Illegal plugin for \"' + name + '\", must be a function, was ' + (typeof plugin === 'undefined' ? 'undefined' : _typeof(plugin)) + '.');\n    }\n\n    pluginStorage[name] = plugin;\n\n    // Add a player prototype method for all sub-classed plugins (but not for\n    // the base Plugin class).\n    if (name !== BASE_PLUGIN_NAME) {\n      if (Plugin.isBasic(plugin)) {\n        Player.prototype[name] = createBasicPlugin(name, plugin);\n      } else {\n        Player.prototype[name] = createPluginFactory(name, plugin);\n      }\n    }\n\n    return plugin;\n  };\n\n  /**\n   * De-register a Video.js plugin.\n   *\n   * @param {string} name\n   *        The name of the plugin to be deregistered.\n   */\n\n\n  Plugin.deregisterPlugin = function deregisterPlugin(name) {\n    if (name === BASE_PLUGIN_NAME) {\n      throw new Error('Cannot de-register base plugin.');\n    }\n    if (pluginExists(name)) {\n      delete pluginStorage[name];\n      delete Player.prototype[name];\n    }\n  };\n\n  /**\n   * Gets an object containing multiple Video.js plugins.\n   *\n   * @param   {Array} [names]\n   *          If provided, should be an array of plugin names. Defaults to _all_\n   *          plugin names.\n   *\n   * @returns {Object|undefined}\n   *          An object containing plugin(s) associated with their name(s) or\n   *          `undefined` if no matching plugins exist).\n   */\n\n\n  Plugin.getPlugins = function getPlugins() {\n    var names = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Object.keys(pluginStorage);\n\n    var result = void 0;\n\n    names.forEach(function (name) {\n      var plugin = getPlugin(name);\n\n      if (plugin) {\n        result = result || {};\n        result[name] = plugin;\n      }\n    });\n\n    return result;\n  };\n\n  /**\n   * Gets a plugin's version, if available\n   *\n   * @param   {string} name\n   *          The name of a plugin.\n   *\n   * @returns {string}\n   *          The plugin's version or an empty string.\n   */\n\n\n  Plugin.getPluginVersion = function getPluginVersion(name) {\n    var plugin = getPlugin(name);\n\n    return plugin && plugin.VERSION || '';\n  };\n\n  return Plugin;\n}();\n\n/**\n * Gets a plugin by name if it exists.\n *\n * @static\n * @method   getPlugin\n * @memberOf Plugin\n * @param    {string} name\n *           The name of a plugin.\n *\n * @returns  {Function|undefined}\n *           The plugin (or `undefined`).\n */\n\n\nPlugin.getPlugin = getPlugin;\n\n/**\n * The name of the base plugin class as it is registered.\n *\n * @type {string}\n */\nPlugin.BASE_PLUGIN_NAME = BASE_PLUGIN_NAME;\n\nPlugin.registerPlugin(BASE_PLUGIN_NAME, Plugin);\n\n/**\n * Documented in player.js\n *\n * @ignore\n */\nPlayer.prototype.usingPlugin = function (name) {\n  return !!this[PLUGIN_CACHE_KEY] && this[PLUGIN_CACHE_KEY][name] === true;\n};\n\n/**\n * Documented in player.js\n *\n * @ignore\n */\nPlayer.prototype.hasPlugin = function (name) {\n  return !!pluginExists(name);\n};\n\n/**\n * Signals that a plugin is about to be set up on a player.\n *\n * @event    Player#beforepluginsetup\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin is about to be set up on a player - by name. The name\n * is the name of the plugin.\n *\n * @event    Player#beforepluginsetup:$name\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin has just been set up on a player.\n *\n * @event    Player#pluginsetup\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * Signals that a plugin has just been set up on a player - by name. The name\n * is the name of the plugin.\n *\n * @event    Player#pluginsetup:$name\n * @type     {Plugin~PluginEventHash}\n */\n\n/**\n * @typedef  {Object} Plugin~PluginEventHash\n *\n * @property {string} instance\n *           For basic plugins, the return value of the plugin function. For\n *           advanced plugins, the plugin instance on which the event is fired.\n *\n * @property {string} name\n *           The name of the plugin.\n *\n * @property {string} plugin\n *           For basic plugins, the plugin function. For advanced plugins, the\n *           plugin class/constructor.\n */\n\n/**\n * @file extend.js\n * @module extend\n */\n\n/**\n * A combination of node inherits and babel's inherits (after transpile).\n * Both work the same but node adds `super_` to the subClass\n * and Bable adds the superClass as __proto__. Both seem useful.\n *\n * @param {Object} subClass\n *        The class to inherit to\n *\n * @param {Object} superClass\n *        The class to inherit from\n *\n * @private\n */\nvar _inherits = function _inherits(subClass, superClass) {\n  if (typeof superClass !== 'function' && superClass !== null) {\n    throw new TypeError('Super expression must either be null or a function, not ' + (typeof superClass === 'undefined' ? 'undefined' : _typeof(superClass)));\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n\n  if (superClass) {\n    // node\n    subClass.super_ = superClass;\n  }\n};\n\n/**\n * Function for subclassing using the same inheritance that\n * videojs uses internally\n *\n * @static\n * @const\n *\n * @param {Object} superClass\n *        The class to inherit from\n *\n * @param {Object} [subClassMethods={}]\n *        The class to inherit to\n *\n * @return {Object}\n *         The new object with subClassMethods that inherited superClass.\n */\nvar extendFn = function extendFn(superClass) {\n  var subClassMethods = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var subClass = function subClass() {\n    superClass.apply(this, arguments);\n  };\n\n  var methods = {};\n\n  if ((typeof subClassMethods === 'undefined' ? 'undefined' : _typeof(subClassMethods)) === 'object') {\n    if (subClassMethods.constructor !== Object.prototype.constructor) {\n      subClass = subClassMethods.constructor;\n    }\n    methods = subClassMethods;\n  } else if (typeof subClassMethods === 'function') {\n    subClass = subClassMethods;\n  }\n\n  _inherits(subClass, superClass);\n\n  // Extend subObj's prototype with functions and other properties from props\n  for (var name in methods) {\n    if (methods.hasOwnProperty(name)) {\n      subClass.prototype[name] = methods[name];\n    }\n  }\n\n  return subClass;\n};\n\n/**\n * @file video.js\n * @module videojs\n */\n// Include the built-in techs\n// HTML5 Element Shim for IE8\nif (typeof HTMLVideoElement === 'undefined' && isReal()) {\n  document_1.createElement('video');\n  document_1.createElement('audio');\n  document_1.createElement('track');\n  document_1.createElement('video-js');\n}\n\n/**\n * Doubles as the main function for users to create a player instance and also\n * the main library object.\n * The `videojs` function can be used to initialize or retrieve a player.\n  *\n * @param {string|Element} id\n *        Video element or video element ID\n *\n * @param {Object} [options]\n *        Optional options object for config/settings\n *\n * @param {Component~ReadyCallback} [ready]\n *        Optional ready callback\n *\n * @return {Player}\n *         A player instance\n */\nfunction videojs(id, options, ready) {\n  var tag = void 0;\n\n  // Allow for element or ID to be passed in\n  // String ID\n  if (typeof id === 'string') {\n    var players = videojs.getPlayers();\n\n    // Adjust for jQuery ID syntax\n    if (id.indexOf('#') === 0) {\n      id = id.slice(1);\n    }\n\n    // If a player instance has already been created for this ID return it.\n    if (players[id]) {\n\n      // If options or ready function are passed, warn\n      if (options) {\n        log$1.warn('Player \"' + id + '\" is already initialised. Options will not be applied.');\n      }\n\n      if (ready) {\n        players[id].ready(ready);\n      }\n\n      return players[id];\n    }\n\n    // Otherwise get element for ID\n    tag = $('#' + id);\n\n    // ID is a media element\n  } else {\n    tag = id;\n  }\n\n  // Check for a useable element\n  // re: nodeName, could be a box div also\n  if (!tag || !tag.nodeName) {\n    throw new TypeError('The element or ID supplied is not valid. (videojs)');\n  }\n\n  // Element may have a player attr referring to an already created player instance.\n  // If so return that otherwise set up a new player below\n  if (tag.player || Player.players[tag.playerId]) {\n    return tag.player || Player.players[tag.playerId];\n  }\n\n  // Check if element is included in the DOM\n  if (isEl(tag) && !document_1.body.contains(tag)) {\n    log$1.warn('The element supplied is not included in the DOM');\n  }\n\n  options = options || {};\n\n  videojs.hooks('beforesetup').forEach(function (hookFunction) {\n    var opts = hookFunction(tag, mergeOptions(options));\n\n    if (!isObject(opts) || Array.isArray(opts)) {\n      log$1.error('please return an object in beforesetup hooks');\n      return;\n    }\n\n    options = mergeOptions(options, opts);\n  });\n\n  var PlayerComponent = Component.getComponent('Player');\n  // If not, set up a new player\n  var player = new PlayerComponent(tag, options, ready);\n\n  videojs.hooks('setup').forEach(function (hookFunction) {\n    return hookFunction(player);\n  });\n\n  return player;\n}\n\n/**\n * An Object that contains lifecycle hooks as keys which point to an array\n * of functions that are run when a lifecycle is triggered\n */\nvideojs.hooks_ = {};\n\n/**\n * Get a list of hooks for a specific lifecycle\n * @function videojs.hooks\n *\n * @param {string} type\n *        the lifecyle to get hooks from\n *\n * @param {Function|Function[]} [fn]\n *        Optionally add a hook (or hooks) to the lifecycle that your are getting.\n *\n * @return {Array}\n *         an array of hooks, or an empty array if there are none.\n */\nvideojs.hooks = function (type, fn) {\n  videojs.hooks_[type] = videojs.hooks_[type] || [];\n  if (fn) {\n    videojs.hooks_[type] = videojs.hooks_[type].concat(fn);\n  }\n  return videojs.hooks_[type];\n};\n\n/**\n * Add a function hook to a specific videojs lifecycle.\n *\n * @param {string} type\n *        the lifecycle to hook the function to.\n *\n * @param {Function|Function[]}\n *        The function or array of functions to attach.\n */\nvideojs.hook = function (type, fn) {\n  videojs.hooks(type, fn);\n};\n\n/**\n * Add a function hook that will only run once to a specific videojs lifecycle.\n *\n * @param {string} type\n *        the lifecycle to hook the function to.\n *\n * @param {Function|Function[]}\n *        The function or array of functions to attach.\n */\nvideojs.hookOnce = function (type, fn) {\n  videojs.hooks(type, [].concat(fn).map(function (original) {\n    var wrapper = function wrapper() {\n      videojs.removeHook(type, wrapper);\n      original.apply(undefined, arguments);\n    };\n\n    return wrapper;\n  }));\n};\n\n/**\n * Remove a hook from a specific videojs lifecycle.\n *\n * @param {string} type\n *        the lifecycle that the function hooked to\n *\n * @param {Function} fn\n *        The hooked function to remove\n *\n * @return {boolean}\n *         The function that was removed or undef\n */\nvideojs.removeHook = function (type, fn) {\n  var index = videojs.hooks(type).indexOf(fn);\n\n  if (index <= -1) {\n    return false;\n  }\n\n  videojs.hooks_[type] = videojs.hooks_[type].slice();\n  videojs.hooks_[type].splice(index, 1);\n\n  return true;\n};\n\n// Add default styles\nif (window_1.VIDEOJS_NO_DYNAMIC_STYLE !== true && isReal()) {\n  var style = $('.vjs-styles-defaults');\n\n  if (!style) {\n    style = createStyleElement('vjs-styles-defaults');\n    var head = $('head');\n\n    if (head) {\n      head.insertBefore(style, head.firstChild);\n    }\n    setTextContent(style, '\\n      .video-js {\\n        width: 300px;\\n        height: 150px;\\n      }\\n\\n      .vjs-fluid {\\n        padding-top: 56.25%\\n      }\\n    ');\n  }\n}\n\n// Run Auto-load players\n// You have to wait at least once in case this script is loaded after your\n// video in the DOM (weird behavior only with minified version)\nautoSetupTimeout(1, videojs);\n\n/**\n * Current software version. Follows semver.\n *\n * @type {string}\n */\nvideojs.VERSION = version;\n\n/**\n * The global options object. These are the settings that take effect\n * if no overrides are specified when the player is created.\n *\n * @type {Object}\n */\nvideojs.options = Player.prototype.options_;\n\n/**\n * Get an object with the currently created players, keyed by player ID\n *\n * @return {Object}\n *         The created players\n */\nvideojs.getPlayers = function () {\n  return Player.players;\n};\n\n/**\n * Expose players object.\n *\n * @memberOf videojs\n * @property {Object} players\n */\nvideojs.players = Player.players;\n\n/**\n * Get a component class object by name\n *\n * @borrows Component.getComponent as videojs.getComponent\n */\nvideojs.getComponent = Component.getComponent;\n\n/**\n * Register a component so it can referred to by name. Used when adding to other\n * components, either through addChild `component.addChild('myComponent')` or through\n * default children options  `{ children: ['myComponent'] }`.\n *\n * > NOTE: You could also just initialize the component before adding.\n * `component.addChild(new MyComponent());`\n *\n * @param {string} name\n *        The class name of the component\n *\n * @param {Component} comp\n *        The component class\n *\n * @return {Component}\n *         The newly registered component\n */\nvideojs.registerComponent = function (name$$1, comp) {\n  if (Tech.isTech(comp)) {\n    log$1.warn('The ' + name$$1 + ' tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)');\n  }\n\n  Component.registerComponent.call(Component, name$$1, comp);\n};\n\n/**\n * Get a Tech class object by name\n *\n * @borrows Tech.getTech as videojs.getTech\n */\nvideojs.getTech = Tech.getTech;\n\n/**\n * Register a Tech so it can referred to by name.\n * This is used in the tech order for the player.\n *\n * @borrows Tech.registerTech as videojs.registerTech\n */\nvideojs.registerTech = Tech.registerTech;\n\nvideojs.use = use;\n\n/**\n * A suite of browser and device tests from {@link browser}.\n *\n * @type {Object}\n * @private\n */\nvideojs.browser = browser;\n\n/**\n * Whether or not the browser supports touch events. Included for backward\n * compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`\n * instead going forward.\n *\n * @deprecated since version 5.0\n * @type {boolean}\n */\nvideojs.TOUCH_ENABLED = TOUCH_ENABLED;\n\n/**\n * Subclass an existing class\n * Mimics ES6 subclassing with the `extend` keyword\n *\n * @borrows extend:extendFn as videojs.extend\n */\nvideojs.extend = extendFn;\n\n/**\n * Merge two options objects recursively\n * Performs a deep merge like lodash.merge but **only merges plain objects**\n * (not arrays, elements, anything else)\n * Other values will be copied directly from the second object.\n *\n * @borrows merge-options:mergeOptions as videojs.mergeOptions\n */\nvideojs.mergeOptions = mergeOptions;\n\n/**\n * Change the context (this) of a function\n *\n * > NOTE: as of v5.0 we require an ES5 shim, so you should use the native\n * `function() {}.bind(newContext);` instead of this.\n *\n * @borrows fn:bind as videojs.bind\n */\nvideojs.bind = bind;\n\n/**\n * Register a Video.js plugin.\n *\n * @borrows plugin:registerPlugin as videojs.registerPlugin\n * @method registerPlugin\n *\n * @param  {string} name\n *         The name of the plugin to be registered. Must be a string and\n *         must not match an existing plugin or a method on the `Player`\n *         prototype.\n *\n * @param  {Function} plugin\n *         A sub-class of `Plugin` or a function for basic plugins.\n *\n * @return {Function}\n *         For advanced plugins, a factory function for that plugin. For\n *         basic plugins, a wrapper function that initializes the plugin.\n */\nvideojs.registerPlugin = Plugin.registerPlugin;\n\n/**\n * Deprecated method to register a plugin with Video.js\n *\n * @deprecated\n *        videojs.plugin() is deprecated; use videojs.registerPlugin() instead\n *\n * @param {string} name\n *        The plugin name\n *\n * @param {Plugin|Function} plugin\n *         The plugin sub-class or function\n */\nvideojs.plugin = function (name$$1, plugin) {\n  log$1.warn('videojs.plugin() is deprecated; use videojs.registerPlugin() instead');\n  return Plugin.registerPlugin(name$$1, plugin);\n};\n\n/**\n * Gets an object containing multiple Video.js plugins.\n *\n * @param  {Array} [names]\n *         If provided, should be an array of plugin names. Defaults to _all_\n *         plugin names.\n *\n * @return {Object|undefined}\n *         An object containing plugin(s) associated with their name(s) or\n *         `undefined` if no matching plugins exist).\n */\nvideojs.getPlugins = Plugin.getPlugins;\n\n/**\n * Gets a plugin by name if it exists.\n *\n * @param  {string} name\n *         The name of a plugin.\n *\n * @return {Function|undefined}\n *         The plugin (or `undefined`).\n */\nvideojs.getPlugin = Plugin.getPlugin;\n\n/**\n * Gets a plugin's version, if available\n *\n * @param  {string} name\n *         The name of a plugin.\n *\n * @return {string}\n *         The plugin's version or an empty string.\n */\nvideojs.getPluginVersion = Plugin.getPluginVersion;\n\n/**\n * Adding languages so that they're available to all players.\n * Example: `videojs.addLanguage('es', { 'Hello': 'Hola' });`\n *\n * @param {string} code\n *        The language code or dictionary property\n *\n * @param {Object} data\n *        The data values to be translated\n *\n * @return {Object}\n *         The resulting language dictionary object\n */\nvideojs.addLanguage = function (code, data) {\n  var _mergeOptions;\n\n  code = ('' + code).toLowerCase();\n\n  videojs.options.languages = mergeOptions(videojs.options.languages, (_mergeOptions = {}, _mergeOptions[code] = data, _mergeOptions));\n\n  return videojs.options.languages[code];\n};\n\n/**\n * Log messages\n *\n * @borrows log:log as videojs.log\n */\nvideojs.log = log$1;\n\n/**\n * Creates an emulated TimeRange object.\n *\n * @borrows time-ranges:createTimeRanges as videojs.createTimeRange\n */\n/**\n * @borrows time-ranges:createTimeRanges as videojs.createTimeRanges\n */\nvideojs.createTimeRange = videojs.createTimeRanges = createTimeRanges;\n\n/**\n * Format seconds as a time string, H:MM:SS or M:SS\n * Supplying a guide (in seconds) will force a number of leading zeros\n * to cover the length of the guide\n *\n * @borrows format-time:formatTime as videojs.formatTime\n */\nvideojs.formatTime = formatTime;\n\n/**\n * Resolve and parse the elements of a URL\n *\n * @borrows url:parseUrl as videojs.parseUrl\n */\nvideojs.parseUrl = parseUrl;\n\n/**\n * Returns whether the url passed is a cross domain request or not.\n *\n * @borrows url:isCrossOrigin as videojs.isCrossOrigin\n */\nvideojs.isCrossOrigin = isCrossOrigin;\n\n/**\n * Event target class.\n *\n * @borrows EventTarget as videojs.EventTarget\n */\nvideojs.EventTarget = EventTarget;\n\n/**\n * Add an event listener to element\n * It stores the handler function in a separate cache object\n * and adds a generic handler to the element's event,\n * along with a unique id (guid) to the element.\n *\n * @borrows events:on as videojs.on\n */\nvideojs.on = on;\n\n/**\n * Trigger a listener only once for an event\n *\n * @borrows events:one as videojs.one\n */\nvideojs.one = one;\n\n/**\n * Removes event listeners from an element\n *\n * @borrows events:off as videojs.off\n */\nvideojs.off = off;\n\n/**\n * Trigger an event for an element\n *\n * @borrows events:trigger as videojs.trigger\n */\nvideojs.trigger = trigger;\n\n/**\n * A cross-browser XMLHttpRequest wrapper. Here's a simple example:\n *\n * @param {Object} options\n *        settings for the request.\n *\n * @return {XMLHttpRequest|XDomainRequest}\n *         The request object.\n *\n * @see https://github.com/Raynos/xhr\n */\nvideojs.xhr = xhr;\n\n/**\n * TextTrack class\n *\n * @borrows TextTrack as videojs.TextTrack\n */\nvideojs.TextTrack = TextTrack;\n\n/**\n * export the AudioTrack class so that source handlers can create\n * AudioTracks and then add them to the players AudioTrackList\n *\n * @borrows AudioTrack as videojs.AudioTrack\n */\nvideojs.AudioTrack = AudioTrack;\n\n/**\n * export the VideoTrack class so that source handlers can create\n * VideoTracks and then add them to the players VideoTrackList\n *\n * @borrows VideoTrack as videojs.VideoTrack\n */\nvideojs.VideoTrack = VideoTrack;\n\n/**\n * Determines, via duck typing, whether or not a value is a DOM element.\n *\n * @borrows dom:isEl as videojs.isEl\n * @deprecated Use videojs.dom.isEl() instead\n */\n\n/**\n * Determines, via duck typing, whether or not a value is a text node.\n *\n * @borrows dom:isTextNode as videojs.isTextNode\n * @deprecated Use videojs.dom.isTextNode() instead\n */\n\n/**\n * Creates an element and applies properties.\n *\n * @borrows dom:createEl as videojs.createEl\n * @deprecated Use videojs.dom.createEl() instead\n */\n\n/**\n * Check if an element has a CSS class\n *\n * @borrows dom:hasElClass as videojs.hasClass\n * @deprecated Use videojs.dom.hasClass() instead\n */\n\n/**\n * Add a CSS class name to an element\n *\n * @borrows dom:addElClass as videojs.addClass\n * @deprecated Use videojs.dom.addClass() instead\n */\n\n/**\n * Remove a CSS class name from an element\n *\n * @borrows dom:removeElClass as videojs.removeClass\n * @deprecated Use videojs.dom.removeClass() instead\n */\n\n/**\n * Adds or removes a CSS class name on an element depending on an optional\n * condition or the presence/absence of the class name.\n *\n * @borrows dom:toggleElClass as videojs.toggleClass\n * @deprecated Use videojs.dom.toggleClass() instead\n */\n\n/**\n * Apply attributes to an HTML element.\n *\n * @borrows dom:setElAttributes as videojs.setAttribute\n * @deprecated Use videojs.dom.setAttributes() instead\n */\n\n/**\n * Get an element's attribute values, as defined on the HTML tag\n * Attributes are not the same as properties. They're defined on the tag\n * or with setAttribute (which shouldn't be used with HTML)\n * This will return true or false for boolean attributes.\n *\n * @borrows dom:getElAttributes as videojs.getAttributes\n * @deprecated Use videojs.dom.getAttributes() instead\n */\n\n/**\n * Empties the contents of an element.\n *\n * @borrows dom:emptyEl as videojs.emptyEl\n * @deprecated Use videojs.dom.emptyEl() instead\n */\n\n/**\n * Normalizes and appends content to an element.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * - String\n *   Normalized into a text node.\n *\n * - Element, TextNode\n *   Passed through.\n *\n * - Array\n *   A one-dimensional array of strings, elements, nodes, or functions (which\n *   return single strings, elements, or nodes).\n *\n * - Function\n *   If the sole argument, is expected to produce a string, element,\n *   node, or array.\n *\n * @borrows dom:appendContents as videojs.appendContet\n * @deprecated Use videojs.dom.appendContent() instead\n */\n\n/**\n * Normalizes and inserts content into an element; this is identical to\n * `appendContent()`, except it empties the element first.\n *\n * The content for an element can be passed in multiple types and\n * combinations, whose behavior is as follows:\n *\n * - String\n *   Normalized into a text node.\n *\n * - Element, TextNode\n *   Passed through.\n *\n * - Array\n *   A one-dimensional array of strings, elements, nodes, or functions (which\n *   return single strings, elements, or nodes).\n *\n * - Function\n *   If the sole argument, is expected to produce a string, element,\n *   node, or array.\n *\n * @borrows dom:insertContent as videojs.insertContent\n * @deprecated Use videojs.dom.insertContent() instead\n */\n['isEl', 'isTextNode', 'createEl', 'hasClass', 'addClass', 'removeClass', 'toggleClass', 'setAttributes', 'getAttributes', 'emptyEl', 'appendContent', 'insertContent'].forEach(function (k) {\n  videojs[k] = function () {\n    log$1.warn('videojs.' + k + '() is deprecated; use videojs.dom.' + k + '() instead');\n    return Dom[k].apply(null, arguments);\n  };\n});\n\n/**\n * A safe getComputedStyle with an IE8 fallback.\n *\n * This is because in Firefox, if the player is loaded in an iframe with `display:none`,\n * then `getComputedStyle` returns `null`, so, we do a null-check to make sure\n * that the player doesn't break in these cases.\n * See https://bugzilla.mozilla.org/show_bug.cgi?id=548397 for more details.\n *\n * @borrows computed-style:computedStyle as videojs.computedStyle\n */\nvideojs.computedStyle = computedStyle;\n\n/**\n * Export the Dom utilities for use in external plugins\n * and Tech's\n */\nvideojs.dom = Dom;\n\n/**\n * Export the Url utilities for use in external plugins\n * and Tech's\n */\nvideojs.url = Url;\n\nreturn videojs;\n\n})));\n","created":"20180113144251310","type":"application/javascript","tags":"","modifier":"TheDiveO","modified":"20180113144952817","creator":"TheDiveO","module-type":"library"},"$:/plugins/TheDiveO/TwTube/libraries/videojspluginloader.js":{"title":"$:/plugins/TheDiveO/TwTube/libraries/videojspluginloader.js","text":"/*\\\ncreated: 20140902083720188\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/TwTube/libraries/videojspluginloader.js\nmodifier: TheDiveO\nmodified: 20180125125026949\ncreator: TheDiveO\nmodule-type: library\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Where the video.js (CommonJS) module is to be found in this plugin.\nvar TWTUBE_VIDEOJS = \"$:/plugins/TheDiveO/TwTube/libraries/video.js\";\n// Filter expression matching videojs plugin tiddlers.\nvar VIDEOJS_PLUGIN_FILTER =\n  \"[\"\n  + \"all[shadows+tiddlers]\"\n  + \"type[application/javascript]\"\n  + \"tag[$:/tags/VideojsPlugin]\"\n  + \"]\";\n\n// Please note that we **CANNOT** run this module as a \"startup\" module,\n// due to some ugly race conditions with widget module initialization\n// due to the TiddlyWiki boot/core startup \"sequence\". While running\n// this via a development TiddlyWiki server works, it fails when running\n// an ordinary release TiddlyWiki. Thus, this Video.js plugin loader\n// needs to be pulled in only when the videojs widget module initializes.\n// Then we are first(!) pulling in the Video.js video player base module from\n// its library tiddler. Next, we load any Video.js framework plugins we\n// can find -- based on the special $:/tags/VideojsPlugin tag.\n// Oh, did I mention that we need to run through all these loops\n// only when we're running inside a browser?!\nexports.loadplugins = function TwTubeStartup() {\n  if ($tw.browser) {\n    // We *NEED* to get our Video.js library activated here, because\n    // the videojs plugins rely on it being active by now. Albeit we\n    // will later load the plugins as CommonJS modules, there might be\n    // some that may choose to use the \"global\" videojs object reference\n    // instead. Thus we simply pull in videojs now.\n    var videojs = $tw.modules.execute(TWTUBE_VIDEOJS);\n\n    // Prepare a template sandbox for loading video.js plugins; as\n    // there may be multiple plugins we simply setup a clean context\n    // once from which we later clone throw-away contexts just for\n    // the purposes of video.js plugin activation.\n    var sandbox = $tw.utils.extend({}, {\n      console: console,\n      setInterval: setInterval,\n      clearInterval: clearInterval,\n      setTimeout: setTimeout,\n      clearTimeout: clearTimeout,\n      exports: {},\n      videojs: videojs,\n      $tw: $tw\n    });\n\n    // A (rather short) list of global aliases required in order to\n    // correctly resolve absolute require()s used in some plugins.\n    var aliases = {\n        \"video.js\": TWTUBE_VIDEOJS\n    };\n\n    // A special-purpose require() implementation (solely) for use in\n    // videojs plugins: as the modules of such videojs plugins will often\n    // be packaged in a TiddlyWiki plugin with their titles somewhere\n    // inside the TiddylWiki system namespace ($:/), we need to play some\n    // games with the module names to tiddler titles mapping.\n    var pluginrequire = function(moduleTitle, contextTitle) {\n      if ((moduleTitle.substr(0, 3) !== \"$:/\")\n        && (moduleTitle.substr(0, 1) !== \".\")) {\n        // So we got an absolute module title which wouldn't be usable\n        // at all. So we first check with our (compact) list of known\n        // aliases; if there's a match, then go for it!\n        if (aliases[moduleTitle]) {\n          return $tw.modules.execute(aliases[moduleTitle], \"\");\n        }\n        // It's none of the known aliases, thus we now try to resolve in\n        // the context of the particular videojs plugin location (title).\n        // This handles intra-plugin require()s which use absolute module\n        // names where they should use relative ones instead. Sigh.\n        try {\n          var absmodtitle = contextTitle;\n          if (absmodtitle.substr(-1) !== \"/\") {\n            absmodtitle += \"/\";\n          }\n          absmodtitle += moduleTitle;\n          console.log(\"local require:\", moduleTitle, \"in\", contextTitle);\n          var mod = $tw.modules.execute(absmodtitle, \"\");\n          return mod;\n        } catch (e) {\n          console.log(e);\n        };\n      }\n      // If nothing works, desparately attempt to load the module with\n      // the module name taken verbatim...\n      console.log(\"global require:\", moduleTitle);\n      return $tw.modules.execute(moduleTitle, \"\");\n    };\n\n    // Now load all video.js plugins we can find; these plugins need to be\n    // tagged with $:/tags/VideojsPlugin and of type \"application/javascript\".\n    // They should NOT have a \"module-type\" field set.\n    var vjsplugins = $tw.wiki.filterTiddlers(VIDEOJS_PLUGIN_FILTER);\n    $tw.utils.each(vjsplugins, function loadplugin(pluginTitle, index) {\n      var vjsplugincode = $tw.wiki.getTiddlerText(pluginTitle, \"\");\n      var pluginexports = {};\n      var pluginsandbox = $tw.utils.extend({}, sandbox, {\n        module: {exports: pluginexports},\n        exports: pluginexports,\n      });\n      var lastslash = pluginTitle.lastIndexOf(\"/\");\n      var pluginRoot = lastslash >= 0 ? pluginTitle.substr(0, lastslash-1) : \"\";\n      pluginsandbox.require = function(moduleTitle) {\n        return pluginrequire(moduleTitle, pluginRoot);\n      };\n      $tw.utils.evalSandboxed(vjsplugincode, pluginsandbox, pluginTitle);\n      // TODO: keep exports?\n    });\n\n  } // if $tw.browser\n};\n\n})();\n","created":"20140902083720188","type":"application/javascript","modifier":"TheDiveO","modified":"20180125125026949","creator":"TheDiveO","module-type":"library"},"$:/plugins/TheDiveO/TwTube/license":{"title":"$:/plugins/TheDiveO/TwTube/license","created":"20140902084022063","creator":"TheDiveO","modified":"20180127151252098","modifier":"TheDiveO","type":"text/vnd.tiddlywiki","text":"The ''~TwTube'' plugin is covered by the following licenses:\n\n* The plugin itself (with the exceptions below) as well as the associated demo wiki is licensed under the [[MIT License|https://opensource.org/licenses/MIT]].\n* The Video.js player (and framework) is licensed under the [[Apache License 2.0|https://opensource.org/licenses/Apache-2.0]]. See also the GitHub [[videojs/video.js|https://github.com/videojs/video.js]] project page.\n* The persistent volume Video.js plugin is licensed under the [[MIT License|https://opensource.org/licenses/MIT]]."},"$:/plugins/TheDiveO/TwTube/readme":{"title":"$:/plugins/TheDiveO/TwTube/readme","created":"20140902083641711","creator":"TheDiveO","modified":"20180128161145144","modifier":"TheDiveO","type":"text/vnd.tiddlywiki","text":"! About\n\nThis ''~TwTube'' plugin provides a video player using the new `<$videojs>` widget. The video player uses the free and open source HTML5 [[Video.js|https://videojs.com/]] video player.\n\n! Installation\n\nSimply drag [[this TwTube plugin|$:/plugins/TheDiveO/TwTube]] into your own [[TiddlyWiki 5|https://tiddlywiki.com/]] wikis, save, reload, and start enjoying the `<$videojs>` widget.\n\n! Quickstart\n\nA video player widget is created using `<$videojs>`. You then specify the audio-video media to play inside the widget using ordinary HTML5 `source` elements. Such as:\n\n```\n<$videojs controls=\"controls\" fluid=\"fluid\">\n  <source src=\"test.mp4\" type=\"video/mp4\">\n</$videojs>\n```\n\nFor more details, please refer to our comprehensive [[usage guide|$:/plugins/TheDiveO/TwTube/usage]].\n\n! Skins\n\nSimply install one or several of the ~TwTube Video.js Skin plugins to be able to switch media player skins. You can then select one of these skins, or the default skin, in the control panel: <$button>\n<$action-setfield $tiddler=\"$:/state/tab-1749438307\" text=\"$:/plugins/TheDiveO/TwTube/ui/ControlPanel/VideojsSkins\"/>\n<$action-navigate $to=\"$:/ControlPanel\"/>\nOpen Control Panel \"Media Player Skin\" tab\n</$button>\n\n! Player Plugins\n\nYou can also install Video.js extension plugins. The ~TwTube plugin already includes a persistent volume plugin that stores the player volume level and muting state in the browser storage."},"$:/plugins/TheDiveO/TwTube/styles/skin-styles-aggregator":{"title":"$:/plugins/TheDiveO/TwTube/styles/skin-styles-aggregator","created":"20180113191643863","modified":"20180128161252220","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"<$set name=\"selected-skin-prefix\" filter=\"[title{$:/config/TwTube/skin}addsuffix[/]]\">\n<$list filter=\"$:/plugins/TheDiveO/TwTube/styles/videojs.css [all[shadows+tiddlers]prefix<selected-skin-prefix>tag[$:/tags/TwTubeVideojsSkin]!has[draft.of]]\">\n/* Skin CSS from <$view field=\"title\"/> */\n<$transclude/>\n</$list>\n</$set>"},"$:/plugins/TheDiveO/TwTube/styles/videojs.css":{"title":"$:/plugins/TheDiveO/TwTube/styles/videojs.css","created":"20180113145042261","modified":"20180128153153581","type":"text/css","text":".video-js .vjs-big-play-button .vjs-icon-placeholder:before, .vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-modal-dialog, .vjs-modal-dialog .vjs-modal-dialog-content {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%; }\n\n.video-js .vjs-big-play-button .vjs-icon-placeholder:before, .vjs-button > .vjs-icon-placeholder:before {\n  text-align: center; }\n\n@font-face {\n  font-family: VideoJS;\n  src: url(\"font/VideoJS.eot?#iefix\") format(\"eot\"); }\n\n@font-face {\n  font-family: VideoJS;\n  src: url(data:application/font-woff;charset=utf-8;base64,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) format(\"woff\"), url(data:application/x-font-ttf;charset=utf-8;base64,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AG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AaAB0AHQAcAA6AC8ALwBmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQAAAAIAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgAEcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgVhdWRpbwluZXh0LWl0ZW0NcHJldmlvdXMtaXRlbQAAAAA=) format(\"truetype\");\n  font-weight: normal;\n  font-style: normal; }\n\n.vjs-icon-play, .video-js .vjs-big-play-button .vjs-icon-placeholder:before, .video-js .vjs-play-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-play:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before, .video-js .vjs-play-control .vjs-icon-placeholder:before {\n    content: \"\\f101\"; }\n\n.vjs-icon-play-circle {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-play-circle:before {\n    content: \"\\f102\"; }\n\n.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before {\n    content: \"\\f103\"; }\n\n.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before {\n    content: \"\\f104\"; }\n\n.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before {\n    content: \"\\f105\"; }\n\n.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before {\n    content: \"\\f106\"; }\n\n.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before {\n    content: \"\\f107\"; }\n\n.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before {\n    content: \"\\f108\"; }\n\n.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before {\n    content: \"\\f109\"; }\n\n.vjs-icon-square {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-square:before {\n    content: \"\\f10a\"; }\n\n.vjs-icon-spinner {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-spinner:before {\n    content: \"\\f10b\"; }\n\n.vjs-icon-subtitles, .video-js .vjs-subtitles-button .vjs-icon-placeholder, .video-js .vjs-subs-caps-button .vjs-icon-placeholder,\n.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,\n.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,\n.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,\n.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-subtitles:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,\n  .video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,\n  .video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,\n  .video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,\n  .video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before {\n    content: \"\\f10c\"; }\n\n.vjs-icon-captions, .video-js .vjs-captions-button .vjs-icon-placeholder, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,\n.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-captions:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,\n  .video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before {\n    content: \"\\f10d\"; }\n\n.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before {\n    content: \"\\f10e\"; }\n\n.vjs-icon-share {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-share:before {\n    content: \"\\f10f\"; }\n\n.vjs-icon-cog {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-cog:before {\n    content: \"\\f110\"; }\n\n.vjs-icon-circle, .video-js .vjs-play-progress, .video-js .vjs-volume-level {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-circle:before, .video-js .vjs-play-progress:before, .video-js .vjs-volume-level:before {\n    content: \"\\f111\"; }\n\n.vjs-icon-circle-outline {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-circle-outline:before {\n    content: \"\\f112\"; }\n\n.vjs-icon-circle-inner-circle {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-circle-inner-circle:before {\n    content: \"\\f113\"; }\n\n.vjs-icon-hd {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-hd:before {\n    content: \"\\f114\"; }\n\n.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before {\n    content: \"\\f115\"; }\n\n.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before {\n    content: \"\\f116\"; }\n\n.vjs-icon-facebook {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-facebook:before {\n    content: \"\\f117\"; }\n\n.vjs-icon-gplus {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-gplus:before {\n    content: \"\\f118\"; }\n\n.vjs-icon-linkedin {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-linkedin:before {\n    content: \"\\f119\"; }\n\n.vjs-icon-twitter {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-twitter:before {\n    content: \"\\f11a\"; }\n\n.vjs-icon-tumblr {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-tumblr:before {\n    content: \"\\f11b\"; }\n\n.vjs-icon-pinterest {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-pinterest:before {\n    content: \"\\f11c\"; }\n\n.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before {\n    content: \"\\f11d\"; }\n\n.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before {\n    content: \"\\f11e\"; }\n\n.vjs-icon-next-item {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-next-item:before {\n    content: \"\\f11f\"; }\n\n.vjs-icon-previous-item {\n  font-family: VideoJS;\n  font-weight: normal;\n  font-style: normal; }\n  .vjs-icon-previous-item:before {\n    content: \"\\f120\"; }\n\n.video-js {\n  display: block;\n  vertical-align: top;\n  box-sizing: border-box;\n  color: #fff;\n  background-color: #000;\n  position: relative;\n  padding: 0;\n  font-size: 10px;\n  line-height: 1;\n  font-weight: normal;\n  font-style: normal;\n  font-family: Arial, Helvetica, sans-serif; }\n  .video-js:-moz-full-screen {\n    position: absolute; }\n  .video-js:-webkit-full-screen {\n    width: 100% !important;\n    height: 100% !important; }\n\n.video-js[tabindex=\"-1\"] {\n  outline: none; }\n\n.video-js *,\n.video-js *:before,\n.video-js *:after {\n  box-sizing: inherit; }\n\n.video-js ul {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n  list-style-position: outside;\n  margin-left: 0;\n  margin-right: 0;\n  margin-top: 0;\n  margin-bottom: 0; }\n\n.video-js.vjs-fluid,\n.video-js.vjs-16-9,\n.video-js.vjs-4-3 {\n  width: 100%;\n  max-width: 100%;\n  height: 0; }\n\n.video-js.vjs-16-9 {\n  padding-top: 56.25%; }\n\n.video-js.vjs-4-3 {\n  padding-top: 75%; }\n\n.video-js.vjs-fill {\n  width: 100%;\n  height: 100%; }\n\n.video-js .vjs-tech {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%; }\n\nbody.vjs-full-window {\n  padding: 0;\n  margin: 0;\n  height: 100%;\n  overflow-y: auto; }\n\n.vjs-full-window .video-js.vjs-fullscreen {\n  position: fixed;\n  overflow: hidden;\n  z-index: 1000;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  right: 0; }\n\n.video-js.vjs-fullscreen {\n  width: 100% !important;\n  height: 100% !important;\n  padding-top: 0 !important; }\n\n.video-js.vjs-fullscreen.vjs-user-inactive {\n  cursor: none; }\n\n.vjs-hidden {\n  display: none !important; }\n\n.vjs-disabled {\n  opacity: 0.5;\n  cursor: default; }\n\n.video-js .vjs-offscreen {\n  height: 1px;\n  left: -9999px;\n  position: absolute;\n  top: 0;\n  width: 1px; }\n\n.vjs-lock-showing {\n  display: block !important;\n  opacity: 1;\n  visibility: visible; }\n\n.vjs-no-js {\n  padding: 20px;\n  color: #fff;\n  background-color: #000;\n  font-size: 18px;\n  font-family: Arial, Helvetica, sans-serif;\n  text-align: center;\n  width: 300px;\n  height: 150px;\n  margin: 0px auto; }\n\n.vjs-no-js a,\n.vjs-no-js a:visited {\n  color: #66A8CC; }\n\n.video-js .vjs-big-play-button {\n  font-size: 3em;\n  line-height: 1.5em;\n  height: 1.5em;\n  width: 3em;\n  display: block;\n  position: absolute;\n  top: 10px;\n  left: 10px;\n  padding: 0;\n  cursor: pointer;\n  opacity: 1;\n  border: 0.06666em solid #fff;\n  background-color: #2B333F;\n  background-color: rgba(43, 51, 63, 0.7);\n  -webkit-border-radius: 0.3em;\n  -moz-border-radius: 0.3em;\n  border-radius: 0.3em;\n  -webkit-transition: all 0.4s;\n  -moz-transition: all 0.4s;\n  -ms-transition: all 0.4s;\n  -o-transition: all 0.4s;\n  transition: all 0.4s; }\n\n.vjs-big-play-centered .vjs-big-play-button {\n  top: 50%;\n  left: 50%;\n  margin-top: -0.75em;\n  margin-left: -1.5em; }\n\n.video-js:hover .vjs-big-play-button,\n.video-js .vjs-big-play-button:focus {\n  border-color: #fff;\n  background-color: #73859f;\n  background-color: rgba(115, 133, 159, 0.5);\n  -webkit-transition: all 0s;\n  -moz-transition: all 0s;\n  -ms-transition: all 0s;\n  -o-transition: all 0s;\n  transition: all 0s; }\n\n.vjs-controls-disabled .vjs-big-play-button,\n.vjs-has-started .vjs-big-play-button,\n.vjs-using-native-controls .vjs-big-play-button,\n.vjs-error .vjs-big-play-button {\n  display: none; }\n\n.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button {\n  display: block; }\n\n.video-js button {\n  background: none;\n  border: none;\n  color: inherit;\n  display: inline-block;\n  overflow: visible;\n  font-size: inherit;\n  line-height: inherit;\n  text-transform: none;\n  text-decoration: none;\n  transition: none;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none; }\n\n.vjs-control .vjs-button {\n  width: 100%;\n  height: 100%; }\n\n.video-js .vjs-control.vjs-close-button {\n  cursor: pointer;\n  height: 3em;\n  position: absolute;\n  right: 0;\n  top: 0.5em;\n  z-index: 2; }\n\n.video-js .vjs-modal-dialog {\n  background: rgba(0, 0, 0, 0.8);\n  background: -webkit-linear-gradient(-90deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));\n  background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));\n  overflow: auto;\n  box-sizing: content-box; }\n\n.video-js .vjs-modal-dialog > * {\n  box-sizing: border-box; }\n\n.vjs-modal-dialog .vjs-modal-dialog-content {\n  font-size: 1.2em;\n  line-height: 1.5;\n  padding: 20px 24px;\n  z-index: 1; }\n\n.vjs-menu-button {\n  cursor: pointer; }\n\n.vjs-menu-button.vjs-disabled {\n  cursor: default; }\n\n.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu {\n  display: none; }\n\n.vjs-menu .vjs-menu-content {\n  display: block;\n  padding: 0;\n  margin: 0;\n  font-family: Arial, Helvetica, sans-serif;\n  overflow: auto;\n  box-sizing: content-box; }\n\n.vjs-menu .vjs-menu-content > * {\n  box-sizing: border-box; }\n\n.vjs-scrubbing .vjs-menu-button:hover .vjs-menu {\n  display: none; }\n\n.vjs-menu li {\n  list-style: none;\n  margin: 0;\n  padding: 0.2em 0;\n  line-height: 1.4em;\n  font-size: 1.2em;\n  text-align: center;\n  text-transform: lowercase; }\n\n.vjs-menu li.vjs-menu-item:focus,\n.vjs-menu li.vjs-menu-item:hover {\n  background-color: #73859f;\n  background-color: rgba(115, 133, 159, 0.5); }\n\n.vjs-menu li.vjs-selected,\n.vjs-menu li.vjs-selected:focus,\n.vjs-menu li.vjs-selected:hover {\n  background-color: #fff;\n  color: #2B333F; }\n\n.vjs-menu li.vjs-menu-title {\n  text-align: center;\n  text-transform: uppercase;\n  font-size: 1em;\n  line-height: 2em;\n  padding: 0;\n  margin: 0 0 0.3em 0;\n  font-weight: bold;\n  cursor: default; }\n\n.vjs-menu-button-popup .vjs-menu {\n  display: none;\n  position: absolute;\n  bottom: 0;\n  width: 10em;\n  left: -3em;\n  height: 0em;\n  margin-bottom: 1.5em;\n  border-top-color: rgba(43, 51, 63, 0.7); }\n\n.vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  background-color: #2B333F;\n  background-color: rgba(43, 51, 63, 0.7);\n  position: absolute;\n  width: 100%;\n  bottom: 1.5em;\n  max-height: 15em; }\n\n.vjs-workinghover .vjs-menu-button-popup:hover .vjs-menu,\n.vjs-menu-button-popup .vjs-menu.vjs-lock-showing {\n  display: block; }\n\n.video-js .vjs-menu-button-inline {\n  -webkit-transition: all 0.4s;\n  -moz-transition: all 0.4s;\n  -ms-transition: all 0.4s;\n  -o-transition: all 0.4s;\n  transition: all 0.4s;\n  overflow: hidden; }\n\n.video-js .vjs-menu-button-inline:before {\n  width: 2.222222222em; }\n\n.video-js .vjs-menu-button-inline:hover,\n.video-js .vjs-menu-button-inline:focus,\n.video-js .vjs-menu-button-inline.vjs-slider-active,\n.video-js.vjs-no-flex .vjs-menu-button-inline {\n  width: 12em; }\n\n.vjs-menu-button-inline .vjs-menu {\n  opacity: 0;\n  height: 100%;\n  width: auto;\n  position: absolute;\n  left: 4em;\n  top: 0;\n  padding: 0;\n  margin: 0;\n  -webkit-transition: all 0.4s;\n  -moz-transition: all 0.4s;\n  -ms-transition: all 0.4s;\n  -o-transition: all 0.4s;\n  transition: all 0.4s; }\n\n.vjs-menu-button-inline:hover .vjs-menu,\n.vjs-menu-button-inline:focus .vjs-menu,\n.vjs-menu-button-inline.vjs-slider-active .vjs-menu {\n  display: block;\n  opacity: 1; }\n\n.vjs-no-flex .vjs-menu-button-inline .vjs-menu {\n  display: block;\n  opacity: 1;\n  position: relative;\n  width: auto; }\n\n.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu,\n.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,\n.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu {\n  width: auto; }\n\n.vjs-menu-button-inline .vjs-menu-content {\n  width: auto;\n  height: 100%;\n  margin: 0;\n  overflow: hidden; }\n\n.video-js .vjs-control-bar {\n  display: none;\n  width: 100%;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  height: 3.0em;\n  background-color: #2B333F;\n  background-color: rgba(43, 51, 63, 0.7); }\n\n.vjs-has-started .vjs-control-bar {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  visibility: visible;\n  opacity: 1;\n  -webkit-transition: visibility 0.1s, opacity 0.1s;\n  -moz-transition: visibility 0.1s, opacity 0.1s;\n  -ms-transition: visibility 0.1s, opacity 0.1s;\n  -o-transition: visibility 0.1s, opacity 0.1s;\n  transition: visibility 0.1s, opacity 0.1s; }\n\n.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\n  visibility: visible;\n  opacity: 0;\n  -webkit-transition: visibility 1s, opacity 1s;\n  -moz-transition: visibility 1s, opacity 1s;\n  -ms-transition: visibility 1s, opacity 1s;\n  -o-transition: visibility 1s, opacity 1s;\n  transition: visibility 1s, opacity 1s; }\n\n.vjs-controls-disabled .vjs-control-bar,\n.vjs-using-native-controls .vjs-control-bar,\n.vjs-error .vjs-control-bar {\n  display: none !important; }\n\n.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\n  opacity: 1;\n  visibility: visible; }\n\n.vjs-has-started.vjs-no-flex .vjs-control-bar {\n  display: table; }\n\n.video-js .vjs-control {\n  position: relative;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n  height: 100%;\n  width: 4em;\n  -webkit-box-flex: none;\n  -moz-box-flex: none;\n  -webkit-flex: none;\n  -ms-flex: none;\n  flex: none; }\n\n.vjs-button > .vjs-icon-placeholder:before {\n  font-size: 1.8em;\n  line-height: 1.67; }\n\n.video-js .vjs-control:focus:before,\n.video-js .vjs-control:hover:before,\n.video-js .vjs-control:focus {\n  text-shadow: 0em 0em 1em white; }\n\n.video-js .vjs-control-text {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px; }\n\n.vjs-no-flex .vjs-control {\n  display: table-cell;\n  vertical-align: middle; }\n\n.video-js .vjs-custom-control-spacer {\n  display: none; }\n\n.video-js .vjs-progress-control {\n  cursor: pointer;\n  -webkit-box-flex: auto;\n  -moz-box-flex: auto;\n  -webkit-flex: auto;\n  -ms-flex: auto;\n  flex: auto;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  -ms-flex-align: center;\n  align-items: center;\n  min-width: 4em; }\n\n.video-js .vjs-progress-control.disabled {\n  cursor: default; }\n\n.vjs-live .vjs-progress-control {\n  display: none; }\n\n.vjs-no-flex .vjs-progress-control {\n  width: auto; }\n\n.video-js .vjs-progress-holder {\n  -webkit-box-flex: auto;\n  -moz-box-flex: auto;\n  -webkit-flex: auto;\n  -ms-flex: auto;\n  flex: auto;\n  -webkit-transition: all 0.2s;\n  -moz-transition: all 0.2s;\n  -ms-transition: all 0.2s;\n  -o-transition: all 0.2s;\n  transition: all 0.2s;\n  height: 0.3em; }\n\n.video-js .vjs-progress-control .vjs-progress-holder {\n  margin: 0 10px; }\n\n.video-js .vjs-progress-control:hover .vjs-progress-holder {\n  font-size: 1.666666666666666666em; }\n\n.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled {\n  font-size: 1em; }\n\n.video-js .vjs-progress-holder .vjs-play-progress,\n.video-js .vjs-progress-holder .vjs-load-progress,\n.video-js .vjs-progress-holder .vjs-load-progress div {\n  position: absolute;\n  display: block;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  width: 0;\n  left: 0;\n  top: 0; }\n\n.video-js .vjs-play-progress {\n  background-color: #fff; }\n  .video-js .vjs-play-progress:before {\n    font-size: 0.9em;\n    position: absolute;\n    right: -0.5em;\n    top: -0.333333333333333em;\n    z-index: 1; }\n\n.video-js .vjs-load-progress {\n  background: #bfc7d3;\n  background: rgba(115, 133, 159, 0.5); }\n\n.video-js .vjs-load-progress div {\n  background: white;\n  background: rgba(115, 133, 159, 0.75); }\n\n.video-js .vjs-time-tooltip {\n  background-color: #fff;\n  background-color: rgba(255, 255, 255, 0.8);\n  -webkit-border-radius: 0.3em;\n  -moz-border-radius: 0.3em;\n  border-radius: 0.3em;\n  color: #000;\n  float: right;\n  font-family: Arial, Helvetica, sans-serif;\n  font-size: 1em;\n  padding: 6px 8px 8px 8px;\n  pointer-events: none;\n  position: relative;\n  top: -3.4em;\n  visibility: hidden;\n  z-index: 1; }\n\n.video-js .vjs-progress-holder:focus .vjs-time-tooltip {\n  display: none; }\n\n.video-js .vjs-progress-control:hover .vjs-time-tooltip,\n.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip {\n  display: block;\n  font-size: 0.6em;\n  visibility: visible; }\n\n.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip {\n  font-size: 1em; }\n\n.video-js .vjs-progress-control .vjs-mouse-display {\n  display: none;\n  position: absolute;\n  width: 1px;\n  height: 100%;\n  background-color: #000;\n  z-index: 1; }\n\n.vjs-no-flex .vjs-progress-control .vjs-mouse-display {\n  z-index: 0; }\n\n.video-js .vjs-progress-control:hover .vjs-mouse-display {\n  display: block; }\n\n.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display {\n  visibility: hidden;\n  opacity: 0;\n  -webkit-transition: visibility 1s, opacity 1s;\n  -moz-transition: visibility 1s, opacity 1s;\n  -ms-transition: visibility 1s, opacity 1s;\n  -o-transition: visibility 1s, opacity 1s;\n  transition: visibility 1s, opacity 1s; }\n\n.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display {\n  display: none; }\n\n.vjs-mouse-display .vjs-time-tooltip {\n  color: #fff;\n  background-color: #000;\n  background-color: rgba(0, 0, 0, 0.8); }\n\n.video-js .vjs-slider {\n  position: relative;\n  cursor: pointer;\n  padding: 0;\n  margin: 0 0.45em 0 0.45em;\n  /* iOS Safari */\n  -webkit-touch-callout: none;\n  /* Safari */\n  -webkit-user-select: none;\n  /* Konqueror HTML */\n  -khtml-user-select: none;\n  /* Firefox */\n  -moz-user-select: none;\n  /* Internet Explorer/Edge */\n  -ms-user-select: none;\n  /* Non-prefixed version, currently supported by Chrome and Opera */\n  user-select: none;\n  background-color: #73859f;\n  background-color: rgba(115, 133, 159, 0.5); }\n\n.video-js .vjs-slider.disabled {\n  cursor: default; }\n\n.video-js .vjs-slider:focus {\n  text-shadow: 0em 0em 1em white;\n  -webkit-box-shadow: 0 0 1em #fff;\n  -moz-box-shadow: 0 0 1em #fff;\n  box-shadow: 0 0 1em #fff; }\n\n.video-js .vjs-mute-control {\n  cursor: pointer;\n  -webkit-box-flex: none;\n  -moz-box-flex: none;\n  -webkit-flex: none;\n  -ms-flex: none;\n  flex: none;\n  padding-left: 2em;\n  padding-right: 2em;\n  padding-bottom: 3em; }\n\n.video-js .vjs-volume-control {\n  cursor: pointer;\n  margin-right: 1em;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n\n.video-js .vjs-volume-control.vjs-volume-horizontal {\n  width: 5em; }\n\n.video-js .vjs-volume-panel .vjs-volume-control {\n  visibility: visible;\n  opacity: 0;\n  width: 1px;\n  height: 1px;\n  margin-left: -1px; }\n\n.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\n  -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\"; }\n  .vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n  .vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical .vjs-volume-level {\n    -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\"; }\n\n.video-js .vjs-volume-panel {\n  -webkit-transition: width 1s;\n  -moz-transition: width 1s;\n  -ms-transition: width 1s;\n  -o-transition: width 1s;\n  transition: width 1s; }\n  .video-js .vjs-volume-panel:hover .vjs-volume-control,\n  .video-js .vjs-volume-panel:active .vjs-volume-control,\n  .video-js .vjs-volume-panel:focus .vjs-volume-control,\n  .video-js .vjs-volume-panel .vjs-volume-control:hover,\n  .video-js .vjs-volume-panel .vjs-volume-control:active,\n  .video-js .vjs-volume-panel .vjs-volume-control:focus,\n  .video-js .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control,\n  .video-js .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control,\n  .video-js .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control,\n  .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active {\n    visibility: visible;\n    opacity: 1;\n    position: relative;\n    -webkit-transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\n    -moz-transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\n    -ms-transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\n    -o-transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\n    transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s; }\n    .video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-volume-control:focus.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control.vjs-volume-horizontal,\n    .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal {\n      width: 5em;\n      height: 3em; }\n    .video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-vertical,\n    .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical,\n    .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-volume-control:focus.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control.vjs-volume-vertical,\n    .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical {\n      -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\"; }\n      .video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel:hover .vjs-volume-control.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-volume-control:hover.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-volume-control:focus.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-volume-control:focus.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-mute-control:hover ~ .vjs-volume-control.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-mute-control:active ~ .vjs-volume-control.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-mute-control:focus ~ .vjs-volume-control.vjs-volume-vertical .vjs-volume-level,\n      .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical .vjs-volume-bar,\n      .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical .vjs-volume-level {\n        -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\"; }\n  .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:focus, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {\n    width: 9em;\n    -webkit-transition: width 0.1s;\n    -moz-transition: width 0.1s;\n    -ms-transition: width 0.1s;\n    -o-transition: width 0.1s;\n    transition: width 0.1s; }\n\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\n  height: 8em;\n  width: 3em;\n  left: -3.5em;\n  -webkit-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\n  -moz-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\n  -ms-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\n  -o-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\n  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s; }\n\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\n  -webkit-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\n  -moz-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\n  -ms-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\n  -o-transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\n  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s; }\n\n.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\n  width: 5em;\n  height: 3em;\n  visibility: visible;\n  opacity: 1;\n  position: relative;\n  -webkit-transition: none;\n  -moz-transition: none;\n  -ms-transition: none;\n  -o-transition: none;\n  transition: none; }\n\n.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical,\n.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\n  position: absolute;\n  bottom: 3em;\n  left: 0.5em; }\n\n.video-js .vjs-volume-panel {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex; }\n\n.video-js .vjs-volume-bar {\n  margin: 1.35em 0.45em; }\n\n.vjs-volume-bar.vjs-slider-horizontal {\n  width: 5em;\n  height: 0.3em; }\n\n.vjs-volume-bar.vjs-slider-vertical {\n  width: 0.3em;\n  height: 5em;\n  margin: 1.35em auto; }\n\n.video-js .vjs-volume-level {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  background-color: #fff; }\n  .video-js .vjs-volume-level:before {\n    position: absolute;\n    font-size: 0.9em; }\n\n.vjs-slider-vertical .vjs-volume-level {\n  width: 0.3em; }\n  .vjs-slider-vertical .vjs-volume-level:before {\n    top: -0.5em;\n    left: -0.3em; }\n\n.vjs-slider-horizontal .vjs-volume-level {\n  height: 0.3em; }\n  .vjs-slider-horizontal .vjs-volume-level:before {\n    top: -0.3em;\n    right: -0.5em; }\n\n.video-js .vjs-volume-panel.vjs-volume-panel-vertical {\n  width: 4em; }\n\n.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {\n  height: 100%; }\n\n.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {\n  width: 100%; }\n\n.video-js .vjs-volume-vertical {\n  width: 3em;\n  height: 8em;\n  bottom: 8em;\n  background-color: #2B333F;\n  background-color: rgba(43, 51, 63, 0.7); }\n\n.video-js .vjs-volume-horizontal .vjs-menu {\n  left: -2em; }\n\n.vjs-poster {\n  display: inline-block;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  background-position: 50% 50%;\n  background-size: contain;\n  background-color: #000000;\n  cursor: pointer;\n  margin: 0;\n  padding: 0;\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  height: 100%; }\n\n.vjs-poster img {\n  display: block;\n  vertical-align: middle;\n  margin: 0 auto;\n  max-height: 100%;\n  padding: 0;\n  width: 100%; }\n\n.vjs-has-started .vjs-poster {\n  display: none; }\n\n.vjs-audio.vjs-has-started .vjs-poster {\n  display: block; }\n\n.vjs-using-native-controls .vjs-poster {\n  display: none; }\n\n.video-js .vjs-live-control {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-align: flex-start;\n  -webkit-align-items: flex-start;\n  -ms-flex-align: flex-start;\n  align-items: flex-start;\n  -webkit-box-flex: auto;\n  -moz-box-flex: auto;\n  -webkit-flex: auto;\n  -ms-flex: auto;\n  flex: auto;\n  font-size: 1em;\n  line-height: 3em; }\n\n.vjs-no-flex .vjs-live-control {\n  display: table-cell;\n  width: auto;\n  text-align: left; }\n\n.video-js .vjs-time-control {\n  -webkit-box-flex: none;\n  -moz-box-flex: none;\n  -webkit-flex: none;\n  -ms-flex: none;\n  flex: none;\n  font-size: 1em;\n  line-height: 3em;\n  min-width: 2em;\n  width: auto;\n  padding-left: 1em;\n  padding-right: 1em; }\n\n.vjs-live .vjs-time-control {\n  display: none; }\n\n.video-js .vjs-current-time,\n.vjs-no-flex .vjs-current-time {\n  display: none; }\n\n.vjs-no-flex .vjs-remaining-time.vjs-time-control.vjs-control {\n  width: 0px !important;\n  white-space: nowrap; }\n\n.video-js .vjs-duration,\n.vjs-no-flex .vjs-duration {\n  display: none; }\n\n.vjs-time-divider {\n  display: none;\n  line-height: 3em; }\n\n.vjs-live .vjs-time-divider {\n  display: none; }\n\n.video-js .vjs-play-control .vjs-icon-placeholder {\n  cursor: pointer;\n  -webkit-box-flex: none;\n  -moz-box-flex: none;\n  -webkit-flex: none;\n  -ms-flex: none;\n  flex: none; }\n\n.vjs-text-track-display {\n  position: absolute;\n  bottom: 3em;\n  left: 0;\n  right: 0;\n  top: 0;\n  pointer-events: none; }\n\n.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {\n  bottom: 1em; }\n\n.video-js .vjs-text-track {\n  font-size: 1.4em;\n  text-align: center;\n  margin-bottom: 0.1em;\n  background-color: #000;\n  background-color: rgba(0, 0, 0, 0.5); }\n\n.vjs-subtitles {\n  color: #fff; }\n\n.vjs-captions {\n  color: #fc6; }\n\n.vjs-tt-cue {\n  display: block; }\n\nvideo::-webkit-media-text-track-display {\n  -moz-transform: translateY(-3em);\n  -ms-transform: translateY(-3em);\n  -o-transform: translateY(-3em);\n  -webkit-transform: translateY(-3em);\n  transform: translateY(-3em); }\n\n.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display {\n  -moz-transform: translateY(-1.5em);\n  -ms-transform: translateY(-1.5em);\n  -o-transform: translateY(-1.5em);\n  -webkit-transform: translateY(-1.5em);\n  transform: translateY(-1.5em); }\n\n.video-js .vjs-fullscreen-control {\n  cursor: pointer;\n  -webkit-box-flex: none;\n  -moz-box-flex: none;\n  -webkit-flex: none;\n  -ms-flex: none;\n  flex: none; }\n\n.vjs-playback-rate > .vjs-menu-button,\n.vjs-playback-rate .vjs-playback-rate-value {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%; }\n\n.vjs-playback-rate .vjs-playback-rate-value {\n  pointer-events: none;\n  font-size: 1.5em;\n  line-height: 2;\n  text-align: center; }\n\n.vjs-playback-rate .vjs-menu {\n  width: 4em;\n  left: 0em; }\n\n.vjs-error .vjs-error-display .vjs-modal-dialog-content {\n  font-size: 1.4em;\n  text-align: center; }\n\n.vjs-error .vjs-error-display:before {\n  color: #fff;\n  content: 'X';\n  font-family: Arial, Helvetica, sans-serif;\n  font-size: 4em;\n  left: 0;\n  line-height: 1;\n  margin-top: -0.5em;\n  position: absolute;\n  text-shadow: 0.05em 0.05em 0.1em #000;\n  text-align: center;\n  top: 50%;\n  vertical-align: middle;\n  width: 100%; }\n\n.vjs-loading-spinner {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin: -25px 0 0 -25px;\n  opacity: 0.85;\n  text-align: left;\n  border: 6px solid rgba(43, 51, 63, 0.7);\n  box-sizing: border-box;\n  background-clip: padding-box;\n  width: 50px;\n  height: 50px;\n  border-radius: 25px;\n  visibility: hidden; }\n\n.vjs-seeking .vjs-loading-spinner,\n.vjs-waiting .vjs-loading-spinner {\n  display: block;\n  animation: 0s linear 0.3s forwards vjs-spinner-show; }\n\n.vjs-loading-spinner:before,\n.vjs-loading-spinner:after {\n  content: \"\";\n  position: absolute;\n  margin: -6px;\n  box-sizing: inherit;\n  width: inherit;\n  height: inherit;\n  border-radius: inherit;\n  opacity: 1;\n  border: inherit;\n  border-color: transparent;\n  border-top-color: white; }\n\n.vjs-seeking .vjs-loading-spinner:before,\n.vjs-seeking .vjs-loading-spinner:after,\n.vjs-waiting .vjs-loading-spinner:before,\n.vjs-waiting .vjs-loading-spinner:after {\n  -webkit-animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;\n  animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite; }\n\n.vjs-seeking .vjs-loading-spinner:before,\n.vjs-waiting .vjs-loading-spinner:before {\n  border-top-color: white; }\n\n.vjs-seeking .vjs-loading-spinner:after,\n.vjs-waiting .vjs-loading-spinner:after {\n  border-top-color: white;\n  -webkit-animation-delay: 0.44s;\n  animation-delay: 0.44s; }\n\n@keyframes vjs-spinner-show {\n  to {\n    visibility: visible; } }\n\n@-webkit-keyframes vjs-spinner-show {\n  to {\n    visibility: visible; } }\n\n@keyframes vjs-spinner-spin {\n  100% {\n    transform: rotate(360deg); } }\n\n@-webkit-keyframes vjs-spinner-spin {\n  100% {\n    -webkit-transform: rotate(360deg); } }\n\n@keyframes vjs-spinner-fade {\n  0% {\n    border-top-color: #73859f; }\n  20% {\n    border-top-color: #73859f; }\n  35% {\n    border-top-color: white; }\n  60% {\n    border-top-color: #73859f; }\n  100% {\n    border-top-color: #73859f; } }\n\n@-webkit-keyframes vjs-spinner-fade {\n  0% {\n    border-top-color: #73859f; }\n  20% {\n    border-top-color: #73859f; }\n  35% {\n    border-top-color: white; }\n  60% {\n    border-top-color: #73859f; }\n  100% {\n    border-top-color: #73859f; } }\n\n.vjs-chapters-button .vjs-menu ul {\n  width: 24em; }\n\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\n  position: absolute; }\n\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\n  font-family: VideoJS;\n  content: \"\\f10d\";\n  font-size: 1.5em;\n  line-height: inherit; }\n\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer {\n  -webkit-box-flex: auto;\n  -moz-box-flex: auto;\n  -webkit-flex: auto;\n  -ms-flex: auto;\n  flex: auto; }\n\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer {\n  width: auto; }\n\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time,\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control,\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control,\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-descriptions-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,\n.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-audio-button {\n  display: none; }\n\n.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time,\n.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate,\n.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control,\n.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-descriptions-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,\n.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button, .video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-audio-button {\n  display: none; }\n\n.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time,\n.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate,\n.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control,\n.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-descriptions-button, .video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button,\n.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button .vjs-audio-button {\n  display: none; }\n\n.vjs-modal-dialog.vjs-text-track-settings {\n  background-color: #2B333F;\n  background-color: rgba(43, 51, 63, 0.75);\n  color: #fff;\n  height: 70%; }\n\n.vjs-text-track-settings .vjs-modal-dialog-content {\n  display: table; }\n\n.vjs-text-track-settings .vjs-track-settings-colors,\n.vjs-text-track-settings .vjs-track-settings-font,\n.vjs-text-track-settings .vjs-track-settings-controls {\n  display: table-cell; }\n\n.vjs-text-track-settings .vjs-track-settings-controls {\n  text-align: right;\n  vertical-align: bottom; }\n\n.vjs-text-track-settings fieldset {\n  margin: 5px;\n  padding: 3px;\n  border: none; }\n\n.vjs-text-track-settings fieldset span {\n  display: inline-block;\n  margin-left: 5px; }\n\n.vjs-text-track-settings legend {\n  color: #fff;\n  margin: 0 0 5px 0; }\n\n.vjs-text-track-settings .vjs-label {\n  position: absolute;\n  clip: rect(1px 1px 1px 1px);\n  clip: rect(1px, 1px, 1px, 1px);\n  display: block;\n  margin: 0 0 5px 0;\n  padding: 0;\n  border: 0;\n  height: 1px;\n  width: 1px;\n  overflow: hidden; }\n\n.vjs-track-settings-controls button:focus,\n.vjs-track-settings-controls button:active {\n  outline-style: solid;\n  outline-width: medium;\n  background-image: linear-gradient(0deg, #fff 88%, #73859f 100%); }\n\n.vjs-track-settings-controls button:hover {\n  color: rgba(43, 51, 63, 0.75); }\n\n.vjs-track-settings-controls button {\n  background-color: #fff;\n  background-image: linear-gradient(-180deg, #fff 88%, #73859f 100%);\n  color: #2B333F;\n  cursor: pointer;\n  border-radius: 2px; }\n\n.vjs-track-settings-controls .vjs-default-button {\n  margin-right: 1em; }\n\n@media print {\n  .video-js > *:not(.vjs-tech):not(.vjs-poster) {\n    visibility: hidden; } }\n\n@media \\0screen {\n  .vjs-user-inactive.vjs-playing .vjs-control-bar :before {\n    content: \"\";\n  }\n}\n\n@media \\0screen {\n  .vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\n    visibility: hidden;\n  }\n}\n"},"$:/plugins/TheDiveO/TwTube/ui/ControlPanel/VideojsSkins":{"title":"$:/plugins/TheDiveO/TwTube/ui/ControlPanel/VideojsSkins","caption":"Media Player Skins","created":"20180128151952619","modified":"20180128155435799","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"Customize the visual appearance of the [[Visual.js|https://videojs.com]] media player using skins.\n\nVideo.js media player skin <$select tiddler=\"$:/config/TwTube/skin\" default=\"$:/plugins/TheDiveO/TwTube\">\n<$list filter=\"[all[tiddlers+shadow]tag[$:/tags/TwTubeVideojsSkinPlugin]sort[caption]]\">\n<option value=<<currentTiddler>> ><$view field=\"caption\"><$view field=\"description\"/></$view></option>\n</$list>\n</$select>"},"$:/plugins/TheDiveO/TwTube/usage":{"title":"$:/plugins/TheDiveO/TwTube/usage","created":"20180113181502426","modified":"20180128160857909","tags":"","type":"text/vnd.tiddlywiki","text":"! Usage\n\nA video player widget is created using `<$videojs>`. You then specify the audio-video media to play inside the widget using ordinary HTML5 `source` elements. Such as:\n\n```\n<$videojs controls=\"controls\" fluid=\"fluid\">\n  <source src=\"test.mp4\" type=\"video/mp4\">\n</$videojs>\n```\n\n! Widget Attributes\n\nThe `<$videojs>` video player widget supports the following attributes:\n\n|!Attribute |!Description |\n|^`aspectratio` |The video player aspect ratio as two numbers separated by a colon, such as `\"16:9\"` or `\"4:3\"`. While the [[Video.js documentation states|http://docs.videojs.com/tutorial-options.html]] the aspect ratio additionally puts the player into \"fluid\" mode, this seems to be incorrect. You'll still need to also specify the `fluid` attribute if you want the player to scale to fit its container. |\n|^`autoplay` |When present and not empty the player automatically begins playback when it is ready.  |\n|^`class` |The CSS class or classes for the video player. You don't need to specify `\"video-js\"` as it gets added automatically by the widget. |\n|^`controls` |When present and not empty the player shows controls the user can interact it. If this attribute is left out the only way to start the player is using the `autoplay` attribute. |\n|^`fluid` |When present and not empty the player will scale to fit its container. |\n|^`height` |Sets the height of the video player in pixels. See also the `fluid` attribute when responsive design is needed. |\n|^`language` |Sets the initial language of the player using a language code, such as `\"en\"`. If not specified, the language defaults to the web browser language setting, or -- as the last resort -- to `\"en\"`. |\n|^`loop` |When present and not empty the the video gets looped endless and endless and ... you get the drift. |\n|^`muted` |When present and not empty then audio is muted by default. The user then can unmute audio at any time. |\n|^`poster` |URL to an image that gets displayed before the video begins playing. |\n|^`preload` |Indicates to the web browser whether media data download should begin immediately or not. Possible values are `auto`, `metadata`, and `none`. `auto` selects immediate downloading, but only if the web browser supports this. `metadata` preloads only information like video frame dimensions and duration. `none` disables preloading and the player will download the media only after the user clicked the \"play\" button. |\n|^`pluginsdata` |Specifies plugin (configuration) data in form of a JSON string. For instance: <pre>pluginsdata='{\"persistvolume\": {\"namespace\": \"twtube\"}}'</pre> Alternatively, you can specify plugin configuration data in data tiddlers of type `application/json` and tagged with `$:/tags/VideojsPluginConfig`. |\n|^`width` |Sets the width of the video player in pixels. See also the `fluid` attribute when responsive design is needed. |\n\n! Widget Content\n\nThe content of the video player widget needs to be one or more media source declarations using the HTML5 `source` element. A typical example is:\n\n```\n<source src=\"glorous-blockbuster-XXII.mp4\" type=\"video/mp4\">\n```\n\nYou can specify multiple media sources for different media formats, so that browsers can pick the format they support or even like the best.\n\n! Widget CSS Classes\n\nThis is an imcomplete list of CSS classes to be used on your `<$videojs>` widgets you might find mildly useful:\n\n;`vjs-big-play-centered`\n: centers the play button over the video player widget instead of hiding it in its topleft corner. The rationale for defaulting to the topleft corner seems to be that then the button does not cover some interesting preload image details in the center.\n\n! Plugin Configuration Data\n\nThe Video.js player widget supports Video.js plugins. The player widget comes with one Video.js plugin out of the box: a plugin for making your player volume setting persistent. However, you need to activate Video.js plugins by specifying plugin configuration data. Otherwise, these Video.js plugins won't get activated. Configuration data can be specified either:\n\n* using the `pluginsdata=` attribute of a `<$videojs>` widget; this allows for an individual per-player configuration.\n\n* using Video.js plugin configuration data tiddlers, tagged with `$:/tags/VideojsPluginConfig` and of type `application/json`.\n\n! Persistent Volume Setting Plugin\n\nAs we deem the persistent volume setting plugin incredibly useful, it's enabled by default. The player's volume setting is stored in either your browser's persistent storage, or, if that isn't available, in a cookie.\n\nIn the default configuration, the `<$videojs>` widgets in ''all ~TiddlyWikis share the same volume setting''. If you change the player volume in one ~TiddlyWiki, the other ~TiddlyWikis will pick up this most recent volume setting automatically.\n\nIf you want instead //individual// player volume settings per ~TiddlyWiki, then overwrite the plugin tiddler [[$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.config]] and specify a different namespace value for each of your ~TiddlyWikis.\n\n! Caveats\n\nDue to the way ~TiddlyWiki handles widget parameters, it is not enough to specify a \"boolean\" parameter in itself or with an empty `\"\"` value. Instead, you need to specify some non-empty value. The actual value is, erm, actually irrelevant, as long as it is not empty. For instance:\n\n```\n<$videojs controls=\"controls\"/>\n```\n\nEven if these parameters are (following the HTML5 standard) termed \"boolean\" values, you ''cannot'' specify a false value. Any value is taken as a truth value."},"$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.config":{"title":"$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.config","created":"20180126205823852","modified":"20180126210055994","tags":"$:/tags/VideojsPluginConfig","type":"application/json","text":"{\n  \"persistvolume\": {\n    \"namespace\": \"twtube\"\n  }\n}"},"$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.js":{"title":"$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.js","text":"/*\\\ncreated: 20140902083720188\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.js\nmodifier: TheDiveO\nmodified: 20180125125001394\ncreator: TheDiveO\ntags: $:/tags/VideojsPlugin\n\\*/\n\"use strict\";\n(function(factory){\n  /*!\n   * Custom Universal Module Definition (UMD)\n   *\n   * Video.js will never be a non-browser lib so we can simplify UMD a bunch and\n   * still support requirejs and browserify. This also needs to be closure\n   * compiler compatible, so string keys are used.\n   */\n  if (typeof define === 'function' && define['amd']) {\n    define(['./video'], function(vjs){ factory(window, document, vjs) });\n  // checking that module is an object too because of umdjs/umd#35\n  } else if (typeof exports === 'object' && typeof module === 'object') {\n    factory(window, document, require('video.js'));\n  } else {\n    factory(window, document, videojs);\n  }\n\n})(function(window, document, vjs) {\n  //cookie functions from https://developer.mozilla.org/en-US/docs/DOM/document.cookie\n  var\n  getCookieItem = function(sKey) {\n    if (!sKey || !hasCookieItem(sKey)) { return null; }\n    var reg_ex = new RegExp(\n      \"(?:^|.*;\\\\s*)\" +\n      window.escape(sKey).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") +\n      \"\\\\s*\\\\=\\\\s*((?:[^;](?!;))*[^;]?).*\"\n    );\n    return window.unescape(document.cookie.replace(reg_ex,\"$1\"));\n  },\n\n  setCookieItem = function(sKey, sValue, vEnd, sPath, sDomain, bSecure) {\n    if (!sKey || /^(?:expires|max\\-age|path|domain|secure)$/i.test(sKey)) { return; }\n    var sExpires = \"\";\n    if (vEnd) {\n      switch (vEnd.constructor) {\n        case Number:\n          sExpires = vEnd === Infinity ? \"; expires=Tue, 19 Jan 2038 03:14:07 GMT\" : \"; max-age=\" + vEnd;\n          break;\n        case String:\n          sExpires = \"; expires=\" + vEnd;\n          break;\n        case Date:\n          sExpires = \"; expires=\" + vEnd.toGMTString();\n          break;\n      }\n    }\n    document.cookie =\n      window.escape(sKey) + \"=\" +\n      window.escape(sValue) +\n      sExpires +\n      (sDomain ? \"; domain=\" + sDomain : \"\") +\n      (sPath ? \"; path=\" + sPath : \"\") +\n      (bSecure ? \"; secure\" : \"\");\n  },\n\n  hasCookieItem = function(sKey) {\n    return (new RegExp(\n      \"(?:^|;\\\\s*)\" +\n      window.escape(sKey).replace(/[\\-\\.\\+\\*]/g, \"\\\\$&\") +\n      \"\\\\s*\\\\=\")\n    ).test(document.cookie);\n  },\n\n  hasLocalStorage = function() {\n    try {\n      window.localStorage.setItem('persistVolume', 'persistVolume');\n      window.localStorage.removeItem('persistVolume');\n      return true;\n    } catch(e) {\n      return false;\n    }\n  },\n  getStorageItem = function(key) {\n    return hasLocalStorage() ? window.localStorage.getItem(key) : getCookieItem(key);\n  },\n  setStorageItem = function(key, value) {\n    return hasLocalStorage() ? window.localStorage.setItem(key, value) : setCookieItem(key, value, Infinity, '/');\n  },\n\n  extend = function(obj) {\n    var arg, i, k;\n    for (i = 1; i < arguments.length; i++) {\n      arg = arguments[i];\n      for (k in arg) {\n        if (arg.hasOwnProperty(k)) {\n          obj[k] = arg[k];\n        }\n      }\n    }\n    return obj;\n  },\n\n  defaults = {\n    namespace: \"\"\n  },\n\n  volumePersister = function(options) {\n    var player = this;\n    var settings = extend({}, defaults, options || {});\n\n    var key = settings.namespace + '-' + 'volume';\n    var muteKey = settings.namespace + '-' + 'mute';\n\n    player.on(\"volumechange\", function() {\n      setStorageItem(key, player.volume());\n      setStorageItem(muteKey, player.muted());\n    });\n\n    var persistedVolume = getStorageItem(key);\n    if(persistedVolume !== null){\n      player.volume(persistedVolume);\n    }\n\n    var persistedMute = getStorageItem(muteKey);\n    if(persistedMute !== null){\n      player.muted('true' === persistedMute);\n    }\n  };\n\n  vjs.registerPlugin(\"persistvolume\", volumePersister);\n\n});\n","created":"20140902083720188","type":"application/javascript","modifier":"TheDiveO","modified":"20180125125001394","creator":"TheDiveO","tags":"$:/tags/VideojsPlugin"},"$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.license":{"title":"$:/plugins/TheDiveO/TwTube/videojsplugins/videojs.persistvolume.license","created":"20180127151328027","modified":"20180127151505293","tags":"","type":"text/vnd.tiddlywiki","text":"Source: [[https://github.com/theonion/videojs-persistvolume/blob/master/LICENSE]]\n\n<hr/>\n\nThe MIT License (MIT)\n\nCopyright (c) {{{year}}} {{{fullname}}}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."},"$:/plugins/TheDiveO/TwTube/widgets/videojs.js":{"title":"$:/plugins/TheDiveO/TwTube/widgets/videojs.js","text":"/*\\\ncreated: 20180113145438225\ntitle: $:/plugins/TheDiveO/TwTube/widgets/videojs.js\ntags:\nmodified: 20180113150322040\ntype: application/javascript\nmodule-type: widget\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n//\nvar VIDEOJS_PLUGINCFG_FILTER =\n  \"[\"\n  + \"all[shadows+tiddlers]\"\n  + \"tag[$:/tags/VideojsPluginConfig]\"\n  + \"type[application/json]\"\n  + \"]\";\n\n// Stuff we need...\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n// Here be Dragons! During development we might be loaded and executed\n// not only in a web browser as usual, but also in Node.js. However,\n// the Video.js library won't work in Node.js -- for obvious reasons --\n// and crash. Thus, when we're run inside Node.js we need to avoid\n// doing anything with the Video.js library and thus just keep a\n// useless stub.\nvar videojs = null;\nif ($tw.browser) {\n  // Even more dragons here: we need to lazy load the Video.js plugins.\n  // That's not due to the Video.js but instead to startup issues with\n  // the TiddlyWiki boot/core mechanics. To cut a long story short: we\n  // simply load only when this widget module gets pulled in for the\n  // first time. This seems to be safe, otherwise the plugin loader\n  // might get run **after** this module initializes.\n  require(\"$:/plugins/TheDiveO/TwTube/libraries/videojspluginloader.js\")\n    .loadplugins();\n  videojs = require(\"$:/plugins/TheDiveO/TwTube/libraries/video.js\");\n}\n\n// Widget constructor\nvar VideojsWidget = function(parseTreeNode, options) {\n  this.initialise(parseTreeNode, options);\n};\n\n// Inherit from the base widget \"class\".\nVideojsWidget.prototype = new Widget();\n\n// Render widget into the DOM...\nVideojsWidget.prototype.render = function(parent, nextSibling) {\n  this.parentDomNode = parent;\n  this.computeAttributes();\n  this.execute();\n  // Create our DOM elements...\n  this.shellDomNode = this.document.createElement(\"div\");\n  this.shellDomNode.setAttribute(\"data-vjs-player\", \"\");\n  this.videojsDomNode = this.document.createElement(\"video-js\");\n  // General\n  if (this.vidClass) {\n    this.videojsDomNode.setAttribute(\"class\", \"video-js \" + this.vidClass);\n  } else {\n    this.videojsDomNode.setAttribute(\"class\", \"video-js\");\n  }\n\n  // Lump all the many video/video-js element attributes into\n  // a JSON object and later hand that over in one go.\n  var dataSetup = {};\n\n  // Multikulti\n  if (this.vidLanguage) {\n    dataSetup[\"language\"] = this.vidLanguage;\n  }\n  // Geometry\n  if (this.vidAspectRatio) {\n    dataSetup[\"aspectratio\"] = this.vidAspectRatio;\n  }\n  if (this.vidFluid) {\n    dataSetup[\"fluid\"] = this.vidFluid;\n  }\n  if (this.vidWidth) {\n    dataSetup[\"width\"] = this.vidWidth;\n  }\n  if (this.vidHeight) {\n    dataSetup[\"height\"] = this.vidHeight;\n  }\n  // Player control\n  if (this.vidAutoplay) {\n    dataSetup[\"autoplay\"] = this.vidAutoplay;\n  }\n  if (this.vidControls) {\n    dataSetup[\"controls\"] = this.vidControls;\n  }\n  if (this.vidLoop) {\n    dataSetup[\"loop\"] = this.vidLoop;\n  }\n  if (this.vidMuted) {\n    dataSetup[\"muted\"] = this.vidMuted;\n  }\n  if (this.vidPreload) {\n    dataSetup[\"preload\"] = this.vidPreload;\n  }\n  if (this.vidPoster) {\n    dataSetup[\"poster\"] = this.vidPoster;\n  }\n  // Plugin configuration data\n  // Step (1): fetch any plugin configuration data tiddlers that might\n  // be present in this TiddlyWiki. Merge the configuration data from\n  // all these configuration data tiddlers.\n  var pluginsdata = {};\n  var pluginsdatatiddlers = $tw.wiki.filterTiddlers(VIDEOJS_PLUGINCFG_FILTER);\n  $tw.utils.each(pluginsdatatiddlers, function loadplugin(pluginDataTitle, index) {\n    var data = $tw.wiki.getTiddlerDataCached(pluginDataTitle, {});\n    $tw.utils.extend(pluginsdata, data);\n  });\n  // Step (2): merge in the configuration data from the pluginsdata=\n  // attribute, if specified.\n  try {\n    $tw.utils.extend(pluginsdata, JSON.parse(this.vidPluginsData));\n  } catch (e) {};\n  dataSetup[\"plugins\"] = pluginsdata;\n\n  // Finalize the setup parameters and then add our video element.\n  this.videojsDomNode.setAttribute(\"data-setup\", JSON.stringify(dataSetup));\n  this.shellDomNode.appendChild(this.videojsDomNode);\n  // ...and insert them into the DOM.\n  parent.insertBefore(this.shellDomNode, nextSibling);\n  this.renderChildren(this.videojsDomNode, null);\n  this.domNodes.push(this.shellDomNode);\n  // Now let's do the Video.js library its magic...\n  if (videojs !== null) {\n    videojs(this.videojsDomNode);\n  }\n};\n\n// Compute the internal state of the videojs widget. Also make\n// sure that all child widgets/elements get correctly created.\nVideojsWidget.prototype.execute = function() {\n  // Get our parameters...\n  // General\n  this.vidClass = this.getAttribute(\"class\");\n  // CSS classes: we take additional CSS class definitions from\n  // skin plugins into account.\n  var skinClasses = this.getVariable(\"twtube-skin-classes\");\n  if (skinClasses !== undefined) {\n    this.vidClass += \" \" + skinClasses;\n  }\n  // Multikulti\n  this.vidLanguage = this.getAttribute(\"language\");\n  //this.vidLanguages = this.getAttribute(\"languages\");\n  // Geometry\n  this.vidAspectRatio = this.getAttribute(\"aspectratio\");\n  this.vidFluid = this.getAttribute(\"fluid\");\n  this.vidWidth = this.getAttribute(\"width\");\n  this.vidHeight = this.getAttribute(\"height\");\n  // Player control\n  this.vidAutoplay = this.getAttribute(\"autoplay\");\n  this.vidControls = this.getAttribute(\"controls\");\n  this.vidLoop = this.getAttribute(\"loop\");\n  this.vidMuted = this.getAttribute(\"muted\");\n  this.vidPreload = this.getAttribute(\"preload\");\n  this.vidPoster = this.getAttribute(\"poster\");\n  // (plugin) configuration mechanism\n  this.vidPluginsData = this.getAttribute(\"pluginsdata\")\n  // \"Don't forget about the Children!\"\n  this.makeChildWidgets();\n};\n\n// Decide whether the video widget needs to be refreshed, either\n// because its own state changed or its children.\nVideojsWidget.prototype.refresh = function(changedTiddlers) {\n  var changedAttributes = this.computeAttributes();\n  if (\n    changedAttributes[\"class\"]\n    || changedAttributes[\"language\"]\n    || changedAttributes[\"aspectratio\"]\n    || changedAttributes[\"fluid\"]\n    || changedAttributes.width\n    || changedAttributes.height\n    || changedAttributes[\"autoplay\"]\n    || changedAttributes[\"controls\"]\n    || changedAttributes[\"loop\"]\n    || changedAttributes[\"muted\"]\n    || changedAttributes[\"preload\"]\n    || changedAttributes[\"poster\"]\n    || changedAttributes[\"pluginsdata\"]\n  ) {\n    this.refreshSelf();\n    return true;\n  }\n  return false;\n};\n\n// Finally export our Video.js player widget so that it can be\n// used as <$videojs />.\nexports.videojs = VideojsWidget;\n\n})();\n","created":"20180113145438225","tags":"","modified":"20180113150322040","type":"application/javascript","module-type":"widget"}}}
{"tiddlers":{"$:/plugins/TheDiveO/VideojsHotkeys/history":{"title":"$:/plugins/TheDiveO/VideojsHotkeys/history","created":"20180127152008953","modified":"20180127152033738","tags":"","type":"text/vnd.tiddlywiki","text":"* ''1.0.0'' – first release of the Video.js Hotkeys Skin plugin."},"$:/plugins/TheDiveO/VideojsHotkeys/license":{"title":"$:/plugins/TheDiveO/VideojsHotkeys/license","created":"20180127151728845","modified":"20180127151932518","tags":"","type":"text/vnd.tiddlywiki","text":"* The Video.js Hotkeys Plugin ([[$:/plugins/TheDiveO/VideojsHotkeys/videojs.hotkeys.js]]) is licensed under the [[Apache License 2.0|https://opensource.org/licenses/Apache-2.0]].\n* This plugin is licensed under the [[MIT License|http://opensource.org/licenses/MIT]]."},"$:/plugins/TheDiveO/VideojsHotkeys/readme":{"title":"$:/plugins/TheDiveO/VideojsHotkeys/readme","created":"20180127151555515","modified":"20180127151709239","tags":"","type":"text/vnd.tiddlywiki","text":"Provides the [[Video.js Hotkeys Plugin|https://github.com/ctd1500/videojs-hotkeys]] (~GitHub) by [[ctd1500|https://github.com/ctd1500]] (~GitHub) for use with the [[TwTube plugin|https://github.com/TheDiveO/TwTube]] (//you guessed right// ... ~GitHub). Simply install this plugin into your ~TiddlyWiki alongside the ~TwTube plugin and you're done."},"$:/plugins/TheDiveO/VideojsHotkeys/videojs.persistvolume.config":{"title":"$:/plugins/TheDiveO/VideojsHotkeys/videojs.persistvolume.config","created":"20180126205823852","modified":"20180126210055994","tags":"$:/tags/VideojsPluginConfig","type":"application/json","text":"{\n  \"hotkeys\": {\n    \"alwaysCaptureHotkeys\": \"true\",\n    \"seekStep\": \"15\"\n  }\n}\n"},"$:/plugins/TheDiveO/VideojsHotkeys/videojs.hotkeys.js":{"title":"$:/plugins/TheDiveO/VideojsHotkeys/videojs.hotkeys.js","text":"/*\\\ncreated: 20180127145118351\ntitle: $:/plugins/TheDiveO/VideojsHotkeys/videojs.hotkeys.js\ntags: $:/tags/VideojsPlugin\nmodified: 20180127145315645\ntype: application/javascript\n\\*/\n/*\n * Video.js Hotkeys\n * https://github.com/ctd1500/videojs-hotkeys\n *\n * Copyright (c) 2015 Chris Dougherty\n * Licensed under the Apache-2.0 license.\n */\n\n;(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define('videojs-hotkeys', ['video.js'], function (module) {\n      return factory(module.default || module);\n    });\n  } else if (typeof module !== 'undefined' && module.exports) {\n    module.exports = factory(require('video.js'));\n  } else {\n    factory(videojs);\n  }\n}(this, function (videojs) {\n  \"use strict\";\n  if (typeof window !== 'undefined') {\n    window['videojs_hotkeys'] = { version: \"0.2.20\" };\n  }\n\n  var hotkeys = function(options) {\n    var player = this;\n    var pEl = player.el();\n    var doc = document;\n    var def_options = {\n      volumeStep: 0.1,\n      seekStep: 5,\n      enableMute: true,\n      enableVolumeScroll: true,\n      enableFullscreen: true,\n      enableNumbers: true,\n      enableJogStyle: false,\n      alwaysCaptureHotkeys: false,\n      enableModifiersForNumbers: true,\n      enableInactiveFocus: true,\n      skipInitialFocus: false,\n      playPauseKey: playPauseKey,\n      rewindKey: rewindKey,\n      forwardKey: forwardKey,\n      volumeUpKey: volumeUpKey,\n      volumeDownKey: volumeDownKey,\n      muteKey: muteKey,\n      fullscreenKey: fullscreenKey,\n      customKeys: {}\n    };\n\n    var cPlay = 1,\n      cRewind = 2,\n      cForward = 3,\n      cVolumeUp = 4,\n      cVolumeDown = 5,\n      cMute = 6,\n      cFullscreen = 7;\n\n    // Use built-in merge function from Video.js v5.0+ or v4.4.0+\n    var mergeOptions = videojs.mergeOptions || videojs.util.mergeOptions;\n    options = mergeOptions(def_options, options || {});\n\n    var volumeStep = options.volumeStep,\n      seekStep = options.seekStep,\n      enableMute = options.enableMute,\n      enableVolumeScroll = options.enableVolumeScroll,\n      enableFull = options.enableFullscreen,\n      enableNumbers = options.enableNumbers,\n      enableJogStyle = options.enableJogStyle,\n      alwaysCaptureHotkeys = options.alwaysCaptureHotkeys,\n      enableModifiersForNumbers = options.enableModifiersForNumbers,\n      enableInactiveFocus = options.enableInactiveFocus,\n      skipInitialFocus = options.skipInitialFocus;\n\n    // Set default player tabindex to handle keydown and doubleclick events\n    if (!pEl.hasAttribute('tabIndex')) {\n      pEl.setAttribute('tabIndex', '-1');\n    }\n\n    // Remove player outline to fix video performance issue\n    pEl.style.outline = \"none\";\n\n    if (alwaysCaptureHotkeys || !player.autoplay()) {\n      if (!skipInitialFocus) {\n        player.one('play', function() {\n          pEl.focus(); // Fixes the .vjs-big-play-button handing focus back to body instead of the player\n        });\n      }\n    }\n\n    if (enableInactiveFocus) {\n      player.on('userinactive', function() {\n        // When the control bar fades, re-apply focus to the player if last focus was a control button\n        var cancelFocusingPlayer = function() {\n          clearTimeout(focusingPlayerTimeout);\n        };\n        var focusingPlayerTimeout = setTimeout(function() {\n          player.off('useractive', cancelFocusingPlayer);\n          if (doc.activeElement.parentElement == pEl.querySelector('.vjs-control-bar')) {\n            pEl.focus();\n          }\n        }, 10);\n\n        player.one('useractive', cancelFocusingPlayer);\n      });\n    }\n\n    player.on('play', function() {\n      // Fix allowing the YouTube plugin to have hotkey support.\n      var ifblocker = pEl.querySelector('.iframeblocker');\n      if (ifblocker && ifblocker.style.display === '') {\n        ifblocker.style.display = \"block\";\n        ifblocker.style.bottom = \"39px\";\n      }\n    });\n\n    var keyDown = function keyDown(event) {\n      var ewhich = event.which, wasPlaying, seekTime;\n      var ePreventDefault = event.preventDefault;\n      var duration = player.duration();\n      // When controls are disabled, hotkeys will be disabled as well\n      if (player.controls()) {\n\n        // Don't catch keys if any control buttons are focused, unless alwaysCaptureHotkeys is true\n        var activeEl = doc.activeElement;\n        if (alwaysCaptureHotkeys ||\n            activeEl == pEl ||\n            activeEl == pEl.querySelector('.vjs-tech') ||\n            activeEl == pEl.querySelector('.vjs-control-bar') ||\n            activeEl == pEl.querySelector('.iframeblocker')) {\n\n          switch (checkKeys(event, player)) {\n            // Spacebar toggles play/pause\n            case cPlay:\n              ePreventDefault();\n              if (alwaysCaptureHotkeys) {\n                // Prevent control activation with space\n                event.stopPropagation();\n              }\n\n              if (player.paused()) {\n                player.play();\n              } else {\n                player.pause();\n              }\n              break;\n\n            // Seeking with the left/right arrow keys\n            case cRewind: // Seek Backward\n              wasPlaying = !player.paused();\n              ePreventDefault();\n              if (wasPlaying) {\n                player.pause();\n              }\n              seekTime = player.currentTime() - seekStep;\n              // The flash player tech will allow you to seek into negative\n              // numbers and break the seekbar, so try to prevent that.\n              if (player.currentTime() <= seekStep) {\n                seekTime = 0;\n              }\n              player.currentTime(seekTime);\n              if (wasPlaying) {\n                player.play();\n              }\n              break;\n            case cForward: // Seek Forward\n              wasPlaying = !player.paused();\n              ePreventDefault();\n              if (wasPlaying) {\n                player.pause();\n              }\n              seekTime = player.currentTime() + seekStep;\n              // Fixes the player not sending the end event if you\n              // try to seek past the duration on the seekbar.\n              if (seekTime >= duration) {\n                seekTime = wasPlaying ? duration - .001 : duration;\n              }\n              player.currentTime(seekTime);\n              if (wasPlaying) {\n                player.play();\n              }\n              break;\n\n            // Volume control with the up/down arrow keys\n            case cVolumeDown:\n              ePreventDefault();\n              if (!enableJogStyle) {\n                player.volume(player.volume() - volumeStep);\n              } else {\n                seekTime = player.currentTime() - 1;\n                if (player.currentTime() <= 1) {\n                  seekTime = 0;\n                }\n                player.currentTime(seekTime);\n              }\n              break;\n            case cVolumeUp:\n              ePreventDefault();\n              if (!enableJogStyle) {\n                player.volume(player.volume() + volumeStep);\n              } else {\n                seekTime = player.currentTime() + 1;\n                if (seekTime >= duration) {\n                  seekTime = duration;\n                }\n                player.currentTime(seekTime);\n              }\n              break;\n\n            // Toggle Mute with the M key\n            case cMute:\n              if (enableMute) {\n                player.muted(!player.muted());\n              }\n              break;\n\n            // Toggle Fullscreen with the F key\n            case  cFullscreen:\n              if (enableFull) {\n                if (player.isFullscreen()) {\n                  player.exitFullscreen();\n                } else {\n                  player.requestFullscreen();\n                }\n              }\n              break;\n\n            default:\n              // Number keys from 0-9 skip to a percentage of the video. 0 is 0% and 9 is 90%\n              if ((ewhich > 47 && ewhich < 59) || (ewhich > 95 && ewhich < 106)) {\n                // Do not handle if enableModifiersForNumbers set to false and keys are Ctrl, Cmd or Alt\n                if (enableModifiersForNumbers || !(event.metaKey || event.ctrlKey || event.altKey)) {\n                  if (enableNumbers) {\n                    var sub = 48;\n                    if (ewhich > 95) {\n                      sub = 96;\n                    }\n                    var number = ewhich - sub;\n                    ePreventDefault();\n                    player.currentTime(player.duration() * number * 0.1);\n                  }\n                }\n              }\n\n              // Handle any custom hotkeys\n              for (var customKey in options.customKeys) {\n                var customHotkey = options.customKeys[customKey];\n                // Check for well formed custom keys\n                if (customHotkey && customHotkey.key && customHotkey.handler) {\n                  // Check if the custom key's condition matches\n                  if (customHotkey.key(event)) {\n                    ePreventDefault();\n                    customHotkey.handler(player, options, event);\n                  }\n                }\n              }\n          }\n        }\n      }\n    };\n\n    var doubleClick = function doubleClick(event) {\n      // When controls are disabled, hotkeys will be disabled as well\n      if (player.controls()) {\n\n        // Don't catch clicks if any control buttons are focused\n        var activeEl = event.relatedTarget || event.toElement || doc.activeElement;\n        if (activeEl == pEl ||\n            activeEl == pEl.querySelector('.vjs-tech') ||\n            activeEl == pEl.querySelector('.iframeblocker')) {\n\n          if (enableFull) {\n            if (player.isFullscreen()) {\n              player.exitFullscreen();\n            } else {\n              player.requestFullscreen();\n            }\n          }\n        }\n      }\n    };\n\n    var mouseScroll = function mouseScroll(event) {\n      // When controls are disabled, hotkeys will be disabled as well\n      if (player.controls()) {\n        var activeEl = event.relatedTarget || event.toElement || doc.activeElement;\n        if (alwaysCaptureHotkeys ||\n            activeEl == pEl ||\n            activeEl == pEl.querySelector('.vjs-tech') ||\n            activeEl == pEl.querySelector('.iframeblocker') ||\n            activeEl == pEl.querySelector('.vjs-control-bar')) {\n\n          if (enableVolumeScroll) {\n            event = window.event || event;\n            var delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));\n            event.preventDefault();\n\n            if (delta == 1) {\n              player.volume(player.volume() + volumeStep);\n            } else if (delta == -1) {\n              player.volume(player.volume() - volumeStep);\n            }\n          }\n        }\n      }\n    };\n\n    var checkKeys = function checkKeys(e, player) {\n      // Allow some modularity in defining custom hotkeys\n\n      // Play/Pause check\n      if (options.playPauseKey(e, player)) {\n        return cPlay;\n      }\n\n      // Seek Backward check\n      if (options.rewindKey(e, player)) {\n        return cRewind;\n      }\n\n      // Seek Forward check\n      if (options.forwardKey(e, player)) {\n        return cForward;\n      }\n\n      // Volume Up check\n      if (options.volumeUpKey(e, player)) {\n        return cVolumeUp;\n      }\n\n      // Volume Down check\n      if (options.volumeDownKey(e, player)) {\n        return cVolumeDown;\n      }\n\n      // Mute check\n      if (options.muteKey(e, player)) {\n        return cMute;\n      }\n\n      // Fullscreen check\n      if (options.fullscreenKey(e, player)) {\n        return cFullscreen;\n      }\n    };\n\n    function playPauseKey(e) {\n      // Space bar or MediaPlayPause\n      return (e.which === 32 || e.which === 179);\n    }\n\n    function rewindKey(e) {\n      // Left Arrow or MediaRewind\n      return (e.which === 37 || e.which === 177);\n    }\n\n    function forwardKey(e) {\n      // Right Arrow or MediaForward\n      return (e.which === 39 || e.which === 176);\n    }\n\n    function volumeUpKey(e) {\n      // Up Arrow\n      return (e.which === 38);\n    }\n\n    function volumeDownKey(e) {\n      // Down Arrow\n      return (e.which === 40);\n    }\n\n    function muteKey(e) {\n      // M key\n      return (e.which === 77);\n    }\n\n    function fullscreenKey(e) {\n      // F key\n      return (e.which === 70);\n    }\n\n    player.on('keydown', keyDown);\n    player.on('dblclick', doubleClick);\n    player.on('mousewheel', mouseScroll);\n    player.on(\"DOMMouseScroll\", mouseScroll);\n\n    return this;\n  };\n\n  var registerPlugin = videojs.registerPlugin || videojs.plugin;\n  registerPlugin('hotkeys', hotkeys);\n}));","created":"20180127145118351","tags":"$:/tags/VideojsPlugin","modified":"20180127145315645","type":"application/javascript"}}}
{"tiddlers":{"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/history":{"title":"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/history","created":"20180114170309007","modified":"20180128162545795","tags":"","type":"text/vnd.tiddlywiki","text":"* ''1.0.1'' -- adds `caption` field to support new skin selection in the Control Panel tab \"Media Player Skins\".\n* ''1.0.0'' -- first release of the ~YouTube-inspired Video.js Skin plugin."},"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/license":{"title":"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/license","created":"20180114170300930","modified":"20180114211253792","tags":"","type":"text/vnd.tiddlywiki","text":"This plugin and its CSS stylesheet are licensed under the [[MIT License|http://opensource.org/licenses/MIT]].\n"},"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/readme":{"title":"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/readme","created":"20180114170253183","modified":"20180114211345389","tags":"","type":"text/vnd.tiddlywiki","text":"Provides an YouTube-inspired Video.js skin for use with the [[TwTube plugin|https://github.com/TheDiveO/TwTube]] created using the [[Videojs Skin Generator|http://www.scriptsmashup.com/Video_Skin_Generator/Videojs/videojs-skin-generator.html]]. Simply install this plugin into your ~TiddlyWiki alongside the ~TwTube plugin and you're done.\n"},"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/styles/fixes.css":{"title":"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/styles/fixes.css","created":"20180114182654131","modified":"20180114182731430","tags":"$:/tags/TwTubeVideojsSkin","type":"text/css","text":".video-js .vjs-time-control {\n  padding-left: 0;\n  padding-right: 0;\n}\n"},"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/styles/skin.css":{"title":"$:/plugins/TheDiveO/YouTubeInspiredVideojsSkin/styles/skin.css","created":"20180114182654131","modified":"20180114182731430","tags":"$:/tags/TwTubeVideojsSkin","type":"text/css","text":".video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {\n    width: 10em\n}\n\n.video-js .vjs-controls-disabled .vjs-big-play-button {\n    display: none!important\n}\n\n.video-js .vjs-control {\n    width: 3em\n}\n\n.video-js .vjs-menu-button-inline:before {\n    width: 1.5em\n}\n\n.vjs-menu-button-inline .vjs-menu {\n    left: 3em\n}\n\n.vjs-paused.vjs-has-started.video-js .vjs-big-play-button,.video-js.vjs-ended .vjs-big-play-button,.video-js.vjs-paused .vjs-big-play-button {\n    display: block\n}\n\n.video-js .vjs-load-progress div,.vjs-seeking .vjs-big-play-button,.vjs-waiting .vjs-big-play-button {\n    display: none!important\n}\n\n.video-js .vjs-mouse-display:after,.video-js .vjs-play-progress:after {\n    padding: 0 .4em .3em\n}\n\n.video-js.vjs-ended .vjs-loading-spinner {\n    display: none;\n}\n\n.video-js.vjs-ended .vjs-big-play-button {\n    display: block !important;\n}\n\n.video-js *,.video-js:after,.video-js:before {\n    box-sizing: inherit;\n    font-size: inherit;\n    color: inherit;\n    line-height: inherit\n}\n\n.video-js.vjs-fullscreen,.video-js.vjs-fullscreen .vjs-tech {\n    width: 100%!important;\n    height: 100%!important\n}\n\n.video-js {\n    font-size: 14px;\n    overflow: hidden\n}\n\n.video-js .vjs-control {\n    color: inherit\n}\n\n.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline {\n    width: 8.35em\n}\n\n.video-js .vjs-volume-menu-button.vjs-volume-menu-button-horizontal:hover .vjs-menu .vjs-menu-content {\n    height: 3em;\n    width: 6.35em\n}\n\n.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before {\n    text-shadow: 0 0 1em #fff,0 0 1em #fff,0 0 1em #fff\n}\n\n.video-js .vjs-spacer,.video-js .vjs-time-control {\n    display: -webkit-box;\n    display: -moz-box;\n    display: -ms-flexbox;\n    display: -webkit-flex;\n    display: flex;\n    -webkit-box-flex: 1 1 auto;\n    -moz-box-flex: 1 1 auto;\n    -webkit-flex: 1 1 auto;\n    -ms-flex: 1 1 auto;\n    flex: 1 1 auto\n}\n\n.video-js .vjs-time-control {\n    -webkit-box-flex: 0 1 auto;\n    -moz-box-flex: 0 1 auto;\n    -webkit-flex: 0 1 auto;\n    -ms-flex: 0 1 auto;\n    flex: 0 1 auto;\n    width: auto\n}\n\n.video-js .vjs-time-control.vjs-time-divider {\n    width: 14px\n}\n\n.video-js .vjs-time-control.vjs-time-divider div {\n    width: 100%;\n    text-align: center\n}\n\n.video-js .vjs-time-control.vjs-current-time {\n    margin-left: 1em\n}\n\n.video-js .vjs-time-control .vjs-current-time-display,.video-js .vjs-time-control .vjs-duration-display {\n    width: 100%\n}\n\n.video-js .vjs-time-control .vjs-current-time-display {\n    text-align: right\n}\n\n.video-js .vjs-time-control .vjs-duration-display {\n    text-align: left\n}\n\n.video-js .vjs-play-progress:before,.video-js .vjs-progress-control .vjs-play-progress:before,.video-js .vjs-remaining-time,.video-js .vjs-volume-level:after,.video-js .vjs-volume-level:before,.video-js.vjs-live .vjs-time-control.vjs-current-time,.video-js.vjs-live .vjs-time-control.vjs-duration,.video-js.vjs-live .vjs-time-control.vjs-time-divider,.video-js.vjs-no-flex .vjs-time-control.vjs-remaining-time {\n    display: none\n}\n\n.video-js.vjs-no-flex .vjs-time-control {\n    display: table-cell;\n    width: 4em\n}\n\n.video-js .vjs-progress-control {\n    position: absolute;\n    left: 0;\n    right: 0;\n    width: 100%;\n    height: .5em;\n    top: -.5em\n}\n\n.video-js .vjs-progress-control .vjs-load-progress,.video-js .vjs-progress-control .vjs-play-progress,.video-js .vjs-progress-control .vjs-progress-holder {\n    height: 100%\n}\n\n.video-js .vjs-progress-control .vjs-progress-holder {\n    margin: 0\n}\n\n.video-js .vjs-progress-control:hover {\n    height: 1.5em;\n    top: -1.5em\n}\n\n.video-js .vjs-control-bar {\n    -webkit-transition: -webkit-transform .1s ease 0s;\n    -moz-transition: -moz-transform .1s ease 0s;\n    -ms-transition: -ms-transform .1s ease 0s;\n    -o-transition: -o-transform .1s ease 0s;\n    transition: transform .1s ease 0s\n}\n\n.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-control-bar,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-control-bar {\n    visibility: visible;\n    opacity: 1;\n    -webkit-backface-visibility: hidden;\n    -webkit-transform: translateY(3em);\n    -moz-transform: translateY(3em);\n    -ms-transform: translateY(3em);\n    -o-transform: translateY(3em);\n    transform: translateY(3em);\n    -webkit-transition: -webkit-transform 1s ease 0s;\n    -moz-transition: -moz-transform 1s ease 0s;\n    -ms-transition: -ms-transform 1s ease 0s;\n    -o-transition: -o-transform 1s ease 0s;\n    transition: transform 1s ease 0s\n}\n\n.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-progress-control,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive .vjs-progress-control {\n    height: .25em;\n    top: -.25em;\n    pointer-events: none;\n    -webkit-transition: height 1s,top 1s;\n    -moz-transition: height 1s,top 1s;\n    -ms-transition: height 1s,top 1s;\n    -o-transition: height 1s,top 1s;\n    transition: height 1s,top 1s\n}\n\n.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-active.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-paused.vjs-user-inactive.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-active.vjs-fullscreen .vjs-progress-control,.video-js.not-hover.vjs-has-started.vjs-playing.vjs-user-inactive.vjs-fullscreen .vjs-progress-control,.video-js.vjs-has-started.vjs-playing.vjs-user-inactive.vjs-fullscreen .vjs-progress-control {\n    opacity: 0;\n    -webkit-transition: opacity 1s ease 1s;\n    -moz-transition: opacity 1s ease 1s;\n    -ms-transition: opacity 1s ease 1s;\n    -o-transition: opacity 1s ease 1s;\n    transition: opacity 1s ease 1s\n}\n\n.video-js.vjs-live .vjs-live-control {\n    margin-left: 1em\n}\n\n.video-js .vjs-big-play-button {\n    top: 50%;\n    left: 50%;\n    margin-left: -1em;\n    margin-top: -1em;\n    width: 2em;\n    height: 2em;\n    line-height: 2em;\n    border: none;\n    border-radius: 50%;\n    font-size: 3.5em;\n    background-color: rgba(0,0,0,.45);\n    color: #fff;\n    -webkit-transition: border-color .4s,outline .4s,background-color .4s;\n    -moz-transition: border-color .4s,outline .4s,background-color .4s;\n    -ms-transition: border-color .4s,outline .4s,background-color .4s;\n    -o-transition: border-color .4s,outline .4s,background-color .4s;\n    transition: border-color .4s,outline .4s,background-color .4s\n}\n\n.video-js .vjs-menu-button-popup .vjs-menu {\n    left: -3em\n}\n\n.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n    background-color: transparent;\n    width: 12em;\n    left: -1.5em;\n    padding-bottom: .5em\n}\n\n.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-item,.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-title {\n    background-color: #151b17;\n    margin: .3em 0;\n    padding: .5em;\n    border-radius: .3em\n}\n\n.video-js .vjs-menu-button-popup .vjs-menu .vjs-menu-item.vjs-selected {\n    background-color: #2483d5\n}\n\n.video-js .vjs-big-play-button {\n    background-color: rgba(0,0,0,0.5);\n    font-size: 3.5em;\n    border-radius: 20%;\n    height: 1.4em !important;\n    line-height: 1.4em !important;\n    margin-top: -0.7em !important\n}\n\n.video-js:hover .vjs-big-play-button,.video-js .vjs-big-play-button:focus,.video-js .vjs-big-play-button:active {\n    background-color: #cc181e\n}\n\n.video-js .vjs-loading-spinner {\n    border-color: #cc181e\n}\n\n.video-js .vjs-control-bar2 {\n    background-color: #000000\n}\n\n.video-js .vjs-control-bar {\n    background-color: rgba(0,0,0,0.3) !important;\n    color: #ffffff;\n    font-size: 18px\n}\n\n.video-js .vjs-play-progress,.video-js  .vjs-volume-level {\n    background-color: #cc181e\n}\n\n.video-js .vjs-load-progress {\n    background: rgba(255,255,255,0.3);\n}\n"}}}
{
    "tiddlers": {
        "$:/plugins/tiddlywiki/googleanalytics/googleanalytics.js": {
            "title": "$:/plugins/tiddlywiki/googleanalytics/googleanalytics.js",
            "text": "/*\\\ntitle: $:/plugins/tiddlywiki/googleanalytics/googleanalytics.js\ntype: application/javascript\nmodule-type: startup\n\nRuns Google Analytics with the account number in the tiddler `$:/GoogleAnalyticsAccount` and the domain name in `$:/GoogleAnalyticsDomain`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"google-analytics\";\nexports.platforms = [\"browser\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// getting parameters\n\tvar GA_ACCOUNT = $tw.wiki.getTiddlerText(\"$:/GoogleAnalyticsAccount\",\"\").replace(/\\n/g,\"\"),\n\t\tGA_DOMAIN = $tw.wiki.getTiddlerText(\"$:/GoogleAnalyticsDomain\",\"\").replace(/\\n/g,\"\");\n\tif (GA_DOMAIN == \"\" || GA_DOMAIN == undefined) GA_DOMAIN = \"auto\";\n\n\t// using ga \"isogram\" function\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');\n\n  ga('create', GA_ACCOUNT, GA_DOMAIN);\n  ga('send', 'pageview');\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/plugins/tiddlywiki/googleanalytics/readme": {
            "title": "$:/plugins/tiddlywiki/googleanalytics/readme",
            "text": "This plugin enables you to use Google Analytics to track access to your online TiddlyWiki document. Based upon the [[official Google code|https://developers.google.com/analytics/devguides/collection/analyticsjs]].\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/googleanalytics]]\n"
        },
        "$:/plugins/tiddlywiki/googleanalytics/settings": {
            "title": "$:/plugins/tiddlywiki/googleanalytics/settings",
            "text": "You have only two value to set, only first is mandatory:\n\n# ''[[Google Analytics Account|$:/GoogleAnalyticsAccount]]'': (mandatory) a code of the form `UA-XXXXXX-XX` where X are digits<br/><$edit-text tiddler=\"$:/GoogleAnalyticsAccount\" default=\"\" tag=\"input\"/>\n\n# ''[[Google Analytics Domain|$:/GoogleAnalyticsDomain]]'': (optional) the website URL where the TiddlyWiki file is published. Defaults to `auto` if not set.<br/><$edit-text tiddler=\"$:/GoogleAnalyticsDomain\" default=\"\" tag=\"input\"/>\n"
        },
        "$:/plugins/tiddlywiki/googleanalytics/usage": {
            "title": "$:/plugins/tiddlywiki/googleanalytics/usage",
            "text": "!! Create a Google Analytics account\n\nIf you don't already have an account:\n\n# Go to the Google Analytics website: http://www.google.com/analytics/\n# Click the ''Access Google Analytics'' button and follow instructions to set up your account\n# Enter the URL where the wiki is hosted\n# Note the Tracking ID for this domain of the form `UA-XXXXXX-XX`\n\n!! Install the plugin on your local copy of the TiddlyWiki\n\n# ''Backup your TiddlyWiki''. Just in case\n# Install the plugin via the plugin manager in control panel\n# Save the TiddlyWiki andrefresh the page to load the plugin\n# Go to [[$:/ControlPanel]] > Plugins tab and unfold the Google Analytics Plugin\n# Go to the //settings// tab and edit the parameters\n# Save the TiddlyWiki\n\n!! Upload the new version of your TiddlyWiki\n\n# Upload the saved TiddlyWiki to TiddlySpot, GitHub, GitLab or other web host\n# Return to your Google Analytics page to check that your site is being tracked\n"
        }
    }
}
{
    "tiddlers": {
        "$:/config/HighlightPlugin/TypeMappings/application/javascript": {
            "title": "$:/config/HighlightPlugin/TypeMappings/application/javascript",
            "text": "javascript"
        },
        "$:/config/HighlightPlugin/TypeMappings/application/json": {
            "title": "$:/config/HighlightPlugin/TypeMappings/application/json",
            "text": "json"
        },
        "$:/config/HighlightPlugin/TypeMappings/text/css": {
            "title": "$:/config/HighlightPlugin/TypeMappings/text/css",
            "text": "css"
        },
        "$:/config/HighlightPlugin/TypeMappings/text/html": {
            "title": "$:/config/HighlightPlugin/TypeMappings/text/html",
            "text": "html"
        },
        "$:/config/HighlightPlugin/TypeMappings/image/svg+xml": {
            "title": "$:/config/HighlightPlugin/TypeMappings/image/svg+xml",
            "text": "xml"
        },
        "$:/config/HighlightPlugin/TypeMappings/text/x-markdown": {
            "title": "$:/config/HighlightPlugin/TypeMappings/text/x-markdown",
            "text": "markdown"
        },
        "$:/plugins/tiddlywiki/highlight/highlight.js": {
            "text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */\n!function(e){var n=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\\blang(?:uage)?-([\\w-]+)\\b/i,t=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,r={case_insensitive:\"cI\",lexemes:\"l\",contains:\"c\",keywords:\"k\",subLanguage:\"sL\",className:\"cN\",begin:\"b\",beginKeywords:\"bK\",end:\"e\",endsWithParent:\"eW\",illegal:\"i\",excludeBegin:\"eB\",excludeEnd:\"eE\",returnBegin:\"rB\",returnEnd:\"rE\",variants:\"v\",IDENT_RE:\"IR\",UNDERSCORE_IDENT_RE:\"UIR\",NUMBER_RE:\"NR\",C_NUMBER_RE:\"CNR\",BINARY_NUMBER_RE:\"BNR\",RE_STARTERS_RE:\"RSR\",BACKSLASH_ESCAPE:\"BE\",APOS_STRING_MODE:\"ASM\",QUOTE_STRING_MODE:\"QSM\",PHRASAL_WORDS_MODE:\"PWM\",C_LINE_COMMENT_MODE:\"CLCM\",C_BLOCK_COMMENT_MODE:\"CBCM\",HASH_COMMENT_MODE:\"HCM\",NUMBER_MODE:\"NM\",C_NUMBER_MODE:\"CNM\",BINARY_NUMBER_MODE:\"BNM\",CSS_NUMBER_MODE:\"CSSNM\",REGEXP_MODE:\"RM\",TITLE_MODE:\"TM\",UNDERSCORE_TITLE_MODE:\"UTM\",COMMENT:\"C\",beginRe:\"bR\",endRe:\"eR\",illegalRe:\"iR\",lexemesRe:\"lR\",terminators:\"t\",terminator_end:\"tE\"},m=\"</span>\",O=\"Could not find the language '{}', did you forget to load/include a language module?\",B={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},o=\"of and for in not or if then\".split(\" \");function x(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:\"start\",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:\"stop\",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a=\"\",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"===n[0].event?e:n:e.length?e:n}function c(e){a+=\"<\"+g(e)+f.map.call(e.attributes,function(e){return\" \"+e.nodeName+'=\"'+x(e.value).replace(/\"/g,\"&quot;\")+'\"'}).join(\"\")+\">\"}function l(e){a+=\"</\"+g(e)+\">\"}function u(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else\"start\"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return\"string\"==typeof n?t(\"keyword\",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(\" \").forEach(function(e){var n=e.split(\"|\");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),\"m\"+(r.cI?\"i\":\"\")+(n?\"g\":\"\"))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?\"\\\\.?(?:\"+e.b+\")\\\\.?\":e.b)}a.tE&&n(\"end\",a.tE),a.i&&n(\"illegal\",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./,r=0,a=\"\",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+=\"(\";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),\"\\\\\"==l[0][0]&&l[1]?a+=\"\\\\\"+String(Number(l[1])+o):(a+=l[0],\"(\"==l[0]&&r++)}a+=\")\"}return a}(u,\"|\"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[\"\"+r]){n=o[\"\"+r];break}return\"string\"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type=\"begin\",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf(\"self\")){if(!C)throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");r.c=r.c.filter(function(e){return\"self\"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\\w+/,!0),e&&(t.bK&&(t.b=\"\\\\b(\"+t.bK.split(\" \").join(\"|\")+\")\\\\b\"),t.b||(t.b=/\\B|\\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\\B|\\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||\"\",t.eW&&e.tE&&(t.tE+=(t.e?\"|\":\"\")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R(\"self\"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&\"\"===n)return\"\";if(!e)return n;var a='<span class=\"'+(r?\"\":B.classPrefix);return(a+=e+'\">')+n+(t?\"\":m)}function l(){p+=null!=d.sL?function(){var e=\"string\"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r=\"\",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=\"\"}function u(e){p+=e.cN?c(e.cN,\"\",!0):\"\",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if(\"begin\"==f.type&&\"end\"==n.type&&f.index==n.index&&\"\"===t)return v+=i.slice(n.index,n.index+1),1;if(\"begin\"===(f=n).type)return s(n);if(\"illegal\"===n.type&&!a)throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(d.cN||\"<unnamed>\")+'\"');if(\"end\"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace(\"{}\",n)),new Error('Unknown language: \"'+n+'\"');S(g);var E,d=t||g,R={},p=\"\";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,\"\",!0)+p);var v=\"\",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf(\"Illegal\"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&\"\\n\"===e?\"<br>\":B.tabReplace?n.replace(/\\t/g,B.tabReplace):\"\"}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace(\"{}\",t[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),o?t[1]:\"no-highlight\"}for(n=0,r=(i=i.split(/\\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement(\"div\")).innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement(\"div\")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||\"\").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener(\"DOMContentLoaded\",h,!1),window.addEventListener(\"load\",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE=\"[a-zA-Z]\\\\w*\",a.UIR=a.UNDERSCORE_IDENT_RE=\"[a-zA-Z_]\\\\w*\",a.NR=a.NUMBER_RE=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",a.CNR=a.C_NUMBER_RE=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",a.BNR=a.BINARY_NUMBER_RE=\"\\\\b(0b[01]+)\",a.RSR=a.RE_STARTERS_RE=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",a.BE=a.BACKSLASH_ESCAPE={b:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:\"comment\",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C(\"//\",\"$\"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C(\"/\\\\*\",\"\\\\*/\"),a.HCM=a.HASH_COMMENT_MODE=a.C(\"#\",\"$\"),a.NM=a.NUMBER_MODE={cN:\"number\",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:\"number\",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:\"number\",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:\"number\",b:a.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},a.RM=a.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[a.BE,{b:/\\[/,e:/\\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:\"title\",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:\"title\",b:a.UIR,relevance:0},a.METHOD_GUARD={b:\"\\\\.\\\\s*\"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r=\"function\"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||\"object\"!=typeof t[e]&&\"function\"!=typeof t[e]||r&&(\"caller\"===e||\"callee\"===e||\"arguments\"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage(\"swift\",function(e){var i={keyword:\"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet\",literal:\"true false nil\",built_in:\"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip\"},t=e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),n={cN:\"subst\",b:/\\\\\\(/,e:\"\\\\)\",k:i,c:[]},r={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/\"/,e:/\"/}]},a={cN:\"number\",b:\"\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b\",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*[!?]\"},{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*\",relevance:0},a,{cN:\"function\",bK:\"func\",e:\"{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:i,c:[\"self\",a,r,e.CBCM,{b:\":\"}],i:/[\"']/}],i:/\\[|%/},{cN:\"class\",bK:\"struct protocol class extension enum\",k:i,e:\"\\\\{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/})]},{cN:\"meta\",b:\"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\"},{bK:\"import\",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage(\"less\",function(e){function r(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a=\"[\\\\w-]+\",c=\"(\"+a+\"|@{\"+a+\"})\",s=[],n=[],b={b:\"\\\\(\",e:\"\\\\)\",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r(\"'\"),r('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},t(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),b,t(\"variable\",\"@@?\"+a,10),t(\"variable\",\"@{\"+a+\"}\"),t(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:a+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=n.concat({b:\"{\",e:\"}\",c:s}),l={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(n)},o={b:c+\"\\\\s*:\",rB:!0,e:\"[;}]\",relevance:0,c:[{cN:\"attribute\",b:c,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",relevance:0,c:n}}]},u={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:n,relevance:0}},v={cN:\"variable\",v:[{b:\"@\"+a+\"\\\\s*:\",relevance:15},{b:\"@\"+a}],starts:{e:\"[;}]\",rE:!0,c:i}},C={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:c,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",relevance:0,c:[e.CLCM,e.CBCM,l,t(\"keyword\",\"all\\\\b\"),t(\"variable\",\"@{\"+a+\"}\"),t(\"selector-tag\",c+\"%?\",0),t(\"selector-id\",\"#\"+c),t(\"selector-class\",\"\\\\.\"+c,0),t(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:\"[=>'/<($\\\"]\",c:s}});hljs.registerLanguage(\"armasm\",function(s){return{cI:!0,aliases:[\"arm\"],l:\"\\\\.?\"+s.IR,k:{meta:\".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND \",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @\"},c:[{cN:\"keyword\",b:\"\\\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?\",e:\"\\\\s\"},s.C(\"[;@]\",\"$\",{relevance:0}),s.CBCM,s.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",relevance:0},{cN:\"title\",b:\"\\\\|\",e:\"\\\\|\",i:\"\\\\n\",relevance:0},{cN:\"number\",v:[{b:\"[#$=]?0x[0-9a-f]+\"},{b:\"[#$=]?0b[01]+\"},{b:\"[#$=]\\\\d+\"},{b:\"\\\\b\\\\d+\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+\"},{b:\"^\\\\s*[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+:\"},{b:\"[=#]\\\\w+\"}],relevance:0}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",b={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},r={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[r]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[r],relevance:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:b},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<[-~]?'?(\\w+)(?:.|\\n)*?\\n\\s*\\1\\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:b},l=[t,a,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",relevance:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[t,{b:c}],relevance:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:b},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[a,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\\s*=>/,starts:{e:\"$\",c:i.c=l}},{cN:\"meta\",b:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>)\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:b,i:/\\/\\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage(\"lua\",function(e){var t=\"\\\\[=*\\\\[\",a=\"\\\\]=*\\\\]\",n={b:t,e:a,c:[\"self\"]},l=[e.C(\"--(?!\"+t+\")\",\"$\"),e.C(\"--\"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:\"true false nil\",keyword:\"and break do else elseif end for goto if in local not or repeat return then until while\",built_in:\"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove\"},c:l.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[e.inherit(e.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:\"string\",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage(\"matlab\",function(e){var a=\"('|\\\\.')+\",s={relevance:0,c:[{b:a}]};return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell \"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[e.UTM,{cN:\"params\",v:[{b:\"\\\\(\",e:\"\\\\)\"},{b:\"\\\\[\",e:\"\\\\]\"}]}]},{cN:\"built_in\",b:/true|false/,relevance:0,starts:s},{b:\"[a-zA-Z][a-zA-Z_0-9]*\"+a,relevance:0},{cN:\"number\",b:e.CNR,relevance:0,starts:s},{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{b:/\\]|}|\\)/,relevance:0,starts:s},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}],starts:s},e.C(\"^\\\\s*\\\\%\\\\{\\\\s*$\",\"^\\\\s*\\\\%\\\\}\\\\s*$\"),e.C(\"\\\\%\",\"$\")]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,relevance:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,relevance:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"yaml\",function(e){var b=\"true false yes no null\",a={cN:\"string\",relevance:0,v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/\\S+/}],c:[e.BE,{cN:\"template-variable\",v:[{b:\"{{\",e:\"}}\"},{b:\"%{\",e:\"}\"}]}]};return{cI:!0,aliases:[\"yml\",\"YAML\",\"yaml\"],c:[{cN:\"attr\",v:[{b:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{b:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{b:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{cN:\"meta\",b:\"^---s*$\",relevance:10},{cN:\"string\",b:\"[\\\\|>]([0-9]?[+-])?[ ]*\\\\n( *)[\\\\S ]+\\\\n(\\\\2[\\\\S ]+\\\\n?)*\"},{b:\"<%[%=-]?\",e:\"[%-]?%>\",sL:\"ruby\",eB:!0,eE:!0,relevance:0},{cN:\"type\",b:\"!\"+e.UIR},{cN:\"type\",b:\"!!\"+e.UIR},{cN:\"meta\",b:\"&\"+e.UIR+\"$\"},{cN:\"meta\",b:\"\\\\*\"+e.UIR+\"$\"},{cN:\"bullet\",b:\"\\\\-(?=[ ]|$)\",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:\"number\",b:e.CNR+\"\\\\b\"},a]}});hljs.registerLanguage(\"plaintext\",function(e){return{disableAutodetect:!0}});hljs.registerLanguage(\"erlang-repl\",function(e){return{k:{built_in:\"spawn spawn_link self\",keyword:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"meta\",b:\"^[0-9]+> \",relevance:10},e.C(\"%\",\"$\"),{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},e.ASM,e.QSM,{b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{b:\"->\"},{b:\"ok\"},{b:\"!\"},{b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",relevance:0},{b:\"[A-Z][a-zA-Z0-9_']*\",relevance:0}]}});hljs.registerLanguage(\"cmake\",function(e){return{aliases:[\"cmake.in\"],cI:!0,k:{keyword:\"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined\"},c:[{cN:\"variable\",b:\"\\\\${\",e:\"}\"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage(\"kotlin\",function(e){var t={keyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default\",built_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",literal:\"true false null\"},a={cN:\"symbol\",b:e.UIR+\"@\"},n={cN:\"subst\",b:\"\\\\${\",e:\"}\",c:[e.CNM]},c={cN:\"variable\",b:\"\\\\$\"+e.UIR},r={cN:\"string\",v:[{b:'\"\"\"',e:'\"\"\"(?=[^\"])',c:[c,n]},{b:\"'\",e:\"'\",i:/\\n/,c:[e.BE]},{b:'\"',e:'\"',i:/\\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:\"meta\",b:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UIR+\")?\"},l={cN:\"meta\",b:\"@\"+e.UIR,c:[{b:/\\(/,e:/\\)/,c:[e.inherit(r,{cN:\"meta-string\"})]}]},s={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0},b=e.C(\"/\\\\*\",\"\\\\*/\",{c:[e.CBCM]}),o={v:[{cN:\"type\",b:e.UIR},{b:/\\(/,e:/\\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:[\"kt\"],k:t,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,b,{cN:\"keyword\",b:/\\b(break|continue|return|this)\\b/,starts:{c:[{cN:\"symbol\",b:/@\\w+/}]}},a,i,l,{cN:\"function\",bK:\"fun\",e:\"[(]|$\",rB:!0,eE:!0,k:t,i:/fun\\s+(<.*>)?[^\\s\\(]+(\\s+[^\\s\\(]+)\\s*=/,relevance:5,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"type\",b:/</,e:/>/,k:\"reified\",relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:\"class\",bK:\"class interface trait\",e:/[:\\{(]|$/,eE:!0,i:\"extends implements\",c:[{bK:\"public protected internal private constructor\"},e.UTM,{cN:\"type\",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:\"type\",b:/[,:]\\s*/,e:/[<\\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:\"meta\",b:\"^#!/usr/bin/env\",e:\"$\",i:\"\\n\"},s]}});hljs.registerLanguage(\"javascript\",function(e){var r=\"<>\",a=\"</>\",t={b:/<[A-Za-z0-9\\\\._:-]+/,e:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/},c=\"[A-Za-z$_][0-9A-Za-z$_]*\",n={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:n,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},b={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},l={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],k:n,c:[{cN:\"meta\",relevance:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\",c:[{cN:\"type\",b:\"\\\\{\",e:\"\\\\}\",relevance:0},{cN:\"variable\",b:c+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{b:/(?=[^\\n])\\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\\n]\\s*/,relevance:0,c:[{b:c+\"\\\\s*:\",rB:!0,relevance:0,c:[{cN:\"attr\",b:c,relevance:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+c+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:c},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:\"\",b:/\\s/,e:/\\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:\"xml\",c:[{b:t.b,e:t.e,skip:!0,c:[\"self\"]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:u}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor get set\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"scss\",function(e){var t=\"@[a-z-]+\",r={cN:\"variable\",b:\"(\\\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\\\b\"},i={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",relevance:0},{cN:\"selector-pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"selector-pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},r,{cN:\"attribute\",b:\"\\\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@(page|font-face)\",l:t,k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",rB:!0,k:\"and or not only\",c:[{b:t,cN:\"keyword\"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:c,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",relevance:5},{b:\"qw\\\\s+q\",e:\"q\",relevance:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],relevance:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],relevance:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",relevance:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",relevance:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],relevance:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,relevance:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",relevance:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=a,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s.c=a}});hljs.registerLanguage(\"go\",function(e){var n={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",literal:\"true false iota nil\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:n,i:\"</\",c:[e.CLCM,e.CBCM,{cN:\"string\",v:[e.QSM,e.ASM,{b:\"`\",e:\"`\"}]},{cN:\"number\",v:[{b:e.CNR+\"[i]\",relevance:1},e.CNM]},{b:/:=/},{cN:\"function\",bK:\"func\",e:\"\\\\s*(\\\\{|$)\",eE:!0,c:[e.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:n,i:/[\"']/}]}]}});hljs.registerLanguage(\"x86asm\",function(s){return{cI:!0,l:\"[.%]?\"+s.IR,k:{keyword:\"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63\",built_in:\"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0  xmm1  xmm2  xmm3  xmm4  xmm5  xmm6  xmm7  xmm8  xmm9 xmm10  xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0  ymm1  ymm2  ymm3  ymm4  ymm5  ymm6  ymm7  ymm8  ymm9 ymm10  ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0  zmm1  zmm2  zmm3  zmm4  zmm5  zmm6  zmm7  zmm8  zmm9 zmm10  zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr\",meta:\"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__  __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__  __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__\"},c:[s.C(\";\",\"$\",{relevance:0}),{cN:\"number\",v:[{b:\"\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b\",relevance:0},{b:\"\\\\$[0-9][0-9A-Fa-f]*\",relevance:0},{b:\"\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b\"},{b:\"\\\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b\"}]},s.QSM,{cN:\"string\",v:[{b:\"'\",e:\"[^\\\\\\\\]'\"},{b:\"`\",e:\"[^\\\\\\\\]`\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)\"},{b:\"^\\\\s*%%[A-Za-z0-9_$#@~.?]*:\"}],relevance:0},{cN:\"subst\",b:\"%[0-9]+\",relevance:0},{cN:\"subst\",b:\"%!S+\",relevance:0},{cN:\"meta\",b:/^\\s*\\.[\\w_-]+/}]}});hljs.registerLanguage(\"cpp\",function(e){function t(e){return\"(?:\"+e+\")?\"}var r=\"decltype\\\\(auto\\\\)\",a=\"[a-zA-Z_]\\\\w*::\",i=\"(\"+r+\"|\"+t(a)+\"[a-zA-Z_]\\\\w*\"+t(\"<.*?>\")+\")\",c={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},s={cN:\"string\",v:[{b:'(u8?|U|L)?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",e:\"'\",i:\".\"},{b:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\((?:.|\\n)*?\\)\\1\"/}]},n={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},o={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(s,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},l={cN:\"title\",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+\"\\\\s*\\\\(\",p={keyword:\"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\",built_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary\",literal:\"true false nullptr NULL\"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:p,c:m.concat([{b:/\\(/,e:/\\)/,k:p,c:m.concat([\"self\"]),relevance:0}]),relevance:0},b={cN:\"function\",b:\"(\"+i+\"[\\\\*&\\\\s]+)+\"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\\w\\s\\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\\(/,e:/\\)/,k:p,relevance:0,c:[\"self\",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\",\"hh\",\"hxx\",\"cxx\"],k:p,i:\"</\",c:[].concat(d,b,m,[o,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:p,c:[\"self\",c]},{b:e.IR+\"::\",k:p},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage(\"arduino\",function(e){var t=\"boolean byte word String\",r=\"setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put\",i=\"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW\",o=e.requireLanguage(\"cpp\").rawDefinition(),a=o.k;return a.keyword+=\" \"+t,a.literal+=\" \"+i,a.built_in+=\" \"+r,o});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},relevance:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",relevance:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],relevance:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:b}],relevance:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"xml\",function(e){var c={cN:\"symbol\",b:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},s={b:\"\\\\s\",c:[{cN:\"meta-keyword\",b:\"#?[a-z_][a-z1-9_-]+\",i:\"\\\\n\"}]},a=e.inherit(s,{b:\"\\\\(\",e:\"\\\\)\"}),t=e.inherit(e.ASM,{cN:\"meta-string\"}),l=e.inherit(e.QSM,{cN:\"meta-string\"}),r={eW:!0,i:/</,relevance:0,c:[{cN:\"attr\",b:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{b:/=\\s*/,relevance:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],cI:!0,c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",relevance:10,c:[s,l,t,a,{b:\"\\\\[\",e:\"\\\\]\",c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",c:[s,a,l,t]}]}]},e.C(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",relevance:10},c,{cN:\"meta\",b:/<\\?xml/,e:/\\?>/,relevance:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0},{b:'b\"',e:'\"',skip:!0},{b:\"b'\",e:\"'\",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:\"tag\",b:\"<style(?=\\\\s|>)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"<\\/script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,relevance:0},r]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",relevance:0},{cN:\"bullet\",b:\"^\\\\s*([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",relevance:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```\\\\w*\\\\s*$\",e:\"^```[ ]*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\\\\t)\",e:\"$\",relevance:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,relevance:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],relevance:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"properties\",function(e){var r=\"[ \\\\t\\\\f]*\",t=\"(\"+r+\"[:=]\"+r+\"|[ \\\\t\\\\f]+)\",n=\"([^\\\\\\\\\\\\W:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",a=\"([^\\\\\\\\:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",c={e:t,relevance:0,starts:{cN:\"string\",e:/$/,relevance:0,c:[{b:\"\\\\\\\\\\\\n\"}]}};return{cI:!0,i:/\\S/,c:[e.C(\"^\\\\s*[!#]\",\"$\"),{b:n+t,rB:!0,c:[{cN:\"attr\",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:\"meta\",b:a,endsParent:!0,relevance:0}],starts:c},{cN:\"attr\",relevance:0,b:a+r+\"$\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},a={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,relevance:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],relevance:0},e.HCM,a,{cN:\"\",b:/\\\\\"/},{cN:\"string\",b:/'/,e:/'/},t]}});hljs.registerLanguage(\"dockerfile\",function(e){return{aliases:[\"docker\"],cI:!0,k:\"from maintainer expose env arg user onbuild stopsignal\",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:\"run cmd entrypoint volume add copy workdir label healthcheck shell\",starts:{e:/[^\\\\]$/,sL:\"bash\"}}],i:\"</\"}});hljs.registerLanguage(\"python\",function(e){var r={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10\",built_in:\"Ellipsis NotImplemented\",literal:\"False None True\"},b={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},c={cN:\"subst\",b:/\\{/,e:/\\}/,k:r,i:/#/},a={b:/\\{\\{/,relevance:0},l={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)\"/,e:/\"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:\"number\",relevance:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},i={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:[\"py\",\"gyp\",\"ipython\"],k:r,i:/(<\\/|->|\\?)|=>/,c:[b,n,{bK:\"if\",relevance:0},l,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"number\",relevance:0,v:[{b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},n={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",relevance:10},{b:'\"\"\"',e:'\"\"\"',relevance:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[a,{cN:\"section\",b:/\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_\\.-]+(?=\\s*=\\s*)/,cN:\"attr\",starts:{e:/$/,c:[a,{b:/\\[/,e:/\\]/,c:[a,r,c,n,b,\"self\"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",relevance:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/^\\*{15}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",relevance:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null unknown\",built_in:\"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage(\"vala\",function(e){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object Gtk Posix\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface namespace\",e:\"{\",eE:!0,i:\"[^,:\\\\n\\\\s\\\\.]\",c:[e.UTM]},e.CLCM,e.CBCM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',relevance:5},e.ASM,e.QSM,e.CNM,{cN:\"meta\",b:\"^#\",e:\"$\",relevance:2}]}});hljs.registerLanguage(\"asciidoc\",function(e){return{aliases:[\"adoc\"],c:[e.C(\"^/{4,}\\\\n\",\"\\\\n/{4,}$\",{relevance:10}),e.C(\"^//\",\"$\",{relevance:0}),{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",relevance:10},{cN:\"section\",relevance:10,v:[{b:\"^(={1,5}) .+?( \\\\1)?$\"},{b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\"}]},{cN:\"meta\",b:\"^:.+?:\",e:\"\\\\s\",eE:!0,relevance:10},{cN:\"meta\",b:\"^\\\\[.+?\\\\]$\",relevance:0},{cN:\"quote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",relevance:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",relevance:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",relevance:0}],relevance:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"symbol\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",relevance:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",relevance:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",relevance:0}],relevance:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",relevance:0},{cN:\"string\",v:[{b:\"``.+?''\"},{b:\"`.+?'\"}]},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",relevance:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",relevance:0},{b:\"^'{3,}[ \\\\t]*$\",relevance:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:!0,c:[{b:\"(link|image:?):\",relevance:0},{cN:\"link\",b:\"\\\\w\",e:\"[^\\\\[]+\",relevance:0},{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:c,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})].concat(n),i:\"\\\\S\"},a={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(e){var t=\"([ui](8|16|32|64|128|size)|f(32|64))?\",r=\"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!\";return{aliases:[\"rs\"],k:{keyword:\"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield\",literal:\"true false Some None Ok Err\",built_in:r},l:e.IR+\"!?\",i:\"</\",c:[e.CLCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),e.inherit(e.QSM,{b:/b?\"/,i:null}),{cN:\"string\",v:[{b:/r(#*)\"(.|\\n)*?\"\\1(?!#)/},{b:/b?'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/}]},{cN:\"symbol\",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:\"number\",v:[{b:\"\\\\b0b([01_]+)\"+t},{b:\"\\\\b0o([0-7_]+)\"+t},{b:\"\\\\b0x([A-Fa-f0-9_]+)\"+t},{b:\"\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)\"+t}],relevance:0},{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",eE:!0,c:[e.UTM]},{cN:\"meta\",b:\"#\\\\!?\\\\[\",e:\"\\\\]\",c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{cN:\"class\",bK:\"type\",e:\";\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"\\\\S\"},{cN:\"class\",bK:\"trait enum struct union\",e:\"{\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"[\\\\w\\\\d]\"},{b:e.IR+\"::\",k:{built_in:r}},{b:\"->\"}]}});hljs.registerLanguage(\"awk\",function(e){return{k:{keyword:\"BEGIN END if else while do for in break continue delete next nextfile function func exit|10\"},c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},{cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage(\"java\",function(e){var a=\"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",t={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{b:/\\w+@/,relevance:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",relevance:0},{cN:\"function\",b:\"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\\\s*,\\\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"cs\",function(e){var a={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield\",literal:\"null false true\"},i={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},c={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},r=e.inherit(c,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:a},t=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,t]},l={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},b=e.inherit(l,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\",\"c#\"],k:a,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",relevance:0},{b:\"\\x3c!--|--\\x3e\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},o,i,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",relevance:0},{cN:\"function\",b:\"(\"+d+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/\\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"mathematica\",function(e){return{aliases:[\"mma\",\"wl\"],l:\"(\\\\$|\\\\b)\"+e.IR+\"\\\\b\",k:\"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID\",c:[e.C(\"\\\\(\\\\*\",\"\\\\*\\\\)\",{c:[\"self\"]}),e.QSM,e.CNM]}});hljs.registerLanguage(\"vim\",function(e){return{l:/[!#@\\w]+/,k:{keyword:\"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank\",built_in:\"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp\"},i:/;/,c:[e.NM,{cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\"},{cN:\"string\",b:/\"(\\\\\"|\\n\\\\|[^\"\\n])*\"/},e.C('\"',\"$\"),{cN:\"variable\",b:/[bwtglsav]:[\\w\\d_]*/},{cN:\"function\",bK:\"function function!\",e:\"$\",relevance:0,c:[e.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"symbol\",b:/<[\\w-]+>/}]}});hljs.registerLanguage(\"makefile\",function(e){var i={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,i]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[i]},n={b:\"^\"+e.UIR+\"\\\\s*(?=[:+?]?=)\"},t={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[i]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,i,r,a,n,{cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},t]}});hljs.registerLanguage(\"objectivec\",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:{keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},l:t,i:\"</\",c:[{cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]}]},{cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(e.QSM,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},{cN:\"class\",b:\"(\"+i.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:i,l:t,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,relevance:0}]}});hljs.registerLanguage(\"shell\",function(s){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[/\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}});hljs.registerLanguage(\"erlang\",function(e){var r=\"[a-z'][a-zA-Z0-9_']*\",c=\"(\"+r+\":\"+r+\"|\"+r+\")\",n={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor\",literal:\"false true\"},a=e.C(\"%\",\"$\"),b={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},i={b:\"fun\\\\s+\"+r+\"/\\\\d+\"},l={b:c+\"\\\\(\",e:\"\\\\)\",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:\"\\\\(\",e:\"\\\\)\",eW:!0,rE:!0,relevance:0}]},d={b:\"{\",e:\"}\",relevance:0},o={b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",relevance:0},t={b:\"[A-Z][a-zA-Z0-9_]*\",relevance:0},v={b:\"#\"+e.UIR,relevance:0,rB:!0,c:[{b:\"#\"+e.UIR,relevance:0},{b:\"{\",e:\"}\",relevance:0}]},f={bK:\"fun receive if try case\",e:\"end\",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:\"\"}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v.c[1].c=s};return{aliases:[\"erl\"],k:n,i:\"(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+r+\"\\\\s*\\\\(\",e:\"->\",rB:!0,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[u,e.inherit(e.TM,{b:r})],starts:{e:\";|\\\\.\",k:n,c:s}},a,{b:\"^-\",e:\"\\\\.\",relevance:0,eE:!0,rB:!0,l:\"-\"+e.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec\",c:[u]},b,e.QSM,v,o,t,d,{b:/\\.$/}]}});hljs.registerLanguage(\"powershell\",function(e){var t={keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\"},n={b:\"`[\\\\s\\\\S]\",relevance:0},c={cN:\"variable\",v:[{b:/\\$\\B/},{cN:\"keyword\",b:/\\$this/},{b:/\\$[\\w\\d][\\w\\d_:]*/}]},i={cN:\"string\",v:[{b:/\"/,e:/\"/},{b:/@\"/,e:/^\"@/}],c:[n,c,{cN:\"variable\",b:/\\$[A-z]/,e:/[^A-z]/}]},a={cN:\"string\",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:\"doctag\",v:[{b:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),o={cN:\"built_in\",v:[{b:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},l={cN:\"class\",bK:\"class enum\",e:/\\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:\"function\",b:/function\\s+/,e:/\\s*\\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:\"function\",relevance:0,cN:\"keyword\"},{cN:\"title\",b:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{b:/\\(/,e:/\\)/,cN:\"params\",relevance:0,c:[c]}]},p={b:/using\\s/,e:/$/,rB:!0,c:[i,a,{cN:\"keyword\",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:\"operator\",b:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{cN:\"literal\",b:/(-)[\\w\\d]+/,relevance:0}]},d={cN:\"function\",b:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,e:/$/,rB:!0,relevance:0,c:[{cN:\"keyword\",b:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:\"literal\",b:/\\$(null|true|false)\\b/},{cN:\"selector-tag\",b:/\\@\\B/,relevance:0}],m={b:/\\[/,e:/\\]/,eB:!0,eE:!0,relevance:0,c:[].concat(\"self\",u,{b:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",cN:\"built_in\",relevance:0},{cN:\"type\",b:/[\\.\\w\\d]+/,relevance:0})};return d.c.unshift(m),{aliases:[\"ps\",\"ps1\"],l:/-?[A-z\\.\\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage(\"typescript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise\"},n={cN:\"meta\",b:\"@\"+r},a={b:\"\\\\(\",e:/\\)/,k:t,c:[\"self\",e.QSM,e.ASM,e.NM]},c={cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},l={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},b={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:[\"ts\"],k:t,c:[{cN:\"meta\",b:/^\\s*['\"]use strict['\"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+e.IR+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:e.IR},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[\"self\",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/[\\{;]/,eE:!0,k:t,c:[\"self\",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:\"constructor\",e:/[\\{;]/,eE:!0,c:[\"self\",c]},{b:/module\\./,k:{built_in:\"module\"},relevance:0},{bK:\"module\",e:/\\{/,eE:!0},{bK:\"interface\",e:/\\{/,eE:!0,k:\"interface extends\"},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,relevance:0},n,a]}});hljs.registerLanguage(\"fortran\",function(e){return{cI:!0,aliases:[\"f90\",\"f95\"],k:{literal:\".False. .True.\",keyword:\"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data\",built_in:\"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image\"},i:/\\/\\*/,c:[e.inherit(e.ASM,{cN:\"string\",relevance:0}),e.inherit(e.QSM,{cN:\"string\",relevance:0}),{cN:\"function\",bK:\"subroutine function program\",i:\"[${=\\\\n]\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},e.C(\"!\",\"$\",{relevance:0}),{cN:\"number\",b:\"(?=\\\\b|\\\\+|\\\\-|\\\\.)(?=\\\\.\\\\d|\\\\d)(?:\\\\d+)?(?:\\\\.?\\\\d*)(?:[de][+-]?\\\\d+)?\\\\b\\\\.?\",relevance:0}]}});hljs.registerLanguage(\"php\",function(e){var c={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"meta\",b:/<\\?(php)?|\\?>/},t={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:[\"php\",\"php3\",\"php4\",\"php5\",\"php6\",\"php7\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[i]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},i,{cN:\"keyword\",b:/\\$this\\b/},c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,t,a]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},t,a]}});hljs.registerLanguage(\"haskell\",function(e){var i={v:[e.C(\"--\",\"$\"),e.C(\"{-\",\"-}\",{c:[\"self\"]})]},a={cN:\"meta\",b:\"{-#\",e:\"#-}\"},l={cN:\"meta\",b:\"^#\",e:\"$\"},c={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",relevance:0},n={b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[a,l,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},e.inherit(e.TM,{b:\"[_a-z][\\\\w']*\"}),i]};return{aliases:[\"hs\"],k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{bK:\"module\",e:\"where\",k:\"module where\",c:[n,i],i:\"\\\\W\\\\.|;\"},{b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import qualified as hiding\",c:[n,i],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[c,n,i]},{cN:\"class\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[a,c,n,{b:\"{\",e:\"}\",c:n.c},i]},{bK:\"default\",e:\"$\",c:[c,n,i]},{bK:\"infix infixl infixr\",e:\"$\",c:[e.CNM,i]},{b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[c,e.QSM,i]},{cN:\"meta\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:\"^[_a-z][\\\\w']*\"}),i,{b:\"->|<-\"}]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",relevance:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]{0,3}(?=\\\\W)\",relevance:0},{b:/\\/(?![ *]).*?(?![\\\\]).\\/[gim]{0,3}(?=\\W)/}]},{b:\"@\"+n},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",a={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(i)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:i.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+t,e:\"[-=]>\",rB:!0,c:[s,a]},{b:/[:\\(,=]\\s*/,relevance:0,c:[{cN:\"function\",b:t,e:\"[-=]>\",rB:!0,c:[a]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{b:n+\":\",e:\":\",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage(\"r\",function(e){var r=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[e.HCM,{b:r,l:r,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},relevance:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{b:\"`\",e:\"`\",relevance:0},{cN:\"string\",c:[e.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"autohotkey\",function(e){var a={b:\"`[\\\\s\\\\S]\"};return{cI:!0,aliases:[\"ahk\"],k:{keyword:\"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group\",literal:\"true false NOT AND OR\",built_in:\"ComSpec Clipboard ClipboardAll ErrorLevel\"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(\";\",\"$\",{relevance:0}),e.CBCM,{cN:\"number\",b:e.NR,relevance:0},{cN:\"variable\",b:\"%[a-zA-Z0-9#_$@]+%\"},{cN:\"built_in\",b:\"^\\\\s*\\\\w+\\\\s*(,|%)\"},{cN:\"title\",v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',relevance:0}]},{cN:\"meta\",b:\"^\\\\s*#\\\\w+\",e:\"$\",relevance:0},{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{b:\",\\\\s*,\"}]}});hljs.registerLanguage(\"elixir\",function(e){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*(\\\\!|\\\\?)?\",c=\"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0\",n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:b,k:c},r=\"[/|([{<\\\"']\",a={cN:\"string\",b:\"~[a-z](?=\"+r+\")\",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/</,e:/>/}]}]}]},i={cN:\"string\",b:\"~[A-Z](?=\"+r+\")\",c:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/\\</,e:/\\>/}]},l={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/'''/,e:/'''/},{b:/~S\"\"\"/,e:/\"\"\"/,c:[]},{b:/~S\"/,e:/\"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/\"/,e:/\"/}]},s={cN:\"function\",bK:\"def defp defmacro\",e:/\\B\\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:\"class\",bK:\"defimpl defmodule defprotocol defrecord\",e:/\\bdo\\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:\"::\"},{cN:\"symbol\",b:\":(?![\\\\s:])\",c:[l,{b:\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\"}],relevance:0},{cN:\"symbol\",b:b+\":(?!:)\",relevance:0},{cN:\"number\",b:\"(\\\\b0o[0-7_]+)|(\\\\b0b[01_]+)|(\\\\b0x[0-9a-fA-F_]+)|(-?\\\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)\",relevance:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"->\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[e.HCM,{cN:\"regexp\",i:\"\\\\n\",c:[e.BE,n],v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage(\"gradle\",function(e){return{cI:!0,k:{keyword:\"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine\"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage(\"css\",function(e){var c={b:/(?:[A-Z\\_\\.\\-]+|--[a-zA-Z0-9_-]+)\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\",c:[e.ASM,e.QSM]},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(page|font-face)\",l:\"@[a-z-]+\",k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",i:/:/,rB:!0,c:[{cN:\"keyword\",b:/@\\-?\\w[\\w]*(\\-\\w+)*/},{b:/\\s/,eW:!0,eE:!0,relevance:0,k:\"and or not only\",c:[{b:/[a-z-]+:/,cN:\"attribute\"},e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:\"[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,c]}]}});\n\nexports.hljs = hljs;\n",
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/highlight/highlight.js",
            "module-type": "library"
        },
        "$:/plugins/tiddlywiki/highlight/highlight.css": {
            "text": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #F0F0F0;\n}\n\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n  color: #444;\n}\n\n.hljs-comment {\n  color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n  font-weight: bold;\n}\n\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n  color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n  color: #880000;\n  font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #BC6060;\n}\n\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n  color: #78A960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n  color: #397300;\n}\n\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n  color: #1f7199;\n}\n\n.hljs-meta-string {\n  color: #4d99bf;\n}\n\n\n/* Misc effects */\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n",
            "type": "text/css",
            "title": "$:/plugins/tiddlywiki/highlight/highlight.css",
            "tags": "[[$:/tags/Stylesheet]]"
        },
        "$:/plugins/tiddlywiki/highlight/highlightblock.js": {
            "title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
            "text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TYPE_MAPPINGS_BASE = \"$:/config/HighlightPlugin/TypeMappings/\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \"    \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0],\n\t\tlanguage = this.language,\n\t\ttiddler = this.wiki.getTiddler(TYPE_MAPPINGS_BASE + language);\n\tif(tiddler) {\n\t\tlanguage = tiddler.fields.text || \"\";\n\t}\n\tif(language && hljs.getLanguage(language)) {\n\t\tdomNode.className = language.toLowerCase() + \" hljs\";\n\t\tif($tw.browser && !domNode.isTiddlyWikiFakeDom) {\n\t\t\thljs.highlightBlock(domNode);\t\t\t\n\t\t} else {\n\t\t\tvar text = domNode.textContent;\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(language,text).value);\n\t\t\t// If we're using the fakedom then specially save the original raw text\n\t\t\tif(domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tdomNode.children[0].textInnerHTML = text;\n\t\t\t}\n\t\t}\n\t}\t\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/tiddlywiki/highlight/howto": {
            "title": "$:/plugins/tiddlywiki/highlight/howto",
            "text": "! Supporting Additional Languages\n \nThe [[highlight.js|https://github.com/highlightjs/highlight.js]] project supports many languages. Only a subset of these languages are supported by the plugin. It is possible for users to change the set of languages supported by the plugin by following these steps:\n \n# Go to the highlight.js project [[download page|https://highlightjs.org/download/]], select the language definitions to include, and press the Download button to download a zip archive containing customised support files for a highlight.js syntax highlighting server.\n# Locate the `highlight.pack.js` file in the highlight plugin -- on a stock Debian 8 system running Tiddlywiki5 under node-js it is located at `/usr/local/lib/node_modules/tiddlywiki/plugins/tiddlywiki/highlight/files/highlight.pack.js`.\n# Replace the plugin `highlight.pack.js` file located in step 2 with the one from the downloaded archive obtained in step 1.\n# Restart the Tiddlywiki server.\n"
        },
        "$:/plugins/tiddlywiki/highlight/license": {
            "title": "$:/plugins/tiddlywiki/highlight/license",
            "type": "text/plain",
            "text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of highlight.js nor the names of its contributors\n      may be used to endorse or promote products derived from this software\n      without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
        },
        "$:/plugins/tiddlywiki/highlight/readme": {
            "title": "$:/plugins/tiddlywiki/highlight/readme",
            "text": "This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1   { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* arduino\n* arm assembly\n* asciidoc\n* autohotkey\n* awk\n* bash\n* cmake\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* dockerfile\n* erlang\n* elixir\n* fortran\n* go\n* gradle\n* haskell\n* html\n* http\n* ini\n* intel x86 assembly\n* java\n* javascript\n* json\n* kotlin\n* less\n* lua\n* makefile\n* markdown\n* mathematica\n* matlab\n* nginx\n* objectivec\n* perl\n* php\n* plaintext\n* powershell\n* properties\n* python\n* R\n* ruby\n* rust\n* scss\n* shell session\n* sql\n* swift\n* toml\n* typescript\n* vala\n* vim script\n* xml\n* yaml\n\nYou can also specify the language as a MIME content type (eg `text/html` or `text/css`). The mapping is accomplished via mapping tiddlers whose titles start with `$:/config/HighlightPlugin/TypeMappings/`.\n"
        },
        "$:/plugins/tiddlywiki/highlight/styles": {
            "title": "$:/plugins/tiddlywiki/highlight/styles",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": ".hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: <<colour tiddler-editor-background>>;\n  color: <<colour foreground>>;\n  -webkit-text-size-adjust:none\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-string,\n.hljs-meta .hljs-meta-string,\n.hljs-literal,\n.hljs-doctag,\n.hljs-regexp {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-meta .hljs-keyword,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-link {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-built_in,\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.hljs-formula {\n  background: #eee8d5;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
        },
        "$:/plugins/tiddlywiki/highlight/usage": {
            "title": "$:/plugins/tiddlywiki/highlight/usage",
            "text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/tiddlywiki/katex/katex.min.css": {
            "text": ".katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:\"0.10.2\"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:\"\"}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left}\n",
            "type": "text/plain",
            "title": "$:/plugins/tiddlywiki/katex/katex.min.css"
        },
        "$:/plugins/tiddlywiki/katex/katex.min.js": {
            "text": "(function(document) {\n!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.katex=e():t.katex=e()}(\"undefined\"!=typeof self?self:this,function(){return function(t){var e={};function r(a){if(e[a])return e[a].exports;var n=e[a]={i:a,l:!1,exports:{}};return t[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,a){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:a})},r.r=function(t){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&\"object\"==typeof t&&t&&t.__esModule)return t;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var n in t)r.d(a,n,function(e){return t[e]}.bind(null,n));return a},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,\"a\",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p=\"\",r(r.s=1)}([function(t,e,r){},function(t,e,r){\"use strict\";r.r(e);r(0);var a=function(){function t(t,e,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=t,this.start=e,this.end=r}return t.range=function(e,r){return r?e&&e.loc&&r.loc&&e.loc.lexer===r.loc.lexer?new t(e.loc.lexer,e.loc.start,r.loc.end):null:e&&e.loc},t}(),n=function(){function t(t,e){this.text=void 0,this.loc=void 0,this.text=t,this.loc=e}return t.prototype.range=function(e,r){return new t(r,a.range(this,e))},t}(),o=function t(e,r){this.position=void 0;var a,n=\"KaTeX parse error: \"+e,o=r&&r.loc;if(o&&o.start<=o.end){var i=o.lexer.input;a=o.start;var s=o.end;a===i.length?n+=\" at end of input: \":n+=\" at position \"+(a+1)+\": \";var h=i.slice(a,s).replace(/[^]/g,\"$&\\u0332\");n+=(a>15?\"\\u2026\"+i.slice(a-15,a):i.slice(0,a))+h+(s+15<i.length?i.slice(s,s+15)+\"\\u2026\":i.slice(s))}var l=new Error(n);return l.name=\"ParseError\",l.__proto__=t.prototype,l.position=a,l};o.prototype.__proto__=Error.prototype;var i=o,s=/([A-Z])/g,h={\"&\":\"&amp;\",\">\":\"&gt;\",\"<\":\"&lt;\",'\"':\"&quot;\",\"'\":\"&#x27;\"},l=/[&><\"']/g;var m=function t(e){return\"ordgroup\"===e.type?1===e.body.length?t(e.body[0]):e:\"color\"===e.type?1===e.body.length?t(e.body[0]):e:\"font\"===e.type?t(e.body):e},c={contains:function(t,e){return-1!==t.indexOf(e)},deflt:function(t,e){return void 0===t?e:t},escape:function(t){return String(t).replace(l,function(t){return h[t]})},hyphenate:function(t){return t.replace(s,\"-$1\").toLowerCase()},getBaseElem:m,isCharacterBox:function(t){var e=m(t);return\"mathord\"===e.type||\"textord\"===e.type||\"atom\"===e.type}},u=function(){function t(t){this.displayMode=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.allowedProtocols=void 0,t=t||{},this.displayMode=c.deflt(t.displayMode,!1),this.leqno=c.deflt(t.leqno,!1),this.fleqn=c.deflt(t.fleqn,!1),this.throwOnError=c.deflt(t.throwOnError,!0),this.errorColor=c.deflt(t.errorColor,\"#cc0000\"),this.macros=t.macros||{},this.colorIsTextColor=c.deflt(t.colorIsTextColor,!1),this.strict=c.deflt(t.strict,\"warn\"),this.maxSize=Math.max(0,c.deflt(t.maxSize,1/0)),this.maxExpand=Math.max(0,c.deflt(t.maxExpand,1e3)),this.allowedProtocols=c.deflt(t.allowedProtocols,[\"http\",\"https\",\"mailto\",\"_relative\"])}var e=t.prototype;return e.reportNonstrict=function(t,e,r){var a=this.strict;if(\"function\"==typeof a&&(a=a(t,e,r)),a&&\"ignore\"!==a){if(!0===a||\"error\"===a)throw new i(\"LaTeX-incompatible input and strict mode is set to 'error': \"+e+\" [\"+t+\"]\",r);\"warn\"===a?\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \"+e+\" [\"+t+\"]\"):\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to unrecognized '\"+a+\"': \"+e+\" [\"+t+\"]\")}},e.useStrictBehavior=function(t,e,r){var a=this.strict;if(\"function\"==typeof a)try{a=a(t,e,r)}catch(t){a=\"error\"}return!(!a||\"ignore\"===a)&&(!0===a||\"error\"===a||(\"warn\"===a?(\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \"+e+\" [\"+t+\"]\"),!1):(\"undefined\"!=typeof console&&console.warn(\"LaTeX-incompatible input and strict mode is set to unrecognized '\"+a+\"': \"+e+\" [\"+t+\"]\"),!1)))},t}(),d=function(){function t(t,e,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=t,this.size=e,this.cramped=r}var e=t.prototype;return e.sup=function(){return p[f[this.id]]},e.sub=function(){return p[g[this.id]]},e.fracNum=function(){return p[x[this.id]]},e.fracDen=function(){return p[v[this.id]]},e.cramp=function(){return p[b[this.id]]},e.text=function(){return p[y[this.id]]},e.isTight=function(){return this.size>=2},t}(),p=[new d(0,0,!1),new d(1,0,!0),new d(2,1,!1),new d(3,1,!0),new d(4,2,!1),new d(5,2,!0),new d(6,3,!1),new d(7,3,!0)],f=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],x=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],w={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},k=[{name:\"latin\",blocks:[[256,591],[768,879]]},{name:\"cyrillic\",blocks:[[1024,1279]]},{name:\"brahmic\",blocks:[[2304,4255]]},{name:\"georgian\",blocks:[[4256,4351]]},{name:\"cjk\",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:\"hangul\",blocks:[[44032,55215]]}];var S=[];function z(t){for(var e=0;e<S.length;e+=2)if(t>=S[e]&&t<=S[e+1])return!0;return!1}k.forEach(function(t){return t.blocks.forEach(function(t){return S.push.apply(S,t)})});var M={path:{sqrtMain:\"M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,\\n-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,\\n-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,\\n35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,\\n-221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467\\ns-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422\\ns-65,47,-65,47z M834 80H400000v40H845z\",sqrtSize1:\"M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,\\n158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067\\nc4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,\\n175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71\\nc-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,\\n-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26\\ns76,-59,76,-59s76,-60,76,-60z M1001 80H40000v40H1012z\",sqrtSize2:\"M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,\\n572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,\\n-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39\\nc-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60\\ns208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,\\n-658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z\\nM1001 80H400000v40H1013z\",sqrtSize3:\"M424,2478c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,\\n-342,-109.8,-513.3,-110.5,-514c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,\\n25c-5.7,9.3,-9.8,16,-12.5,20s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,\\n-13s76,-122,76,-122s77,-121,77,-121s209,968,209,968c0,-2,84.7,-361.7,254,-1079\\nc169.3,-717.3,254.7,-1077.7,256,-1081c4,-6.7,10,-10,18,-10H400000v40H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M1001 80H400000v40H1014z\",sqrtSize4:\"M473,2793c339.3,-1799.3,509.3,-2700,510,-2702\\nc3.3,-7.3,9.3,-11,18,-11H400000v40H1017.7s-90.5,478,-276.2,1466c-185.7,988,\\n-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,\\n-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200c0,-1.3,-5.3,8.7,-16,30c-10.7,\\n21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26s76,-153,76,-153s77,-151,\\n77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,606z\\nM1001 80H400000v40H1017z\",doubleleftarrow:\"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",doublerightarrow:\"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",leftarrow:\"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",leftbrace:\"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",leftbraceunder:\"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",leftgroup:\"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",leftgroupunder:\"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",leftharpoon:\"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",leftharpoonplus:\"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",leftharpoondown:\"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",leftharpoondownplus:\"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",lefthook:\"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",leftlinesegment:\"M40 281 V428 H0 V94 H40 V241 H400000 v40z\\nM40 281 V428 H0 V94 H40 V241 H400000 v40z\",leftmapsto:\"M40 281 V448H0V74H40V241H400000v40z\\nM40 281 V448H0V74H40V241H400000v40z\",leftToFrom:\"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",longequal:\"M0 50 h400000 v40H0z m0 194h40000v40H0z\\nM0 50 h400000 v40H0z m0 194h40000v40H0z\",midbrace:\"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",midbraceunder:\"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",oiintSize1:\"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",oiintSize2:\"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",oiiintSize1:\"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",oiiintSize2:\"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",rightarrow:\"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",rightbrace:\"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",rightbraceunder:\"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",rightgroup:\"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",rightgroupunder:\"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",rightharpoon:\"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",rightharpoonplus:\"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",rightharpoondown:\"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",rightharpoondownplus:\"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",righthook:\"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",rightlinesegment:\"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z\",rightToFrom:\"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",twoheadleftarrow:\"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",twoheadrightarrow:\"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",tilde1:\"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",tilde2:\"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",tilde3:\"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",tilde4:\"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",vec:\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",widehat1:\"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",widehat2:\"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",widehat3:\"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",widehat4:\"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",widecheck1:\"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",widecheck2:\"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",widecheck3:\"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",widecheck4:\"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",baraboveleftarrow:\"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",rightarrowabovebar:\"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",baraboveshortleftharpoon:\"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",rightharpoonaboveshortbar:\"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",shortbaraboveleftharpoon:\"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",shortrightharpoonabovebar:\"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"}},T=function(){function t(t){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=t,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){for(var t=document.createDocumentFragment(),e=0;e<this.children.length;e++)t.appendChild(this.children[e].toNode());return t},e.toMarkup=function(){for(var t=\"\",e=0;e<this.children.length;e++)t+=this.children[e].toMarkup();return t},e.toText=function(){var t=function(t){return t.toText()};return this.children.map(t).join(\"\")},t}(),A=function(t){return t.filter(function(t){return t}).join(\" \")},B=function(t,e,r){if(this.classes=t||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},e){e.style.isTight()&&this.classes.push(\"mtight\");var a=e.getColor();a&&(this.style.color=a)}},q=function(t){var e=document.createElement(t);for(var r in e.className=A(this.classes),this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&e.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)e.appendChild(this.children[n].toNode());return e},C=function(t){var e=\"<\"+t;this.classes.length&&(e+=' class=\"'+c.escape(A(this.classes))+'\"');var r=\"\";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+\":\"+this.style[a]+\";\");for(var n in r&&(e+=' style=\"'+c.escape(r)+'\"'),this.attributes)this.attributes.hasOwnProperty(n)&&(e+=\" \"+n+'=\"'+c.escape(this.attributes[n])+'\"');e+=\">\";for(var o=0;o<this.children.length;o++)e+=this.children[o].toMarkup();return e+=\"</\"+t+\">\"},N=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,t,r,a),this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,\"span\")},e.toMarkup=function(){return C.call(this,\"span\")},t}(),I=function(){function t(t,e,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,B.call(this,e,a),this.children=r||[],this.setAttribute(\"href\",t)}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){return q.call(this,\"a\")},e.toMarkup=function(){return C.call(this,\"a\")},t}(),O={\"\\xee\":\"\\u0131\\u0302\",\"\\xef\":\"\\u0131\\u0308\",\"\\xed\":\"\\u0131\\u0301\",\"\\xec\":\"\\u0131\\u0300\"},E=function(){function t(t,e,r,a,n,o,i,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=t,this.height=e||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=o||0,this.classes=i||[],this.style=s||{},this.maxFontSize=0;var h=function(t){for(var e=0;e<k.length;e++)for(var r=k[e],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(t>=n[0]&&t<=n[1])return r.name}return null}(this.text.charCodeAt(0));h&&this.classes.push(h+\"_fallback\"),/[\\xee\\xef\\xed\\xec]/.test(this.text)&&(this.text=O[this.text])}var e=t.prototype;return e.hasClass=function(t){return c.contains(this.classes,t)},e.toNode=function(){var t=document.createTextNode(this.text),e=null;for(var r in this.italic>0&&((e=document.createElement(\"span\")).style.marginRight=this.italic+\"em\"),this.classes.length>0&&((e=e||document.createElement(\"span\")).className=A(this.classes)),this.style)this.style.hasOwnProperty(r)&&((e=e||document.createElement(\"span\")).style[r]=this.style[r]);return e?(e.appendChild(t),e):t},e.toMarkup=function(){var t=!1,e=\"<span\";this.classes.length&&(t=!0,e+=' class=\"',e+=c.escape(A(this.classes)),e+='\"');var r=\"\";for(var a in this.italic>0&&(r+=\"margin-right:\"+this.italic+\"em;\"),this.style)this.style.hasOwnProperty(a)&&(r+=c.hyphenate(a)+\":\"+this.style[a]+\";\");r&&(t=!0,e+=' style=\"'+c.escape(r)+'\"');var n=c.escape(this.text);return t?(e+=\">\",e+=n,e+=\"</span>\"):n},t}(),R=function(){function t(t,e){this.children=void 0,this.attributes=void 0,this.children=t||[],this.attributes=e||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t=\"<svg\";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=\" \"+e+\"='\"+this.attributes[e]+\"'\");t+=\">\";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+=\"</svg>\"},t}(),L=function(){function t(t,e){this.pathName=void 0,this.alternate=void 0,this.pathName=t,this.alternate=e}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");return this.alternate?t.setAttribute(\"d\",this.alternate):t.setAttribute(\"d\",M.path[this.pathName]),t},e.toMarkup=function(){return this.alternate?\"<path d='\"+this.alternate+\"'/>\":\"<path d='\"+M.path[this.pathName]+\"'/>\"},t}(),H=function(){function t(t){this.attributes=void 0,this.attributes=t||{}}var e=t.prototype;return e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/2000/svg\",\"line\");for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);return t},e.toMarkup=function(){var t=\"<line\";for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=\" \"+e+\"='\"+this.attributes[e]+\"'\");return t+=\"/>\"},t}();var P={\"AMS-Regular\":{65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},\"Caligraphic-Regular\":{48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473]},\"Fraktur-Regular\":{33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},\"Main-Bold\":{33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},\"Main-BoldItalic\":{33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],163:[0,.69444,0,0,.86853],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},\"Main-Italic\":{33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],163:[0,.69444,0,0,.76909],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],305:[0,.43056,0,.02778,.32246],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],567:[.19444,.43056,0,.08334,.38403],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},\"Main-Regular\":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.12,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,1],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.67,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.9,0,0,.278],8943:[-.19,.31,0,0,1.172],8945:[-.1,.82,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.744,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.744,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},\"Math-BoldItalic\":{65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333]},\"Math-Italic\":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},\"Math-Regular\":{65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059]},\"SansSerif-Bold\":{33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},\"SansSerif-Italic\":{33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},\"SansSerif-Regular\":{33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},\"Script-Regular\":{65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212]},\"Size1-Regular\":{40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},\"Size2-Regular\":{40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},\"Size3-Regular\":{40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},\"Size4-Regular\":{40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},\"Typewriter-Regular\":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},D={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2]},F={\"\\xc5\":\"A\",\"\\xc7\":\"C\",\"\\xd0\":\"D\",\"\\xde\":\"o\",\"\\xe5\":\"a\",\"\\xe7\":\"c\",\"\\xf0\":\"d\",\"\\xfe\":\"o\",\"\\u0410\":\"A\",\"\\u0411\":\"B\",\"\\u0412\":\"B\",\"\\u0413\":\"F\",\"\\u0414\":\"A\",\"\\u0415\":\"E\",\"\\u0416\":\"K\",\"\\u0417\":\"3\",\"\\u0418\":\"N\",\"\\u0419\":\"N\",\"\\u041a\":\"K\",\"\\u041b\":\"N\",\"\\u041c\":\"M\",\"\\u041d\":\"H\",\"\\u041e\":\"O\",\"\\u041f\":\"N\",\"\\u0420\":\"P\",\"\\u0421\":\"C\",\"\\u0422\":\"T\",\"\\u0423\":\"y\",\"\\u0424\":\"O\",\"\\u0425\":\"X\",\"\\u0426\":\"U\",\"\\u0427\":\"h\",\"\\u0428\":\"W\",\"\\u0429\":\"W\",\"\\u042a\":\"B\",\"\\u042b\":\"X\",\"\\u042c\":\"B\",\"\\u042d\":\"3\",\"\\u042e\":\"X\",\"\\u042f\":\"R\",\"\\u0430\":\"a\",\"\\u0431\":\"b\",\"\\u0432\":\"a\",\"\\u0433\":\"r\",\"\\u0434\":\"y\",\"\\u0435\":\"e\",\"\\u0436\":\"m\",\"\\u0437\":\"e\",\"\\u0438\":\"n\",\"\\u0439\":\"n\",\"\\u043a\":\"n\",\"\\u043b\":\"n\",\"\\u043c\":\"m\",\"\\u043d\":\"n\",\"\\u043e\":\"o\",\"\\u043f\":\"n\",\"\\u0440\":\"p\",\"\\u0441\":\"c\",\"\\u0442\":\"o\",\"\\u0443\":\"y\",\"\\u0444\":\"b\",\"\\u0445\":\"x\",\"\\u0446\":\"n\",\"\\u0447\":\"n\",\"\\u0448\":\"w\",\"\\u0449\":\"w\",\"\\u044a\":\"a\",\"\\u044b\":\"m\",\"\\u044c\":\"a\",\"\\u044d\":\"e\",\"\\u044e\":\"m\",\"\\u044f\":\"r\"};function V(t,e,r){if(!P[e])throw new Error(\"Font metrics not found for font: \"+e+\".\");var a=t.charCodeAt(0),n=P[e][a];if(!n&&t[0]in F&&(a=F[t[0]].charCodeAt(0),n=P[e][a]),n||\"text\"!==r||z(a)&&(n=P[e][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var U={};var G={bin:1,close:1,inner:1,open:1,punct:1,rel:1},X={\"accent-token\":1,mathord:1,\"op-token\":1,spacing:1,textord:1},Y={math:{},text:{}},_=Y;function W(t,e,r,a,n,o){Y[t][n]={font:e,group:r,replace:a},o&&a&&(Y[t][a]=Y[t][n])}var j=\"main\",$=\"ams\",Z=\"bin\",K=\"mathord\",J=\"op-token\",Q=\"rel\";W(\"math\",j,Q,\"\\u2261\",\"\\\\equiv\",!0),W(\"math\",j,Q,\"\\u227a\",\"\\\\prec\",!0),W(\"math\",j,Q,\"\\u227b\",\"\\\\succ\",!0),W(\"math\",j,Q,\"\\u223c\",\"\\\\sim\",!0),W(\"math\",j,Q,\"\\u22a5\",\"\\\\perp\"),W(\"math\",j,Q,\"\\u2aaf\",\"\\\\preceq\",!0),W(\"math\",j,Q,\"\\u2ab0\",\"\\\\succeq\",!0),W(\"math\",j,Q,\"\\u2243\",\"\\\\simeq\",!0),W(\"math\",j,Q,\"\\u2223\",\"\\\\mid\",!0),W(\"math\",j,Q,\"\\u226a\",\"\\\\ll\",!0),W(\"math\",j,Q,\"\\u226b\",\"\\\\gg\",!0),W(\"math\",j,Q,\"\\u224d\",\"\\\\asymp\",!0),W(\"math\",j,Q,\"\\u2225\",\"\\\\parallel\"),W(\"math\",j,Q,\"\\u22c8\",\"\\\\bowtie\",!0),W(\"math\",j,Q,\"\\u2323\",\"\\\\smile\",!0),W(\"math\",j,Q,\"\\u2291\",\"\\\\sqsubseteq\",!0),W(\"math\",j,Q,\"\\u2292\",\"\\\\sqsupseteq\",!0),W(\"math\",j,Q,\"\\u2250\",\"\\\\doteq\",!0),W(\"math\",j,Q,\"\\u2322\",\"\\\\frown\",!0),W(\"math\",j,Q,\"\\u220b\",\"\\\\ni\",!0),W(\"math\",j,Q,\"\\u221d\",\"\\\\propto\",!0),W(\"math\",j,Q,\"\\u22a2\",\"\\\\vdash\",!0),W(\"math\",j,Q,\"\\u22a3\",\"\\\\dashv\",!0),W(\"math\",j,Q,\"\\u220b\",\"\\\\owns\"),W(\"math\",j,\"punct\",\".\",\"\\\\ldotp\"),W(\"math\",j,\"punct\",\"\\u22c5\",\"\\\\cdotp\"),W(\"math\",j,\"textord\",\"#\",\"\\\\#\"),W(\"text\",j,\"textord\",\"#\",\"\\\\#\"),W(\"math\",j,\"textord\",\"&\",\"\\\\&\"),W(\"text\",j,\"textord\",\"&\",\"\\\\&\"),W(\"math\",j,\"textord\",\"\\u2135\",\"\\\\aleph\",!0),W(\"math\",j,\"textord\",\"\\u2200\",\"\\\\forall\",!0),W(\"math\",j,\"textord\",\"\\u210f\",\"\\\\hbar\",!0),W(\"math\",j,\"textord\",\"\\u2203\",\"\\\\exists\",!0),W(\"math\",j,\"textord\",\"\\u2207\",\"\\\\nabla\",!0),W(\"math\",j,\"textord\",\"\\u266d\",\"\\\\flat\",!0),W(\"math\",j,\"textord\",\"\\u2113\",\"\\\\ell\",!0),W(\"math\",j,\"textord\",\"\\u266e\",\"\\\\natural\",!0),W(\"math\",j,\"textord\",\"\\u2663\",\"\\\\clubsuit\",!0),W(\"math\",j,\"textord\",\"\\u2118\",\"\\\\wp\",!0),W(\"math\",j,\"textord\",\"\\u266f\",\"\\\\sharp\",!0),W(\"math\",j,\"textord\",\"\\u2662\",\"\\\\diamondsuit\",!0),W(\"math\",j,\"textord\",\"\\u211c\",\"\\\\Re\",!0),W(\"math\",j,\"textord\",\"\\u2661\",\"\\\\heartsuit\",!0),W(\"math\",j,\"textord\",\"\\u2111\",\"\\\\Im\",!0),W(\"math\",j,\"textord\",\"\\u2660\",\"\\\\spadesuit\",!0),W(\"text\",j,\"textord\",\"\\xa7\",\"\\\\S\",!0),W(\"text\",j,\"textord\",\"\\xb6\",\"\\\\P\",!0),W(\"math\",j,\"textord\",\"\\u2020\",\"\\\\dag\"),W(\"text\",j,\"textord\",\"\\u2020\",\"\\\\dag\"),W(\"text\",j,\"textord\",\"\\u2020\",\"\\\\textdagger\"),W(\"math\",j,\"textord\",\"\\u2021\",\"\\\\ddag\"),W(\"text\",j,\"textord\",\"\\u2021\",\"\\\\ddag\"),W(\"text\",j,\"textord\",\"\\u2021\",\"\\\\textdaggerdbl\"),W(\"math\",j,\"close\",\"\\u23b1\",\"\\\\rmoustache\",!0),W(\"math\",j,\"open\",\"\\u23b0\",\"\\\\lmoustache\",!0),W(\"math\",j,\"close\",\"\\u27ef\",\"\\\\rgroup\",!0),W(\"math\",j,\"open\",\"\\u27ee\",\"\\\\lgroup\",!0),W(\"math\",j,Z,\"\\u2213\",\"\\\\mp\",!0),W(\"math\",j,Z,\"\\u2296\",\"\\\\ominus\",!0),W(\"math\",j,Z,\"\\u228e\",\"\\\\uplus\",!0),W(\"math\",j,Z,\"\\u2293\",\"\\\\sqcap\",!0),W(\"math\",j,Z,\"\\u2217\",\"\\\\ast\"),W(\"math\",j,Z,\"\\u2294\",\"\\\\sqcup\",!0),W(\"math\",j,Z,\"\\u25ef\",\"\\\\bigcirc\"),W(\"math\",j,Z,\"\\u2219\",\"\\\\bullet\"),W(\"math\",j,Z,\"\\u2021\",\"\\\\ddagger\"),W(\"math\",j,Z,\"\\u2240\",\"\\\\wr\",!0),W(\"math\",j,Z,\"\\u2a3f\",\"\\\\amalg\"),W(\"math\",j,Z,\"&\",\"\\\\And\"),W(\"math\",j,Q,\"\\u27f5\",\"\\\\longleftarrow\",!0),W(\"math\",j,Q,\"\\u21d0\",\"\\\\Leftarrow\",!0),W(\"math\",j,Q,\"\\u27f8\",\"\\\\Longleftarrow\",!0),W(\"math\",j,Q,\"\\u27f6\",\"\\\\longrightarrow\",!0),W(\"math\",j,Q,\"\\u21d2\",\"\\\\Rightarrow\",!0),W(\"math\",j,Q,\"\\u27f9\",\"\\\\Longrightarrow\",!0),W(\"math\",j,Q,\"\\u2194\",\"\\\\leftrightarrow\",!0),W(\"math\",j,Q,\"\\u27f7\",\"\\\\longleftrightarrow\",!0),W(\"math\",j,Q,\"\\u21d4\",\"\\\\Leftrightarrow\",!0),W(\"math\",j,Q,\"\\u27fa\",\"\\\\Longleftrightarrow\",!0),W(\"math\",j,Q,\"\\u21a6\",\"\\\\mapsto\",!0),W(\"math\",j,Q,\"\\u27fc\",\"\\\\longmapsto\",!0),W(\"math\",j,Q,\"\\u2197\",\"\\\\nearrow\",!0),W(\"math\",j,Q,\"\\u21a9\",\"\\\\hookleftarrow\",!0),W(\"math\",j,Q,\"\\u21aa\",\"\\\\hookrightarrow\",!0),W(\"math\",j,Q,\"\\u2198\",\"\\\\searrow\",!0),W(\"math\",j,Q,\"\\u21bc\",\"\\\\leftharpoonup\",!0),W(\"math\",j,Q,\"\\u21c0\",\"\\\\rightharpoonup\",!0),W(\"math\",j,Q,\"\\u2199\",\"\\\\swarrow\",!0),W(\"math\",j,Q,\"\\u21bd\",\"\\\\leftharpoondown\",!0),W(\"math\",j,Q,\"\\u21c1\",\"\\\\rightharpoondown\",!0),W(\"math\",j,Q,\"\\u2196\",\"\\\\nwarrow\",!0),W(\"math\",j,Q,\"\\u21cc\",\"\\\\rightleftharpoons\",!0),W(\"math\",$,Q,\"\\u226e\",\"\\\\nless\",!0),W(\"math\",$,Q,\"\\ue010\",\"\\\\@nleqslant\"),W(\"math\",$,Q,\"\\ue011\",\"\\\\@nleqq\"),W(\"math\",$,Q,\"\\u2a87\",\"\\\\lneq\",!0),W(\"math\",$,Q,\"\\u2268\",\"\\\\lneqq\",!0),W(\"math\",$,Q,\"\\ue00c\",\"\\\\@lvertneqq\"),W(\"math\",$,Q,\"\\u22e6\",\"\\\\lnsim\",!0),W(\"math\",$,Q,\"\\u2a89\",\"\\\\lnapprox\",!0),W(\"math\",$,Q,\"\\u2280\",\"\\\\nprec\",!0),W(\"math\",$,Q,\"\\u22e0\",\"\\\\npreceq\",!0),W(\"math\",$,Q,\"\\u22e8\",\"\\\\precnsim\",!0),W(\"math\",$,Q,\"\\u2ab9\",\"\\\\precnapprox\",!0),W(\"math\",$,Q,\"\\u2241\",\"\\\\nsim\",!0),W(\"math\",$,Q,\"\\ue006\",\"\\\\@nshortmid\"),W(\"math\",$,Q,\"\\u2224\",\"\\\\nmid\",!0),W(\"math\",$,Q,\"\\u22ac\",\"\\\\nvdash\",!0),W(\"math\",$,Q,\"\\u22ad\",\"\\\\nvDash\",!0),W(\"math\",$,Q,\"\\u22ea\",\"\\\\ntriangleleft\"),W(\"math\",$,Q,\"\\u22ec\",\"\\\\ntrianglelefteq\",!0),W(\"math\",$,Q,\"\\u228a\",\"\\\\subsetneq\",!0),W(\"math\",$,Q,\"\\ue01a\",\"\\\\@varsubsetneq\"),W(\"math\",$,Q,\"\\u2acb\",\"\\\\subsetneqq\",!0),W(\"math\",$,Q,\"\\ue017\",\"\\\\@varsubsetneqq\"),W(\"math\",$,Q,\"\\u226f\",\"\\\\ngtr\",!0),W(\"math\",$,Q,\"\\ue00f\",\"\\\\@ngeqslant\"),W(\"math\",$,Q,\"\\ue00e\",\"\\\\@ngeqq\"),W(\"math\",$,Q,\"\\u2a88\",\"\\\\gneq\",!0),W(\"math\",$,Q,\"\\u2269\",\"\\\\gneqq\",!0),W(\"math\",$,Q,\"\\ue00d\",\"\\\\@gvertneqq\"),W(\"math\",$,Q,\"\\u22e7\",\"\\\\gnsim\",!0),W(\"math\",$,Q,\"\\u2a8a\",\"\\\\gnapprox\",!0),W(\"math\",$,Q,\"\\u2281\",\"\\\\nsucc\",!0),W(\"math\",$,Q,\"\\u22e1\",\"\\\\nsucceq\",!0),W(\"math\",$,Q,\"\\u22e9\",\"\\\\succnsim\",!0),W(\"math\",$,Q,\"\\u2aba\",\"\\\\succnapprox\",!0),W(\"math\",$,Q,\"\\u2246\",\"\\\\ncong\",!0),W(\"math\",$,Q,\"\\ue007\",\"\\\\@nshortparallel\"),W(\"math\",$,Q,\"\\u2226\",\"\\\\nparallel\",!0),W(\"math\",$,Q,\"\\u22af\",\"\\\\nVDash\",!0),W(\"math\",$,Q,\"\\u22eb\",\"\\\\ntriangleright\"),W(\"math\",$,Q,\"\\u22ed\",\"\\\\ntrianglerighteq\",!0),W(\"math\",$,Q,\"\\ue018\",\"\\\\@nsupseteqq\"),W(\"math\",$,Q,\"\\u228b\",\"\\\\supsetneq\",!0),W(\"math\",$,Q,\"\\ue01b\",\"\\\\@varsupsetneq\"),W(\"math\",$,Q,\"\\u2acc\",\"\\\\supsetneqq\",!0),W(\"math\",$,Q,\"\\ue019\",\"\\\\@varsupsetneqq\"),W(\"math\",$,Q,\"\\u22ae\",\"\\\\nVdash\",!0),W(\"math\",$,Q,\"\\u2ab5\",\"\\\\precneqq\",!0),W(\"math\",$,Q,\"\\u2ab6\",\"\\\\succneqq\",!0),W(\"math\",$,Q,\"\\ue016\",\"\\\\@nsubseteqq\"),W(\"math\",$,Z,\"\\u22b4\",\"\\\\unlhd\"),W(\"math\",$,Z,\"\\u22b5\",\"\\\\unrhd\"),W(\"math\",$,Q,\"\\u219a\",\"\\\\nleftarrow\",!0),W(\"math\",$,Q,\"\\u219b\",\"\\\\nrightarrow\",!0),W(\"math\",$,Q,\"\\u21cd\",\"\\\\nLeftarrow\",!0),W(\"math\",$,Q,\"\\u21cf\",\"\\\\nRightarrow\",!0),W(\"math\",$,Q,\"\\u21ae\",\"\\\\nleftrightarrow\",!0),W(\"math\",$,Q,\"\\u21ce\",\"\\\\nLeftrightarrow\",!0),W(\"math\",$,Q,\"\\u25b3\",\"\\\\vartriangle\"),W(\"math\",$,\"textord\",\"\\u210f\",\"\\\\hslash\"),W(\"math\",$,\"textord\",\"\\u25bd\",\"\\\\triangledown\"),W(\"math\",$,\"textord\",\"\\u25ca\",\"\\\\lozenge\"),W(\"math\",$,\"textord\",\"\\u24c8\",\"\\\\circledS\"),W(\"math\",$,\"textord\",\"\\xae\",\"\\\\circledR\"),W(\"text\",$,\"textord\",\"\\xae\",\"\\\\circledR\"),W(\"math\",$,\"textord\",\"\\u2221\",\"\\\\measuredangle\",!0),W(\"math\",$,\"textord\",\"\\u2204\",\"\\\\nexists\"),W(\"math\",$,\"textord\",\"\\u2127\",\"\\\\mho\"),W(\"math\",$,\"textord\",\"\\u2132\",\"\\\\Finv\",!0),W(\"math\",$,\"textord\",\"\\u2141\",\"\\\\Game\",!0),W(\"math\",$,\"textord\",\"\\u2035\",\"\\\\backprime\"),W(\"math\",$,\"textord\",\"\\u25b2\",\"\\\\blacktriangle\"),W(\"math\",$,\"textord\",\"\\u25bc\",\"\\\\blacktriangledown\"),W(\"math\",$,\"textord\",\"\\u25a0\",\"\\\\blacksquare\"),W(\"math\",$,\"textord\",\"\\u29eb\",\"\\\\blacklozenge\"),W(\"math\",$,\"textord\",\"\\u2605\",\"\\\\bigstar\"),W(\"math\",$,\"textord\",\"\\u2222\",\"\\\\sphericalangle\",!0),W(\"math\",$,\"textord\",\"\\u2201\",\"\\\\complement\",!0),W(\"math\",$,\"textord\",\"\\xf0\",\"\\\\eth\",!0),W(\"math\",$,\"textord\",\"\\u2571\",\"\\\\diagup\"),W(\"math\",$,\"textord\",\"\\u2572\",\"\\\\diagdown\"),W(\"math\",$,\"textord\",\"\\u25a1\",\"\\\\square\"),W(\"math\",$,\"textord\",\"\\u25a1\",\"\\\\Box\"),W(\"math\",$,\"textord\",\"\\u25ca\",\"\\\\Diamond\"),W(\"math\",$,\"textord\",\"\\xa5\",\"\\\\yen\",!0),W(\"text\",$,\"textord\",\"\\xa5\",\"\\\\yen\",!0),W(\"math\",$,\"textord\",\"\\u2713\",\"\\\\checkmark\",!0),W(\"text\",$,\"textord\",\"\\u2713\",\"\\\\checkmark\"),W(\"math\",$,\"textord\",\"\\u2136\",\"\\\\beth\",!0),W(\"math\",$,\"textord\",\"\\u2138\",\"\\\\daleth\",!0),W(\"math\",$,\"textord\",\"\\u2137\",\"\\\\gimel\",!0),W(\"math\",$,\"textord\",\"\\u03dd\",\"\\\\digamma\"),W(\"math\",$,\"textord\",\"\\u03f0\",\"\\\\varkappa\"),W(\"math\",$,\"open\",\"\\u250c\",\"\\\\ulcorner\",!0),W(\"math\",$,\"close\",\"\\u2510\",\"\\\\urcorner\",!0),W(\"math\",$,\"open\",\"\\u2514\",\"\\\\llcorner\",!0),W(\"math\",$,\"close\",\"\\u2518\",\"\\\\lrcorner\",!0),W(\"math\",$,Q,\"\\u2266\",\"\\\\leqq\",!0),W(\"math\",$,Q,\"\\u2a7d\",\"\\\\leqslant\",!0),W(\"math\",$,Q,\"\\u2a95\",\"\\\\eqslantless\",!0),W(\"math\",$,Q,\"\\u2272\",\"\\\\lesssim\",!0),W(\"math\",$,Q,\"\\u2a85\",\"\\\\lessapprox\",!0),W(\"math\",$,Q,\"\\u224a\",\"\\\\approxeq\",!0),W(\"math\",$,Z,\"\\u22d6\",\"\\\\lessdot\"),W(\"math\",$,Q,\"\\u22d8\",\"\\\\lll\",!0),W(\"math\",$,Q,\"\\u2276\",\"\\\\lessgtr\",!0),W(\"math\",$,Q,\"\\u22da\",\"\\\\lesseqgtr\",!0),W(\"math\",$,Q,\"\\u2a8b\",\"\\\\lesseqqgtr\",!0),W(\"math\",$,Q,\"\\u2251\",\"\\\\doteqdot\"),W(\"math\",$,Q,\"\\u2253\",\"\\\\risingdotseq\",!0),W(\"math\",$,Q,\"\\u2252\",\"\\\\fallingdotseq\",!0),W(\"math\",$,Q,\"\\u223d\",\"\\\\backsim\",!0),W(\"math\",$,Q,\"\\u22cd\",\"\\\\backsimeq\",!0),W(\"math\",$,Q,\"\\u2ac5\",\"\\\\subseteqq\",!0),W(\"math\",$,Q,\"\\u22d0\",\"\\\\Subset\",!0),W(\"math\",$,Q,\"\\u228f\",\"\\\\sqsubset\",!0),W(\"math\",$,Q,\"\\u227c\",\"\\\\preccurlyeq\",!0),W(\"math\",$,Q,\"\\u22de\",\"\\\\curlyeqprec\",!0),W(\"math\",$,Q,\"\\u227e\",\"\\\\precsim\",!0),W(\"math\",$,Q,\"\\u2ab7\",\"\\\\precapprox\",!0),W(\"math\",$,Q,\"\\u22b2\",\"\\\\vartriangleleft\"),W(\"math\",$,Q,\"\\u22b4\",\"\\\\trianglelefteq\"),W(\"math\",$,Q,\"\\u22a8\",\"\\\\vDash\",!0),W(\"math\",$,Q,\"\\u22aa\",\"\\\\Vvdash\",!0),W(\"math\",$,Q,\"\\u2323\",\"\\\\smallsmile\"),W(\"math\",$,Q,\"\\u2322\",\"\\\\smallfrown\"),W(\"math\",$,Q,\"\\u224f\",\"\\\\bumpeq\",!0),W(\"math\",$,Q,\"\\u224e\",\"\\\\Bumpeq\",!0),W(\"math\",$,Q,\"\\u2267\",\"\\\\geqq\",!0),W(\"math\",$,Q,\"\\u2a7e\",\"\\\\geqslant\",!0),W(\"math\",$,Q,\"\\u2a96\",\"\\\\eqslantgtr\",!0),W(\"math\",$,Q,\"\\u2273\",\"\\\\gtrsim\",!0),W(\"math\",$,Q,\"\\u2a86\",\"\\\\gtrapprox\",!0),W(\"math\",$,Z,\"\\u22d7\",\"\\\\gtrdot\"),W(\"math\",$,Q,\"\\u22d9\",\"\\\\ggg\",!0),W(\"math\",$,Q,\"\\u2277\",\"\\\\gtrless\",!0),W(\"math\",$,Q,\"\\u22db\",\"\\\\gtreqless\",!0),W(\"math\",$,Q,\"\\u2a8c\",\"\\\\gtreqqless\",!0),W(\"math\",$,Q,\"\\u2256\",\"\\\\eqcirc\",!0),W(\"math\",$,Q,\"\\u2257\",\"\\\\circeq\",!0),W(\"math\",$,Q,\"\\u225c\",\"\\\\triangleq\",!0),W(\"math\",$,Q,\"\\u223c\",\"\\\\thicksim\"),W(\"math\",$,Q,\"\\u2248\",\"\\\\thickapprox\"),W(\"math\",$,Q,\"\\u2ac6\",\"\\\\supseteqq\",!0),W(\"math\",$,Q,\"\\u22d1\",\"\\\\Supset\",!0),W(\"math\",$,Q,\"\\u2290\",\"\\\\sqsupset\",!0),W(\"math\",$,Q,\"\\u227d\",\"\\\\succcurlyeq\",!0),W(\"math\",$,Q,\"\\u22df\",\"\\\\curlyeqsucc\",!0),W(\"math\",$,Q,\"\\u227f\",\"\\\\succsim\",!0),W(\"math\",$,Q,\"\\u2ab8\",\"\\\\succapprox\",!0),W(\"math\",$,Q,\"\\u22b3\",\"\\\\vartriangleright\"),W(\"math\",$,Q,\"\\u22b5\",\"\\\\trianglerighteq\"),W(\"math\",$,Q,\"\\u22a9\",\"\\\\Vdash\",!0),W(\"math\",$,Q,\"\\u2223\",\"\\\\shortmid\"),W(\"math\",$,Q,\"\\u2225\",\"\\\\shortparallel\"),W(\"math\",$,Q,\"\\u226c\",\"\\\\between\",!0),W(\"math\",$,Q,\"\\u22d4\",\"\\\\pitchfork\",!0),W(\"math\",$,Q,\"\\u221d\",\"\\\\varpropto\"),W(\"math\",$,Q,\"\\u25c0\",\"\\\\blacktriangleleft\"),W(\"math\",$,Q,\"\\u2234\",\"\\\\therefore\",!0),W(\"math\",$,Q,\"\\u220d\",\"\\\\backepsilon\"),W(\"math\",$,Q,\"\\u25b6\",\"\\\\blacktriangleright\"),W(\"math\",$,Q,\"\\u2235\",\"\\\\because\",!0),W(\"math\",$,Q,\"\\u22d8\",\"\\\\llless\"),W(\"math\",$,Q,\"\\u22d9\",\"\\\\gggtr\"),W(\"math\",$,Z,\"\\u22b2\",\"\\\\lhd\"),W(\"math\",$,Z,\"\\u22b3\",\"\\\\rhd\"),W(\"math\",$,Q,\"\\u2242\",\"\\\\eqsim\",!0),W(\"math\",j,Q,\"\\u22c8\",\"\\\\Join\"),W(\"math\",$,Q,\"\\u2251\",\"\\\\Doteq\",!0),W(\"math\",$,Z,\"\\u2214\",\"\\\\dotplus\",!0),W(\"math\",$,Z,\"\\u2216\",\"\\\\smallsetminus\"),W(\"math\",$,Z,\"\\u22d2\",\"\\\\Cap\",!0),W(\"math\",$,Z,\"\\u22d3\",\"\\\\Cup\",!0),W(\"math\",$,Z,\"\\u2a5e\",\"\\\\doublebarwedge\",!0),W(\"math\",$,Z,\"\\u229f\",\"\\\\boxminus\",!0),W(\"math\",$,Z,\"\\u229e\",\"\\\\boxplus\",!0),W(\"math\",$,Z,\"\\u22c7\",\"\\\\divideontimes\",!0),W(\"math\",$,Z,\"\\u22c9\",\"\\\\ltimes\",!0),W(\"math\",$,Z,\"\\u22ca\",\"\\\\rtimes\",!0),W(\"math\",$,Z,\"\\u22cb\",\"\\\\leftthreetimes\",!0),W(\"math\",$,Z,\"\\u22cc\",\"\\\\rightthreetimes\",!0),W(\"math\",$,Z,\"\\u22cf\",\"\\\\curlywedge\",!0),W(\"math\",$,Z,\"\\u22ce\",\"\\\\curlyvee\",!0),W(\"math\",$,Z,\"\\u229d\",\"\\\\circleddash\",!0),W(\"math\",$,Z,\"\\u229b\",\"\\\\circledast\",!0),W(\"math\",$,Z,\"\\u22c5\",\"\\\\centerdot\"),W(\"math\",$,Z,\"\\u22ba\",\"\\\\intercal\",!0),W(\"math\",$,Z,\"\\u22d2\",\"\\\\doublecap\"),W(\"math\",$,Z,\"\\u22d3\",\"\\\\doublecup\"),W(\"math\",$,Z,\"\\u22a0\",\"\\\\boxtimes\",!0),W(\"math\",$,Q,\"\\u21e2\",\"\\\\dashrightarrow\",!0),W(\"math\",$,Q,\"\\u21e0\",\"\\\\dashleftarrow\",!0),W(\"math\",$,Q,\"\\u21c7\",\"\\\\leftleftarrows\",!0),W(\"math\",$,Q,\"\\u21c6\",\"\\\\leftrightarrows\",!0),W(\"math\",$,Q,\"\\u21da\",\"\\\\Lleftarrow\",!0),W(\"math\",$,Q,\"\\u219e\",\"\\\\twoheadleftarrow\",!0),W(\"math\",$,Q,\"\\u21a2\",\"\\\\leftarrowtail\",!0),W(\"math\",$,Q,\"\\u21ab\",\"\\\\looparrowleft\",!0),W(\"math\",$,Q,\"\\u21cb\",\"\\\\leftrightharpoons\",!0),W(\"math\",$,Q,\"\\u21b6\",\"\\\\curvearrowleft\",!0),W(\"math\",$,Q,\"\\u21ba\",\"\\\\circlearrowleft\",!0),W(\"math\",$,Q,\"\\u21b0\",\"\\\\Lsh\",!0),W(\"math\",$,Q,\"\\u21c8\",\"\\\\upuparrows\",!0),W(\"math\",$,Q,\"\\u21bf\",\"\\\\upharpoonleft\",!0),W(\"math\",$,Q,\"\\u21c3\",\"\\\\downharpoonleft\",!0),W(\"math\",$,Q,\"\\u22b8\",\"\\\\multimap\",!0),W(\"math\",$,Q,\"\\u21ad\",\"\\\\leftrightsquigarrow\",!0),W(\"math\",$,Q,\"\\u21c9\",\"\\\\rightrightarrows\",!0),W(\"math\",$,Q,\"\\u21c4\",\"\\\\rightleftarrows\",!0),W(\"math\",$,Q,\"\\u21a0\",\"\\\\twoheadrightarrow\",!0),W(\"math\",$,Q,\"\\u21a3\",\"\\\\rightarrowtail\",!0),W(\"math\",$,Q,\"\\u21ac\",\"\\\\looparrowright\",!0),W(\"math\",$,Q,\"\\u21b7\",\"\\\\curvearrowright\",!0),W(\"math\",$,Q,\"\\u21bb\",\"\\\\circlearrowright\",!0),W(\"math\",$,Q,\"\\u21b1\",\"\\\\Rsh\",!0),W(\"math\",$,Q,\"\\u21ca\",\"\\\\downdownarrows\",!0),W(\"math\",$,Q,\"\\u21be\",\"\\\\upharpoonright\",!0),W(\"math\",$,Q,\"\\u21c2\",\"\\\\downharpoonright\",!0),W(\"math\",$,Q,\"\\u21dd\",\"\\\\rightsquigarrow\",!0),W(\"math\",$,Q,\"\\u21dd\",\"\\\\leadsto\"),W(\"math\",$,Q,\"\\u21db\",\"\\\\Rrightarrow\",!0),W(\"math\",$,Q,\"\\u21be\",\"\\\\restriction\"),W(\"math\",j,\"textord\",\"\\u2018\",\"`\"),W(\"math\",j,\"textord\",\"$\",\"\\\\$\"),W(\"text\",j,\"textord\",\"$\",\"\\\\$\"),W(\"text\",j,\"textord\",\"$\",\"\\\\textdollar\"),W(\"math\",j,\"textord\",\"%\",\"\\\\%\"),W(\"text\",j,\"textord\",\"%\",\"\\\\%\"),W(\"math\",j,\"textord\",\"_\",\"\\\\_\"),W(\"text\",j,\"textord\",\"_\",\"\\\\_\"),W(\"text\",j,\"textord\",\"_\",\"\\\\textunderscore\"),W(\"math\",j,\"textord\",\"\\u2220\",\"\\\\angle\",!0),W(\"math\",j,\"textord\",\"\\u221e\",\"\\\\infty\",!0),W(\"math\",j,\"textord\",\"\\u2032\",\"\\\\prime\"),W(\"math\",j,\"textord\",\"\\u25b3\",\"\\\\triangle\"),W(\"math\",j,\"textord\",\"\\u0393\",\"\\\\Gamma\",!0),W(\"math\",j,\"textord\",\"\\u0394\",\"\\\\Delta\",!0),W(\"math\",j,\"textord\",\"\\u0398\",\"\\\\Theta\",!0),W(\"math\",j,\"textord\",\"\\u039b\",\"\\\\Lambda\",!0),W(\"math\",j,\"textord\",\"\\u039e\",\"\\\\Xi\",!0),W(\"math\",j,\"textord\",\"\\u03a0\",\"\\\\Pi\",!0),W(\"math\",j,\"textord\",\"\\u03a3\",\"\\\\Sigma\",!0),W(\"math\",j,\"textord\",\"\\u03a5\",\"\\\\Upsilon\",!0),W(\"math\",j,\"textord\",\"\\u03a6\",\"\\\\Phi\",!0),W(\"math\",j,\"textord\",\"\\u03a8\",\"\\\\Psi\",!0),W(\"math\",j,\"textord\",\"\\u03a9\",\"\\\\Omega\",!0),W(\"math\",j,\"textord\",\"A\",\"\\u0391\"),W(\"math\",j,\"textord\",\"B\",\"\\u0392\"),W(\"math\",j,\"textord\",\"E\",\"\\u0395\"),W(\"math\",j,\"textord\",\"Z\",\"\\u0396\"),W(\"math\",j,\"textord\",\"H\",\"\\u0397\"),W(\"math\",j,\"textord\",\"I\",\"\\u0399\"),W(\"math\",j,\"textord\",\"K\",\"\\u039a\"),W(\"math\",j,\"textord\",\"M\",\"\\u039c\"),W(\"math\",j,\"textord\",\"N\",\"\\u039d\"),W(\"math\",j,\"textord\",\"O\",\"\\u039f\"),W(\"math\",j,\"textord\",\"P\",\"\\u03a1\"),W(\"math\",j,\"textord\",\"T\",\"\\u03a4\"),W(\"math\",j,\"textord\",\"X\",\"\\u03a7\"),W(\"math\",j,\"textord\",\"\\xac\",\"\\\\neg\",!0),W(\"math\",j,\"textord\",\"\\xac\",\"\\\\lnot\"),W(\"math\",j,\"textord\",\"\\u22a4\",\"\\\\top\"),W(\"math\",j,\"textord\",\"\\u22a5\",\"\\\\bot\"),W(\"math\",j,\"textord\",\"\\u2205\",\"\\\\emptyset\"),W(\"math\",$,\"textord\",\"\\u2205\",\"\\\\varnothing\"),W(\"math\",j,K,\"\\u03b1\",\"\\\\alpha\",!0),W(\"math\",j,K,\"\\u03b2\",\"\\\\beta\",!0),W(\"math\",j,K,\"\\u03b3\",\"\\\\gamma\",!0),W(\"math\",j,K,\"\\u03b4\",\"\\\\delta\",!0),W(\"math\",j,K,\"\\u03f5\",\"\\\\epsilon\",!0),W(\"math\",j,K,\"\\u03b6\",\"\\\\zeta\",!0),W(\"math\",j,K,\"\\u03b7\",\"\\\\eta\",!0),W(\"math\",j,K,\"\\u03b8\",\"\\\\theta\",!0),W(\"math\",j,K,\"\\u03b9\",\"\\\\iota\",!0),W(\"math\",j,K,\"\\u03ba\",\"\\\\kappa\",!0),W(\"math\",j,K,\"\\u03bb\",\"\\\\lambda\",!0),W(\"math\",j,K,\"\\u03bc\",\"\\\\mu\",!0),W(\"math\",j,K,\"\\u03bd\",\"\\\\nu\",!0),W(\"math\",j,K,\"\\u03be\",\"\\\\xi\",!0),W(\"math\",j,K,\"\\u03bf\",\"\\\\omicron\",!0),W(\"math\",j,K,\"\\u03c0\",\"\\\\pi\",!0),W(\"math\",j,K,\"\\u03c1\",\"\\\\rho\",!0),W(\"math\",j,K,\"\\u03c3\",\"\\\\sigma\",!0),W(\"math\",j,K,\"\\u03c4\",\"\\\\tau\",!0),W(\"math\",j,K,\"\\u03c5\",\"\\\\upsilon\",!0),W(\"math\",j,K,\"\\u03d5\",\"\\\\phi\",!0),W(\"math\",j,K,\"\\u03c7\",\"\\\\chi\",!0),W(\"math\",j,K,\"\\u03c8\",\"\\\\psi\",!0),W(\"math\",j,K,\"\\u03c9\",\"\\\\omega\",!0),W(\"math\",j,K,\"\\u03b5\",\"\\\\varepsilon\",!0),W(\"math\",j,K,\"\\u03d1\",\"\\\\vartheta\",!0),W(\"math\",j,K,\"\\u03d6\",\"\\\\varpi\",!0),W(\"math\",j,K,\"\\u03f1\",\"\\\\varrho\",!0),W(\"math\",j,K,\"\\u03c2\",\"\\\\varsigma\",!0),W(\"math\",j,K,\"\\u03c6\",\"\\\\varphi\",!0),W(\"math\",j,Z,\"\\u2217\",\"*\"),W(\"math\",j,Z,\"+\",\"+\"),W(\"math\",j,Z,\"\\u2212\",\"-\"),W(\"math\",j,Z,\"\\u22c5\",\"\\\\cdot\",!0),W(\"math\",j,Z,\"\\u2218\",\"\\\\circ\"),W(\"math\",j,Z,\"\\xf7\",\"\\\\div\",!0),W(\"math\",j,Z,\"\\xb1\",\"\\\\pm\",!0),W(\"math\",j,Z,\"\\xd7\",\"\\\\times\",!0),W(\"math\",j,Z,\"\\u2229\",\"\\\\cap\",!0),W(\"math\",j,Z,\"\\u222a\",\"\\\\cup\",!0),W(\"math\",j,Z,\"\\u2216\",\"\\\\setminus\"),W(\"math\",j,Z,\"\\u2227\",\"\\\\land\"),W(\"math\",j,Z,\"\\u2228\",\"\\\\lor\"),W(\"math\",j,Z,\"\\u2227\",\"\\\\wedge\",!0),W(\"math\",j,Z,\"\\u2228\",\"\\\\vee\",!0),W(\"math\",j,\"textord\",\"\\u221a\",\"\\\\surd\"),W(\"math\",j,\"open\",\"(\",\"(\"),W(\"math\",j,\"open\",\"[\",\"[\"),W(\"math\",j,\"open\",\"\\u27e8\",\"\\\\langle\",!0),W(\"math\",j,\"open\",\"\\u2223\",\"\\\\lvert\"),W(\"math\",j,\"open\",\"\\u2225\",\"\\\\lVert\"),W(\"math\",j,\"close\",\")\",\")\"),W(\"math\",j,\"close\",\"]\",\"]\"),W(\"math\",j,\"close\",\"?\",\"?\"),W(\"math\",j,\"close\",\"!\",\"!\"),W(\"math\",j,\"close\",\"\\u27e9\",\"\\\\rangle\",!0),W(\"math\",j,\"close\",\"\\u2223\",\"\\\\rvert\"),W(\"math\",j,\"close\",\"\\u2225\",\"\\\\rVert\"),W(\"math\",j,Q,\"=\",\"=\"),W(\"math\",j,Q,\"<\",\"<\"),W(\"math\",j,Q,\">\",\">\"),W(\"math\",j,Q,\":\",\":\"),W(\"math\",j,Q,\"\\u2248\",\"\\\\approx\",!0),W(\"math\",j,Q,\"\\u2245\",\"\\\\cong\",!0),W(\"math\",j,Q,\"\\u2265\",\"\\\\ge\"),W(\"math\",j,Q,\"\\u2265\",\"\\\\geq\",!0),W(\"math\",j,Q,\"\\u2190\",\"\\\\gets\"),W(\"math\",j,Q,\">\",\"\\\\gt\"),W(\"math\",j,Q,\"\\u2208\",\"\\\\in\",!0),W(\"math\",j,Q,\"\\ue020\",\"\\\\@not\"),W(\"math\",j,Q,\"\\u2282\",\"\\\\subset\",!0),W(\"math\",j,Q,\"\\u2283\",\"\\\\supset\",!0),W(\"math\",j,Q,\"\\u2286\",\"\\\\subseteq\",!0),W(\"math\",j,Q,\"\\u2287\",\"\\\\supseteq\",!0),W(\"math\",$,Q,\"\\u2288\",\"\\\\nsubseteq\",!0),W(\"math\",$,Q,\"\\u2289\",\"\\\\nsupseteq\",!0),W(\"math\",j,Q,\"\\u22a8\",\"\\\\models\"),W(\"math\",j,Q,\"\\u2190\",\"\\\\leftarrow\",!0),W(\"math\",j,Q,\"\\u2264\",\"\\\\le\"),W(\"math\",j,Q,\"\\u2264\",\"\\\\leq\",!0),W(\"math\",j,Q,\"<\",\"\\\\lt\"),W(\"math\",j,Q,\"\\u2192\",\"\\\\rightarrow\",!0),W(\"math\",j,Q,\"\\u2192\",\"\\\\to\"),W(\"math\",$,Q,\"\\u2271\",\"\\\\ngeq\",!0),W(\"math\",$,Q,\"\\u2270\",\"\\\\nleq\",!0),W(\"math\",j,\"spacing\",\"\\xa0\",\"\\\\ \"),W(\"math\",j,\"spacing\",\"\\xa0\",\"~\"),W(\"math\",j,\"spacing\",\"\\xa0\",\"\\\\space\"),W(\"math\",j,\"spacing\",\"\\xa0\",\"\\\\nobreakspace\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\ \"),W(\"text\",j,\"spacing\",\"\\xa0\",\"~\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\space\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\nobreakspace\"),W(\"math\",j,\"spacing\",null,\"\\\\nobreak\"),W(\"math\",j,\"spacing\",null,\"\\\\allowbreak\"),W(\"math\",j,\"punct\",\",\",\",\"),W(\"math\",j,\"punct\",\";\",\";\"),W(\"math\",$,Z,\"\\u22bc\",\"\\\\barwedge\",!0),W(\"math\",$,Z,\"\\u22bb\",\"\\\\veebar\",!0),W(\"math\",j,Z,\"\\u2299\",\"\\\\odot\",!0),W(\"math\",j,Z,\"\\u2295\",\"\\\\oplus\",!0),W(\"math\",j,Z,\"\\u2297\",\"\\\\otimes\",!0),W(\"math\",j,\"textord\",\"\\u2202\",\"\\\\partial\",!0),W(\"math\",j,Z,\"\\u2298\",\"\\\\oslash\",!0),W(\"math\",$,Z,\"\\u229a\",\"\\\\circledcirc\",!0),W(\"math\",$,Z,\"\\u22a1\",\"\\\\boxdot\",!0),W(\"math\",j,Z,\"\\u25b3\",\"\\\\bigtriangleup\"),W(\"math\",j,Z,\"\\u25bd\",\"\\\\bigtriangledown\"),W(\"math\",j,Z,\"\\u2020\",\"\\\\dagger\"),W(\"math\",j,Z,\"\\u22c4\",\"\\\\diamond\"),W(\"math\",j,Z,\"\\u22c6\",\"\\\\star\"),W(\"math\",j,Z,\"\\u25c3\",\"\\\\triangleleft\"),W(\"math\",j,Z,\"\\u25b9\",\"\\\\triangleright\"),W(\"math\",j,\"open\",\"{\",\"\\\\{\"),W(\"text\",j,\"textord\",\"{\",\"\\\\{\"),W(\"text\",j,\"textord\",\"{\",\"\\\\textbraceleft\"),W(\"math\",j,\"close\",\"}\",\"\\\\}\"),W(\"text\",j,\"textord\",\"}\",\"\\\\}\"),W(\"text\",j,\"textord\",\"}\",\"\\\\textbraceright\"),W(\"math\",j,\"open\",\"{\",\"\\\\lbrace\"),W(\"math\",j,\"close\",\"}\",\"\\\\rbrace\"),W(\"math\",j,\"open\",\"[\",\"\\\\lbrack\"),W(\"text\",j,\"textord\",\"[\",\"\\\\lbrack\"),W(\"math\",j,\"close\",\"]\",\"\\\\rbrack\"),W(\"text\",j,\"textord\",\"]\",\"\\\\rbrack\"),W(\"math\",j,\"open\",\"(\",\"\\\\lparen\"),W(\"math\",j,\"close\",\")\",\"\\\\rparen\"),W(\"text\",j,\"textord\",\"<\",\"\\\\textless\"),W(\"text\",j,\"textord\",\">\",\"\\\\textgreater\"),W(\"math\",j,\"open\",\"\\u230a\",\"\\\\lfloor\",!0),W(\"math\",j,\"close\",\"\\u230b\",\"\\\\rfloor\",!0),W(\"math\",j,\"open\",\"\\u2308\",\"\\\\lceil\",!0),W(\"math\",j,\"close\",\"\\u2309\",\"\\\\rceil\",!0),W(\"math\",j,\"textord\",\"\\\\\",\"\\\\backslash\"),W(\"math\",j,\"textord\",\"\\u2223\",\"|\"),W(\"math\",j,\"textord\",\"\\u2223\",\"\\\\vert\"),W(\"text\",j,\"textord\",\"|\",\"\\\\textbar\"),W(\"math\",j,\"textord\",\"\\u2225\",\"\\\\|\"),W(\"math\",j,\"textord\",\"\\u2225\",\"\\\\Vert\"),W(\"text\",j,\"textord\",\"\\u2225\",\"\\\\textbardbl\"),W(\"text\",j,\"textord\",\"~\",\"\\\\textasciitilde\"),W(\"text\",j,\"textord\",\"\\\\\",\"\\\\textbackslash\"),W(\"text\",j,\"textord\",\"^\",\"\\\\textasciicircum\"),W(\"math\",j,Q,\"\\u2191\",\"\\\\uparrow\",!0),W(\"math\",j,Q,\"\\u21d1\",\"\\\\Uparrow\",!0),W(\"math\",j,Q,\"\\u2193\",\"\\\\downarrow\",!0),W(\"math\",j,Q,\"\\u21d3\",\"\\\\Downarrow\",!0),W(\"math\",j,Q,\"\\u2195\",\"\\\\updownarrow\",!0),W(\"math\",j,Q,\"\\u21d5\",\"\\\\Updownarrow\",!0),W(\"math\",j,J,\"\\u2210\",\"\\\\coprod\"),W(\"math\",j,J,\"\\u22c1\",\"\\\\bigvee\"),W(\"math\",j,J,\"\\u22c0\",\"\\\\bigwedge\"),W(\"math\",j,J,\"\\u2a04\",\"\\\\biguplus\"),W(\"math\",j,J,\"\\u22c2\",\"\\\\bigcap\"),W(\"math\",j,J,\"\\u22c3\",\"\\\\bigcup\"),W(\"math\",j,J,\"\\u222b\",\"\\\\int\"),W(\"math\",j,J,\"\\u222b\",\"\\\\intop\"),W(\"math\",j,J,\"\\u222c\",\"\\\\iint\"),W(\"math\",j,J,\"\\u222d\",\"\\\\iiint\"),W(\"math\",j,J,\"\\u220f\",\"\\\\prod\"),W(\"math\",j,J,\"\\u2211\",\"\\\\sum\"),W(\"math\",j,J,\"\\u2a02\",\"\\\\bigotimes\"),W(\"math\",j,J,\"\\u2a01\",\"\\\\bigoplus\"),W(\"math\",j,J,\"\\u2a00\",\"\\\\bigodot\"),W(\"math\",j,J,\"\\u222e\",\"\\\\oint\"),W(\"math\",j,J,\"\\u222f\",\"\\\\oiint\"),W(\"math\",j,J,\"\\u2230\",\"\\\\oiiint\"),W(\"math\",j,J,\"\\u2a06\",\"\\\\bigsqcup\"),W(\"math\",j,J,\"\\u222b\",\"\\\\smallint\"),W(\"text\",j,\"inner\",\"\\u2026\",\"\\\\textellipsis\"),W(\"math\",j,\"inner\",\"\\u2026\",\"\\\\mathellipsis\"),W(\"text\",j,\"inner\",\"\\u2026\",\"\\\\ldots\",!0),W(\"math\",j,\"inner\",\"\\u2026\",\"\\\\ldots\",!0),W(\"math\",j,\"inner\",\"\\u22ef\",\"\\\\@cdots\",!0),W(\"math\",j,\"inner\",\"\\u22f1\",\"\\\\ddots\",!0),W(\"math\",j,\"textord\",\"\\u22ee\",\"\\\\varvdots\"),W(\"math\",j,\"accent-token\",\"\\u02ca\",\"\\\\acute\"),W(\"math\",j,\"accent-token\",\"\\u02cb\",\"\\\\grave\"),W(\"math\",j,\"accent-token\",\"\\xa8\",\"\\\\ddot\"),W(\"math\",j,\"accent-token\",\"~\",\"\\\\tilde\"),W(\"math\",j,\"accent-token\",\"\\u02c9\",\"\\\\bar\"),W(\"math\",j,\"accent-token\",\"\\u02d8\",\"\\\\breve\"),W(\"math\",j,\"accent-token\",\"\\u02c7\",\"\\\\check\"),W(\"math\",j,\"accent-token\",\"^\",\"\\\\hat\"),W(\"math\",j,\"accent-token\",\"\\u20d7\",\"\\\\vec\"),W(\"math\",j,\"accent-token\",\"\\u02d9\",\"\\\\dot\"),W(\"math\",j,\"accent-token\",\"\\u02da\",\"\\\\mathring\"),W(\"math\",j,K,\"\\u0131\",\"\\\\imath\",!0),W(\"math\",j,K,\"\\u0237\",\"\\\\jmath\",!0),W(\"text\",j,\"textord\",\"\\u0131\",\"\\\\i\",!0),W(\"text\",j,\"textord\",\"\\u0237\",\"\\\\j\",!0),W(\"text\",j,\"textord\",\"\\xdf\",\"\\\\ss\",!0),W(\"text\",j,\"textord\",\"\\xe6\",\"\\\\ae\",!0),W(\"text\",j,\"textord\",\"\\xe6\",\"\\\\ae\",!0),W(\"text\",j,\"textord\",\"\\u0153\",\"\\\\oe\",!0),W(\"text\",j,\"textord\",\"\\xf8\",\"\\\\o\",!0),W(\"text\",j,\"textord\",\"\\xc6\",\"\\\\AE\",!0),W(\"text\",j,\"textord\",\"\\u0152\",\"\\\\OE\",!0),W(\"text\",j,\"textord\",\"\\xd8\",\"\\\\O\",!0),W(\"text\",j,\"accent-token\",\"\\u02ca\",\"\\\\'\"),W(\"text\",j,\"accent-token\",\"\\u02cb\",\"\\\\`\"),W(\"text\",j,\"accent-token\",\"\\u02c6\",\"\\\\^\"),W(\"text\",j,\"accent-token\",\"\\u02dc\",\"\\\\~\"),W(\"text\",j,\"accent-token\",\"\\u02c9\",\"\\\\=\"),W(\"text\",j,\"accent-token\",\"\\u02d8\",\"\\\\u\"),W(\"text\",j,\"accent-token\",\"\\u02d9\",\"\\\\.\"),W(\"text\",j,\"accent-token\",\"\\u02da\",\"\\\\r\"),W(\"text\",j,\"accent-token\",\"\\u02c7\",\"\\\\v\"),W(\"text\",j,\"accent-token\",\"\\xa8\",'\\\\\"'),W(\"text\",j,\"accent-token\",\"\\u02dd\",\"\\\\H\"),W(\"text\",j,\"accent-token\",\"\\u25ef\",\"\\\\textcircled\");var tt={\"--\":!0,\"---\":!0,\"``\":!0,\"''\":!0};W(\"text\",j,\"textord\",\"\\u2013\",\"--\"),W(\"text\",j,\"textord\",\"\\u2013\",\"\\\\textendash\"),W(\"text\",j,\"textord\",\"\\u2014\",\"---\"),W(\"text\",j,\"textord\",\"\\u2014\",\"\\\\textemdash\"),W(\"text\",j,\"textord\",\"\\u2018\",\"`\"),W(\"text\",j,\"textord\",\"\\u2018\",\"\\\\textquoteleft\"),W(\"text\",j,\"textord\",\"\\u2019\",\"'\"),W(\"text\",j,\"textord\",\"\\u2019\",\"\\\\textquoteright\"),W(\"text\",j,\"textord\",\"\\u201c\",\"``\"),W(\"text\",j,\"textord\",\"\\u201c\",\"\\\\textquotedblleft\"),W(\"text\",j,\"textord\",\"\\u201d\",\"''\"),W(\"text\",j,\"textord\",\"\\u201d\",\"\\\\textquotedblright\"),W(\"math\",j,\"textord\",\"\\xb0\",\"\\\\degree\",!0),W(\"text\",j,\"textord\",\"\\xb0\",\"\\\\degree\"),W(\"text\",j,\"textord\",\"\\xb0\",\"\\\\textdegree\",!0),W(\"math\",j,K,\"\\xa3\",\"\\\\pounds\"),W(\"math\",j,K,\"\\xa3\",\"\\\\mathsterling\",!0),W(\"text\",j,K,\"\\xa3\",\"\\\\pounds\"),W(\"text\",j,K,\"\\xa3\",\"\\\\textsterling\",!0),W(\"math\",$,\"textord\",\"\\u2720\",\"\\\\maltese\"),W(\"text\",$,\"textord\",\"\\u2720\",\"\\\\maltese\"),W(\"text\",j,\"spacing\",\"\\xa0\",\"\\\\ \"),W(\"text\",j,\"spacing\",\"\\xa0\",\" \"),W(\"text\",j,\"spacing\",\"\\xa0\",\"~\");for(var et=0;et<'0123456789/@.\"'.length;et++){var rt='0123456789/@.\"'.charAt(et);W(\"math\",j,\"textord\",rt,rt)}for(var at=0;at<'0123456789!@*()-=+[]<>|\";:?/.,'.length;at++){var nt='0123456789!@*()-=+[]<>|\";:?/.,'.charAt(at);W(\"text\",j,\"textord\",nt,nt)}for(var ot=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",it=0;it<ot.length;it++){var st=ot.charAt(it);W(\"math\",j,K,st,st),W(\"text\",j,\"textord\",st,st)}W(\"math\",$,\"textord\",\"C\",\"\\u2102\"),W(\"text\",$,\"textord\",\"C\",\"\\u2102\"),W(\"math\",$,\"textord\",\"H\",\"\\u210d\"),W(\"text\",$,\"textord\",\"H\",\"\\u210d\"),W(\"math\",$,\"textord\",\"N\",\"\\u2115\"),W(\"text\",$,\"textord\",\"N\",\"\\u2115\"),W(\"math\",$,\"textord\",\"P\",\"\\u2119\"),W(\"text\",$,\"textord\",\"P\",\"\\u2119\"),W(\"math\",$,\"textord\",\"Q\",\"\\u211a\"),W(\"text\",$,\"textord\",\"Q\",\"\\u211a\"),W(\"math\",$,\"textord\",\"R\",\"\\u211d\"),W(\"text\",$,\"textord\",\"R\",\"\\u211d\"),W(\"math\",$,\"textord\",\"Z\",\"\\u2124\"),W(\"text\",$,\"textord\",\"Z\",\"\\u2124\"),W(\"math\",j,K,\"h\",\"\\u210e\"),W(\"text\",j,K,\"h\",\"\\u210e\");for(var ht=\"\",lt=0;lt<ot.length;lt++){var mt=ot.charAt(lt);W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56320+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56372+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56424+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56580+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56736+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56788+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56840+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56944+lt)),W(\"text\",j,\"textord\",mt,ht),lt<26&&(W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56632+lt)),W(\"text\",j,\"textord\",mt,ht),W(\"math\",j,K,mt,ht=String.fromCharCode(55349,56476+lt)),W(\"text\",j,\"textord\",mt,ht))}W(\"math\",j,K,\"k\",ht=String.fromCharCode(55349,56668)),W(\"text\",j,\"textord\",\"k\",ht);for(var ct=0;ct<10;ct++){var ut=ct.toString();W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57294+ct)),W(\"text\",j,\"textord\",ut,ht),W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57314+ct)),W(\"text\",j,\"textord\",ut,ht),W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57324+ct)),W(\"text\",j,\"textord\",ut,ht),W(\"math\",j,K,ut,ht=String.fromCharCode(55349,57334+ct)),W(\"text\",j,\"textord\",ut,ht)}for(var dt=0;dt<\"\\xc7\\xd0\\xde\\xe7\\xfe\".length;dt++){var pt=\"\\xc7\\xd0\\xde\\xe7\\xfe\".charAt(dt);W(\"math\",j,K,pt,pt),W(\"text\",j,\"textord\",pt,pt)}W(\"text\",j,\"textord\",\"\\xf0\",\"\\xf0\"),W(\"text\",j,\"textord\",\"\\u2013\",\"\\u2013\"),W(\"text\",j,\"textord\",\"\\u2014\",\"\\u2014\"),W(\"text\",j,\"textord\",\"\\u2018\",\"\\u2018\"),W(\"text\",j,\"textord\",\"\\u2019\",\"\\u2019\"),W(\"text\",j,\"textord\",\"\\u201c\",\"\\u201c\"),W(\"text\",j,\"textord\",\"\\u201d\",\"\\u201d\");var ft=[[\"mathbf\",\"textbf\",\"Main-Bold\"],[\"mathbf\",\"textbf\",\"Main-Bold\"],[\"mathdefault\",\"textit\",\"Math-Italic\"],[\"mathdefault\",\"textit\",\"Math-Italic\"],[\"boldsymbol\",\"boldsymbol\",\"Main-BoldItalic\"],[\"boldsymbol\",\"boldsymbol\",\"Main-BoldItalic\"],[\"mathscr\",\"textscr\",\"Script-Regular\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"mathfrak\",\"textfrak\",\"Fraktur-Regular\"],[\"mathfrak\",\"textfrak\",\"Fraktur-Regular\"],[\"mathbb\",\"textbb\",\"AMS-Regular\"],[\"mathbb\",\"textbb\",\"AMS-Regular\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"mathsf\",\"textsf\",\"SansSerif-Regular\"],[\"mathsf\",\"textsf\",\"SansSerif-Regular\"],[\"mathboldsf\",\"textboldsf\",\"SansSerif-Bold\"],[\"mathboldsf\",\"textboldsf\",\"SansSerif-Bold\"],[\"mathitsf\",\"textitsf\",\"SansSerif-Italic\"],[\"mathitsf\",\"textitsf\",\"SansSerif-Italic\"],[\"\",\"\",\"\"],[\"\",\"\",\"\"],[\"mathtt\",\"texttt\",\"Typewriter-Regular\"],[\"mathtt\",\"texttt\",\"Typewriter-Regular\"]],gt=[[\"mathbf\",\"textbf\",\"Main-Bold\"],[\"\",\"\",\"\"],[\"mathsf\",\"textsf\",\"SansSerif-Regular\"],[\"mathboldsf\",\"textboldsf\",\"SansSerif-Bold\"],[\"mathtt\",\"texttt\",\"Typewriter-Regular\"]],xt=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],vt=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],bt=function(t,e){return e.size<2?t:xt[t-1][e.size-1]},yt=function(){function t(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||\"\",this.fontFamily=e.fontFamily||\"\",this.fontWeight=e.fontWeight||\"\",this.fontShape=e.fontShape||\"\",this.sizeMultiplier=vt[this.size-1],this.maxSize=e.maxSize,this._fontMetrics=void 0}var e=t.prototype;return e.extend=function(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize};for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);return new t(r)},e.havingStyle=function(t){return this.style===t?this:this.extend({style:t,size:bt(this.textSize,t)})},e.havingCrampedStyle=function(){return this.havingStyle(this.style.cramp())},e.havingSize=function(t){return this.size===t&&this.textSize===t?this:this.extend({style:this.style.text(),size:t,textSize:t,sizeMultiplier:vt[t-1]})},e.havingBaseStyle=function(e){e=e||this.style.text();var r=bt(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})},e.havingBaseSizing=function(){var t;switch(this.style.id){case 4:case 5:t=3;break;case 6:case 7:t=1;break;default:t=6}return this.extend({style:this.style.text(),size:t})},e.withColor=function(t){return this.extend({color:t})},e.withPhantom=function(){return this.extend({phantom:!0})},e.withFont=function(t){return this.extend({font:t})},e.withTextFontFamily=function(t){return this.extend({fontFamily:t,font:\"\"})},e.withTextFontWeight=function(t){return this.extend({fontWeight:t,font:\"\"})},e.withTextFontShape=function(t){return this.extend({fontShape:t,font:\"\"})},e.sizingClasses=function(t){return t.size!==this.size?[\"sizing\",\"reset-size\"+t.size,\"size\"+this.size]:[]},e.baseSizingClasses=function(){return this.size!==t.BASESIZE?[\"sizing\",\"reset-size\"+this.size,\"size\"+t.BASESIZE]:[]},e.fontMetrics=function(){return this._fontMetrics||(this._fontMetrics=function(t){var e;if(!U[e=t>=5?0:t>=3?1:2]){var r=U[e]={cssEmPerMu:D.quad[e]/18};for(var a in D)D.hasOwnProperty(a)&&(r[a]=D[a][e])}return U[e]}(this.size)),this._fontMetrics},e.getColor=function(){return this.phantom?\"transparent\":this.color},t}();yt.BASESIZE=6;var wt=yt,kt={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},St={ex:!0,em:!0,mu:!0},zt=function(t,e){var r;if(t.unit in kt)r=kt[t.unit]/e.fontMetrics().ptPerEm/e.sizeMultiplier;else if(\"mu\"===t.unit)r=e.fontMetrics().cssEmPerMu;else{var a;if(a=e.style.isTight()?e.havingStyle(e.style.text()):e,\"ex\"===t.unit)r=a.fontMetrics().xHeight;else{if(\"em\"!==t.unit)throw new i(\"Invalid unit: '\"+t.unit+\"'\");r=a.fontMetrics().quad}a!==e&&(r*=a.sizeMultiplier/e.sizeMultiplier)}return Math.min(t.number*r,e.maxSize)},Mt=[\"\\\\imath\",\"\\u0131\",\"\\\\jmath\",\"\\u0237\",\"\\\\pounds\",\"\\\\mathsterling\",\"\\\\textsterling\",\"\\xa3\"],Tt=function(t,e,r){return _[r][t]&&_[r][t].replace&&(t=_[r][t].replace),{value:t,metrics:V(t,e,r)}},At=function(t,e,r,a,n){var o,i=Tt(t,e,r),s=i.metrics;if(t=i.value,s){var h=s.italic;(\"text\"===r||a&&\"mathit\"===a.font)&&(h=0),o=new E(t,s.height,s.depth,h,s.skew,s.width,n)}else\"undefined\"!=typeof console&&console.warn(\"No character metrics for '\"+t+\"' in style '\"+e+\"'\"),o=new E(t,0,0,0,0,0,n);if(a){o.maxFontSize=a.sizeMultiplier,a.style.isTight()&&o.classes.push(\"mtight\");var l=a.getColor();l&&(o.style.color=l)}return o},Bt=function(t,e){if(A(t.classes)!==A(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;for(var r in t.style)if(t.style.hasOwnProperty(r)&&t.style[r]!==e.style[r])return!1;for(var a in e.style)if(e.style.hasOwnProperty(a)&&t.style[a]!==e.style[a])return!1;return!0},qt=function(t){for(var e=0,r=0,a=0,n=0;n<t.children.length;n++){var o=t.children[n];o.height>e&&(e=o.height),o.depth>r&&(r=o.depth),o.maxFontSize>a&&(a=o.maxFontSize)}t.height=e,t.depth=r,t.maxFontSize=a},Ct=function(t,e,r,a){var n=new N(t,e,r,a);return qt(n),n},Nt=function(t,e,r,a){return new N(t,e,r,a)},It=function(t){var e=new T(t);return qt(e),e},Ot=function(t,e,r){var a=\"\";switch(t){case\"amsrm\":a=\"AMS\";break;case\"textrm\":a=\"Main\";break;case\"textsf\":a=\"SansSerif\";break;case\"texttt\":a=\"Typewriter\";break;default:a=t}return a+\"-\"+(\"textbf\"===e&&\"textit\"===r?\"BoldItalic\":\"textbf\"===e?\"Bold\":\"textit\"===e?\"Italic\":\"Regular\")},Et={mathbf:{variant:\"bold\",fontName:\"Main-Bold\"},mathrm:{variant:\"normal\",fontName:\"Main-Regular\"},textit:{variant:\"italic\",fontName:\"Main-Italic\"},mathit:{variant:\"italic\",fontName:\"Main-Italic\"},mathbb:{variant:\"double-struck\",fontName:\"AMS-Regular\"},mathcal:{variant:\"script\",fontName:\"Caligraphic-Regular\"},mathfrak:{variant:\"fraktur\",fontName:\"Fraktur-Regular\"},mathscr:{variant:\"script\",fontName:\"Script-Regular\"},mathsf:{variant:\"sans-serif\",fontName:\"SansSerif-Regular\"},mathtt:{variant:\"monospace\",fontName:\"Typewriter-Regular\"}},Rt={vec:[\"vec\",.471,.714],oiintSize1:[\"oiintSize1\",.957,.499],oiintSize2:[\"oiintSize2\",1.472,.659],oiiintSize1:[\"oiiintSize1\",1.304,.499],oiiintSize2:[\"oiiintSize2\",1.98,.659]},Lt={fontMap:Et,makeSymbol:At,mathsym:function(t,e,r,a){return void 0===a&&(a=[]),r&&r.font&&\"boldsymbol\"===r.font&&Tt(t,\"Main-Bold\",e).metrics?At(t,\"Main-Bold\",e,r,a.concat([\"mathbf\"])):\"\\\\\"===t||\"main\"===_[e][t].font?At(t,\"Main-Regular\",e,r,a):At(t,\"AMS-Regular\",e,r,a.concat([\"amsrm\"]))},makeSpan:Ct,makeSvgSpan:Nt,makeLineSpan:function(t,e,r){var a=Ct([t],[],e);return a.height=r||e.fontMetrics().defaultRuleThickness,a.style.borderBottomWidth=a.height+\"em\",a.maxFontSize=1,a},makeAnchor:function(t,e,r,a){var n=new I(t,e,r,a);return qt(n),n},makeFragment:It,wrapFragment:function(t,e){return t instanceof T?Ct([],[t],e):t},makeVList:function(t,e){for(var r=function(t){if(\"individualShift\"===t.positionType){for(var e=t.children,r=[e[0]],a=-e[0].shift-e[0].elem.depth,n=a,o=1;o<e.length;o++){var i=-e[o].shift-n-e[o].elem.depth,s=i-(e[o-1].elem.height+e[o-1].elem.depth);n+=i,r.push({type:\"kern\",size:s}),r.push(e[o])}return{children:r,depth:a}}var h;if(\"top\"===t.positionType){for(var l=t.positionData,m=0;m<t.children.length;m++){var c=t.children[m];l-=\"kern\"===c.type?c.size:c.elem.height+c.elem.depth}h=l}else if(\"bottom\"===t.positionType)h=-t.positionData;else{var u=t.children[0];if(\"elem\"!==u.type)throw new Error('First child must have type \"elem\".');if(\"shift\"===t.positionType)h=-u.elem.depth-t.positionData;else{if(\"firstBaseline\"!==t.positionType)throw new Error(\"Invalid positionType \"+t.positionType+\".\");h=-u.elem.depth}}return{children:t.children,depth:h}}(t),a=r.children,n=r.depth,o=0,i=0;i<a.length;i++){var s=a[i];if(\"elem\"===s.type){var h=s.elem;o=Math.max(o,h.maxFontSize,h.height)}}o+=2;var l=Ct([\"pstrut\"],[]);l.style.height=o+\"em\";for(var m=[],c=n,u=n,d=n,p=0;p<a.length;p++){var f=a[p];if(\"kern\"===f.type)d+=f.size;else{var g=f.elem,x=f.wrapperClasses||[],v=f.wrapperStyle||{},b=Ct(x,[l,g],void 0,v);b.style.top=-o-d-g.depth+\"em\",f.marginLeft&&(b.style.marginLeft=f.marginLeft),f.marginRight&&(b.style.marginRight=f.marginRight),m.push(b),d+=g.height+g.depth}c=Math.min(c,d),u=Math.max(u,d)}var y,w=Ct([\"vlist\"],m);if(w.style.height=u+\"em\",c<0){var k=Ct([],[]),S=Ct([\"vlist\"],[k]);S.style.height=-c+\"em\";var z=Ct([\"vlist-s\"],[new E(\"\\u200b\")]);y=[Ct([\"vlist-r\"],[w,z]),Ct([\"vlist-r\"],[S])]}else y=[Ct([\"vlist-r\"],[w])];var M=Ct([\"vlist-t\"],y);return 2===y.length&&M.classes.push(\"vlist-t2\"),M.height=u,M.depth=-c,M},makeOrd:function(t,e,r){var a,n=t.mode,o=t.text,s=[\"mord\"],h=\"math\"===n||\"text\"===n&&e.font,l=h?e.font:e.fontFamily;if(55349===o.charCodeAt(0)){var m=function(t,e){var r=1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536,a=\"math\"===e?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[ft[n][2],ft[n][a]]}if(120782<=r&&r<=120831){var o=Math.floor((r-120782)/10);return[gt[o][2],gt[o][a]]}if(120485===r||120486===r)return[ft[0][2],ft[0][a]];if(120486<r&&r<120782)return[\"\",\"\"];throw new i(\"Unsupported character: \"+t)}(o,n),u=m[0],d=m[1];return At(o,u,n,e,s.concat(d))}if(l){var p,f;if(\"boldsymbol\"===l||\"mathnormal\"===l){var g=\"boldsymbol\"===l?function(t,e,r,a){return Tt(t,\"Math-BoldItalic\",e).metrics?{fontName:\"Math-BoldItalic\",fontClass:\"boldsymbol\"}:{fontName:\"Main-Bold\",fontClass:\"mathbf\"}}(o,n):(a=o,c.contains(Mt,a)?{fontName:\"Main-Italic\",fontClass:\"mathit\"}:/[0-9]/.test(a.charAt(0))?{fontName:\"Caligraphic-Regular\",fontClass:\"mathcal\"}:{fontName:\"Math-Italic\",fontClass:\"mathdefault\"});p=g.fontName,f=[g.fontClass]}else c.contains(Mt,o)?(p=\"Main-Italic\",f=[\"mathit\"]):h?(p=Et[l].fontName,f=[l]):(p=Ot(l,e.fontWeight,e.fontShape),f=[l,e.fontWeight,e.fontShape]);if(Tt(o,p,n).metrics)return At(o,p,n,e,s.concat(f));if(tt.hasOwnProperty(o)&&\"Typewriter\"===p.substr(0,10)){for(var x=[],v=0;v<o.length;v++)x.push(At(o[v],p,n,e,s.concat(f)));return It(x)}}if(\"mathord\"===r){var b=function(t,e,r,a){return/[0-9]/.test(t.charAt(0))||c.contains(Mt,t)?{fontName:\"Main-Italic\",fontClass:\"mathit\"}:{fontName:\"Math-Italic\",fontClass:\"mathdefault\"}}(o);return At(o,b.fontName,n,e,s.concat([b.fontClass]))}if(\"textord\"===r){var y=_[n][o]&&_[n][o].font;if(\"ams\"===y){var w=Ot(\"amsrm\",e.fontWeight,e.fontShape);return At(o,w,n,e,s.concat(\"amsrm\",e.fontWeight,e.fontShape))}if(\"main\"!==y&&y){var k=Ot(y,e.fontWeight,e.fontShape);return At(o,k,n,e,s.concat(k,e.fontWeight,e.fontShape))}var S=Ot(\"textrm\",e.fontWeight,e.fontShape);return At(o,S,n,e,s.concat(e.fontWeight,e.fontShape))}throw new Error(\"unexpected type: \"+r+\" in makeOrd\")},makeGlue:function(t,e){var r=Ct([\"mspace\"],[],e),a=zt(t,e);return r.style.marginRight=a+\"em\",r},staticSvg:function(t,e){var r=Rt[t],a=r[0],n=r[1],o=r[2],i=new L(a),s=new R([i],{width:n+\"em\",height:o+\"em\",style:\"width:\"+n+\"em\",viewBox:\"0 0 \"+1e3*n+\" \"+1e3*o,preserveAspectRatio:\"xMinYMin\"}),h=Nt([\"overlay\"],[s],e);return h.height=o,h.style.height=o+\"em\",h.style.width=n+\"em\",h},svgData:Rt,tryCombineChars:function(t){for(var e=0;e<t.length-1;e++){var r=t[e],a=t[e+1];r instanceof E&&a instanceof E&&Bt(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,t.splice(e+1,1),e--)}return t}};function Ht(t,e){var r=Pt(t,e);if(!r)throw new Error(\"Expected node of type \"+e+\", but got \"+(t?\"node of type \"+t.type:String(t)));return r}function Pt(t,e){return t&&t.type===e?t:null}function Dt(t,e){var r=function(t,e){return t&&\"atom\"===t.type&&t.family===e?t:null}(t,e);if(!r)throw new Error('Expected node of type \"atom\" and family \"'+e+'\", but got '+(t?\"atom\"===t.type?\"atom of family \"+t.family:\"node of type \"+t.type:String(t)));return r}function Ft(t){return t&&(\"atom\"===t.type||X.hasOwnProperty(t.type))?t:null}var Vt={number:3,unit:\"mu\"},Ut={number:4,unit:\"mu\"},Gt={number:5,unit:\"mu\"},Xt={mord:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mop:{mord:Vt,mop:Vt,mrel:Gt,minner:Vt},mbin:{mord:Ut,mop:Ut,mopen:Ut,minner:Ut},mrel:{mord:Gt,mop:Gt,mopen:Gt,minner:Gt},mopen:{},mclose:{mop:Vt,mbin:Ut,mrel:Gt,minner:Vt},mpunct:{mord:Vt,mop:Vt,mrel:Gt,mopen:Vt,mclose:Vt,mpunct:Vt,minner:Vt},minner:{mord:Vt,mop:Vt,mbin:Ut,mrel:Gt,mopen:Vt,mpunct:Vt,minner:Vt}},Yt={mord:{mop:Vt},mop:{mord:Vt,mop:Vt},mbin:{},mrel:{},mopen:{},mclose:{mop:Vt},mpunct:{},minner:{mop:Vt}},_t={},Wt={},jt={};function $t(t){for(var e=t.type,r=(t.nodeType,t.names),a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs,argTypes:a.argTypes,greediness:void 0===a.greediness?1:a.greediness,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,consumeMode:a.consumeMode,handler:n},h=0;h<r.length;++h)_t[r[h]]=s;e&&(o&&(Wt[e]=o),i&&(jt[e]=i))}function Zt(t){$t({type:t.type,names:[],props:{numArgs:0},handler:function(){throw new Error(\"Should never be called.\")},htmlBuilder:t.htmlBuilder,mathmlBuilder:t.mathmlBuilder})}var Kt=function(t){var e=Pt(t,\"ordgroup\");return e?e.body:[t]},Jt=Lt.makeSpan,Qt=[\"leftmost\",\"mbin\",\"mopen\",\"mrel\",\"mop\",\"mpunct\"],te=[\"rightmost\",\"mrel\",\"mclose\",\"mpunct\"],ee={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT},re={mord:\"mord\",mop:\"mop\",mbin:\"mbin\",mrel:\"mrel\",mopen:\"mopen\",mclose:\"mclose\",mpunct:\"mpunct\",minner:\"minner\"},ae=function(t,e,r,a){void 0===a&&(a=[null,null]);for(var n=[],o=0;o<t.length;o++){var i=he(t[o],e);if(i instanceof T){var s=i.children;n.push.apply(n,s)}else n.push(i)}if(!r)return n;var h=e;if(1===t.length){var l=Pt(t[0],\"sizing\")||Pt(t[0],\"styling\");l&&(\"sizing\"===l.type?h=e.havingSize(l.size):\"styling\"===l.type&&(h=e.havingStyle(ee[l.style])))}var m=Jt([a[0]||\"leftmost\"],[],e),u=Jt([a[1]||\"rightmost\"],[],e);return ne(n,function(t,e){var r=e.classes[0],a=t.classes[0];\"mbin\"===r&&c.contains(te,a)?e.classes[0]=\"mord\":\"mbin\"===a&&c.contains(Qt,r)&&(t.classes[0]=\"mord\")},{node:m},u),ne(n,function(t,e){var r=ie(e),a=ie(t),n=r&&a?t.hasClass(\"mtight\")?Yt[r][a]:Xt[r][a]:null;if(n)return Lt.makeGlue(n,h)},{node:m},u),n},ne=function t(e,r,a,n){n&&e.push(n);for(var o=0;o<e.length;o++){var i=e[o],s=oe(i);if(s)t(s.children,r,a);else if(\"mspace\"!==i.classes[0]){var h=r(i,a.node);h&&(a.insertAfter?a.insertAfter(h):(e.unshift(h),o++)),a.node=i,a.insertAfter=function(t){return function(r){e.splice(t+1,0,r),o++}}(o)}}n&&e.pop()},oe=function(t){return t instanceof T||t instanceof I?t:null},ie=function(t,e){return t?(e&&(t=function t(e,r){var a=oe(e);if(a){var n=a.children;if(n.length){if(\"right\"===r)return t(n[n.length-1],\"right\");if(\"left\"===r)return t(n[0],\"left\")}}return e}(t,e)),re[t.classes[0]]||null):null},se=function(t,e){var r=[\"nulldelimiter\"].concat(t.baseSizingClasses());return Jt(e.concat(r))},he=function(t,e,r){if(!t)return Jt();if(Wt[t.type]){var a=Wt[t.type](t,e);if(r&&e.size!==r.size){a=Jt(e.sizingClasses(r),[a],e);var n=e.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new i(\"Got group of unknown type: '\"+t.type+\"'\")};function le(t,e){var r=Jt([\"base\"],t,e),a=Jt([\"strut\"]);return a.style.height=r.height+r.depth+\"em\",a.style.verticalAlign=-r.depth+\"em\",r.children.unshift(a),r}function me(t,e){var r=null;1===t.length&&\"tag\"===t[0].type&&(r=t[0].tag,t=t[0].body);for(var a,n=ae(t,e,!0),o=[],i=[],s=0;s<n.length;s++)if(i.push(n[s]),n[s].hasClass(\"mbin\")||n[s].hasClass(\"mrel\")||n[s].hasClass(\"allowbreak\")){for(var h=!1;s<n.length-1&&n[s+1].hasClass(\"mspace\")&&!n[s+1].hasClass(\"newline\");)s++,i.push(n[s]),n[s].hasClass(\"nobreak\")&&(h=!0);h||(o.push(le(i,e)),i=[])}else n[s].hasClass(\"newline\")&&(i.pop(),i.length>0&&(o.push(le(i,e)),i=[]),o.push(n[s]));i.length>0&&o.push(le(i,e)),r&&((a=le(ae(r,e,!0))).classes=[\"tag\"],o.push(a));var l=Jt([\"katex-html\"],o);if(l.setAttribute(\"aria-hidden\",\"true\"),a){var m=a.children[0];m.style.height=l.height+l.depth+\"em\",m.style.verticalAlign=-l.depth+\"em\"}return l}function ce(t){return new T(t)}var ue=function(){function t(t,e){this.type=void 0,this.attributes=void 0,this.children=void 0,this.type=t,this.attributes={},this.children=e||[]}var e=t.prototype;return e.setAttribute=function(t,e){this.attributes[t]=e},e.getAttribute=function(t){return this.attributes[t]},e.toNode=function(){var t=document.createElementNS(\"http://www.w3.org/1998/Math/MathML\",this.type);for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(var r=0;r<this.children.length;r++)t.appendChild(this.children[r].toNode());return t},e.toMarkup=function(){var t=\"<\"+this.type;for(var e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&(t+=\" \"+e+'=\"',t+=c.escape(this.attributes[e]),t+='\"');t+=\">\";for(var r=0;r<this.children.length;r++)t+=this.children[r].toMarkup();return t+=\"</\"+this.type+\">\"},e.toText=function(){return this.children.map(function(t){return t.toText()}).join(\"\")},t}(),de=function(){function t(t){this.text=void 0,this.text=t}var e=t.prototype;return e.toNode=function(){return document.createTextNode(this.text)},e.toMarkup=function(){return c.escape(this.toText())},e.toText=function(){return this.text},t}(),pe={MathNode:ue,TextNode:de,SpaceNode:function(){function t(t){this.width=void 0,this.character=void 0,this.width=t,this.character=t>=.05555&&t<=.05556?\"\\u200a\":t>=.1666&&t<=.1667?\"\\u2009\":t>=.2222&&t<=.2223?\"\\u2005\":t>=.2777&&t<=.2778?\"\\u2005\\u200a\":t>=-.05556&&t<=-.05555?\"\\u200a\\u2063\":t>=-.1667&&t<=-.1666?\"\\u2009\\u2063\":t>=-.2223&&t<=-.2222?\"\\u205f\\u2063\":t>=-.2778&&t<=-.2777?\"\\u2005\\u2063\":null}var e=t.prototype;return e.toNode=function(){if(this.character)return document.createTextNode(this.character);var t=document.createElementNS(\"http://www.w3.org/1998/Math/MathML\",\"mspace\");return t.setAttribute(\"width\",this.width+\"em\"),t},e.toMarkup=function(){return this.character?\"<mtext>\"+this.character+\"</mtext>\":'<mspace width=\"'+this.width+'em\"/>'},e.toText=function(){return this.character?this.character:\" \"},t}(),newDocumentFragment:ce},fe=function(t,e,r){return!_[e][t]||!_[e][t].replace||55349===t.charCodeAt(0)||tt.hasOwnProperty(t)&&r&&(r.fontFamily&&\"tt\"===r.fontFamily.substr(4,2)||r.font&&\"tt\"===r.font.substr(4,2))||(t=_[e][t].replace),new pe.TextNode(t)},ge=function(t){return 1===t.length?t[0]:new pe.MathNode(\"mrow\",t)},xe=function(t,e){if(\"texttt\"===e.fontFamily)return\"monospace\";if(\"textsf\"===e.fontFamily)return\"textit\"===e.fontShape&&\"textbf\"===e.fontWeight?\"sans-serif-bold-italic\":\"textit\"===e.fontShape?\"sans-serif-italic\":\"textbf\"===e.fontWeight?\"bold-sans-serif\":\"sans-serif\";if(\"textit\"===e.fontShape&&\"textbf\"===e.fontWeight)return\"bold-italic\";if(\"textit\"===e.fontShape)return\"italic\";if(\"textbf\"===e.fontWeight)return\"bold\";var r=e.font;if(!r||\"mathnormal\"===r)return null;var a=t.mode;if(\"mathit\"===r)return\"italic\";if(\"boldsymbol\"===r)return\"bold-italic\";var n=t.text;return c.contains([\"\\\\imath\",\"\\\\jmath\"],n)?null:(_[a][n]&&_[a][n].replace&&(n=_[a][n].replace),V(n,Lt.fontMap[r].fontName,a)?Lt.fontMap[r].variant:null)},ve=function(t,e){for(var r,a=[],n=0;n<t.length;n++){var o=ye(t[n],e);if(o instanceof ue&&r instanceof ue){if(\"mtext\"===o.type&&\"mtext\"===r.type&&o.getAttribute(\"mathvariant\")===r.getAttribute(\"mathvariant\")){var i;(i=r.children).push.apply(i,o.children);continue}if(\"mn\"===o.type&&\"mn\"===r.type){var s;(s=r.children).push.apply(s,o.children);continue}if(\"mi\"===o.type&&1===o.children.length&&\"mn\"===r.type){var h=o.children[0];if(h instanceof de&&\".\"===h.text){var l;(l=r.children).push.apply(l,o.children);continue}}else if(\"mi\"===r.type&&1===r.children.length){var m=r.children[0];if(m instanceof de&&\"\\u0338\"===m.text&&(\"mo\"===o.type||\"mi\"===o.type||\"mn\"===o.type)){var c=o.children[0];c instanceof de&&c.text.length>0&&(c.text=c.text.slice(0,1)+\"\\u0338\"+c.text.slice(1),a.pop())}}}a.push(o),r=o}return a},be=function(t,e){return ge(ve(t,e))},ye=function(t,e){if(!t)return new pe.MathNode(\"mrow\");if(jt[t.type])return jt[t.type](t,e);throw new i(\"Got group of unknown type: '\"+t.type+\"'\")};var we=function(t){return new wt({style:t.displayMode?w.DISPLAY:w.TEXT,maxSize:t.maxSize})},ke=function(t,e){if(e.displayMode){var r=[\"katex-display\"];e.leqno&&r.push(\"leqno\"),e.fleqn&&r.push(\"fleqn\"),t=Lt.makeSpan(r,[t])}return t},Se=function(t,e,r){var a=we(r),n=function(t,e,r){var a,n=ve(t,r);a=1===n.length&&n[0]instanceof ue&&c.contains([\"mrow\",\"mtable\"],n[0].type)?n[0]:new pe.MathNode(\"mrow\",n);var o=new pe.MathNode(\"annotation\",[new pe.TextNode(e)]);o.setAttribute(\"encoding\",\"application/x-tex\");var i=new pe.MathNode(\"semantics\",[a,o]),s=new pe.MathNode(\"math\",[i]);return Lt.makeSpan([\"katex-mathml\"],[s])}(t,e,a),o=me(t,a),i=Lt.makeSpan([\"katex\"],[n,o]);return ke(i,r)},ze={widehat:\"^\",widecheck:\"\\u02c7\",widetilde:\"~\",utilde:\"~\",overleftarrow:\"\\u2190\",underleftarrow:\"\\u2190\",xleftarrow:\"\\u2190\",overrightarrow:\"\\u2192\",underrightarrow:\"\\u2192\",xrightarrow:\"\\u2192\",underbrace:\"\\u23df\",overbrace:\"\\u23de\",overgroup:\"\\u23e0\",undergroup:\"\\u23e1\",overleftrightarrow:\"\\u2194\",underleftrightarrow:\"\\u2194\",xleftrightarrow:\"\\u2194\",Overrightarrow:\"\\u21d2\",xRightarrow:\"\\u21d2\",overleftharpoon:\"\\u21bc\",xleftharpoonup:\"\\u21bc\",overrightharpoon:\"\\u21c0\",xrightharpoonup:\"\\u21c0\",xLeftarrow:\"\\u21d0\",xLeftrightarrow:\"\\u21d4\",xhookleftarrow:\"\\u21a9\",xhookrightarrow:\"\\u21aa\",xmapsto:\"\\u21a6\",xrightharpoondown:\"\\u21c1\",xleftharpoondown:\"\\u21bd\",xrightleftharpoons:\"\\u21cc\",xleftrightharpoons:\"\\u21cb\",xtwoheadleftarrow:\"\\u219e\",xtwoheadrightarrow:\"\\u21a0\",xlongequal:\"=\",xtofrom:\"\\u21c4\",xrightleftarrows:\"\\u21c4\",xrightequilibrium:\"\\u21cc\",xleftequilibrium:\"\\u21cb\"},Me={overrightarrow:[[\"rightarrow\"],.888,522,\"xMaxYMin\"],overleftarrow:[[\"leftarrow\"],.888,522,\"xMinYMin\"],underrightarrow:[[\"rightarrow\"],.888,522,\"xMaxYMin\"],underleftarrow:[[\"leftarrow\"],.888,522,\"xMinYMin\"],xrightarrow:[[\"rightarrow\"],1.469,522,\"xMaxYMin\"],xleftarrow:[[\"leftarrow\"],1.469,522,\"xMinYMin\"],Overrightarrow:[[\"doublerightarrow\"],.888,560,\"xMaxYMin\"],xRightarrow:[[\"doublerightarrow\"],1.526,560,\"xMaxYMin\"],xLeftarrow:[[\"doubleleftarrow\"],1.526,560,\"xMinYMin\"],overleftharpoon:[[\"leftharpoon\"],.888,522,\"xMinYMin\"],xleftharpoonup:[[\"leftharpoon\"],.888,522,\"xMinYMin\"],xleftharpoondown:[[\"leftharpoondown\"],.888,522,\"xMinYMin\"],overrightharpoon:[[\"rightharpoon\"],.888,522,\"xMaxYMin\"],xrightharpoonup:[[\"rightharpoon\"],.888,522,\"xMaxYMin\"],xrightharpoondown:[[\"rightharpoondown\"],.888,522,\"xMaxYMin\"],xlongequal:[[\"longequal\"],.888,334,\"xMinYMin\"],xtwoheadleftarrow:[[\"twoheadleftarrow\"],.888,334,\"xMinYMin\"],xtwoheadrightarrow:[[\"twoheadrightarrow\"],.888,334,\"xMaxYMin\"],overleftrightarrow:[[\"leftarrow\",\"rightarrow\"],.888,522],overbrace:[[\"leftbrace\",\"midbrace\",\"rightbrace\"],1.6,548],underbrace:[[\"leftbraceunder\",\"midbraceunder\",\"rightbraceunder\"],1.6,548],underleftrightarrow:[[\"leftarrow\",\"rightarrow\"],.888,522],xleftrightarrow:[[\"leftarrow\",\"rightarrow\"],1.75,522],xLeftrightarrow:[[\"doubleleftarrow\",\"doublerightarrow\"],1.75,560],xrightleftharpoons:[[\"leftharpoondownplus\",\"rightharpoonplus\"],1.75,716],xleftrightharpoons:[[\"leftharpoonplus\",\"rightharpoondownplus\"],1.75,716],xhookleftarrow:[[\"leftarrow\",\"righthook\"],1.08,522],xhookrightarrow:[[\"lefthook\",\"rightarrow\"],1.08,522],overlinesegment:[[\"leftlinesegment\",\"rightlinesegment\"],.888,522],underlinesegment:[[\"leftlinesegment\",\"rightlinesegment\"],.888,522],overgroup:[[\"leftgroup\",\"rightgroup\"],.888,342],undergroup:[[\"leftgroupunder\",\"rightgroupunder\"],.888,342],xmapsto:[[\"leftmapsto\",\"rightarrow\"],1.5,522],xtofrom:[[\"leftToFrom\",\"rightToFrom\"],1.75,528],xrightleftarrows:[[\"baraboveleftarrow\",\"rightarrowabovebar\"],1.75,901],xrightequilibrium:[[\"baraboveshortleftharpoon\",\"rightharpoonaboveshortbar\"],1.75,716],xleftequilibrium:[[\"shortbaraboveleftharpoon\",\"shortrightharpoonabovebar\"],1.75,716]},Te=function(t){return\"ordgroup\"===t.type?t.body.length:1},Ae=function(t,e,r,a){var n,o=t.height+t.depth+2*r;if(/fbox|color/.test(e)){if(n=Lt.makeSpan([\"stretchy\",e],[],a),\"fbox\"===e){var i=a.color&&a.getColor();i&&(n.style.borderColor=i)}}else{var s=[];/^[bx]cancel$/.test(e)&&s.push(new H({x1:\"0\",y1:\"0\",x2:\"100%\",y2:\"100%\",\"stroke-width\":\"0.046em\"})),/^x?cancel$/.test(e)&&s.push(new H({x1:\"0\",y1:\"100%\",x2:\"100%\",y2:\"0\",\"stroke-width\":\"0.046em\"}));var h=new R(s,{width:\"100%\",height:o+\"em\"});n=Lt.makeSvgSpan([],[h],a)}return n.height=o,n.style.height=o+\"em\",n},Be=function(t){var e=new pe.MathNode(\"mo\",[new pe.TextNode(ze[t.substr(1)])]);return e.setAttribute(\"stretchy\",\"true\"),e},qe=function(t,e){var r=function(){var r=4e5,a=t.label.substr(1);if(c.contains([\"widehat\",\"widecheck\",\"widetilde\",\"utilde\"],a)){var n,o,i,s=Te(t.base);if(s>5)\"widehat\"===a||\"widecheck\"===a?(n=420,r=2364,i=.42,o=a+\"4\"):(n=312,r=2340,i=.34,o=\"tilde4\");else{var h=[1,1,2,2,3,3][s];\"widehat\"===a||\"widecheck\"===a?(r=[0,1062,2364,2364,2364][h],n=[0,239,300,360,420][h],i=[0,.24,.3,.3,.36,.42][h],o=a+h):(r=[0,600,1033,2339,2340][h],n=[0,260,286,306,312][h],i=[0,.26,.286,.3,.306,.34][h],o=\"tilde\"+h)}var l=new L(o),m=new R([l],{width:\"100%\",height:i+\"em\",viewBox:\"0 0 \"+r+\" \"+n,preserveAspectRatio:\"none\"});return{span:Lt.makeSvgSpan([],[m],e),minWidth:0,height:i}}var u,d,p=[],f=Me[a],g=f[0],x=f[1],v=f[2],b=v/1e3,y=g.length;if(1===y)u=[\"hide-tail\"],d=[f[3]];else if(2===y)u=[\"halfarrow-left\",\"halfarrow-right\"],d=[\"xMinYMin\",\"xMaxYMin\"];else{if(3!==y)throw new Error(\"Correct katexImagesData or update code here to support\\n                    \"+y+\" children.\");u=[\"brace-left\",\"brace-center\",\"brace-right\"],d=[\"xMinYMin\",\"xMidYMin\",\"xMaxYMin\"]}for(var w=0;w<y;w++){var k=new L(g[w]),S=new R([k],{width:\"400em\",height:b+\"em\",viewBox:\"0 0 \"+r+\" \"+v,preserveAspectRatio:d[w]+\" slice\"}),z=Lt.makeSvgSpan([u[w]],[S],e);if(1===y)return{span:z,minWidth:x,height:b};z.style.height=b+\"em\",p.push(z)}return{span:Lt.makeSpan([\"stretchy\"],p,e),minWidth:x,height:b}}(),a=r.span,n=r.minWidth,o=r.height;return a.height=o,a.style.height=o+\"em\",n>0&&(a.style.minWidth=n+\"em\"),a},Ce=function(t,e){var r,a,n,o=Pt(t,\"supsub\");o?(r=(a=Ht(o.base,\"accent\")).base,o.base=r,n=function(t){if(t instanceof N)return t;throw new Error(\"Expected span<HtmlDomNode> but got \"+String(t)+\".\")}(he(o,e)),o.base=a):r=(a=Ht(t,\"accent\")).base;var i=he(r,e.havingCrampedStyle()),s=0;if(a.isShifty&&c.isCharacterBox(r)){var h=c.getBaseElem(r);s=function(t){if(t instanceof E)return t;throw new Error(\"Expected symbolNode but got \"+String(t)+\".\")}(he(h,e.havingCrampedStyle())).skew}var l,m=Math.min(i.height,e.fontMetrics().xHeight);if(a.isStretchy)l=qe(a,e),l=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:i},{type:\"elem\",elem:l,wrapperClasses:[\"svg-align\"],wrapperStyle:s>0?{width:\"calc(100% - \"+2*s+\"em)\",marginLeft:2*s+\"em\"}:void 0}]},e);else{var u,d;\"\\\\vec\"===a.label?(u=Lt.staticSvg(\"vec\",e),d=Lt.svgData.vec[1]):((u=Lt.makeSymbol(a.label,\"Main-Regular\",a.mode,e)).italic=0,d=u.width),l=Lt.makeSpan([\"accent-body\"],[u]);var p=\"\\\\textcircled\"===a.label;p&&(l.classes.push(\"accent-full\"),m=i.height);var f=s;p||(f-=d/2),l.style.left=f+\"em\",\"\\\\textcircled\"===a.label&&(l.style.top=\".2em\"),l=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:i},{type:\"kern\",size:-m},{type:\"elem\",elem:l}]},e)}var g=Lt.makeSpan([\"mord\",\"accent\"],[l],e);return n?(n.children[0]=g,n.height=Math.max(g.height,n.height),n.classes[0]=\"mord\",n):g},Ne=function(t,e){var r=t.isStretchy?Be(t.label):new pe.MathNode(\"mo\",[fe(t.label,t.mode)]),a=new pe.MathNode(\"mover\",[ye(t.base,e),r]);return a.setAttribute(\"accent\",\"true\"),a},Ie=new RegExp([\"\\\\acute\",\"\\\\grave\",\"\\\\ddot\",\"\\\\tilde\",\"\\\\bar\",\"\\\\breve\",\"\\\\check\",\"\\\\hat\",\"\\\\vec\",\"\\\\dot\",\"\\\\mathring\"].map(function(t){return\"\\\\\"+t}).join(\"|\"));$t({type:\"accent\",names:[\"\\\\acute\",\"\\\\grave\",\"\\\\ddot\",\"\\\\tilde\",\"\\\\bar\",\"\\\\breve\",\"\\\\check\",\"\\\\hat\",\"\\\\vec\",\"\\\\dot\",\"\\\\mathring\",\"\\\\widecheck\",\"\\\\widehat\",\"\\\\widetilde\",\"\\\\overrightarrow\",\"\\\\overleftarrow\",\"\\\\Overrightarrow\",\"\\\\overleftrightarrow\",\"\\\\overgroup\",\"\\\\overlinesegment\",\"\\\\overleftharpoon\",\"\\\\overrightharpoon\"],props:{numArgs:1},handler:function(t,e){var r=e[0],a=!Ie.test(t.funcName),n=!a||\"\\\\widehat\"===t.funcName||\"\\\\widetilde\"===t.funcName||\"\\\\widecheck\"===t.funcName;return{type:\"accent\",mode:t.parser.mode,label:t.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:\"accent\",names:[\"\\\\'\",\"\\\\`\",\"\\\\^\",\"\\\\~\",\"\\\\=\",\"\\\\u\",\"\\\\.\",'\\\\\"',\"\\\\r\",\"\\\\H\",\"\\\\v\",\"\\\\textcircled\"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1},handler:function(t,e){var r=e[0];return{type:\"accent\",mode:t.parser.mode,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ce,mathmlBuilder:Ne}),$t({type:\"accentUnder\",names:[\"\\\\underleftarrow\",\"\\\\underrightarrow\",\"\\\\underleftrightarrow\",\"\\\\undergroup\",\"\\\\underlinesegment\",\"\\\\utilde\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"accentUnder\",mode:r.mode,label:a,base:n}},htmlBuilder:function(t,e){var r=he(t.base,e),a=qe(t,e),n=\"\\\\utilde\"===t.label?.12:0,o=Lt.makeVList({positionType:\"bottom\",positionData:a.height+n,children:[{type:\"elem\",elem:a,wrapperClasses:[\"svg-align\"]},{type:\"kern\",size:n},{type:\"elem\",elem:r}]},e);return Lt.makeSpan([\"mord\",\"accentunder\"],[o],e)},mathmlBuilder:function(t,e){var r=Be(t.label),a=new pe.MathNode(\"munder\",[ye(t.base,e),r]);return a.setAttribute(\"accentunder\",\"true\"),a}});var Oe=function(t){var e=new pe.MathNode(\"mpadded\",t?[t]:[]);return e.setAttribute(\"width\",\"+0.6em\"),e.setAttribute(\"lspace\",\"0.3em\"),e};$t({type:\"xArrow\",names:[\"\\\\xleftarrow\",\"\\\\xrightarrow\",\"\\\\xLeftarrow\",\"\\\\xRightarrow\",\"\\\\xleftrightarrow\",\"\\\\xLeftrightarrow\",\"\\\\xhookleftarrow\",\"\\\\xhookrightarrow\",\"\\\\xmapsto\",\"\\\\xrightharpoondown\",\"\\\\xrightharpoonup\",\"\\\\xleftharpoondown\",\"\\\\xleftharpoonup\",\"\\\\xrightleftharpoons\",\"\\\\xleftrightharpoons\",\"\\\\xlongequal\",\"\\\\xtwoheadrightarrow\",\"\\\\xtwoheadleftarrow\",\"\\\\xtofrom\",\"\\\\xrightleftarrows\",\"\\\\xrightequilibrium\",\"\\\\xleftequilibrium\"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName;return{type:\"xArrow\",mode:a.mode,label:n,body:e[0],below:r[0]}},htmlBuilder:function(t,e){var r,a=e.style,n=e.havingStyle(a.sup()),o=Lt.wrapFragment(he(t.body,n,e),e);o.classes.push(\"x-arrow-pad\"),t.below&&(n=e.havingStyle(a.sub()),(r=Lt.wrapFragment(he(t.below,n,e),e)).classes.push(\"x-arrow-pad\"));var i,s=qe(t,e),h=-e.fontMetrics().axisHeight+.5*s.height,l=-e.fontMetrics().axisHeight-.5*s.height-.111;if((o.depth>.25||\"\\\\xleftequilibrium\"===t.label)&&(l-=o.depth),r){var m=-e.fontMetrics().axisHeight+r.height+.5*s.height+.111;i=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:o,shift:l},{type:\"elem\",elem:s,shift:h},{type:\"elem\",elem:r,shift:m}]},e)}else i=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:o,shift:l},{type:\"elem\",elem:s,shift:h}]},e);return i.children[0].children[0].children[1].classes.push(\"svg-align\"),Lt.makeSpan([\"mrel\",\"x-arrow\"],[i],e)},mathmlBuilder:function(t,e){var r,a=Be(t.label);if(t.body){var n=Oe(ye(t.body,e));if(t.below){var o=Oe(ye(t.below,e));r=new pe.MathNode(\"munderover\",[a,o,n])}else r=new pe.MathNode(\"mover\",[a,n])}else if(t.below){var i=Oe(ye(t.below,e));r=new pe.MathNode(\"munder\",[a,i])}else r=Oe(),r=new pe.MathNode(\"mover\",[a,r]);return r}}),$t({type:\"textord\",names:[\"\\\\@char\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],\"ordgroup\").body,n=\"\",o=0;o<a.length;o++){n+=Ht(a[o],\"textord\").text}var s=parseInt(n);if(isNaN(s))throw new i(\"\\\\@char has non-numeric argument \"+n);return{type:\"textord\",mode:r.mode,text:String.fromCharCode(s)}}});var Ee=function(t,e){var r=ae(t.body,e.withColor(t.color),!1);return Lt.makeFragment(r)},Re=function(t,e){var r=ve(t.body,e.withColor(t.color)),a=new pe.MathNode(\"mstyle\",r);return a.setAttribute(\"mathcolor\",t.color),a};$t({type:\"color\",names:[\"\\\\textcolor\"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:[\"color\",\"original\"]},handler:function(t,e){var r=t.parser,a=Ht(e[0],\"color-token\").color,n=e[1];return{type:\"color\",mode:r.mode,color:a,body:Kt(n)}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:\"color\",names:[\"\\\\color\"],props:{numArgs:1,allowedInText:!0,greediness:3,argTypes:[\"color\"]},handler:function(t,e){var r=t.parser,a=t.breakOnTokenText,n=Ht(e[0],\"color-token\").color,o=r.parseExpression(!0,a);return{type:\"color\",mode:r.mode,color:n,body:o}},htmlBuilder:Ee,mathmlBuilder:Re}),$t({type:\"cr\",names:[\"\\\\cr\",\"\\\\newline\"],props:{numArgs:0,numOptionalArgs:1,argTypes:[\"size\"],allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=r[0],i=\"\\\\cr\"===n,s=!1;return i||(s=!a.settings.displayMode||!a.settings.useStrictBehavior(\"newLineInDisplayMode\",\"In LaTeX, \\\\\\\\ or \\\\newline does nothing in display mode\")),{type:\"cr\",mode:a.mode,newLine:s,newRow:i,size:o&&Ht(o,\"size\").value}},htmlBuilder:function(t,e){if(t.newRow)throw new i(\"\\\\cr valid only within a tabular/array environment\");var r=Lt.makeSpan([\"mspace\"],[],e);return t.newLine&&(r.classes.push(\"newline\"),t.size&&(r.style.marginTop=zt(t.size,e)+\"em\")),r},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mspace\");return t.newLine&&(r.setAttribute(\"linebreak\",\"newline\"),t.size&&r.setAttribute(\"height\",zt(t.size,e)+\"em\")),r}});var Le=function(t,e,r){var a=V(_.math[t]&&_.math[t].replace||t,e,r);if(!a)throw new Error(\"Unsupported symbol \"+t+\" and font size \"+e+\".\");return a},He=function(t,e,r,a){var n=r.havingBaseStyle(e),o=Lt.makeSpan(a.concat(n.sizingClasses(r)),[t],r),i=n.sizeMultiplier/r.sizeMultiplier;return o.height*=i,o.depth*=i,o.maxFontSize=n.sizeMultiplier,o},Pe=function(t,e,r){var a=e.havingBaseStyle(r),n=(1-e.sizeMultiplier/a.sizeMultiplier)*e.fontMetrics().axisHeight;t.classes.push(\"delimcenter\"),t.style.top=n+\"em\",t.height-=n,t.depth+=n},De=function(t,e,r,a,n,o){var i=function(t,e,r,a){return Lt.makeSymbol(t,\"Size\"+e+\"-Regular\",r,a)}(t,e,n,a),s=He(Lt.makeSpan([\"delimsizing\",\"size\"+e],[i],a),w.TEXT,a,o);return r&&Pe(s,a,w.TEXT),s},Fe=function(t,e,r){var a;return a=\"Size1-Regular\"===e?\"delim-size1\":\"delim-size4\",{type:\"elem\",elem:Lt.makeSpan([\"delimsizinginner\",a],[Lt.makeSpan([],[Lt.makeSymbol(t,e,r)])])}},Ve=function(t,e,r,a,n,o){var i,s,h,l;i=h=l=t,s=null;var m=\"Size1-Regular\";\"\\\\uparrow\"===t?h=l=\"\\u23d0\":\"\\\\Uparrow\"===t?h=l=\"\\u2016\":\"\\\\downarrow\"===t?i=h=\"\\u23d0\":\"\\\\Downarrow\"===t?i=h=\"\\u2016\":\"\\\\updownarrow\"===t?(i=\"\\\\uparrow\",h=\"\\u23d0\",l=\"\\\\downarrow\"):\"\\\\Updownarrow\"===t?(i=\"\\\\Uparrow\",h=\"\\u2016\",l=\"\\\\Downarrow\"):\"[\"===t||\"\\\\lbrack\"===t?(i=\"\\u23a1\",h=\"\\u23a2\",l=\"\\u23a3\",m=\"Size4-Regular\"):\"]\"===t||\"\\\\rbrack\"===t?(i=\"\\u23a4\",h=\"\\u23a5\",l=\"\\u23a6\",m=\"Size4-Regular\"):\"\\\\lfloor\"===t||\"\\u230a\"===t?(h=i=\"\\u23a2\",l=\"\\u23a3\",m=\"Size4-Regular\"):\"\\\\lceil\"===t||\"\\u2308\"===t?(i=\"\\u23a1\",h=l=\"\\u23a2\",m=\"Size4-Regular\"):\"\\\\rfloor\"===t||\"\\u230b\"===t?(h=i=\"\\u23a5\",l=\"\\u23a6\",m=\"Size4-Regular\"):\"\\\\rceil\"===t||\"\\u2309\"===t?(i=\"\\u23a4\",h=l=\"\\u23a5\",m=\"Size4-Regular\"):\"(\"===t||\"\\\\lparen\"===t?(i=\"\\u239b\",h=\"\\u239c\",l=\"\\u239d\",m=\"Size4-Regular\"):\")\"===t||\"\\\\rparen\"===t?(i=\"\\u239e\",h=\"\\u239f\",l=\"\\u23a0\",m=\"Size4-Regular\"):\"\\\\{\"===t||\"\\\\lbrace\"===t?(i=\"\\u23a7\",s=\"\\u23a8\",l=\"\\u23a9\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\}\"===t||\"\\\\rbrace\"===t?(i=\"\\u23ab\",s=\"\\u23ac\",l=\"\\u23ad\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\lgroup\"===t||\"\\u27ee\"===t?(i=\"\\u23a7\",l=\"\\u23a9\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\rgroup\"===t||\"\\u27ef\"===t?(i=\"\\u23ab\",l=\"\\u23ad\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\lmoustache\"===t||\"\\u23b0\"===t?(i=\"\\u23a7\",l=\"\\u23ad\",h=\"\\u23aa\",m=\"Size4-Regular\"):\"\\\\rmoustache\"!==t&&\"\\u23b1\"!==t||(i=\"\\u23ab\",l=\"\\u23a9\",h=\"\\u23aa\",m=\"Size4-Regular\");var c=Le(i,m,n),u=c.height+c.depth,d=Le(h,m,n),p=d.height+d.depth,f=Le(l,m,n),g=f.height+f.depth,x=0,v=1;if(null!==s){var b=Le(s,m,n);x=b.height+b.depth,v=2}var y=u+g+x,k=Math.ceil((e-y)/(v*p)),S=y+k*v*p,z=a.fontMetrics().axisHeight;r&&(z*=a.sizeMultiplier);var M=S/2-z,T=[];if(T.push(Fe(l,m,n)),null===s)for(var A=0;A<k;A++)T.push(Fe(h,m,n));else{for(var B=0;B<k;B++)T.push(Fe(h,m,n));T.push(Fe(s,m,n));for(var q=0;q<k;q++)T.push(Fe(h,m,n))}T.push(Fe(i,m,n));var C=a.havingBaseStyle(w.TEXT),N=Lt.makeVList({positionType:\"bottom\",positionData:M,children:T},C);return He(Lt.makeSpan([\"delimsizing\",\"mult\"],[N],C),w.TEXT,a,o)},Ue=function(t,e,r,a){var n;\"sqrtTall\"===t&&(n=\"M702 80H400000v40H742v\"+(r-54-80)+\"l-4 4-4 4c-.667.7\\n-2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1h-12l-28-84c-16.667-52-96.667\\n-294.333-240-727l-212 -643 -85 170c-4-3.333-8.333-7.667-13 -13l-13-13l77-155\\n 77-156c66 199.333 139 419.667 219 661 l218 661zM702 80H400000v40H742z\");var o=new L(t,n),i=new R([o],{width:\"400em\",height:e+\"em\",viewBox:\"0 0 400000 \"+r,preserveAspectRatio:\"xMinYMin slice\"});return Lt.makeSvgSpan([\"hide-tail\"],[i],a)},Ge=[\"(\",\"\\\\lparen\",\")\",\"\\\\rparen\",\"[\",\"\\\\lbrack\",\"]\",\"\\\\rbrack\",\"\\\\{\",\"\\\\lbrace\",\"\\\\}\",\"\\\\rbrace\",\"\\\\lfloor\",\"\\\\rfloor\",\"\\u230a\",\"\\u230b\",\"\\\\lceil\",\"\\\\rceil\",\"\\u2308\",\"\\u2309\",\"\\\\surd\"],Xe=[\"\\\\uparrow\",\"\\\\downarrow\",\"\\\\updownarrow\",\"\\\\Uparrow\",\"\\\\Downarrow\",\"\\\\Updownarrow\",\"|\",\"\\\\|\",\"\\\\vert\",\"\\\\Vert\",\"\\\\lvert\",\"\\\\rvert\",\"\\\\lVert\",\"\\\\rVert\",\"\\\\lgroup\",\"\\\\rgroup\",\"\\u27ee\",\"\\u27ef\",\"\\\\lmoustache\",\"\\\\rmoustache\",\"\\u23b0\",\"\\u23b1\"],Ye=[\"<\",\">\",\"\\\\langle\",\"\\\\rangle\",\"/\",\"\\\\backslash\",\"\\\\lt\",\"\\\\gt\"],_e=[0,1.2,1.8,2.4,3],We=[{type:\"small\",style:w.SCRIPTSCRIPT},{type:\"small\",style:w.SCRIPT},{type:\"small\",style:w.TEXT},{type:\"large\",size:1},{type:\"large\",size:2},{type:\"large\",size:3},{type:\"large\",size:4}],je=[{type:\"small\",style:w.SCRIPTSCRIPT},{type:\"small\",style:w.SCRIPT},{type:\"small\",style:w.TEXT},{type:\"stack\"}],$e=[{type:\"small\",style:w.SCRIPTSCRIPT},{type:\"small\",style:w.SCRIPT},{type:\"small\",style:w.TEXT},{type:\"large\",size:1},{type:\"large\",size:2},{type:\"large\",size:3},{type:\"large\",size:4},{type:\"stack\"}],Ze=function(t){if(\"small\"===t.type)return\"Main-Regular\";if(\"large\"===t.type)return\"Size\"+t.size+\"-Regular\";if(\"stack\"===t.type)return\"Size4-Regular\";throw new Error(\"Add support for delim type '\"+t.type+\"' here.\")},Ke=function(t,e,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&\"stack\"!==r[n].type;n++){var o=Le(t,Ze(r[n]),\"math\"),i=o.height+o.depth;if(\"small\"===r[n].type&&(i*=a.havingBaseStyle(r[n].style).sizeMultiplier),i>e)return r[n]}return r[r.length-1]},Je=function(t,e,r,a,n,o){var i;\"<\"===t||\"\\\\lt\"===t||\"\\u27e8\"===t?t=\"\\\\langle\":\">\"!==t&&\"\\\\gt\"!==t&&\"\\u27e9\"!==t||(t=\"\\\\rangle\"),i=c.contains(Ye,t)?We:c.contains(Ge,t)?$e:je;var s=Ke(t,e,i,a);return\"small\"===s.type?function(t,e,r,a,n,o){var i=Lt.makeSymbol(t,\"Main-Regular\",n,a),s=He(i,e,a,o);return r&&Pe(s,a,e),s}(t,s.style,r,a,n,o):\"large\"===s.type?De(t,s.size,r,a,n,o):Ve(t,e,r,a,n,o)},Qe=function(t,e){var r,a,n=e.havingBaseSizing(),o=Ke(\"\\\\surd\",t*n.sizeMultiplier,$e,n),i=n.sizeMultiplier,s=0,h=0,l=0;return\"small\"===o.type?(t<1?i=1:t<1.4&&(i=.7),h=1/i,(r=Ue(\"sqrtMain\",s=1.08/i,l=1080,e)).style.minWidth=\"0.853em\",a=.833/i):\"large\"===o.type?(l=1080*_e[o.size],h=_e[o.size]/i,s=(_e[o.size]+.08)/i,(r=Ue(\"sqrtSize\"+o.size,s,l,e)).style.minWidth=\"1.02em\",a=1/i):(s=t+.08,h=t,l=Math.floor(1e3*t)+80,(r=Ue(\"sqrtTall\",s,l,e)).style.minWidth=\"0.742em\",a=1.056),r.height=h,r.style.height=s+\"em\",{span:r,advanceWidth:a,ruleWidth:e.fontMetrics().sqrtRuleThickness*i}},tr=function(t,e,r,a,n){if(\"<\"===t||\"\\\\lt\"===t||\"\\u27e8\"===t?t=\"\\\\langle\":\">\"!==t&&\"\\\\gt\"!==t&&\"\\u27e9\"!==t||(t=\"\\\\rangle\"),c.contains(Ge,t)||c.contains(Ye,t))return De(t,e,!1,r,a,n);if(c.contains(Xe,t))return Ve(t,_e[e],!1,r,a,n);throw new i(\"Illegal delimiter: '\"+t+\"'\")},er=Je,rr=function(t,e,r,a,n,o){var i=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,h=Math.max(e-i,r+i),l=Math.max(h/500*901,2*h-s);return Je(t,l,!0,a,n,o)},ar={\"\\\\bigl\":{mclass:\"mopen\",size:1},\"\\\\Bigl\":{mclass:\"mopen\",size:2},\"\\\\biggl\":{mclass:\"mopen\",size:3},\"\\\\Biggl\":{mclass:\"mopen\",size:4},\"\\\\bigr\":{mclass:\"mclose\",size:1},\"\\\\Bigr\":{mclass:\"mclose\",size:2},\"\\\\biggr\":{mclass:\"mclose\",size:3},\"\\\\Biggr\":{mclass:\"mclose\",size:4},\"\\\\bigm\":{mclass:\"mrel\",size:1},\"\\\\Bigm\":{mclass:\"mrel\",size:2},\"\\\\biggm\":{mclass:\"mrel\",size:3},\"\\\\Biggm\":{mclass:\"mrel\",size:4},\"\\\\big\":{mclass:\"mord\",size:1},\"\\\\Big\":{mclass:\"mord\",size:2},\"\\\\bigg\":{mclass:\"mord\",size:3},\"\\\\Bigg\":{mclass:\"mord\",size:4}},nr=[\"(\",\"\\\\lparen\",\")\",\"\\\\rparen\",\"[\",\"\\\\lbrack\",\"]\",\"\\\\rbrack\",\"\\\\{\",\"\\\\lbrace\",\"\\\\}\",\"\\\\rbrace\",\"\\\\lfloor\",\"\\\\rfloor\",\"\\u230a\",\"\\u230b\",\"\\\\lceil\",\"\\\\rceil\",\"\\u2308\",\"\\u2309\",\"<\",\">\",\"\\\\langle\",\"\\u27e8\",\"\\\\rangle\",\"\\u27e9\",\"\\\\lt\",\"\\\\gt\",\"\\\\lvert\",\"\\\\rvert\",\"\\\\lVert\",\"\\\\rVert\",\"\\\\lgroup\",\"\\\\rgroup\",\"\\u27ee\",\"\\u27ef\",\"\\\\lmoustache\",\"\\\\rmoustache\",\"\\u23b0\",\"\\u23b1\",\"/\",\"\\\\backslash\",\"|\",\"\\\\vert\",\"\\\\|\",\"\\\\Vert\",\"\\\\uparrow\",\"\\\\Uparrow\",\"\\\\downarrow\",\"\\\\Downarrow\",\"\\\\updownarrow\",\"\\\\Updownarrow\",\".\"];function or(t,e){var r=Ft(t);if(r&&c.contains(nr,r.text))return r;throw new i(\"Invalid delimiter: '\"+(r?r.text:JSON.stringify(t))+\"' after '\"+e.funcName+\"'\",t)}function ir(t){if(!t.body)throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\")}$t({type:\"delimsizing\",names:[\"\\\\bigl\",\"\\\\Bigl\",\"\\\\biggl\",\"\\\\Biggl\",\"\\\\bigr\",\"\\\\Bigr\",\"\\\\biggr\",\"\\\\Biggr\",\"\\\\bigm\",\"\\\\Bigm\",\"\\\\biggm\",\"\\\\Biggm\",\"\\\\big\",\"\\\\Big\",\"\\\\bigg\",\"\\\\Bigg\"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);return{type:\"delimsizing\",mode:t.parser.mode,size:ar[t.funcName].size,mclass:ar[t.funcName].mclass,delim:r.text}},htmlBuilder:function(t,e){return\".\"===t.delim?Lt.makeSpan([t.mclass]):tr(t.delim,t.size,e,t.mode,[t.mclass])},mathmlBuilder:function(t){var e=[];\".\"!==t.delim&&e.push(fe(t.delim,t.mode));var r=new pe.MathNode(\"mo\",e);return\"mopen\"===t.mclass||\"mclose\"===t.mclass?r.setAttribute(\"fence\",\"true\"):r.setAttribute(\"fence\",\"false\"),r}}),$t({type:\"leftright-right\",names:[\"\\\\right\"],props:{numArgs:1},handler:function(t,e){return{type:\"leftright-right\",mode:t.parser.mode,delim:or(e[0],t).text}}}),$t({type:\"leftright\",names:[\"\\\\left\"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t),a=t.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect(\"\\\\right\",!1);var o=Ht(a.parseFunction(),\"leftright-right\");return{type:\"leftright\",mode:a.mode,body:n,left:r.text,right:o.delim}},htmlBuilder:function(t,e){ir(t);for(var r,a,n=ae(t.body,e,!0,[\"mopen\",\"mclose\"]),o=0,i=0,s=!1,h=0;h<n.length;h++)n[h].isMiddle?s=!0:(o=Math.max(n[h].height,o),i=Math.max(n[h].depth,i));if(o*=e.sizeMultiplier,i*=e.sizeMultiplier,r=\".\"===t.left?se(e,[\"mopen\"]):rr(t.left,o,i,e,t.mode,[\"mopen\"]),n.unshift(r),s)for(var l=1;l<n.length;l++){var m=n[l].isMiddle;m&&(n[l]=rr(m.delim,o,i,m.options,t.mode,[]))}return a=\".\"===t.right?se(e,[\"mclose\"]):rr(t.right,o,i,e,t.mode,[\"mclose\"]),n.push(a),Lt.makeSpan([\"minner\"],n,e)},mathmlBuilder:function(t,e){ir(t);var r=ve(t.body,e);if(\".\"!==t.left){var a=new pe.MathNode(\"mo\",[fe(t.left,t.mode)]);a.setAttribute(\"fence\",\"true\"),r.unshift(a)}if(\".\"!==t.right){var n=new pe.MathNode(\"mo\",[fe(t.right,t.mode)]);n.setAttribute(\"fence\",\"true\"),r.push(n)}return ge(r)}}),$t({type:\"middle\",names:[\"\\\\middle\"],props:{numArgs:1},handler:function(t,e){var r=or(e[0],t);if(!t.parser.leftrightDepth)throw new i(\"\\\\middle without preceding \\\\left\",r);return{type:\"middle\",mode:t.parser.mode,delim:r.text}},htmlBuilder:function(t,e){var r;if(\".\"===t.delim)r=se(e,[]);else{r=tr(t.delim,1,e,t.mode,[]);var a={delim:t.delim,options:e};r.isMiddle=a}return r},mathmlBuilder:function(t,e){var r=\"\\\\vert\"===t.delim||\"|\"===t.delim?fe(\"|\",\"text\"):fe(t.delim,t.mode),a=new pe.MathNode(\"mo\",[r]);return a.setAttribute(\"fence\",\"true\"),a.setAttribute(\"lspace\",\"0.05em\"),a.setAttribute(\"rspace\",\"0.05em\"),a}});var sr=function(t,e){var r,a,n=Lt.wrapFragment(he(t.body,e),e),o=t.label.substr(1),i=e.sizeMultiplier,s=0,h=c.isCharacterBox(t.body);if(\"sout\"===o)(r=Lt.makeSpan([\"stretchy\",\"sout\"])).height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else{/cancel/.test(o)?h||n.classes.push(\"cancel-pad\"):n.classes.push(\"boxpad\");var l=0;l=/box/.test(o)?\"colorbox\"===o?.3:.34:h?.2:0,r=Ae(n,o,l,e),s=n.depth+l,t.backgroundColor&&(r.style.backgroundColor=t.backgroundColor,t.borderColor&&(r.style.borderColor=t.borderColor))}return a=t.backgroundColor?Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:r,shift:s},{type:\"elem\",elem:n,shift:0}]},e):Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:n,shift:0},{type:\"elem\",elem:r,shift:s,wrapperClasses:/cancel/.test(o)?[\"svg-align\"]:[]}]},e),/cancel/.test(o)&&(a.height=n.height,a.depth=n.depth),/cancel/.test(o)&&!h?Lt.makeSpan([\"mord\",\"cancel-lap\"],[a],e):Lt.makeSpan([\"mord\"],[a],e)},hr=function(t,e){var r=new pe.MathNode(t.label.indexOf(\"colorbox\")>-1?\"mpadded\":\"menclose\",[ye(t.body,e)]);switch(t.label){case\"\\\\cancel\":r.setAttribute(\"notation\",\"updiagonalstrike\");break;case\"\\\\bcancel\":r.setAttribute(\"notation\",\"downdiagonalstrike\");break;case\"\\\\sout\":r.setAttribute(\"notation\",\"horizontalstrike\");break;case\"\\\\fbox\":r.setAttribute(\"notation\",\"box\");break;case\"\\\\fcolorbox\":case\"\\\\colorbox\":if(r.setAttribute(\"width\",\"+6pt\"),r.setAttribute(\"height\",\"+6pt\"),r.setAttribute(\"lspace\",\"3pt\"),r.setAttribute(\"voffset\",\"3pt\"),\"\\\\fcolorbox\"===t.label){var a=e.fontMetrics().defaultRuleThickness;r.setAttribute(\"style\",\"border: \"+a+\"em solid \"+String(t.borderColor))}break;case\"\\\\xcancel\":r.setAttribute(\"notation\",\"updiagonalstrike downdiagonalstrike\")}return t.backgroundColor&&r.setAttribute(\"mathbackground\",t.backgroundColor),r};$t({type:\"enclose\",names:[\"\\\\colorbox\"],props:{numArgs:2,allowedInText:!0,greediness:3,argTypes:[\"color\",\"text\"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],\"color-token\").color,i=e[1];return{type:\"enclose\",mode:a.mode,label:n,backgroundColor:o,body:i}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:\"enclose\",names:[\"\\\\fcolorbox\"],props:{numArgs:3,allowedInText:!0,greediness:3,argTypes:[\"color\",\"color\",\"text\"]},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=Ht(e[0],\"color-token\").color,i=Ht(e[1],\"color-token\").color,s=e[2];return{type:\"enclose\",mode:a.mode,label:n,backgroundColor:i,borderColor:o,body:s}},htmlBuilder:sr,mathmlBuilder:hr}),$t({type:\"enclose\",names:[\"\\\\fbox\"],props:{numArgs:1,argTypes:[\"text\"],allowedInText:!0},handler:function(t,e){return{type:\"enclose\",mode:t.parser.mode,label:\"\\\\fbox\",body:e[0]}}}),$t({type:\"enclose\",names:[\"\\\\cancel\",\"\\\\bcancel\",\"\\\\xcancel\",\"\\\\sout\"],props:{numArgs:1},handler:function(t,e,r){var a=t.parser,n=t.funcName,o=e[0];return{type:\"enclose\",mode:a.mode,label:n,body:o}},htmlBuilder:sr,mathmlBuilder:hr});var lr={};function mr(t){for(var e=t.type,r=t.names,a=t.props,n=t.handler,o=t.htmlBuilder,i=t.mathmlBuilder,s={type:e,numArgs:a.numArgs||0,greediness:1,allowedInText:!1,numOptionalArgs:0,handler:n},h=0;h<r.length;++h)lr[r[h]]=s;o&&(Wt[e]=o),i&&(jt[e]=i)}function cr(t){var e=[];t.consumeSpaces();for(var r=t.nextToken.text;\"\\\\hline\"===r||\"\\\\hdashline\"===r;)t.consume(),e.push(\"\\\\hdashline\"===r),t.consumeSpaces(),r=t.nextToken.text;return e}function ur(t,e,r){var a=e.hskipBeforeAndAfter,n=e.addJot,o=e.cols,s=e.arraystretch,h=e.colSeparationType;if(t.gullet.beginGroup(),t.gullet.macros.set(\"\\\\\\\\\",\"\\\\cr\"),!s){var l=t.gullet.expandMacroAsText(\"\\\\arraystretch\");if(null==l)s=1;else if(!(s=parseFloat(l))||s<0)throw new i(\"Invalid \\\\arraystretch: \"+l)}var m=[],c=[m],u=[],d=[];for(d.push(cr(t));;){var p=t.parseExpression(!1,\"\\\\cr\");p={type:\"ordgroup\",mode:t.mode,body:p},r&&(p={type:\"styling\",mode:t.mode,style:r,body:[p]}),m.push(p);var f=t.nextToken.text;if(\"&\"===f)t.consume();else{if(\"\\\\end\"===f){1===m.length&&\"styling\"===p.type&&0===p.body[0].body.length&&c.pop(),d.length<c.length+1&&d.push([]);break}if(\"\\\\cr\"!==f)throw new i(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\",t.nextToken);var g=Ht(t.parseFunction(),\"cr\");u.push(g.size),d.push(cr(t)),m=[],c.push(m)}}return t.gullet.endGroup(),{type:\"array\",mode:t.mode,addJot:n,arraystretch:s,body:c,cols:o,rowGaps:u,hskipBeforeAndAfter:a,hLinesBeforeRow:d,colSeparationType:h}}function dr(t){return\"d\"===t.substr(0,1)?\"display\":\"text\"}var pr=function(t,e){var r,a,n=t.body.length,o=t.hLinesBeforeRow,s=0,h=new Array(n),l=[],m=1/e.fontMetrics().ptPerEm,u=5*m,d=12*m,p=3*m,f=t.arraystretch*d,g=.7*f,x=.3*f,v=0;function b(t){for(var e=0;e<t.length;++e)e>0&&(v+=.25),l.push({pos:v,isDashed:t[e]})}for(b(o[0]),r=0;r<t.body.length;++r){var y=t.body[r],w=g,k=x;s<y.length&&(s=y.length);var S=new Array(y.length);for(a=0;a<y.length;++a){var z=he(y[a],e);k<z.depth&&(k=z.depth),w<z.height&&(w=z.height),S[a]=z}var M=t.rowGaps[r],T=0;M&&(T=zt(M,e))>0&&(k<(T+=x)&&(k=T),T=0),t.addJot&&(k+=p),S.height=w,S.depth=k,v+=w,S.pos=v,v+=k+T,h[r]=S,b(o[r+1])}var A,B,q=v/2+e.fontMetrics().axisHeight,C=t.cols||[],N=[];for(a=0,B=0;a<s||B<C.length;++a,++B){for(var I=C[B]||{},O=!0;\"separator\"===I.type;){if(O||((A=Lt.makeSpan([\"arraycolsep\"],[])).style.width=e.fontMetrics().doubleRuleSep+\"em\",N.push(A)),\"|\"===I.separator){var E=Lt.makeSpan([\"vertical-separator\"],[],e);E.style.height=v+\"em\",E.style.verticalAlign=-(v-q)+\"em\",N.push(E)}else{if(\":\"!==I.separator)throw new i(\"Invalid separator type: \"+I.separator);var R=Lt.makeSpan([\"vertical-separator\",\"vs-dashed\"],[],e);R.style.height=v+\"em\",R.style.verticalAlign=-(v-q)+\"em\",N.push(R)}I=C[++B]||{},O=!1}if(!(a>=s)){var L=void 0;(a>0||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.pregap,u))&&((A=Lt.makeSpan([\"arraycolsep\"],[])).style.width=L+\"em\",N.push(A));var H=[];for(r=0;r<n;++r){var P=h[r],D=P[a];if(D){var F=P.pos-q;D.depth=P.depth,D.height=P.height,H.push({type:\"elem\",elem:D,shift:F})}}H=Lt.makeVList({positionType:\"individualShift\",children:H},e),H=Lt.makeSpan([\"col-align-\"+(I.align||\"c\")],[H]),N.push(H),(a<s-1||t.hskipBeforeAndAfter)&&0!==(L=c.deflt(I.postgap,u))&&((A=Lt.makeSpan([\"arraycolsep\"],[])).style.width=L+\"em\",N.push(A))}}if(h=Lt.makeSpan([\"mtable\"],N),l.length>0){for(var V=Lt.makeLineSpan(\"hline\",e,.05),U=Lt.makeLineSpan(\"hdashline\",e,.05),G=[{type:\"elem\",elem:h,shift:0}];l.length>0;){var X=l.pop(),Y=X.pos-q;X.isDashed?G.push({type:\"elem\",elem:U,shift:Y}):G.push({type:\"elem\",elem:V,shift:Y})}h=Lt.makeVList({positionType:\"individualShift\",children:G},e)}return Lt.makeSpan([\"mord\"],[h],e)},fr={c:\"center \",l:\"left \",r:\"right \"},gr=function(t,e){var r=new pe.MathNode(\"mtable\",t.body.map(function(t){return new pe.MathNode(\"mtr\",t.map(function(t){return new pe.MathNode(\"mtd\",[ye(t,e)])}))})),a=.16+t.arraystretch-1+(t.addJot?.09:0);r.setAttribute(\"rowspacing\",a+\"em\");var n=\"\",o=\"\";if(t.cols){var i=t.cols,s=\"\",h=!1,l=0,m=i.length;\"separator\"===i[0].type&&(n+=\"top \",l=1),\"separator\"===i[i.length-1].type&&(n+=\"bottom \",m-=1);for(var c=l;c<m;c++)\"align\"===i[c].type?(o+=fr[i[c].align],h&&(s+=\"none \"),h=!0):\"separator\"===i[c].type&&h&&(s+=\"|\"===i[c].separator?\"solid \":\"dashed \",h=!1);r.setAttribute(\"columnalign\",o.trim()),/[sd]/.test(s)&&r.setAttribute(\"columnlines\",s.trim())}if(\"align\"===t.colSeparationType){for(var u=t.cols||[],d=\"\",p=1;p<u.length;p++)d+=p%2?\"0em \":\"1em \";r.setAttribute(\"columnspacing\",d.trim())}else\"alignat\"===t.colSeparationType?r.setAttribute(\"columnspacing\",\"0em\"):r.setAttribute(\"columnspacing\",\"1em\");var f=\"\",g=t.hLinesBeforeRow;n+=g[0].length>0?\"left \":\"\",n+=g[g.length-1].length>0?\"right \":\"\";for(var x=1;x<g.length-1;x++)f+=0===g[x].length?\"none \":g[x][0]?\"dashed \":\"solid \";if(/[sd]/.test(f)&&r.setAttribute(\"rowlines\",f.trim()),\"\"===n)return r;var v=new pe.MathNode(\"menclose\",[r]);return v.setAttribute(\"notation\",n.trim()),v},xr=function(t,e){var r,a=[],n=ur(t.parser,{cols:a,addJot:!0},\"display\"),o=0,s={type:\"ordgroup\",mode:t.mode,body:[]},h=Pt(e[0],\"ordgroup\");if(h){for(var l=\"\",m=0;m<h.body.length;m++){l+=Ht(h.body[m],\"textord\").text}r=Number(l),o=2*r}var c=!o;n.body.forEach(function(t){for(var e=1;e<t.length;e+=2){var a=Ht(t[e],\"styling\");Ht(a.body[0],\"ordgroup\").body.unshift(s)}if(c)o<t.length&&(o=t.length);else{var n=t.length/2;if(r<n)throw new i(\"Too many math in a row: expected \"+r+\", but got \"+n,t[0])}});for(var u=0;u<o;++u){var d=\"r\",p=0;u%2==1?d=\"l\":u>0&&c&&(p=1),a[u]={type:\"align\",align:d,pregap:p,postgap:0}}return n.colSeparationType=c?\"align\":\"alignat\",n};mr({type:\"array\",names:[\"array\",\"darray\"],props:{numArgs:1},handler:function(t,e){var r={cols:(Ft(e[0])?[e[0]]:Ht(e[0],\"ordgroup\").body).map(function(t){var e=function(t){var e=Ft(t);if(!e)throw new Error(\"Expected node of symbol group type, but got \"+(t?\"node of type \"+t.type:String(t)));return e}(t).text;if(-1!==\"lcr\".indexOf(e))return{type:\"align\",align:e};if(\"|\"===e)return{type:\"separator\",separator:\"|\"};if(\":\"===e)return{type:\"separator\",separator:\":\"};throw new i(\"Unknown column alignment: \"+e,t)}),hskipBeforeAndAfter:!0};return ur(t.parser,r,dr(t.envName))},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"matrix\",\"pmatrix\",\"bmatrix\",\"Bmatrix\",\"vmatrix\",\"Vmatrix\"],props:{numArgs:0},handler:function(t){var e={matrix:null,pmatrix:[\"(\",\")\"],bmatrix:[\"[\",\"]\"],Bmatrix:[\"\\\\{\",\"\\\\}\"],vmatrix:[\"|\",\"|\"],Vmatrix:[\"\\\\Vert\",\"\\\\Vert\"]}[t.envName],r=ur(t.parser,{hskipBeforeAndAfter:!1},dr(t.envName));return e?{type:\"leftright\",mode:t.mode,body:[r],left:e[0],right:e[1]}:r},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"cases\",\"dcases\"],props:{numArgs:0},handler:function(t){var e=ur(t.parser,{arraystretch:1.2,cols:[{type:\"align\",align:\"l\",pregap:0,postgap:1},{type:\"align\",align:\"l\",pregap:0,postgap:0}]},dr(t.envName));return{type:\"leftright\",mode:t.mode,body:[e],left:\"\\\\{\",right:\".\"}},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"aligned\"],props:{numArgs:0},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"gathered\"],props:{numArgs:0},handler:function(t){return ur(t.parser,{cols:[{type:\"align\",align:\"c\"}],addJot:!0},\"display\")},htmlBuilder:pr,mathmlBuilder:gr}),mr({type:\"array\",names:[\"alignedat\"],props:{numArgs:1},handler:xr,htmlBuilder:pr,mathmlBuilder:gr}),$t({type:\"text\",names:[\"\\\\hline\",\"\\\\hdashline\"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler:function(t,e){throw new i(t.funcName+\" valid only within array environment\")}});var vr=lr;$t({type:\"environment\",names:[\"\\\\begin\",\"\\\\end\"],props:{numArgs:1,argTypes:[\"text\"]},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];if(\"ordgroup\"!==n.type)throw new i(\"Invalid environment name\",n);for(var o=\"\",s=0;s<n.body.length;++s)o+=Ht(n.body[s],\"textord\").text;if(\"\\\\begin\"===a){if(!vr.hasOwnProperty(o))throw new i(\"No such environment: \"+o,n);var h=vr[o],l=r.parseArguments(\"\\\\begin{\"+o+\"}\",h),m=l.args,c=l.optArgs,u={mode:r.mode,envName:o,parser:r},d=h.handler(u,m,c);r.expect(\"\\\\end\",!1);var p=r.nextToken,f=Ht(r.parseFunction(),\"environment\");if(f.name!==o)throw new i(\"Mismatch: \\\\begin{\"+o+\"} matched by \\\\end{\"+f.name+\"}\",p);return d}return{type:\"environment\",mode:r.mode,name:o,nameGroup:n}}});var br=Lt.makeSpan;function yr(t,e){var r=ae(t.body,e,!0);return br([t.mclass],r,e)}function wr(t,e){var r=ve(t.body,e);return pe.newDocumentFragment(r)}$t({type:\"mclass\",names:[\"\\\\mathord\",\"\\\\mathbin\",\"\\\\mathrel\",\"\\\\mathopen\",\"\\\\mathclose\",\"\\\\mathpunct\",\"\\\\mathinner\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"mclass\",mode:r.mode,mclass:\"m\"+a.substr(5),body:Kt(n)}},htmlBuilder:yr,mathmlBuilder:wr});var kr=function(t){var e=\"ordgroup\"===t.type&&t.body.length?t.body[0]:t;return\"atom\"!==e.type||\"bin\"!==e.family&&\"rel\"!==e.family?\"mord\":\"m\"+e.family};$t({type:\"mclass\",names:[\"\\\\@binrel\"],props:{numArgs:2},handler:function(t,e){return{type:\"mclass\",mode:t.parser.mode,mclass:kr(e[0]),body:[e[1]]}}}),$t({type:\"mclass\",names:[\"\\\\stackrel\",\"\\\\overset\",\"\\\\underset\"],props:{numArgs:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[1],i=e[0];r=\"\\\\stackrel\"!==n?kr(o):\"mrel\";var s={type:\"op\",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:\"\\\\stackrel\"!==n,body:Kt(o)},h={type:\"supsub\",mode:i.mode,base:s,sup:\"\\\\underset\"===n?null:i,sub:\"\\\\underset\"===n?i:null};return{type:\"mclass\",mode:a.mode,mclass:r,body:[h]}},htmlBuilder:yr,mathmlBuilder:wr});var Sr=function(t,e){var r=t.font,a=e.withFont(r);return he(t.body,a)},zr=function(t,e){var r=t.font,a=e.withFont(r);return ye(t.body,a)},Mr={\"\\\\Bbb\":\"\\\\mathbb\",\"\\\\bold\":\"\\\\mathbf\",\"\\\\frak\":\"\\\\mathfrak\",\"\\\\bm\":\"\\\\boldsymbol\"};$t({type:\"font\",names:[\"\\\\mathrm\",\"\\\\mathit\",\"\\\\mathbf\",\"\\\\mathnormal\",\"\\\\mathbb\",\"\\\\mathcal\",\"\\\\mathfrak\",\"\\\\mathscr\",\"\\\\mathsf\",\"\\\\mathtt\",\"\\\\Bbb\",\"\\\\bold\",\"\\\\frak\"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0],o=a;return o in Mr&&(o=Mr[o]),{type:\"font\",mode:r.mode,font:o.slice(1),body:n}},htmlBuilder:Sr,mathmlBuilder:zr}),$t({type:\"mclass\",names:[\"\\\\boldsymbol\",\"\\\\bm\"],props:{numArgs:1,greediness:2},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"mclass\",mode:r.mode,mclass:kr(a),body:[{type:\"font\",mode:r.mode,font:\"boldsymbol\",body:a}]}}}),$t({type:\"font\",names:[\"\\\\rm\",\"\\\\sf\",\"\\\\tt\",\"\\\\bf\",\"\\\\it\"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=t.breakOnTokenText,o=r.mode,i=r.parseExpression(!0,n);return{type:\"font\",mode:o,font:\"math\"+a.slice(1),body:{type:\"ordgroup\",mode:r.mode,body:i}}},htmlBuilder:Sr,mathmlBuilder:zr});var Tr=function(t,e){var r=e;return\"display\"===t?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:\"text\"===t&&r.size===w.DISPLAY.size?r=w.TEXT:\"script\"===t?r=w.SCRIPT:\"scriptscript\"===t&&(r=w.SCRIPTSCRIPT),r},Ar=function(t,e){var r,a=Tr(t.size,e.style),n=a.fracNum(),o=a.fracDen();r=e.havingStyle(n);var i=he(t.numer,r,e);if(t.continued){var s=8.5/e.fontMetrics().ptPerEm,h=3.5/e.fontMetrics().ptPerEm;i.height=i.height<s?s:i.height,i.depth=i.depth<h?h:i.depth}r=e.havingStyle(o);var l,m,c,u,d,p,f,g,x,v,b=he(t.denom,r,e);if(t.hasBarLine?(t.barSize?(m=zt(t.barSize,e),l=Lt.makeLineSpan(\"frac-line\",e,m)):l=Lt.makeLineSpan(\"frac-line\",e),m=l.height,c=l.height):(l=null,m=0,c=e.fontMetrics().defaultRuleThickness),a.size===w.DISPLAY.size||\"display\"===t.size?(u=e.fontMetrics().num1,d=m>0?3*c:7*c,p=e.fontMetrics().denom1):(m>0?(u=e.fontMetrics().num2,d=c):(u=e.fontMetrics().num3,d=3*c),p=e.fontMetrics().denom2),l){var y=e.fontMetrics().axisHeight;u-i.depth-(y+.5*m)<d&&(u+=d-(u-i.depth-(y+.5*m))),y-.5*m-(b.height-p)<d&&(p+=d-(y-.5*m-(b.height-p)));var k=-(y-.5*m);f=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:b,shift:p},{type:\"elem\",elem:l,shift:k},{type:\"elem\",elem:i,shift:-u}]},e)}else{var S=u-i.depth-(b.height-p);S<d&&(u+=.5*(d-S),p+=.5*(d-S)),f=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:b,shift:p},{type:\"elem\",elem:i,shift:-u}]},e)}return r=e.havingStyle(a),f.height*=r.sizeMultiplier/e.sizeMultiplier,f.depth*=r.sizeMultiplier/e.sizeMultiplier,g=a.size===w.DISPLAY.size?e.fontMetrics().delim1:e.fontMetrics().delim2,x=null==t.leftDelim?se(e,[\"mopen\"]):er(t.leftDelim,g,!0,e.havingStyle(a),t.mode,[\"mopen\"]),v=t.continued?Lt.makeSpan([]):null==t.rightDelim?se(e,[\"mclose\"]):er(t.rightDelim,g,!0,e.havingStyle(a),t.mode,[\"mclose\"]),Lt.makeSpan([\"mord\"].concat(r.sizingClasses(e)),[x,Lt.makeSpan([\"mfrac\"],[f]),v],e)},Br=function(t,e){var r=new pe.MathNode(\"mfrac\",[ye(t.numer,e),ye(t.denom,e)]);if(t.hasBarLine){if(t.barSize){var a=zt(t.barSize,e);r.setAttribute(\"linethickness\",a+\"em\")}}else r.setAttribute(\"linethickness\",\"0px\");var n=Tr(t.size,e.style);if(n.size!==e.style.size){r=new pe.MathNode(\"mstyle\",[r]);var o=n.size===w.DISPLAY.size?\"true\":\"false\";r.setAttribute(\"displaystyle\",o),r.setAttribute(\"scriptlevel\",\"0\")}if(null!=t.leftDelim||null!=t.rightDelim){var i=[];if(null!=t.leftDelim){var s=new pe.MathNode(\"mo\",[new pe.TextNode(t.leftDelim.replace(\"\\\\\",\"\"))]);s.setAttribute(\"fence\",\"true\"),i.push(s)}if(i.push(r),null!=t.rightDelim){var h=new pe.MathNode(\"mo\",[new pe.TextNode(t.rightDelim.replace(\"\\\\\",\"\"))]);h.setAttribute(\"fence\",\"true\"),i.push(h)}return ge(i)}return r};$t({type:\"genfrac\",names:[\"\\\\cfrac\",\"\\\\dfrac\",\"\\\\frac\",\"\\\\tfrac\",\"\\\\dbinom\",\"\\\\binom\",\"\\\\tbinom\",\"\\\\\\\\atopfrac\",\"\\\\\\\\bracefrac\",\"\\\\\\\\brackfrac\"],props:{numArgs:2,greediness:2},handler:function(t,e){var r,a=t.parser,n=t.funcName,o=e[0],i=e[1],s=null,h=null,l=\"auto\";switch(n){case\"\\\\cfrac\":case\"\\\\dfrac\":case\"\\\\frac\":case\"\\\\tfrac\":r=!0;break;case\"\\\\\\\\atopfrac\":r=!1;break;case\"\\\\dbinom\":case\"\\\\binom\":case\"\\\\tbinom\":r=!1,s=\"(\",h=\")\";break;case\"\\\\\\\\bracefrac\":r=!1,s=\"\\\\{\",h=\"\\\\}\";break;case\"\\\\\\\\brackfrac\":r=!1,s=\"[\",h=\"]\";break;default:throw new Error(\"Unrecognized genfrac command\")}switch(n){case\"\\\\cfrac\":case\"\\\\dfrac\":case\"\\\\dbinom\":l=\"display\";break;case\"\\\\tfrac\":case\"\\\\tbinom\":l=\"text\"}return{type:\"genfrac\",mode:a.mode,continued:\"\\\\cfrac\"===n,numer:o,denom:i,hasBarLine:r,leftDelim:s,rightDelim:h,size:l,barSize:null}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:\"infix\",names:[\"\\\\over\",\"\\\\choose\",\"\\\\atop\",\"\\\\brace\",\"\\\\brack\"],props:{numArgs:0,infix:!0},handler:function(t){var e,r=t.parser,a=t.funcName,n=t.token;switch(a){case\"\\\\over\":e=\"\\\\frac\";break;case\"\\\\choose\":e=\"\\\\binom\";break;case\"\\\\atop\":e=\"\\\\\\\\atopfrac\";break;case\"\\\\brace\":e=\"\\\\\\\\bracefrac\";break;case\"\\\\brack\":e=\"\\\\\\\\brackfrac\";break;default:throw new Error(\"Unrecognized infix genfrac command\")}return{type:\"infix\",mode:r.mode,replaceWith:e,token:n}}});var qr=[\"display\",\"text\",\"script\",\"scriptscript\"],Cr=function(t){var e=null;return t.length>0&&(e=\".\"===(e=t)?null:e),e};$t({type:\"genfrac\",names:[\"\\\\genfrac\"],props:{numArgs:6,greediness:6,argTypes:[\"math\",\"math\",\"size\",\"text\",\"math\",\"math\"]},handler:function(t,e){var r=t.parser,a=e[4],n=e[5],o=Pt(e[0],\"atom\");o&&(o=Dt(e[0],\"open\"));var i=o?Cr(o.text):null,s=Pt(e[1],\"atom\");s&&(s=Dt(e[1],\"close\"));var h,l=s?Cr(s.text):null,m=Ht(e[2],\"size\"),c=null;h=!!m.isBlank||(c=m.value).number>0;var u=\"auto\",d=Pt(e[3],\"ordgroup\");if(d){if(d.body.length>0){var p=Ht(d.body[0],\"textord\");u=qr[Number(p.text)]}}else d=Ht(e[3],\"textord\"),u=qr[Number(d.text)];return{type:\"genfrac\",mode:r.mode,numer:a,denom:n,continued:!1,hasBarLine:h,barSize:c,leftDelim:i,rightDelim:l,size:u}},htmlBuilder:Ar,mathmlBuilder:Br}),$t({type:\"infix\",names:[\"\\\\above\"],props:{numArgs:1,argTypes:[\"size\"],infix:!0},handler:function(t,e){var r=t.parser,a=(t.funcName,t.token);return{type:\"infix\",mode:r.mode,replaceWith:\"\\\\\\\\abovefrac\",size:Ht(e[0],\"size\").value,token:a}}}),$t({type:\"genfrac\",names:[\"\\\\\\\\abovefrac\"],props:{numArgs:3,argTypes:[\"math\",\"size\",\"math\"]},handler:function(t,e){var r=t.parser,a=(t.funcName,e[0]),n=function(t){if(!t)throw new Error(\"Expected non-null, but got \"+String(t));return t}(Ht(e[1],\"infix\").size),o=e[2],i=n.number>0;return{type:\"genfrac\",mode:r.mode,numer:a,denom:o,continued:!1,hasBarLine:i,barSize:n,leftDelim:null,rightDelim:null,size:\"auto\"}},htmlBuilder:Ar,mathmlBuilder:Br});var Nr=function(t,e){var r,a,n=e.style,o=Pt(t,\"supsub\");o?(r=o.sup?he(o.sup,e.havingStyle(n.sup()),e):he(o.sub,e.havingStyle(n.sub()),e),a=Ht(o.base,\"horizBrace\")):a=Ht(t,\"horizBrace\");var i,s=he(a.base,e.havingBaseStyle(w.DISPLAY)),h=qe(a,e);if(a.isOver?(i=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:s},{type:\"kern\",size:.1},{type:\"elem\",elem:h}]},e)).children[0].children[0].children[1].classes.push(\"svg-align\"):(i=Lt.makeVList({positionType:\"bottom\",positionData:s.depth+.1+h.height,children:[{type:\"elem\",elem:h},{type:\"kern\",size:.1},{type:\"elem\",elem:s}]},e)).children[0].children[0].children[0].classes.push(\"svg-align\"),r){var l=Lt.makeSpan([\"mord\",a.isOver?\"mover\":\"munder\"],[i],e);i=a.isOver?Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:l},{type:\"kern\",size:.2},{type:\"elem\",elem:r}]},e):Lt.makeVList({positionType:\"bottom\",positionData:l.depth+.2+r.height+r.depth,children:[{type:\"elem\",elem:r},{type:\"kern\",size:.2},{type:\"elem\",elem:l}]},e)}return Lt.makeSpan([\"mord\",a.isOver?\"mover\":\"munder\"],[i],e)};$t({type:\"horizBrace\",names:[\"\\\\overbrace\",\"\\\\underbrace\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=t.funcName;return{type:\"horizBrace\",mode:r.mode,label:a,isOver:/^\\\\over/.test(a),base:e[0]}},htmlBuilder:Nr,mathmlBuilder:function(t,e){var r=Be(t.label);return new pe.MathNode(t.isOver?\"mover\":\"munder\",[ye(t.base,e),r])}}),$t({type:\"href\",names:[\"\\\\href\"],props:{numArgs:2,argTypes:[\"url\",\"original\"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[1],n=Ht(e[0],\"url\").url;return{type:\"href\",mode:r.mode,href:n,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e,!1);return Lt.makeAnchor(t.href,[],r,e)},mathmlBuilder:function(t,e){var r=be(t.body,e);return r instanceof ue||(r=new ue(\"mrow\",[r])),r.setAttribute(\"href\",t.href),r}}),$t({type:\"href\",names:[\"\\\\url\"],props:{numArgs:1,argTypes:[\"url\"],allowedInText:!0},handler:function(t,e){for(var r=t.parser,a=Ht(e[0],\"url\").url,n=[],o=0;o<a.length;o++){var i=a[o];\"~\"===i&&(i=\"\\\\textasciitilde\"),n.push({type:\"textord\",mode:\"text\",text:i})}var s={type:\"text\",mode:r.mode,font:\"\\\\texttt\",body:n};return{type:\"href\",mode:r.mode,href:a,body:Kt(s)}}}),$t({type:\"htmlmathml\",names:[\"\\\\html@mathml\"],props:{numArgs:2,allowedInText:!0},handler:function(t,e){return{type:\"htmlmathml\",mode:t.parser.mode,html:Kt(e[0]),mathml:Kt(e[1])}},htmlBuilder:function(t,e){var r=ae(t.html,e,!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){return be(t.mathml,e)}}),$t({type:\"kern\",names:[\"\\\\kern\",\"\\\\mkern\",\"\\\\hskip\",\"\\\\mskip\"],props:{numArgs:1,argTypes:[\"size\"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=Ht(e[0],\"size\");if(r.settings.strict){var o=\"m\"===a[1],i=\"mu\"===n.value.unit;o?(i||r.settings.reportNonstrict(\"mathVsTextUnits\",\"LaTeX's \"+a+\" supports only mu units, not \"+n.value.unit+\" units\"),\"math\"!==r.mode&&r.settings.reportNonstrict(\"mathVsTextUnits\",\"LaTeX's \"+a+\" works only in math mode\")):i&&r.settings.reportNonstrict(\"mathVsTextUnits\",\"LaTeX's \"+a+\" doesn't support mu units\")}return{type:\"kern\",mode:r.mode,dimension:n.value}},htmlBuilder:function(t,e){return Lt.makeGlue(t.dimension,e)},mathmlBuilder:function(t,e){var r=zt(t.dimension,e);return new pe.SpaceNode(r)}}),$t({type:\"lap\",names:[\"\\\\mathllap\",\"\\\\mathrlap\",\"\\\\mathclap\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"lap\",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:function(t,e){var r;\"clap\"===t.alignment?(r=Lt.makeSpan([],[he(t.body,e)]),r=Lt.makeSpan([\"inner\"],[r],e)):r=Lt.makeSpan([\"inner\"],[he(t.body,e)]);var a=Lt.makeSpan([\"fix\"],[]),n=Lt.makeSpan([t.alignment],[r,a],e),o=Lt.makeSpan([\"strut\"]);return o.style.height=n.height+n.depth+\"em\",o.style.verticalAlign=-n.depth+\"em\",n.children.unshift(o),n=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:n}]},e),Lt.makeSpan([\"mord\"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mpadded\",[ye(t.body,e)]);if(\"rlap\"!==t.alignment){var a=\"llap\"===t.alignment?\"-1\":\"-0.5\";r.setAttribute(\"lspace\",a+\"width\")}return r.setAttribute(\"width\",\"0px\"),r}}),$t({type:\"styling\",names:[\"\\\\(\",\"$\"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1,consumeMode:\"math\"},handler:function(t,e){var r=t.funcName,a=t.parser,n=a.mode;a.switchMode(\"math\");var o=\"\\\\(\"===r?\"\\\\)\":\"$\",i=a.parseExpression(!1,o);return a.expect(o,!1),a.switchMode(n),a.consume(),{type:\"styling\",mode:a.mode,style:\"text\",body:i}}}),$t({type:\"text\",names:[\"\\\\)\",\"\\\\]\"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(t,e){throw new i(\"Mismatched \"+t.funcName)}});var Ir=function(t,e){switch(e.style.size){case w.DISPLAY.size:return t.display;case w.TEXT.size:return t.text;case w.SCRIPT.size:return t.script;case w.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}};$t({type:\"mathchoice\",names:[\"\\\\mathchoice\"],props:{numArgs:4},handler:function(t,e){return{type:\"mathchoice\",mode:t.parser.mode,display:Kt(e[0]),text:Kt(e[1]),script:Kt(e[2]),scriptscript:Kt(e[3])}},htmlBuilder:function(t,e){var r=Ir(t,e),a=ae(r,e,!1);return Lt.makeFragment(a)},mathmlBuilder:function(t,e){var r=Ir(t,e);return be(r,e)}});var Or=[\"\\\\smallint\"],Er=function(t,e){var r,a,n,o=!1,i=Pt(t,\"supsub\");i?(r=i.sup,a=i.sub,n=Ht(i.base,\"op\"),o=!0):n=Ht(t,\"op\");var s,h=e.style,l=!1;if(h.size===w.DISPLAY.size&&n.symbol&&!c.contains(Or,n.name)&&(l=!0),n.symbol){var m=l?\"Size2-Regular\":\"Size1-Regular\",u=\"\";if(\"\\\\oiint\"!==n.name&&\"\\\\oiiint\"!==n.name||(u=n.name.substr(1),n.name=\"oiint\"===u?\"\\\\iint\":\"\\\\iiint\"),s=Lt.makeSymbol(n.name,m,\"math\",e,[\"mop\",\"op-symbol\",l?\"large-op\":\"small-op\"]),u.length>0){var d=s.italic,p=Lt.staticSvg(u+\"Size\"+(l?\"2\":\"1\"),e);s=Lt.makeVList({positionType:\"individualShift\",children:[{type:\"elem\",elem:s,shift:0},{type:\"elem\",elem:p,shift:l?.08:0}]},e),n.name=\"\\\\\"+u,s.classes.unshift(\"mop\"),s.italic=d}}else if(n.body){var f=ae(n.body,e,!0);1===f.length&&f[0]instanceof E?(s=f[0]).classes[0]=\"mop\":s=Lt.makeSpan([\"mop\"],Lt.tryCombineChars(f),e)}else{for(var g=[],x=1;x<n.name.length;x++)g.push(Lt.mathsym(n.name[x],n.mode));s=Lt.makeSpan([\"mop\"],g,e)}var v=0,b=0;if((s instanceof E||\"\\\\oiint\"===n.name||\"\\\\oiiint\"===n.name)&&!n.suppressBaseShift&&(v=(s.height-s.depth)/2-e.fontMetrics().axisHeight,b=s.italic),o){var y,k,S;if(s=Lt.makeSpan([],[s]),r){var z=he(r,e.havingStyle(h.sup()),e);k={elem:z,kern:Math.max(e.fontMetrics().bigOpSpacing1,e.fontMetrics().bigOpSpacing3-z.depth)}}if(a){var M=he(a,e.havingStyle(h.sub()),e);y={elem:M,kern:Math.max(e.fontMetrics().bigOpSpacing2,e.fontMetrics().bigOpSpacing4-M.height)}}if(k&&y){var T=e.fontMetrics().bigOpSpacing5+y.elem.height+y.elem.depth+y.kern+s.depth+v;S=Lt.makeVList({positionType:\"bottom\",positionData:T,children:[{type:\"kern\",size:e.fontMetrics().bigOpSpacing5},{type:\"elem\",elem:y.elem,marginLeft:-b+\"em\"},{type:\"kern\",size:y.kern},{type:\"elem\",elem:s},{type:\"kern\",size:k.kern},{type:\"elem\",elem:k.elem,marginLeft:b+\"em\"},{type:\"kern\",size:e.fontMetrics().bigOpSpacing5}]},e)}else if(y){var A=s.height-v;S=Lt.makeVList({positionType:\"top\",positionData:A,children:[{type:\"kern\",size:e.fontMetrics().bigOpSpacing5},{type:\"elem\",elem:y.elem,marginLeft:-b+\"em\"},{type:\"kern\",size:y.kern},{type:\"elem\",elem:s}]},e)}else{if(!k)return s;var B=s.depth+v;S=Lt.makeVList({positionType:\"bottom\",positionData:B,children:[{type:\"elem\",elem:s},{type:\"kern\",size:k.kern},{type:\"elem\",elem:k.elem,marginLeft:b+\"em\"},{type:\"kern\",size:e.fontMetrics().bigOpSpacing5}]},e)}return Lt.makeSpan([\"mop\",\"op-limits\"],[S],e)}return v&&(s.style.position=\"relative\",s.style.top=v+\"em\"),s},Rr=function(t,e){var r;if(t.symbol)r=new ue(\"mo\",[fe(t.name,t.mode)]),c.contains(Or,t.name)&&r.setAttribute(\"largeop\",\"false\");else if(t.body)r=new ue(\"mo\",ve(t.body,e));else{r=new ue(\"mi\",[new de(t.name.slice(1))]);var a=new ue(\"mo\",[fe(\"\\u2061\",\"text\")]);r=t.parentIsSupSub?new ue(\"mo\",[r,a]):ce([r,a])}return r},Lr={\"\\u220f\":\"\\\\prod\",\"\\u2210\":\"\\\\coprod\",\"\\u2211\":\"\\\\sum\",\"\\u22c0\":\"\\\\bigwedge\",\"\\u22c1\":\"\\\\bigvee\",\"\\u22c2\":\"\\\\bigcap\",\"\\u22c3\":\"\\\\bigcup\",\"\\u2a00\":\"\\\\bigodot\",\"\\u2a01\":\"\\\\bigoplus\",\"\\u2a02\":\"\\\\bigotimes\",\"\\u2a04\":\"\\\\biguplus\",\"\\u2a06\":\"\\\\bigsqcup\"};$t({type:\"op\",names:[\"\\\\coprod\",\"\\\\bigvee\",\"\\\\bigwedge\",\"\\\\biguplus\",\"\\\\bigcap\",\"\\\\bigcup\",\"\\\\intop\",\"\\\\prod\",\"\\\\sum\",\"\\\\bigotimes\",\"\\\\bigoplus\",\"\\\\bigodot\",\"\\\\bigsqcup\",\"\\\\smallint\",\"\\u220f\",\"\\u2210\",\"\\u2211\",\"\\u22c0\",\"\\u22c1\",\"\\u22c2\",\"\\u22c3\",\"\\u2a00\",\"\\u2a01\",\"\\u2a02\",\"\\u2a04\",\"\\u2a06\"],props:{numArgs:0},handler:function(t,e){var r=t.parser,a=t.funcName;return 1===a.length&&(a=Lr[a]),{type:\"op\",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"op\",names:[\"\\\\mathop\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"op\",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Kt(a)}},htmlBuilder:Er,mathmlBuilder:Rr});var Hr={\"\\u222b\":\"\\\\int\",\"\\u222c\":\"\\\\iint\",\"\\u222d\":\"\\\\iiint\",\"\\u222e\":\"\\\\oint\",\"\\u222f\":\"\\\\oiint\",\"\\u2230\":\"\\\\oiiint\"};function Pr(t,e,r){for(var a=ae(t,e,!1),n=e.sizeMultiplier/r.sizeMultiplier,o=0;o<a.length;o++){var i=a[o].classes.indexOf(\"sizing\");i<0?Array.prototype.push.apply(a[o].classes,e.sizingClasses(r)):a[o].classes[i+1]===\"reset-size\"+e.size&&(a[o].classes[i+1]=\"reset-size\"+r.size),a[o].height*=n,a[o].depth*=n}return Lt.makeFragment(a)}$t({type:\"op\",names:[\"\\\\arcsin\",\"\\\\arccos\",\"\\\\arctan\",\"\\\\arctg\",\"\\\\arcctg\",\"\\\\arg\",\"\\\\ch\",\"\\\\cos\",\"\\\\cosec\",\"\\\\cosh\",\"\\\\cot\",\"\\\\cotg\",\"\\\\coth\",\"\\\\csc\",\"\\\\ctg\",\"\\\\cth\",\"\\\\deg\",\"\\\\dim\",\"\\\\exp\",\"\\\\hom\",\"\\\\ker\",\"\\\\lg\",\"\\\\ln\",\"\\\\log\",\"\\\\sec\",\"\\\\sin\",\"\\\\sinh\",\"\\\\sh\",\"\\\\tan\",\"\\\\tanh\",\"\\\\tg\",\"\\\\th\"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:\"op\",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"op\",names:[\"\\\\det\",\"\\\\gcd\",\"\\\\inf\",\"\\\\lim\",\"\\\\max\",\"\\\\min\",\"\\\\Pr\",\"\\\\sup\"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return{type:\"op\",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"op\",names:[\"\\\\int\",\"\\\\iint\",\"\\\\iiint\",\"\\\\oint\",\"\\\\oiint\",\"\\\\oiiint\",\"\\u222b\",\"\\u222c\",\"\\u222d\",\"\\u222e\",\"\\u222f\",\"\\u2230\"],props:{numArgs:0},handler:function(t){var e=t.parser,r=t.funcName;return 1===r.length&&(r=Hr[r]),{type:\"op\",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:Er,mathmlBuilder:Rr}),$t({type:\"operatorname\",names:[\"\\\\operatorname\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"operatorname\",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){if(t.body.length>0){for(var r=t.body.map(function(t){var e=t.text;return\"string\"==typeof e?{type:\"textord\",mode:t.mode,text:e}:t}),a=ae(r,e.withFont(\"mathrm\"),!0),n=0;n<a.length;n++){var o=a[n];o instanceof E&&(o.text=o.text.replace(/\\u2212/,\"-\").replace(/\\u2217/,\"*\"))}return Lt.makeSpan([\"mop\"],a,e)}return Lt.makeSpan([\"mop\"],[],e)},mathmlBuilder:function(t,e){for(var r=ve(t.body,e.withFont(\"mathrm\")),a=!0,n=0;n<r.length;n++){var o=r[n];if(o instanceof pe.SpaceNode);else if(o instanceof pe.MathNode)switch(o.type){case\"mi\":case\"mn\":case\"ms\":case\"mspace\":case\"mtext\":break;case\"mo\":var i=o.children[0];1===o.children.length&&i instanceof pe.TextNode?i.text=i.text.replace(/\\u2212/,\"-\").replace(/\\u2217/,\"*\"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(function(t){return t.toText()}).join(\"\");r=[new pe.TextNode(s)]}var h=new pe.MathNode(\"mi\",r);h.setAttribute(\"mathvariant\",\"normal\");var l=new pe.MathNode(\"mo\",[fe(\"\\u2061\",\"text\")]);return pe.newDocumentFragment([h,l])}}),Zt({type:\"ordgroup\",htmlBuilder:function(t,e){return t.semisimple?Lt.makeFragment(ae(t.body,e,!1)):Lt.makeSpan([\"mord\"],ae(t.body,e,!0),e)},mathmlBuilder:function(t,e){return be(t.body,e)}}),$t({type:\"overline\",names:[\"\\\\overline\"],props:{numArgs:1},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"overline\",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle()),a=Lt.makeLineSpan(\"overline-line\",e),n=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r},{type:\"kern\",size:3*a.height},{type:\"elem\",elem:a},{type:\"kern\",size:a.height}]},e);return Lt.makeSpan([\"mord\",\"overline\"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mo\",[new pe.TextNode(\"\\u203e\")]);r.setAttribute(\"stretchy\",\"true\");var a=new pe.MathNode(\"mover\",[ye(t.body,e),r]);return a.setAttribute(\"accent\",\"true\"),a}}),$t({type:\"phantom\",names:[\"\\\\phantom\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"phantom\",mode:r.mode,body:Kt(a)}},htmlBuilder:function(t,e){var r=ae(t.body,e.withPhantom(),!1);return Lt.makeFragment(r)},mathmlBuilder:function(t,e){var r=ve(t.body,e);return new pe.MathNode(\"mphantom\",r)}}),$t({type:\"hphantom\",names:[\"\\\\hphantom\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"hphantom\",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r}]},e),Lt.makeSpan([\"mord\"],[r],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode(\"mphantom\",r),n=new pe.MathNode(\"mpadded\",[a]);return n.setAttribute(\"height\",\"0px\"),n.setAttribute(\"depth\",\"0px\"),n}}),$t({type:\"vphantom\",names:[\"\\\\vphantom\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){var r=t.parser,a=e[0];return{type:\"vphantom\",mode:r.mode,body:a}},htmlBuilder:function(t,e){var r=Lt.makeSpan([\"inner\"],[he(t.body,e.withPhantom())]),a=Lt.makeSpan([\"fix\"],[]);return Lt.makeSpan([\"mord\",\"rlap\"],[r,a],e)},mathmlBuilder:function(t,e){var r=ve(Kt(t.body),e),a=new pe.MathNode(\"mphantom\",r),n=new pe.MathNode(\"mpadded\",[a]);return n.setAttribute(\"width\",\"0px\"),n}});var Dr=[\"\\\\tiny\",\"\\\\sixptsize\",\"\\\\scriptsize\",\"\\\\footnotesize\",\"\\\\small\",\"\\\\normalsize\",\"\\\\large\",\"\\\\Large\",\"\\\\LARGE\",\"\\\\huge\",\"\\\\Huge\"],Fr=function(t,e){var r=e.havingSize(t.size);return Pr(t.body,r,e)};$t({type:\"sizing\",names:Dr,props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!1,r);return{type:\"sizing\",mode:n.mode,size:Dr.indexOf(a)+1,body:o}},htmlBuilder:Fr,mathmlBuilder:function(t,e){var r=e.havingSize(t.size),a=ve(t.body,r),n=new pe.MathNode(\"mstyle\",a);return n.setAttribute(\"mathsize\",r.sizeMultiplier+\"em\"),n}}),$t({type:\"raisebox\",names:[\"\\\\raisebox\"],props:{numArgs:2,argTypes:[\"size\",\"text\"],allowedInText:!0},handler:function(t,e){var r=t.parser,a=Ht(e[0],\"size\").value,n=e[1];return{type:\"raisebox\",mode:r.mode,dy:a,body:n}},htmlBuilder:function(t,e){var r={type:\"text\",mode:t.mode,body:Kt(t.body),font:\"mathrm\"},a={type:\"sizing\",mode:t.mode,body:[r],size:6},n=Fr(a,e),o=zt(t.dy,e);return Lt.makeVList({positionType:\"shift\",positionData:-o,children:[{type:\"elem\",elem:n}]},e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mpadded\",[ye(t.body,e)]),a=t.dy.number+t.dy.unit;return r.setAttribute(\"voffset\",a),r}}),$t({type:\"rule\",names:[\"\\\\rule\"],props:{numArgs:2,numOptionalArgs:1,argTypes:[\"size\",\"size\",\"size\"]},handler:function(t,e,r){var a=t.parser,n=r[0],o=Ht(e[0],\"size\"),i=Ht(e[1],\"size\");return{type:\"rule\",mode:a.mode,shift:n&&Ht(n,\"size\").value,width:o.value,height:i.value}},htmlBuilder:function(t,e){var r=Lt.makeSpan([\"mord\",\"rule\"],[],e),a=zt(t.width,e),n=zt(t.height,e),o=t.shift?zt(t.shift,e):0;return r.style.borderRightWidth=a+\"em\",r.style.borderTopWidth=n+\"em\",r.style.bottom=o+\"em\",r.width=a,r.height=n+o,r.depth=-o,r.maxFontSize=1.125*n*e.sizeMultiplier,r},mathmlBuilder:function(t,e){var r=zt(t.width,e),a=zt(t.height,e),n=t.shift?zt(t.shift,e):0,o=e.color&&e.getColor()||\"black\",i=new pe.MathNode(\"mspace\");i.setAttribute(\"mathbackground\",o),i.setAttribute(\"width\",r+\"em\"),i.setAttribute(\"height\",a+\"em\");var s=new pe.MathNode(\"mpadded\",[i]);return n>=0?s.setAttribute(\"height\",\"+\"+n+\"em\"):(s.setAttribute(\"height\",n+\"em\"),s.setAttribute(\"depth\",\"+\"+-n+\"em\")),s.setAttribute(\"voffset\",n+\"em\"),s}}),$t({type:\"smash\",names:[\"\\\\smash\"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(t,e,r){var a=t.parser,n=!1,o=!1,i=r[0]&&Ht(r[0],\"ordgroup\");if(i)for(var s=\"\",h=0;h<i.body.length;++h){if(\"t\"===(s=i.body[h].text))n=!0;else{if(\"b\"!==s){n=!1,o=!1;break}o=!0}}else n=!0,o=!0;var l=e[0];return{type:\"smash\",mode:a.mode,body:l,smashHeight:n,smashDepth:o}},htmlBuilder:function(t,e){var r=Lt.makeSpan([],[he(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(t.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var o=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r}]},e);return Lt.makeSpan([\"mord\"],[o],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mpadded\",[ye(t.body,e)]);return t.smashHeight&&r.setAttribute(\"height\",\"0px\"),t.smashDepth&&r.setAttribute(\"depth\",\"0px\"),r}}),$t({type:\"sqrt\",names:[\"\\\\sqrt\"],props:{numArgs:1,numOptionalArgs:1},handler:function(t,e,r){var a=t.parser,n=r[0],o=e[0];return{type:\"sqrt\",mode:a.mode,body:o,index:n}},htmlBuilder:function(t,e){var r=he(t.body,e.havingCrampedStyle());0===r.height&&(r.height=e.fontMetrics().xHeight),r=Lt.wrapFragment(r,e);var a=e.fontMetrics().defaultRuleThickness,n=a;e.style.id<w.TEXT.id&&(n=e.fontMetrics().xHeight);var o=a+n/4,i=r.height+r.depth+o+a,s=Qe(i,e),h=s.span,l=s.ruleWidth,m=s.advanceWidth,c=h.height-l;c>r.height+r.depth+o&&(o=(o+c-r.height-r.depth)/2);var u=h.height-r.height-o-l;r.style.paddingLeft=m+\"em\";var d=Lt.makeVList({positionType:\"firstBaseline\",children:[{type:\"elem\",elem:r,wrapperClasses:[\"svg-align\"]},{type:\"kern\",size:-(r.height+u)},{type:\"elem\",elem:h},{type:\"kern\",size:l}]},e);if(t.index){var p=e.havingStyle(w.SCRIPTSCRIPT),f=he(t.index,p,e),g=.6*(d.height-d.depth),x=Lt.makeVList({positionType:\"shift\",positionData:-g,children:[{type:\"elem\",elem:f}]},e),v=Lt.makeSpan([\"root\"],[x]);return Lt.makeSpan([\"mord\",\"sqrt\"],[v,d],e)}return Lt.makeSpan([\"mord\",\"sqrt\"],[d],e)},mathmlBuilder:function(t,e){var r=t.body,a=t.index;return a?new pe.MathNode(\"mroot\",[ye(r,e),ye(a,e)]):new pe.MathNode(\"msqrt\",[ye(r,e)])}});var Vr={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};$t({type:\"styling\",names:[\"\\\\displaystyle\",\"\\\\textstyle\",\"\\\\scriptstyle\",\"\\\\scriptscriptstyle\"],props:{numArgs:0,allowedInText:!0},handler:function(t,e){var r=t.breakOnTokenText,a=t.funcName,n=t.parser,o=n.parseExpression(!0,r),i=a.slice(1,a.length-5);return{type:\"styling\",mode:n.mode,style:i,body:o}},htmlBuilder:function(t,e){var r=Vr[t.style],a=e.havingStyle(r).withFont(\"\");return Pr(t.body,a,e)},mathmlBuilder:function(t,e){var r={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT}[t.style],a=e.havingStyle(r),n=ve(t.body,a),o=new pe.MathNode(\"mstyle\",n),i={display:[\"0\",\"true\"],text:[\"0\",\"false\"],script:[\"1\",\"false\"],scriptscript:[\"2\",\"false\"]}[t.style];return o.setAttribute(\"scriptlevel\",i[0]),o.setAttribute(\"displaystyle\",i[1]),o}});Zt({type:\"supsub\",htmlBuilder:function(t,e){var r=function(t,e){var r=t.base;return r?\"op\"===r.type?r.limits&&(e.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?Er:null:\"accent\"===r.type?c.isCharacterBox(r.base)?Ce:null:\"horizBrace\"===r.type&&!t.sub===r.isOver?Nr:null:null}(t,e);if(r)return r(t,e);var a,n,o,i=t.base,s=t.sup,h=t.sub,l=he(i,e),m=e.fontMetrics(),u=0,d=0,p=i&&c.isCharacterBox(i);if(s){var f=e.havingStyle(e.style.sup());a=he(s,f,e),p||(u=l.height-f.fontMetrics().supDrop*f.sizeMultiplier/e.sizeMultiplier)}if(h){var g=e.havingStyle(e.style.sub());n=he(h,g,e),p||(d=l.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}o=e.style===w.DISPLAY?m.sup1:e.style.cramped?m.sup3:m.sup2;var x,v=e.sizeMultiplier,b=.5/m.ptPerEm/v+\"em\",y=null;if(n){var k=t.base&&\"op\"===t.base.type&&t.base.name&&(\"\\\\oiint\"===t.base.name||\"\\\\oiiint\"===t.base.name);(l instanceof E||k)&&(y=-l.italic+\"em\")}if(a&&n){u=Math.max(u,o,a.depth+.25*m.xHeight),d=Math.max(d,m.sub2);var S=4*m.defaultRuleThickness;if(u-a.depth-(n.height-d)<S){d=S-(u-a.depth)+n.height;var z=.8*m.xHeight-(u-a.depth);z>0&&(u+=z,d-=z)}var M=[{type:\"elem\",elem:n,shift:d,marginRight:b,marginLeft:y},{type:\"elem\",elem:a,shift:-u,marginRight:b}];x=Lt.makeVList({positionType:\"individualShift\",children:M},e)}else if(n){d=Math.max(d,m.sub1,n.height-.8*m.xHeight);var T=[{type:\"elem\",elem:n,marginLeft:y,marginRight:b}];x=Lt.makeVList({positionType:\"shift\",positionData:d,children:T},e)}else{if(!a)throw new Error(\"supsub must have either sup or sub.\");u=Math.max(u,o,a.depth+.25*m.xHeight),x=Lt.makeVList({positionType:\"shift\",positionData:-u,children:[{type:\"elem\",elem:a,marginRight:b}]},e)}var A=ie(l,\"right\")||\"mord\";return Lt.makeSpan([A],[l,Lt.makeSpan([\"msupsub\"],[x])],e)},mathmlBuilder:function(t,e){var r,a=!1,n=Pt(t.base,\"horizBrace\");n&&!!t.sup===n.isOver&&(a=!0,r=n.isOver),t.base&&\"op\"===t.base.type&&(t.base.parentIsSupSub=!0);var o,i=[ye(t.base,e)];if(t.sub&&i.push(ye(t.sub,e)),t.sup&&i.push(ye(t.sup,e)),a)o=r?\"mover\":\"munder\";else if(t.sub)if(t.sup){var s=t.base;o=s&&\"op\"===s.type&&s.limits&&e.style===w.DISPLAY?\"munderover\":\"msubsup\"}else{var h=t.base;o=h&&\"op\"===h.type&&h.limits&&(e.style===w.DISPLAY||h.alwaysHandleSupSub)?\"munder\":\"msub\"}else{var l=t.base;o=l&&\"op\"===l.type&&l.limits&&(e.style===w.DISPLAY||l.alwaysHandleSupSub)?\"mover\":\"msup\"}return new pe.MathNode(o,i)}}),Zt({type:\"atom\",htmlBuilder:function(t,e){return Lt.mathsym(t.text,t.mode,e,[\"m\"+t.family])},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mo\",[fe(t.text,t.mode)]);if(\"bin\"===t.family){var a=xe(t,e);\"bold-italic\"===a&&r.setAttribute(\"mathvariant\",a)}else\"punct\"===t.family?r.setAttribute(\"separator\",\"true\"):\"open\"!==t.family&&\"close\"!==t.family||r.setAttribute(\"stretchy\",\"false\");return r}});var Ur={mi:\"italic\",mn:\"normal\",mtext:\"normal\"};Zt({type:\"mathord\",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,\"mathord\")},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mi\",[fe(t.text,t.mode,e)]),a=xe(t,e)||\"italic\";return a!==Ur[r.type]&&r.setAttribute(\"mathvariant\",a),r}}),Zt({type:\"textord\",htmlBuilder:function(t,e){return Lt.makeOrd(t,e,\"textord\")},mathmlBuilder:function(t,e){var r,a=fe(t.text,t.mode,e),n=xe(t,e)||\"normal\";return r=\"text\"===t.mode?new pe.MathNode(\"mtext\",[a]):/[0-9]/.test(t.text)?new pe.MathNode(\"mn\",[a]):\"\\\\prime\"===t.text?new pe.MathNode(\"mo\",[a]):new pe.MathNode(\"mi\",[a]),n!==Ur[r.type]&&r.setAttribute(\"mathvariant\",n),r}});var Gr={\"\\\\nobreak\":\"nobreak\",\"\\\\allowbreak\":\"allowbreak\"},Xr={\" \":{},\"\\\\ \":{},\"~\":{className:\"nobreak\"},\"\\\\space\":{},\"\\\\nobreakspace\":{className:\"nobreak\"}};Zt({type:\"spacing\",htmlBuilder:function(t,e){if(Xr.hasOwnProperty(t.text)){var r=Xr[t.text].className||\"\";if(\"text\"===t.mode){var a=Lt.makeOrd(t,e,\"textord\");return a.classes.push(r),a}return Lt.makeSpan([\"mspace\",r],[Lt.mathsym(t.text,t.mode,e)],e)}if(Gr.hasOwnProperty(t.text))return Lt.makeSpan([\"mspace\",Gr[t.text]],[],e);throw new i('Unknown type of space \"'+t.text+'\"')},mathmlBuilder:function(t,e){if(!Xr.hasOwnProperty(t.text)){if(Gr.hasOwnProperty(t.text))return new pe.MathNode(\"mspace\");throw new i('Unknown type of space \"'+t.text+'\"')}return new pe.MathNode(\"mtext\",[new pe.TextNode(\"\\xa0\")])}});var Yr=function(){var t=new pe.MathNode(\"mtd\",[]);return t.setAttribute(\"width\",\"50%\"),t};Zt({type:\"tag\",mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mtable\",[new pe.MathNode(\"mtr\",[Yr(),new pe.MathNode(\"mtd\",[be(t.body,e)]),Yr(),new pe.MathNode(\"mtd\",[be(t.tag,e)])])]);return r.setAttribute(\"width\",\"100%\"),r}});var _r={\"\\\\text\":void 0,\"\\\\textrm\":\"textrm\",\"\\\\textsf\":\"textsf\",\"\\\\texttt\":\"texttt\",\"\\\\textnormal\":\"textrm\"},Wr={\"\\\\textbf\":\"textbf\",\"\\\\textmd\":\"textmd\"},jr={\"\\\\textit\":\"textit\",\"\\\\textup\":\"textup\"},$r=function(t,e){var r=t.font;return r?_r[r]?e.withTextFontFamily(_r[r]):Wr[r]?e.withTextFontWeight(Wr[r]):e.withTextFontShape(jr[r]):e};$t({type:\"text\",names:[\"\\\\text\",\"\\\\textrm\",\"\\\\textsf\",\"\\\\texttt\",\"\\\\textnormal\",\"\\\\textbf\",\"\\\\textmd\",\"\\\\textit\",\"\\\\textup\"],props:{numArgs:1,argTypes:[\"text\"],greediness:2,allowedInText:!0,consumeMode:\"text\"},handler:function(t,e){var r=t.parser,a=t.funcName,n=e[0];return{type:\"text\",mode:r.mode,body:Kt(n),font:a}},htmlBuilder:function(t,e){var r=$r(t,e),a=ae(t.body,r,!0);return Lt.makeSpan([\"mord\",\"text\"],Lt.tryCombineChars(a),r)},mathmlBuilder:function(t,e){var r=$r(t,e);return be(t.body,r)}}),$t({type:\"underline\",names:[\"\\\\underline\"],props:{numArgs:1,allowedInText:!0},handler:function(t,e){return{type:\"underline\",mode:t.parser.mode,body:e[0]}},htmlBuilder:function(t,e){var r=he(t.body,e),a=Lt.makeLineSpan(\"underline-line\",e),n=Lt.makeVList({positionType:\"top\",positionData:r.height,children:[{type:\"kern\",size:a.height},{type:\"elem\",elem:a},{type:\"kern\",size:3*a.height},{type:\"elem\",elem:r}]},e);return Lt.makeSpan([\"mord\",\"underline\"],[n],e)},mathmlBuilder:function(t,e){var r=new pe.MathNode(\"mo\",[new pe.TextNode(\"\\u203e\")]);r.setAttribute(\"stretchy\",\"true\");var a=new pe.MathNode(\"munder\",[ye(t.body,e),r]);return a.setAttribute(\"accentunder\",\"true\"),a}}),$t({type:\"verb\",names:[\"\\\\verb\"],props:{numArgs:0,allowedInText:!0},handler:function(t,e,r){throw new i(\"\\\\verb ended by end of line instead of matching delimiter\")},htmlBuilder:function(t,e){for(var r=Zr(t),a=[],n=e.havingStyle(e.style.text()),o=0;o<r.length;o++){var i=r[o];\"~\"===i&&(i=\"\\\\textasciitilde\"),a.push(Lt.makeSymbol(i,\"Typewriter-Regular\",t.mode,n,[\"mord\",\"texttt\"]))}return Lt.makeSpan([\"mord\",\"text\"].concat(n.sizingClasses(e)),Lt.tryCombineChars(a),n)},mathmlBuilder:function(t,e){var r=new pe.TextNode(Zr(t)),a=new pe.MathNode(\"mtext\",[r]);return a.setAttribute(\"mathvariant\",\"monospace\"),a}});var Zr=function(t){return t.body.replace(/ /g,t.star?\"\\u2423\":\"\\xa0\")},Kr=_t,Jr=new RegExp(\"^(\\\\\\\\[a-zA-Z@]+)[ \\r\\n\\t]*$\"),Qr=new RegExp(\"[\\u0300-\\u036f]+$\"),ta=\"([ \\r\\n\\t]+)|([!-\\\\[\\\\]-\\u2027\\u202a-\\ud7ff\\uf900-\\uffff][\\u0300-\\u036f]*|[\\ud800-\\udbff][\\udc00-\\udfff][\\u0300-\\u036f]*|\\\\\\\\verb\\\\*([^]).*?\\\\3|\\\\\\\\verb([^*a-zA-Z]).*?\\\\4|\\\\\\\\[a-zA-Z@]+[ \\r\\n\\t]*|\\\\\\\\[^\\ud800-\\udfff])\",ea=function(){function t(t,e){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=t,this.settings=e,this.tokenRegex=new RegExp(ta,\"g\"),this.catcodes={\"%\":14}}var e=t.prototype;return e.setCatcode=function(t,e){this.catcodes[t]=e},e.lex=function(){var t=this.input,e=this.tokenRegex.lastIndex;if(e===t.length)return new n(\"EOF\",new a(this,e,e));var r=this.tokenRegex.exec(t);if(null===r||r.index!==e)throw new i(\"Unexpected character: '\"+t[e]+\"'\",new n(t[e],new a(this,e,e+1)));var o=r[2]||\" \";if(14===this.catcodes[o]){var s=t.indexOf(\"\\n\",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=t.length,this.settings.reportNonstrict(\"commentAtEnd\",\"% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)\")):this.tokenRegex.lastIndex=s+1,this.lex()}var h=o.match(Jr);return h&&(o=h[1]),new n(o,new a(this,e,this.tokenRegex.lastIndex))},t}(),ra=function(){function t(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=e,this.builtins=t,this.undefStack=[]}var e=t.prototype;return e.beginGroup=function(){this.undefStack.push({})},e.endGroup=function(){if(0===this.undefStack.length)throw new i(\"Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug\");var t=this.undefStack.pop();for(var e in t)t.hasOwnProperty(e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])},e.has=function(t){return this.current.hasOwnProperty(t)||this.builtins.hasOwnProperty(t)},e.get=function(t){return this.current.hasOwnProperty(t)?this.current[t]:this.builtins[t]},e.set=function(t,e,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][t];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][t]=e)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(t)&&(n[t]=this.current[t])}this.current[t]=e},t}(),aa={},na=aa;function oa(t,e){aa[t]=e}oa(\"\\\\@firstoftwo\",function(t){return{tokens:t.consumeArgs(2)[0],numArgs:0}}),oa(\"\\\\@secondoftwo\",function(t){return{tokens:t.consumeArgs(2)[1],numArgs:0}}),oa(\"\\\\@ifnextchar\",function(t){var e=t.consumeArgs(3),r=t.future();return 1===e[0].length&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}}),oa(\"\\\\@ifstar\",\"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\"),oa(\"\\\\TextOrMath\",function(t){var e=t.consumeArgs(2);return\"text\"===t.mode?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});var ia={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};oa(\"\\\\char\",function(t){var e,r=t.popToken(),a=\"\";if(\"'\"===r.text)e=8,r=t.popToken();else if('\"'===r.text)e=16,r=t.popToken();else if(\"`\"===r.text)if(\"\\\\\"===(r=t.popToken()).text[0])a=r.text.charCodeAt(1);else{if(\"EOF\"===r.text)throw new i(\"\\\\char` missing argument\");a=r.text.charCodeAt(0)}else e=10;if(e){if(null==(a=ia[r.text])||a>=e)throw new i(\"Invalid base-\"+e+\" digit \"+r.text);for(var n;null!=(n=ia[t.future().text])&&n<e;)a*=e,a+=n,t.popToken()}return\"\\\\@char{\"+a+\"}\"});var sa=function(t,e){var r=t.consumeArgs(1)[0];if(1!==r.length)throw new i(\"\\\\gdef's first argument must be a macro name\");var a=r[0].text,n=0;for(r=t.consumeArgs(1)[0];1===r.length&&\"#\"===r[0].text;){if(1!==(r=t.consumeArgs(1)[0]).length)throw new i('Invalid argument number length \"'+r.length+'\"');if(!/^[1-9]$/.test(r[0].text))throw new i('Invalid argument number \"'+r[0].text+'\"');if(n++,parseInt(r[0].text)!==n)throw new i('Argument number \"'+r[0].text+'\" out of order');r=t.consumeArgs(1)[0]}return t.macros.set(a,{tokens:r,numArgs:n},e),\"\"};oa(\"\\\\gdef\",function(t){return sa(t,!0)}),oa(\"\\\\def\",function(t){return sa(t,!1)}),oa(\"\\\\global\",function(t){var e=t.consumeArgs(1)[0];if(1!==e.length)throw new i(\"Invalid command after \\\\global\");var r=e[0].text;if(\"\\\\def\"===r)return sa(t,!0);throw new i(\"Invalid command '\"+r+\"' after \\\\global\")});var ha=function(t,e,r){var a=t.consumeArgs(1)[0];if(1!==a.length)throw new i(\"\\\\newcommand's first argument must be a macro name\");var n=a[0].text,o=t.isDefined(n);if(o&&!e)throw new i(\"\\\\newcommand{\"+n+\"} attempting to redefine \"+n+\"; use \\\\renewcommand\");if(!o&&!r)throw new i(\"\\\\renewcommand{\"+n+\"} when command \"+n+\" does not yet exist; use \\\\newcommand\");var s=0;if(1===(a=t.consumeArgs(1)[0]).length&&\"[\"===a[0].text){for(var h=\"\",l=t.expandNextToken();\"]\"!==l.text&&\"EOF\"!==l.text;)h+=l.text,l=t.expandNextToken();if(!h.match(/^\\s*[0-9]+\\s*$/))throw new i(\"Invalid number of arguments: \"+h);s=parseInt(h),a=t.consumeArgs(1)[0]}return t.macros.set(n,{tokens:a,numArgs:s}),\"\"};oa(\"\\\\newcommand\",function(t){return ha(t,!1,!0)}),oa(\"\\\\renewcommand\",function(t){return ha(t,!0,!1)}),oa(\"\\\\providecommand\",function(t){return ha(t,!0,!0)}),oa(\"\\\\bgroup\",\"{\"),oa(\"\\\\egroup\",\"}\"),oa(\"\\\\lq\",\"`\"),oa(\"\\\\rq\",\"'\"),oa(\"\\\\aa\",\"\\\\r a\"),oa(\"\\\\AA\",\"\\\\r A\"),oa(\"\\\\textcopyright\",\"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`\\xa9}\"),oa(\"\\\\copyright\",\"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\"),oa(\"\\\\textregistered\",\"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`\\xae}\"),oa(\"\\u212c\",\"\\\\mathscr{B}\"),oa(\"\\u2130\",\"\\\\mathscr{E}\"),oa(\"\\u2131\",\"\\\\mathscr{F}\"),oa(\"\\u210b\",\"\\\\mathscr{H}\"),oa(\"\\u2110\",\"\\\\mathscr{I}\"),oa(\"\\u2112\",\"\\\\mathscr{L}\"),oa(\"\\u2133\",\"\\\\mathscr{M}\"),oa(\"\\u211b\",\"\\\\mathscr{R}\"),oa(\"\\u212d\",\"\\\\mathfrak{C}\"),oa(\"\\u210c\",\"\\\\mathfrak{H}\"),oa(\"\\u2128\",\"\\\\mathfrak{Z}\"),oa(\"\\\\Bbbk\",\"\\\\Bbb{k}\"),oa(\"\\xb7\",\"\\\\cdotp\"),oa(\"\\\\llap\",\"\\\\mathllap{\\\\textrm{#1}}\"),oa(\"\\\\rlap\",\"\\\\mathrlap{\\\\textrm{#1}}\"),oa(\"\\\\clap\",\"\\\\mathclap{\\\\textrm{#1}}\"),oa(\"\\\\not\",'\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}}{\\\\char\"338}'),oa(\"\\\\neq\",\"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`\\u2260}}\"),oa(\"\\\\ne\",\"\\\\neq\"),oa(\"\\u2260\",\"\\\\neq\"),oa(\"\\\\notin\",\"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}{\\\\mathrel{\\\\char`\\u2209}}\"),oa(\"\\u2209\",\"\\\\notin\"),oa(\"\\u2258\",\"\\\\html@mathml{\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}}{\\\\mathrel{\\\\char`\\u2258}}\"),oa(\"\\u2259\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\"),oa(\"\\u225a\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225a}}\"),oa(\"\\u225b\",\"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}{\\\\mathrel{\\\\char`\\u225b}}\"),oa(\"\\u225d\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}{\\\\mathrel{\\\\char`\\u225d}}\"),oa(\"\\u225e\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}{\\\\mathrel{\\\\char`\\u225e}}\"),oa(\"\\u225f\",\"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225f}}\"),oa(\"\\u27c2\",\"\\\\perp\"),oa(\"\\u203c\",\"\\\\mathclose{!\\\\mkern-0.8mu!}\"),oa(\"\\u220c\",\"\\\\notni\"),oa(\"\\u231c\",\"\\\\ulcorner\"),oa(\"\\u231d\",\"\\\\urcorner\"),oa(\"\\u231e\",\"\\\\llcorner\"),oa(\"\\u231f\",\"\\\\lrcorner\"),oa(\"\\xa9\",\"\\\\copyright\"),oa(\"\\xae\",\"\\\\textregistered\"),oa(\"\\ufe0f\",\"\\\\textregistered\"),oa(\"\\\\vdots\",\"\\\\mathord{\\\\varvdots\\\\rule{0pt}{15pt}}\"),oa(\"\\u22ee\",\"\\\\vdots\"),oa(\"\\\\varGamma\",\"\\\\mathit{\\\\Gamma}\"),oa(\"\\\\varDelta\",\"\\\\mathit{\\\\Delta}\"),oa(\"\\\\varTheta\",\"\\\\mathit{\\\\Theta}\"),oa(\"\\\\varLambda\",\"\\\\mathit{\\\\Lambda}\"),oa(\"\\\\varXi\",\"\\\\mathit{\\\\Xi}\"),oa(\"\\\\varPi\",\"\\\\mathit{\\\\Pi}\"),oa(\"\\\\varSigma\",\"\\\\mathit{\\\\Sigma}\"),oa(\"\\\\varUpsilon\",\"\\\\mathit{\\\\Upsilon}\"),oa(\"\\\\varPhi\",\"\\\\mathit{\\\\Phi}\"),oa(\"\\\\varPsi\",\"\\\\mathit{\\\\Psi}\"),oa(\"\\\\varOmega\",\"\\\\mathit{\\\\Omega}\"),oa(\"\\\\colon\",\"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\"),oa(\"\\\\boxed\",\"\\\\fbox{$\\\\displaystyle{#1}$}\"),oa(\"\\\\iff\",\"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\"),oa(\"\\\\implies\",\"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\"),oa(\"\\\\impliedby\",\"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");var la={\",\":\"\\\\dotsc\",\"\\\\not\":\"\\\\dotsb\",\"+\":\"\\\\dotsb\",\"=\":\"\\\\dotsb\",\"<\":\"\\\\dotsb\",\">\":\"\\\\dotsb\",\"-\":\"\\\\dotsb\",\"*\":\"\\\\dotsb\",\":\":\"\\\\dotsb\",\"\\\\DOTSB\":\"\\\\dotsb\",\"\\\\coprod\":\"\\\\dotsb\",\"\\\\bigvee\":\"\\\\dotsb\",\"\\\\bigwedge\":\"\\\\dotsb\",\"\\\\biguplus\":\"\\\\dotsb\",\"\\\\bigcap\":\"\\\\dotsb\",\"\\\\bigcup\":\"\\\\dotsb\",\"\\\\prod\":\"\\\\dotsb\",\"\\\\sum\":\"\\\\dotsb\",\"\\\\bigotimes\":\"\\\\dotsb\",\"\\\\bigoplus\":\"\\\\dotsb\",\"\\\\bigodot\":\"\\\\dotsb\",\"\\\\bigsqcup\":\"\\\\dotsb\",\"\\\\And\":\"\\\\dotsb\",\"\\\\longrightarrow\":\"\\\\dotsb\",\"\\\\Longrightarrow\":\"\\\\dotsb\",\"\\\\longleftarrow\":\"\\\\dotsb\",\"\\\\Longleftarrow\":\"\\\\dotsb\",\"\\\\longleftrightarrow\":\"\\\\dotsb\",\"\\\\Longleftrightarrow\":\"\\\\dotsb\",\"\\\\mapsto\":\"\\\\dotsb\",\"\\\\longmapsto\":\"\\\\dotsb\",\"\\\\hookrightarrow\":\"\\\\dotsb\",\"\\\\doteq\":\"\\\\dotsb\",\"\\\\mathbin\":\"\\\\dotsb\",\"\\\\mathrel\":\"\\\\dotsb\",\"\\\\relbar\":\"\\\\dotsb\",\"\\\\Relbar\":\"\\\\dotsb\",\"\\\\xrightarrow\":\"\\\\dotsb\",\"\\\\xleftarrow\":\"\\\\dotsb\",\"\\\\DOTSI\":\"\\\\dotsi\",\"\\\\int\":\"\\\\dotsi\",\"\\\\oint\":\"\\\\dotsi\",\"\\\\iint\":\"\\\\dotsi\",\"\\\\iiint\":\"\\\\dotsi\",\"\\\\iiiint\":\"\\\\dotsi\",\"\\\\idotsint\":\"\\\\dotsi\",\"\\\\DOTSX\":\"\\\\dotsx\"};oa(\"\\\\dots\",function(t){var e=\"\\\\dotso\",r=t.expandAfterFuture().text;return r in la?e=la[r]:\"\\\\not\"===r.substr(0,4)?e=\"\\\\dotsb\":r in _.math&&c.contains([\"bin\",\"rel\"],_.math[r].group)&&(e=\"\\\\dotsb\"),e});var ma={\")\":!0,\"]\":!0,\"\\\\rbrack\":!0,\"\\\\}\":!0,\"\\\\rbrace\":!0,\"\\\\rangle\":!0,\"\\\\rceil\":!0,\"\\\\rfloor\":!0,\"\\\\rgroup\":!0,\"\\\\rmoustache\":!0,\"\\\\right\":!0,\"\\\\bigr\":!0,\"\\\\biggr\":!0,\"\\\\Bigr\":!0,\"\\\\Biggr\":!0,$:!0,\";\":!0,\".\":!0,\",\":!0};oa(\"\\\\dotso\",function(t){return t.future().text in ma?\"\\\\ldots\\\\,\":\"\\\\ldots\"}),oa(\"\\\\dotsc\",function(t){var e=t.future().text;return e in ma&&\",\"!==e?\"\\\\ldots\\\\,\":\"\\\\ldots\"}),oa(\"\\\\cdots\",function(t){return t.future().text in ma?\"\\\\@cdots\\\\,\":\"\\\\@cdots\"}),oa(\"\\\\dotsb\",\"\\\\cdots\"),oa(\"\\\\dotsm\",\"\\\\cdots\"),oa(\"\\\\dotsi\",\"\\\\!\\\\cdots\"),oa(\"\\\\dotsx\",\"\\\\ldots\\\\,\"),oa(\"\\\\DOTSI\",\"\\\\relax\"),oa(\"\\\\DOTSB\",\"\\\\relax\"),oa(\"\\\\DOTSX\",\"\\\\relax\"),oa(\"\\\\tmspace\",\"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\"),oa(\"\\\\,\",\"\\\\tmspace+{3mu}{.1667em}\"),oa(\"\\\\thinspace\",\"\\\\,\"),oa(\"\\\\>\",\"\\\\mskip{4mu}\"),oa(\"\\\\:\",\"\\\\tmspace+{4mu}{.2222em}\"),oa(\"\\\\medspace\",\"\\\\:\"),oa(\"\\\\;\",\"\\\\tmspace+{5mu}{.2777em}\"),oa(\"\\\\thickspace\",\"\\\\;\"),oa(\"\\\\!\",\"\\\\tmspace-{3mu}{.1667em}\"),oa(\"\\\\negthinspace\",\"\\\\!\"),oa(\"\\\\negmedspace\",\"\\\\tmspace-{4mu}{.2222em}\"),oa(\"\\\\negthickspace\",\"\\\\tmspace-{5mu}{.277em}\"),oa(\"\\\\enspace\",\"\\\\kern.5em \"),oa(\"\\\\enskip\",\"\\\\hskip.5em\\\\relax\"),oa(\"\\\\quad\",\"\\\\hskip1em\\\\relax\"),oa(\"\\\\qquad\",\"\\\\hskip2em\\\\relax\"),oa(\"\\\\tag\",\"\\\\@ifstar\\\\tag@literal\\\\tag@paren\"),oa(\"\\\\tag@paren\",\"\\\\tag@literal{({#1})}\"),oa(\"\\\\tag@literal\",function(t){if(t.macros.get(\"\\\\df@tag\"))throw new i(\"Multiple \\\\tag\");return\"\\\\gdef\\\\df@tag{\\\\text{#1}}\"}),oa(\"\\\\bmod\",\"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\\\\mathbin{\\\\rm mod}\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\"),oa(\"\\\\pod\",\"\\\\allowbreak\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\"),oa(\"\\\\pmod\",\"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\"),oa(\"\\\\mod\",\"\\\\allowbreak\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\rm mod}\\\\,\\\\,#1\"),oa(\"\\\\pmb\",\"\\\\html@mathml{\\\\@binrel{#1}{\\\\mathrlap{#1}\\\\mathrlap{\\\\mkern0.4mu\\\\raisebox{0.4mu}{$#1$}}{\\\\mkern0.8mu#1}}}{\\\\mathbf{#1}}\"),oa(\"\\\\\\\\\",\"\\\\newline\"),oa(\"\\\\TeX\",\"\\\\textrm{\\\\html@mathml{T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX}{TeX}}\");var ca=P[\"Main-Regular\"][\"T\".charCodeAt(0)][1]-.7*P[\"Main-Regular\"][\"A\".charCodeAt(0)][1]+\"em\";oa(\"\\\\LaTeX\",\"\\\\textrm{\\\\html@mathml{L\\\\kern-.36em\\\\raisebox{\"+ca+\"}{\\\\scriptsize A}\\\\kern-.15em\\\\TeX}{LaTeX}}\"),oa(\"\\\\KaTeX\",\"\\\\textrm{\\\\html@mathml{K\\\\kern-.17em\\\\raisebox{\"+ca+\"}{\\\\scriptsize A}\\\\kern-.15em\\\\TeX}{KaTeX}}\"),oa(\"\\\\hspace\",\"\\\\@ifstar\\\\@hspacer\\\\@hspace\"),oa(\"\\\\@hspace\",\"\\\\hskip #1\\\\relax\"),oa(\"\\\\@hspacer\",\"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\"),oa(\"\\\\ordinarycolon\",\":\"),oa(\"\\\\vcentcolon\",\"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\"),oa(\"\\\\dblcolon\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}{\\\\mathop{\\\\char\"2237}}'),oa(\"\\\\coloneqq\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}{\\\\mathop{\\\\char\"2254}}'),oa(\"\\\\Coloneqq\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}{\\\\mathop{\\\\char\"2237\\\\char\"3d}}'),oa(\"\\\\coloneq\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}{\\\\mathop{\\\\char\"3a\\\\char\"2212}}'),oa(\"\\\\Coloneq\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}{\\\\mathop{\\\\char\"2237\\\\char\"2212}}'),oa(\"\\\\eqqcolon\",'\\\\html@mathml{\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}{\\\\mathop{\\\\char\"2255}}'),oa(\"\\\\Eqqcolon\",'\\\\html@mathml{\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}{\\\\mathop{\\\\char\"3d\\\\char\"2237}}'),oa(\"\\\\eqcolon\",'\\\\html@mathml{\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}{\\\\mathop{\\\\char\"2239}}'),oa(\"\\\\Eqcolon\",'\\\\html@mathml{\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}{\\\\mathop{\\\\char\"2212\\\\char\"2237}}'),oa(\"\\\\colonapprox\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}{\\\\mathop{\\\\char\"3a\\\\char\"2248}}'),oa(\"\\\\Colonapprox\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}{\\\\mathop{\\\\char\"2237\\\\char\"2248}}'),oa(\"\\\\colonsim\",'\\\\html@mathml{\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}{\\\\mathop{\\\\char\"3a\\\\char\"223c}}'),oa(\"\\\\Colonsim\",'\\\\html@mathml{\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}{\\\\mathop{\\\\char\"2237\\\\char\"223c}}'),oa(\"\\u2237\",\"\\\\dblcolon\"),oa(\"\\u2239\",\"\\\\eqcolon\"),oa(\"\\u2254\",\"\\\\coloneqq\"),oa(\"\\u2255\",\"\\\\eqqcolon\"),oa(\"\\u2a74\",\"\\\\Coloneqq\"),oa(\"\\\\ratio\",\"\\\\vcentcolon\"),oa(\"\\\\coloncolon\",\"\\\\dblcolon\"),oa(\"\\\\colonequals\",\"\\\\coloneqq\"),oa(\"\\\\coloncolonequals\",\"\\\\Coloneqq\"),oa(\"\\\\equalscolon\",\"\\\\eqqcolon\"),oa(\"\\\\equalscoloncolon\",\"\\\\Eqqcolon\"),oa(\"\\\\colonminus\",\"\\\\coloneq\"),oa(\"\\\\coloncolonminus\",\"\\\\Coloneq\"),oa(\"\\\\minuscolon\",\"\\\\eqcolon\"),oa(\"\\\\minuscoloncolon\",\"\\\\Eqcolon\"),oa(\"\\\\coloncolonapprox\",\"\\\\Colonapprox\"),oa(\"\\\\coloncolonsim\",\"\\\\Colonsim\"),oa(\"\\\\simcolon\",\"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\"),oa(\"\\\\simcoloncolon\",\"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\"),oa(\"\\\\approxcolon\",\"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\"),oa(\"\\\\approxcoloncolon\",\"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\"),oa(\"\\\\notni\",\"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220c}}\"),oa(\"\\\\limsup\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{lim\\\\,sup}}\\\\limits\"),oa(\"\\\\liminf\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{lim\\\\,inf}}\\\\limits\"),oa(\"\\\\gvertneqq\",\"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\"),oa(\"\\\\lvertneqq\",\"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\"),oa(\"\\\\ngeqq\",\"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\"),oa(\"\\\\ngeqslant\",\"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\"),oa(\"\\\\nleqq\",\"\\\\html@mathml{\\\\@nleqq}{\\u2270}\"),oa(\"\\\\nleqslant\",\"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\"),oa(\"\\\\nshortmid\",\"\\\\html@mathml{\\\\@nshortmid}{\\u2224}\"),oa(\"\\\\nshortparallel\",\"\\\\html@mathml{\\\\@nshortparallel}{\\u2226}\"),oa(\"\\\\nsubseteqq\",\"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\"),oa(\"\\\\nsupseteqq\",\"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\"),oa(\"\\\\varsubsetneq\",\"\\\\html@mathml{\\\\@varsubsetneq}{\\u228a}\"),oa(\"\\\\varsubsetneqq\",\"\\\\html@mathml{\\\\@varsubsetneqq}{\\u2acb}\"),oa(\"\\\\varsupsetneq\",\"\\\\html@mathml{\\\\@varsupsetneq}{\\u228b}\"),oa(\"\\\\varsupsetneqq\",\"\\\\html@mathml{\\\\@varsupsetneqq}{\\u2acc}\"),oa(\"\\\\llbracket\",\"\\\\html@mathml{\\\\mathopen{[\\\\mkern-3.2mu[}}{\\\\mathopen{\\\\char`\\u27e6}}\"),oa(\"\\\\rrbracket\",\"\\\\html@mathml{\\\\mathclose{]\\\\mkern-3.2mu]}}{\\\\mathclose{\\\\char`\\u27e7}}\"),oa(\"\\u27e6\",\"\\\\llbracket\"),oa(\"\\u27e7\",\"\\\\rrbracket\"),oa(\"\\\\lBrace\",\"\\\\html@mathml{\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}{\\\\mathopen{\\\\char`\\u2983}}\"),oa(\"\\\\rBrace\",\"\\\\html@mathml{\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}{\\\\mathclose{\\\\char`\\u2984}}\"),oa(\"\\u2983\",\"\\\\lBrace\"),oa(\"\\u2984\",\"\\\\rBrace\"),oa(\"\\\\darr\",\"\\\\downarrow\"),oa(\"\\\\dArr\",\"\\\\Downarrow\"),oa(\"\\\\Darr\",\"\\\\Downarrow\"),oa(\"\\\\lang\",\"\\\\langle\"),oa(\"\\\\rang\",\"\\\\rangle\"),oa(\"\\\\uarr\",\"\\\\uparrow\"),oa(\"\\\\uArr\",\"\\\\Uparrow\"),oa(\"\\\\Uarr\",\"\\\\Uparrow\"),oa(\"\\\\N\",\"\\\\mathbb{N}\"),oa(\"\\\\R\",\"\\\\mathbb{R}\"),oa(\"\\\\Z\",\"\\\\mathbb{Z}\"),oa(\"\\\\alef\",\"\\\\aleph\"),oa(\"\\\\alefsym\",\"\\\\aleph\"),oa(\"\\\\Alpha\",\"\\\\mathrm{A}\"),oa(\"\\\\Beta\",\"\\\\mathrm{B}\"),oa(\"\\\\bull\",\"\\\\bullet\"),oa(\"\\\\Chi\",\"\\\\mathrm{X}\"),oa(\"\\\\clubs\",\"\\\\clubsuit\"),oa(\"\\\\cnums\",\"\\\\mathbb{C}\"),oa(\"\\\\Complex\",\"\\\\mathbb{C}\"),oa(\"\\\\Dagger\",\"\\\\ddagger\"),oa(\"\\\\diamonds\",\"\\\\diamondsuit\"),oa(\"\\\\empty\",\"\\\\emptyset\"),oa(\"\\\\Epsilon\",\"\\\\mathrm{E}\"),oa(\"\\\\Eta\",\"\\\\mathrm{H}\"),oa(\"\\\\exist\",\"\\\\exists\"),oa(\"\\\\harr\",\"\\\\leftrightarrow\"),oa(\"\\\\hArr\",\"\\\\Leftrightarrow\"),oa(\"\\\\Harr\",\"\\\\Leftrightarrow\"),oa(\"\\\\hearts\",\"\\\\heartsuit\"),oa(\"\\\\image\",\"\\\\Im\"),oa(\"\\\\infin\",\"\\\\infty\"),oa(\"\\\\Iota\",\"\\\\mathrm{I}\"),oa(\"\\\\isin\",\"\\\\in\"),oa(\"\\\\Kappa\",\"\\\\mathrm{K}\"),oa(\"\\\\larr\",\"\\\\leftarrow\"),oa(\"\\\\lArr\",\"\\\\Leftarrow\"),oa(\"\\\\Larr\",\"\\\\Leftarrow\"),oa(\"\\\\lrarr\",\"\\\\leftrightarrow\"),oa(\"\\\\lrArr\",\"\\\\Leftrightarrow\"),oa(\"\\\\Lrarr\",\"\\\\Leftrightarrow\"),oa(\"\\\\Mu\",\"\\\\mathrm{M}\"),oa(\"\\\\natnums\",\"\\\\mathbb{N}\"),oa(\"\\\\Nu\",\"\\\\mathrm{N}\"),oa(\"\\\\Omicron\",\"\\\\mathrm{O}\"),oa(\"\\\\plusmn\",\"\\\\pm\"),oa(\"\\\\rarr\",\"\\\\rightarrow\"),oa(\"\\\\rArr\",\"\\\\Rightarrow\"),oa(\"\\\\Rarr\",\"\\\\Rightarrow\"),oa(\"\\\\real\",\"\\\\Re\"),oa(\"\\\\reals\",\"\\\\mathbb{R}\"),oa(\"\\\\Reals\",\"\\\\mathbb{R}\"),oa(\"\\\\Rho\",\"\\\\mathrm{P}\"),oa(\"\\\\sdot\",\"\\\\cdot\"),oa(\"\\\\sect\",\"\\\\S\"),oa(\"\\\\spades\",\"\\\\spadesuit\"),oa(\"\\\\sub\",\"\\\\subset\"),oa(\"\\\\sube\",\"\\\\subseteq\"),oa(\"\\\\supe\",\"\\\\supseteq\"),oa(\"\\\\Tau\",\"\\\\mathrm{T}\"),oa(\"\\\\thetasym\",\"\\\\vartheta\"),oa(\"\\\\weierp\",\"\\\\wp\"),oa(\"\\\\Zeta\",\"\\\\mathrm{Z}\"),oa(\"\\\\argmin\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{arg\\\\,min}}\\\\limits\"),oa(\"\\\\argmax\",\"\\\\DOTSB\\\\mathop{\\\\operatorname{arg\\\\,max}}\\\\limits\"),oa(\"\\\\blue\",\"\\\\textcolor{##6495ed}{#1}\"),oa(\"\\\\orange\",\"\\\\textcolor{##ffa500}{#1}\"),oa(\"\\\\pink\",\"\\\\textcolor{##ff00af}{#1}\"),oa(\"\\\\red\",\"\\\\textcolor{##df0030}{#1}\"),oa(\"\\\\green\",\"\\\\textcolor{##28ae7b}{#1}\"),oa(\"\\\\gray\",\"\\\\textcolor{gray}{##1}\"),oa(\"\\\\purple\",\"\\\\textcolor{##9d38bd}{#1}\"),oa(\"\\\\blueA\",\"\\\\textcolor{##ccfaff}{#1}\"),oa(\"\\\\blueB\",\"\\\\textcolor{##80f6ff}{#1}\"),oa(\"\\\\blueC\",\"\\\\textcolor{##63d9ea}{#1}\"),oa(\"\\\\blueD\",\"\\\\textcolor{##11accd}{#1}\"),oa(\"\\\\blueE\",\"\\\\textcolor{##0c7f99}{#1}\"),oa(\"\\\\tealA\",\"\\\\textcolor{##94fff5}{#1}\"),oa(\"\\\\tealB\",\"\\\\textcolor{##26edd5}{#1}\"),oa(\"\\\\tealC\",\"\\\\textcolor{##01d1c1}{#1}\"),oa(\"\\\\tealD\",\"\\\\textcolor{##01a995}{#1}\"),oa(\"\\\\tealE\",\"\\\\textcolor{##208170}{#1}\"),oa(\"\\\\greenA\",\"\\\\textcolor{##b6ffb0}{#1}\"),oa(\"\\\\greenB\",\"\\\\textcolor{##8af281}{#1}\"),oa(\"\\\\greenC\",\"\\\\textcolor{##74cf70}{#1}\"),oa(\"\\\\greenD\",\"\\\\textcolor{##1fab54}{#1}\"),oa(\"\\\\greenE\",\"\\\\textcolor{##0d923f}{#1}\"),oa(\"\\\\goldA\",\"\\\\textcolor{##ffd0a9}{#1}\"),oa(\"\\\\goldB\",\"\\\\textcolor{##ffbb71}{#1}\"),oa(\"\\\\goldC\",\"\\\\textcolor{##ff9c39}{#1}\"),oa(\"\\\\goldD\",\"\\\\textcolor{##e07d10}{#1}\"),oa(\"\\\\goldE\",\"\\\\textcolor{##a75a05}{#1}\"),oa(\"\\\\redA\",\"\\\\textcolor{##fca9a9}{#1}\"),oa(\"\\\\redB\",\"\\\\textcolor{##ff8482}{#1}\"),oa(\"\\\\redC\",\"\\\\textcolor{##f9685d}{#1}\"),oa(\"\\\\redD\",\"\\\\textcolor{##e84d39}{#1}\"),oa(\"\\\\redE\",\"\\\\textcolor{##bc2612}{#1}\"),oa(\"\\\\maroonA\",\"\\\\textcolor{##ffbde0}{#1}\"),oa(\"\\\\maroonB\",\"\\\\textcolor{##ff92c6}{#1}\"),oa(\"\\\\maroonC\",\"\\\\textcolor{##ed5fa6}{#1}\"),oa(\"\\\\maroonD\",\"\\\\textcolor{##ca337c}{#1}\"),oa(\"\\\\maroonE\",\"\\\\textcolor{##9e034e}{#1}\"),oa(\"\\\\purpleA\",\"\\\\textcolor{##ddd7ff}{#1}\"),oa(\"\\\\purpleB\",\"\\\\textcolor{##c6b9fc}{#1}\"),oa(\"\\\\purpleC\",\"\\\\textcolor{##aa87ff}{#1}\"),oa(\"\\\\purpleD\",\"\\\\textcolor{##7854ab}{#1}\"),oa(\"\\\\purpleE\",\"\\\\textcolor{##543b78}{#1}\"),oa(\"\\\\mintA\",\"\\\\textcolor{##f5f9e8}{#1}\"),oa(\"\\\\mintB\",\"\\\\textcolor{##edf2df}{#1}\"),oa(\"\\\\mintC\",\"\\\\textcolor{##e0e5cc}{#1}\"),oa(\"\\\\grayA\",\"\\\\textcolor{##f6f7f7}{#1}\"),oa(\"\\\\grayB\",\"\\\\textcolor{##f0f1f2}{#1}\"),oa(\"\\\\grayC\",\"\\\\textcolor{##e3e5e6}{#1}\"),oa(\"\\\\grayD\",\"\\\\textcolor{##d6d8da}{#1}\"),oa(\"\\\\grayE\",\"\\\\textcolor{##babec2}{#1}\"),oa(\"\\\\grayF\",\"\\\\textcolor{##888d93}{#1}\"),oa(\"\\\\grayG\",\"\\\\textcolor{##626569}{#1}\"),oa(\"\\\\grayH\",\"\\\\textcolor{##3b3e40}{#1}\"),oa(\"\\\\grayI\",\"\\\\textcolor{##21242c}{#1}\"),oa(\"\\\\kaBlue\",\"\\\\textcolor{##314453}{#1}\"),oa(\"\\\\kaGreen\",\"\\\\textcolor{##71B307}{#1}\");var ua={\"\\\\relax\":!0,\"^\":!0,_:!0,\"\\\\limits\":!0,\"\\\\nolimits\":!0},da=function(){function t(t,e,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=e,this.expansionCount=0,this.feed(t),this.macros=new ra(na,e.macros),this.mode=r,this.stack=[]}var e=t.prototype;return e.feed=function(t){this.lexer=new ea(t,this.settings)},e.switchMode=function(t){this.mode=t},e.beginGroup=function(){this.macros.beginGroup()},e.endGroup=function(){this.macros.endGroup()},e.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},e.popToken=function(){return this.future(),this.stack.pop()},e.pushToken=function(t){this.stack.push(t)},e.pushTokens=function(t){var e;(e=this.stack).push.apply(e,t)},e.consumeSpaces=function(){for(;;){if(\" \"!==this.future().text)break;this.stack.pop()}},e.consumeArgs=function(t){for(var e=[],r=0;r<t;++r){this.consumeSpaces();var a=this.popToken();if(\"{\"===a.text){for(var n=[],o=1;0!==o;){var s=this.popToken();if(n.push(s),\"{\"===s.text)++o;else if(\"}\"===s.text)--o;else if(\"EOF\"===s.text)throw new i(\"End of input in macro argument\",a)}n.pop(),n.reverse(),e[r]=n}else{if(\"EOF\"===a.text)throw new i(\"End of input expecting macro argument\");e[r]=[a]}}return e},e.expandOnce=function(){var t=this.popToken(),e=t.text,r=this._getExpansion(e);if(null==r)return this.pushToken(t),t;if(this.expansionCount++,this.expansionCount>this.settings.maxExpand)throw new i(\"Too many expansions: infinite loop or need to increase maxExpand setting\");var a=r.tokens;if(r.numArgs)for(var n=this.consumeArgs(r.numArgs),o=(a=a.slice()).length-1;o>=0;--o){var s=a[o];if(\"#\"===s.text){if(0===o)throw new i(\"Incomplete placeholder at end of macro body\",s);if(\"#\"===(s=a[--o]).text)a.splice(o+1,1);else{if(!/^[1-9]$/.test(s.text))throw new i(\"Not a valid argument number\",s);var h;(h=a).splice.apply(h,[o,2].concat(n[+s.text-1]))}}}return this.pushTokens(a),a},e.expandAfterFuture=function(){return this.expandOnce(),this.future()},e.expandNextToken=function(){for(;;){var t=this.expandOnce();if(t instanceof n){if(\"\\\\relax\"!==t.text)return this.stack.pop();this.stack.pop()}}throw new Error},e.expandMacro=function(t){if(this.macros.get(t)){var e=[],r=this.stack.length;for(this.pushToken(new n(t));this.stack.length>r;){this.expandOnce()instanceof n&&e.push(this.stack.pop())}return e}},e.expandMacroAsText=function(t){var e=this.expandMacro(t);return e?e.map(function(t){return t.text}).join(\"\"):e},e._getExpansion=function(t){var e=this.macros.get(t);if(null==e)return e;var r=\"function\"==typeof e?e(this):e;if(\"string\"==typeof r){var a=0;if(-1!==r.indexOf(\"#\"))for(var n=r.replace(/##/g,\"\");-1!==n.indexOf(\"#\"+(a+1));)++a;for(var o=new ea(r,this.settings),i=[],s=o.lex();\"EOF\"!==s.text;)i.push(s),s=o.lex();return i.reverse(),{tokens:i,numArgs:a}}return r},e.isDefined=function(t){return this.macros.has(t)||Kr.hasOwnProperty(t)||_.math.hasOwnProperty(t)||_.text.hasOwnProperty(t)||ua.hasOwnProperty(t)},t}(),pa={\"\\u0301\":{text:\"\\\\'\",math:\"\\\\acute\"},\"\\u0300\":{text:\"\\\\`\",math:\"\\\\grave\"},\"\\u0308\":{text:'\\\\\"',math:\"\\\\ddot\"},\"\\u0303\":{text:\"\\\\~\",math:\"\\\\tilde\"},\"\\u0304\":{text:\"\\\\=\",math:\"\\\\bar\"},\"\\u0306\":{text:\"\\\\u\",math:\"\\\\breve\"},\"\\u030c\":{text:\"\\\\v\",math:\"\\\\check\"},\"\\u0302\":{text:\"\\\\^\",math:\"\\\\hat\"},\"\\u0307\":{text:\"\\\\.\",math:\"\\\\dot\"},\"\\u030a\":{text:\"\\\\r\",math:\"\\\\mathring\"},\"\\u030b\":{text:\"\\\\H\"}},fa={\"\\xe1\":\"a\\u0301\",\"\\xe0\":\"a\\u0300\",\"\\xe4\":\"a\\u0308\",\"\\u01df\":\"a\\u0308\\u0304\",\"\\xe3\":\"a\\u0303\",\"\\u0101\":\"a\\u0304\",\"\\u0103\":\"a\\u0306\",\"\\u1eaf\":\"a\\u0306\\u0301\",\"\\u1eb1\":\"a\\u0306\\u0300\",\"\\u1eb5\":\"a\\u0306\\u0303\",\"\\u01ce\":\"a\\u030c\",\"\\xe2\":\"a\\u0302\",\"\\u1ea5\":\"a\\u0302\\u0301\",\"\\u1ea7\":\"a\\u0302\\u0300\",\"\\u1eab\":\"a\\u0302\\u0303\",\"\\u0227\":\"a\\u0307\",\"\\u01e1\":\"a\\u0307\\u0304\",\"\\xe5\":\"a\\u030a\",\"\\u01fb\":\"a\\u030a\\u0301\",\"\\u1e03\":\"b\\u0307\",\"\\u0107\":\"c\\u0301\",\"\\u010d\":\"c\\u030c\",\"\\u0109\":\"c\\u0302\",\"\\u010b\":\"c\\u0307\",\"\\u010f\":\"d\\u030c\",\"\\u1e0b\":\"d\\u0307\",\"\\xe9\":\"e\\u0301\",\"\\xe8\":\"e\\u0300\",\"\\xeb\":\"e\\u0308\",\"\\u1ebd\":\"e\\u0303\",\"\\u0113\":\"e\\u0304\",\"\\u1e17\":\"e\\u0304\\u0301\",\"\\u1e15\":\"e\\u0304\\u0300\",\"\\u0115\":\"e\\u0306\",\"\\u011b\":\"e\\u030c\",\"\\xea\":\"e\\u0302\",\"\\u1ebf\":\"e\\u0302\\u0301\",\"\\u1ec1\":\"e\\u0302\\u0300\",\"\\u1ec5\":\"e\\u0302\\u0303\",\"\\u0117\":\"e\\u0307\",\"\\u1e1f\":\"f\\u0307\",\"\\u01f5\":\"g\\u0301\",\"\\u1e21\":\"g\\u0304\",\"\\u011f\":\"g\\u0306\",\"\\u01e7\":\"g\\u030c\",\"\\u011d\":\"g\\u0302\",\"\\u0121\":\"g\\u0307\",\"\\u1e27\":\"h\\u0308\",\"\\u021f\":\"h\\u030c\",\"\\u0125\":\"h\\u0302\",\"\\u1e23\":\"h\\u0307\",\"\\xed\":\"i\\u0301\",\"\\xec\":\"i\\u0300\",\"\\xef\":\"i\\u0308\",\"\\u1e2f\":\"i\\u0308\\u0301\",\"\\u0129\":\"i\\u0303\",\"\\u012b\":\"i\\u0304\",\"\\u012d\":\"i\\u0306\",\"\\u01d0\":\"i\\u030c\",\"\\xee\":\"i\\u0302\",\"\\u01f0\":\"j\\u030c\",\"\\u0135\":\"j\\u0302\",\"\\u1e31\":\"k\\u0301\",\"\\u01e9\":\"k\\u030c\",\"\\u013a\":\"l\\u0301\",\"\\u013e\":\"l\\u030c\",\"\\u1e3f\":\"m\\u0301\",\"\\u1e41\":\"m\\u0307\",\"\\u0144\":\"n\\u0301\",\"\\u01f9\":\"n\\u0300\",\"\\xf1\":\"n\\u0303\",\"\\u0148\":\"n\\u030c\",\"\\u1e45\":\"n\\u0307\",\"\\xf3\":\"o\\u0301\",\"\\xf2\":\"o\\u0300\",\"\\xf6\":\"o\\u0308\",\"\\u022b\":\"o\\u0308\\u0304\",\"\\xf5\":\"o\\u0303\",\"\\u1e4d\":\"o\\u0303\\u0301\",\"\\u1e4f\":\"o\\u0303\\u0308\",\"\\u022d\":\"o\\u0303\\u0304\",\"\\u014d\":\"o\\u0304\",\"\\u1e53\":\"o\\u0304\\u0301\",\"\\u1e51\":\"o\\u0304\\u0300\",\"\\u014f\":\"o\\u0306\",\"\\u01d2\":\"o\\u030c\",\"\\xf4\":\"o\\u0302\",\"\\u1ed1\":\"o\\u0302\\u0301\",\"\\u1ed3\":\"o\\u0302\\u0300\",\"\\u1ed7\":\"o\\u0302\\u0303\",\"\\u022f\":\"o\\u0307\",\"\\u0231\":\"o\\u0307\\u0304\",\"\\u0151\":\"o\\u030b\",\"\\u1e55\":\"p\\u0301\",\"\\u1e57\":\"p\\u0307\",\"\\u0155\":\"r\\u0301\",\"\\u0159\":\"r\\u030c\",\"\\u1e59\":\"r\\u0307\",\"\\u015b\":\"s\\u0301\",\"\\u1e65\":\"s\\u0301\\u0307\",\"\\u0161\":\"s\\u030c\",\"\\u1e67\":\"s\\u030c\\u0307\",\"\\u015d\":\"s\\u0302\",\"\\u1e61\":\"s\\u0307\",\"\\u1e97\":\"t\\u0308\",\"\\u0165\":\"t\\u030c\",\"\\u1e6b\":\"t\\u0307\",\"\\xfa\":\"u\\u0301\",\"\\xf9\":\"u\\u0300\",\"\\xfc\":\"u\\u0308\",\"\\u01d8\":\"u\\u0308\\u0301\",\"\\u01dc\":\"u\\u0308\\u0300\",\"\\u01d6\":\"u\\u0308\\u0304\",\"\\u01da\":\"u\\u0308\\u030c\",\"\\u0169\":\"u\\u0303\",\"\\u1e79\":\"u\\u0303\\u0301\",\"\\u016b\":\"u\\u0304\",\"\\u1e7b\":\"u\\u0304\\u0308\",\"\\u016d\":\"u\\u0306\",\"\\u01d4\":\"u\\u030c\",\"\\xfb\":\"u\\u0302\",\"\\u016f\":\"u\\u030a\",\"\\u0171\":\"u\\u030b\",\"\\u1e7d\":\"v\\u0303\",\"\\u1e83\":\"w\\u0301\",\"\\u1e81\":\"w\\u0300\",\"\\u1e85\":\"w\\u0308\",\"\\u0175\":\"w\\u0302\",\"\\u1e87\":\"w\\u0307\",\"\\u1e98\":\"w\\u030a\",\"\\u1e8d\":\"x\\u0308\",\"\\u1e8b\":\"x\\u0307\",\"\\xfd\":\"y\\u0301\",\"\\u1ef3\":\"y\\u0300\",\"\\xff\":\"y\\u0308\",\"\\u1ef9\":\"y\\u0303\",\"\\u0233\":\"y\\u0304\",\"\\u0177\":\"y\\u0302\",\"\\u1e8f\":\"y\\u0307\",\"\\u1e99\":\"y\\u030a\",\"\\u017a\":\"z\\u0301\",\"\\u017e\":\"z\\u030c\",\"\\u1e91\":\"z\\u0302\",\"\\u017c\":\"z\\u0307\",\"\\xc1\":\"A\\u0301\",\"\\xc0\":\"A\\u0300\",\"\\xc4\":\"A\\u0308\",\"\\u01de\":\"A\\u0308\\u0304\",\"\\xc3\":\"A\\u0303\",\"\\u0100\":\"A\\u0304\",\"\\u0102\":\"A\\u0306\",\"\\u1eae\":\"A\\u0306\\u0301\",\"\\u1eb0\":\"A\\u0306\\u0300\",\"\\u1eb4\":\"A\\u0306\\u0303\",\"\\u01cd\":\"A\\u030c\",\"\\xc2\":\"A\\u0302\",\"\\u1ea4\":\"A\\u0302\\u0301\",\"\\u1ea6\":\"A\\u0302\\u0300\",\"\\u1eaa\":\"A\\u0302\\u0303\",\"\\u0226\":\"A\\u0307\",\"\\u01e0\":\"A\\u0307\\u0304\",\"\\xc5\":\"A\\u030a\",\"\\u01fa\":\"A\\u030a\\u0301\",\"\\u1e02\":\"B\\u0307\",\"\\u0106\":\"C\\u0301\",\"\\u010c\":\"C\\u030c\",\"\\u0108\":\"C\\u0302\",\"\\u010a\":\"C\\u0307\",\"\\u010e\":\"D\\u030c\",\"\\u1e0a\":\"D\\u0307\",\"\\xc9\":\"E\\u0301\",\"\\xc8\":\"E\\u0300\",\"\\xcb\":\"E\\u0308\",\"\\u1ebc\":\"E\\u0303\",\"\\u0112\":\"E\\u0304\",\"\\u1e16\":\"E\\u0304\\u0301\",\"\\u1e14\":\"E\\u0304\\u0300\",\"\\u0114\":\"E\\u0306\",\"\\u011a\":\"E\\u030c\",\"\\xca\":\"E\\u0302\",\"\\u1ebe\":\"E\\u0302\\u0301\",\"\\u1ec0\":\"E\\u0302\\u0300\",\"\\u1ec4\":\"E\\u0302\\u0303\",\"\\u0116\":\"E\\u0307\",\"\\u1e1e\":\"F\\u0307\",\"\\u01f4\":\"G\\u0301\",\"\\u1e20\":\"G\\u0304\",\"\\u011e\":\"G\\u0306\",\"\\u01e6\":\"G\\u030c\",\"\\u011c\":\"G\\u0302\",\"\\u0120\":\"G\\u0307\",\"\\u1e26\":\"H\\u0308\",\"\\u021e\":\"H\\u030c\",\"\\u0124\":\"H\\u0302\",\"\\u1e22\":\"H\\u0307\",\"\\xcd\":\"I\\u0301\",\"\\xcc\":\"I\\u0300\",\"\\xcf\":\"I\\u0308\",\"\\u1e2e\":\"I\\u0308\\u0301\",\"\\u0128\":\"I\\u0303\",\"\\u012a\":\"I\\u0304\",\"\\u012c\":\"I\\u0306\",\"\\u01cf\":\"I\\u030c\",\"\\xce\":\"I\\u0302\",\"\\u0130\":\"I\\u0307\",\"\\u0134\":\"J\\u0302\",\"\\u1e30\":\"K\\u0301\",\"\\u01e8\":\"K\\u030c\",\"\\u0139\":\"L\\u0301\",\"\\u013d\":\"L\\u030c\",\"\\u1e3e\":\"M\\u0301\",\"\\u1e40\":\"M\\u0307\",\"\\u0143\":\"N\\u0301\",\"\\u01f8\":\"N\\u0300\",\"\\xd1\":\"N\\u0303\",\"\\u0147\":\"N\\u030c\",\"\\u1e44\":\"N\\u0307\",\"\\xd3\":\"O\\u0301\",\"\\xd2\":\"O\\u0300\",\"\\xd6\":\"O\\u0308\",\"\\u022a\":\"O\\u0308\\u0304\",\"\\xd5\":\"O\\u0303\",\"\\u1e4c\":\"O\\u0303\\u0301\",\"\\u1e4e\":\"O\\u0303\\u0308\",\"\\u022c\":\"O\\u0303\\u0304\",\"\\u014c\":\"O\\u0304\",\"\\u1e52\":\"O\\u0304\\u0301\",\"\\u1e50\":\"O\\u0304\\u0300\",\"\\u014e\":\"O\\u0306\",\"\\u01d1\":\"O\\u030c\",\"\\xd4\":\"O\\u0302\",\"\\u1ed0\":\"O\\u0302\\u0301\",\"\\u1ed2\":\"O\\u0302\\u0300\",\"\\u1ed6\":\"O\\u0302\\u0303\",\"\\u022e\":\"O\\u0307\",\"\\u0230\":\"O\\u0307\\u0304\",\"\\u0150\":\"O\\u030b\",\"\\u1e54\":\"P\\u0301\",\"\\u1e56\":\"P\\u0307\",\"\\u0154\":\"R\\u0301\",\"\\u0158\":\"R\\u030c\",\"\\u1e58\":\"R\\u0307\",\"\\u015a\":\"S\\u0301\",\"\\u1e64\":\"S\\u0301\\u0307\",\"\\u0160\":\"S\\u030c\",\"\\u1e66\":\"S\\u030c\\u0307\",\"\\u015c\":\"S\\u0302\",\"\\u1e60\":\"S\\u0307\",\"\\u0164\":\"T\\u030c\",\"\\u1e6a\":\"T\\u0307\",\"\\xda\":\"U\\u0301\",\"\\xd9\":\"U\\u0300\",\"\\xdc\":\"U\\u0308\",\"\\u01d7\":\"U\\u0308\\u0301\",\"\\u01db\":\"U\\u0308\\u0300\",\"\\u01d5\":\"U\\u0308\\u0304\",\"\\u01d9\":\"U\\u0308\\u030c\",\"\\u0168\":\"U\\u0303\",\"\\u1e78\":\"U\\u0303\\u0301\",\"\\u016a\":\"U\\u0304\",\"\\u1e7a\":\"U\\u0304\\u0308\",\"\\u016c\":\"U\\u0306\",\"\\u01d3\":\"U\\u030c\",\"\\xdb\":\"U\\u0302\",\"\\u016e\":\"U\\u030a\",\"\\u0170\":\"U\\u030b\",\"\\u1e7c\":\"V\\u0303\",\"\\u1e82\":\"W\\u0301\",\"\\u1e80\":\"W\\u0300\",\"\\u1e84\":\"W\\u0308\",\"\\u0174\":\"W\\u0302\",\"\\u1e86\":\"W\\u0307\",\"\\u1e8c\":\"X\\u0308\",\"\\u1e8a\":\"X\\u0307\",\"\\xdd\":\"Y\\u0301\",\"\\u1ef2\":\"Y\\u0300\",\"\\u0178\":\"Y\\u0308\",\"\\u1ef8\":\"Y\\u0303\",\"\\u0232\":\"Y\\u0304\",\"\\u0176\":\"Y\\u0302\",\"\\u1e8e\":\"Y\\u0307\",\"\\u0179\":\"Z\\u0301\",\"\\u017d\":\"Z\\u030c\",\"\\u1e90\":\"Z\\u0302\",\"\\u017b\":\"Z\\u0307\",\"\\u03ac\":\"\\u03b1\\u0301\",\"\\u1f70\":\"\\u03b1\\u0300\",\"\\u1fb1\":\"\\u03b1\\u0304\",\"\\u1fb0\":\"\\u03b1\\u0306\",\"\\u03ad\":\"\\u03b5\\u0301\",\"\\u1f72\":\"\\u03b5\\u0300\",\"\\u03ae\":\"\\u03b7\\u0301\",\"\\u1f74\":\"\\u03b7\\u0300\",\"\\u03af\":\"\\u03b9\\u0301\",\"\\u1f76\":\"\\u03b9\\u0300\",\"\\u03ca\":\"\\u03b9\\u0308\",\"\\u0390\":\"\\u03b9\\u0308\\u0301\",\"\\u1fd2\":\"\\u03b9\\u0308\\u0300\",\"\\u1fd1\":\"\\u03b9\\u0304\",\"\\u1fd0\":\"\\u03b9\\u0306\",\"\\u03cc\":\"\\u03bf\\u0301\",\"\\u1f78\":\"\\u03bf\\u0300\",\"\\u03cd\":\"\\u03c5\\u0301\",\"\\u1f7a\":\"\\u03c5\\u0300\",\"\\u03cb\":\"\\u03c5\\u0308\",\"\\u03b0\":\"\\u03c5\\u0308\\u0301\",\"\\u1fe2\":\"\\u03c5\\u0308\\u0300\",\"\\u1fe1\":\"\\u03c5\\u0304\",\"\\u1fe0\":\"\\u03c5\\u0306\",\"\\u03ce\":\"\\u03c9\\u0301\",\"\\u1f7c\":\"\\u03c9\\u0300\",\"\\u038e\":\"\\u03a5\\u0301\",\"\\u1fea\":\"\\u03a5\\u0300\",\"\\u03ab\":\"\\u03a5\\u0308\",\"\\u1fe9\":\"\\u03a5\\u0304\",\"\\u1fe8\":\"\\u03a5\\u0306\",\"\\u038f\":\"\\u03a9\\u0301\",\"\\u1ffa\":\"\\u03a9\\u0300\"},ga=function(){function t(t,e){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode=\"math\",this.gullet=new da(t,e,this.mode),this.settings=e,this.leftrightDepth=0}var e=t.prototype;return e.expect=function(t,e){if(void 0===e&&(e=!0),this.nextToken.text!==t)throw new i(\"Expected '\"+t+\"', got '\"+this.nextToken.text+\"'\",this.nextToken);e&&this.consume()},e.consume=function(){this.nextToken=this.gullet.expandNextToken()},e.switchMode=function(t){this.mode=t,this.gullet.switchMode(t)},e.parse=function(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set(\"\\\\color\",\"\\\\textcolor\"),this.consume();var t=this.parseExpression(!1);return this.expect(\"EOF\",!1),this.gullet.endGroup(),t},e.parseExpression=function(e,r){for(var a=[];;){\"math\"===this.mode&&this.consumeSpaces();var n=this.nextToken;if(-1!==t.endOfExpression.indexOf(n.text))break;if(r&&n.text===r)break;if(e&&Kr[n.text]&&Kr[n.text].infix)break;var o=this.parseAtom(r);if(!o)break;a.push(o)}return\"text\"===this.mode&&this.formLigatures(a),this.handleInfixNodes(a)},e.handleInfixNodes=function(t){for(var e,r=-1,a=0;a<t.length;a++){var n=Pt(t[a],\"infix\");if(n){if(-1!==r)throw new i(\"only one infix operator per group\",n.token);r=a,e=n.replaceWith}}if(-1!==r&&e){var o,s,h=t.slice(0,r),l=t.slice(r+1);return o=1===h.length&&\"ordgroup\"===h[0].type?h[0]:{type:\"ordgroup\",mode:this.mode,body:h},s=1===l.length&&\"ordgroup\"===l[0].type?l[0]:{type:\"ordgroup\",mode:this.mode,body:l},[\"\\\\\\\\abovefrac\"===e?this.callFunction(e,[o,t[r],s],[]):this.callFunction(e,[o,s],[])]}return t},e.handleSupSubscript=function(e){var r=this.nextToken,a=r.text;this.consume(),this.consumeSpaces();var n=this.parseGroup(e,!1,t.SUPSUB_GREEDINESS);if(!n)throw new i(\"Expected group after '\"+a+\"'\",r);return n},e.handleUnsupportedCmd=function(){for(var t=this.nextToken.text,e=[],r=0;r<t.length;r++)e.push({type:\"textord\",mode:\"text\",text:t[r]});var a={type:\"text\",mode:this.mode,body:e},n={type:\"color\",mode:this.mode,color:this.settings.errorColor,body:[a]};return this.consume(),n},e.parseAtom=function(t){var e,r,a=this.parseGroup(\"atom\",!1,null,t);if(\"text\"===this.mode)return a;for(;;){this.consumeSpaces();var n=this.nextToken;if(\"\\\\limits\"===n.text||\"\\\\nolimits\"===n.text){var o=Pt(a,\"op\");if(!o)throw new i(\"Limit controls must follow a math operator\",n);var s=\"\\\\limits\"===n.text;o.limits=s,o.alwaysHandleSupSub=!0,this.consume()}else if(\"^\"===n.text){if(e)throw new i(\"Double superscript\",n);e=this.handleSupSubscript(\"superscript\")}else if(\"_\"===n.text){if(r)throw new i(\"Double subscript\",n);r=this.handleSupSubscript(\"subscript\")}else{if(\"'\"!==n.text)break;if(e)throw new i(\"Double superscript\",n);var h={type:\"textord\",mode:this.mode,text:\"\\\\prime\"},l=[h];for(this.consume();\"'\"===this.nextToken.text;)l.push(h),this.consume();\"^\"===this.nextToken.text&&l.push(this.handleSupSubscript(\"superscript\")),e={type:\"ordgroup\",mode:this.mode,body:l}}}return e||r?{type:\"supsub\",mode:this.mode,base:a,sup:e,sub:r}:a},e.parseFunction=function(t,e,r){var a=this.nextToken,n=a.text,o=Kr[n];if(!o)return null;if(null!=r&&o.greediness<=r)throw new i(\"Got function '\"+n+\"' with no arguments\"+(e?\" as \"+e:\"\"),a);if(\"text\"===this.mode&&!o.allowedInText)throw new i(\"Can't use function '\"+n+\"' in text mode\",a);if(\"math\"===this.mode&&!1===o.allowedInMath)throw new i(\"Can't use function '\"+n+\"' in math mode\",a);if(o.argTypes&&\"url\"===o.argTypes[0]&&this.gullet.lexer.setCatcode(\"%\",13),o.consumeMode){var s=this.mode;this.switchMode(o.consumeMode),this.consume(),this.switchMode(s)}else this.consume();var h=this.parseArguments(n,o),l=h.args,m=h.optArgs;return this.callFunction(n,l,m,a,t)},e.callFunction=function(t,e,r,a,n){var o={funcName:t,parser:this,token:a,breakOnTokenText:n},s=Kr[t];if(s&&s.handler)return s.handler(o,e,r);throw new i(\"No function handler for \"+t)},e.parseArguments=function(t,e){var r=e.numArgs+e.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=e.greediness,n=[],o=[],s=0;s<r;s++){var h=e.argTypes&&e.argTypes[s],l=s<e.numOptionalArgs;s>0&&!l&&this.consumeSpaces(),0!==s||l||\"math\"!==this.mode||this.consumeSpaces();var m=this.nextToken,c=this.parseGroupOfType(\"argument to '\"+t+\"'\",h,l,a);if(!c){if(l){o.push(null);continue}throw new i(\"Expected group after '\"+t+\"'\",m)}(l?o:n).push(c)}return{args:n,optArgs:o}},e.parseGroupOfType=function(t,e,r,a){switch(e){case\"color\":return this.parseColorGroup(r);case\"size\":return this.parseSizeGroup(r);case\"url\":return this.parseUrlGroup(r);case\"math\":case\"text\":return this.parseGroup(t,r,a,void 0,e);case\"raw\":if(r&&\"{\"===this.nextToken.text)return null;var n=this.parseStringGroup(\"raw\",r,!0);if(n)return{type:\"raw\",mode:\"text\",string:n.text};throw new i(\"Expected raw group\",this.nextToken);case\"original\":case null:case void 0:return this.parseGroup(t,r,a);default:throw new i(\"Unknown group type as \"+t,this.nextToken)}},e.consumeSpaces=function(){for(;\" \"===this.nextToken.text;)this.consume()},e.parseStringGroup=function(t,e,r){var a=e?\"[\":\"{\",n=e?\"]\":\"}\",o=this.nextToken;if(o.text!==a){if(e)return null;if(r&&\"EOF\"!==o.text&&/[^{}[\\]]/.test(o.text))return this.gullet.lexer.setCatcode(\"%\",14),this.consume(),o}var s=this.mode;this.mode=\"text\",this.expect(a);for(var h=\"\",l=this.nextToken,m=0,c=l;r&&m>0||this.nextToken.text!==n;){switch(this.nextToken.text){case\"EOF\":throw new i(\"Unexpected end of input in \"+t,l.range(c,h));case a:m++;break;case n:m--}h+=(c=this.nextToken).text,this.consume()}return this.mode=s,this.gullet.lexer.setCatcode(\"%\",14),this.expect(n),l.range(c,h)},e.parseRegexGroup=function(t,e){var r=this.mode;this.mode=\"text\";for(var a=this.nextToken,n=a,o=\"\";\"EOF\"!==this.nextToken.text&&t.test(o+this.nextToken.text);)o+=(n=this.nextToken).text,this.consume();if(\"\"===o)throw new i(\"Invalid \"+e+\": '\"+a.text+\"'\",a);return this.mode=r,a.range(n,o)},e.parseColorGroup=function(t){var e=this.parseStringGroup(\"color\",t);if(!e)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(e.text);if(!r)throw new i(\"Invalid color: '\"+e.text+\"'\",e);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a=\"#\"+a),{type:\"color-token\",mode:this.mode,color:a}},e.parseSizeGroup=function(t){var e,r=!1;if(!(e=t||\"{\"===this.nextToken.text?this.parseStringGroup(\"size\",t):this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/,\"size\")))return null;t||0!==e.text.length||(e.text=\"0pt\",r=!0);var a=/([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(e.text);if(!a)throw new i(\"Invalid size: '\"+e.text+\"'\",e);var n,o={number:+(a[1]+a[2]),unit:a[3]};if(\"string\"!=typeof(n=o)&&(n=n.unit),!(n in kt||n in St||\"ex\"===n))throw new i(\"Invalid unit: '\"+o.unit+\"'\",e);return{type:\"size\",mode:this.mode,value:o,isBlank:r}},e.parseUrlGroup=function(t){var e=this.parseStringGroup(\"url\",t,!0);if(!e)return null;var r=e.text.replace(/\\\\([#$%&~_^{}])/g,\"$1\"),a=/^\\s*([^\\\\\\/#]*?)(?::|&#0*58|&#x0*3a)/i.exec(r);a=null!=a?a[1]:\"_relative\";var n=this.settings.allowedProtocols;if(!c.contains(n,\"*\")&&!c.contains(n,a))throw new i(\"Forbidden protocol '\"+a+\"'\",e);return{type:\"url\",mode:this.mode,url:r}},e.parseGroup=function(e,r,n,o,s){var h,l,m=this.mode,c=this.nextToken,u=c.text;if(s&&this.switchMode(s),r?\"[\"===u:\"{\"===u||\"\\\\begingroup\"===u){h=t.endOfGroup[u],this.gullet.beginGroup(),this.consume();var d=this.parseExpression(!1,h),p=this.nextToken;this.gullet.endGroup(),l={type:\"ordgroup\",mode:this.mode,loc:a.range(c,p),body:d,semisimple:\"\\\\begingroup\"===u||void 0}}else if(r)l=null;else if(null==(l=this.parseFunction(o,e,n)||this.parseSymbol())&&\"\\\\\"===u[0]&&!ua.hasOwnProperty(u)){if(this.settings.throwOnError)throw new i(\"Undefined control sequence: \"+u,c);l=this.handleUnsupportedCmd()}return s&&this.switchMode(m),h&&this.expect(h),l},e.formLigatures=function(t){for(var e=t.length-1,r=0;r<e;++r){var n=t[r],o=n.text;\"-\"===o&&\"-\"===t[r+1].text&&(r+1<e&&\"-\"===t[r+2].text?(t.splice(r,3,{type:\"textord\",mode:\"text\",loc:a.range(n,t[r+2]),text:\"---\"}),e-=2):(t.splice(r,2,{type:\"textord\",mode:\"text\",loc:a.range(n,t[r+1]),text:\"--\"}),e-=1)),\"'\"!==o&&\"`\"!==o||t[r+1].text!==o||(t.splice(r,2,{type:\"textord\",mode:\"text\",loc:a.range(n,t[r+1]),text:o+o}),e-=1)}},e.parseSymbol=function(){var t=this.nextToken,e=t.text;if(/^\\\\verb[^a-zA-Z]/.test(e)){this.consume();var r=e.slice(5),n=\"*\"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new i(\"\\\\verb assertion failed --\\n                    please report what input caused this bug\");return{type:\"verb\",mode:\"text\",body:r=r.slice(1,-1),star:n}}fa.hasOwnProperty(e[0])&&!_[this.mode][e[0]]&&(this.settings.strict&&\"math\"===this.mode&&this.settings.reportNonstrict(\"unicodeTextInMathMode\",'Accented Unicode text character \"'+e[0]+'\" used in math mode',t),e=fa[e[0]]+e.substr(1));var o,s=Qr.exec(e);if(s&&(\"i\"===(e=e.substring(0,s.index))?e=\"\\u0131\":\"j\"===e&&(e=\"\\u0237\")),_[this.mode][e]){this.settings.strict&&\"math\"===this.mode&&\"\\xc7\\xd0\\xde\\xe7\\xfe\".indexOf(e)>=0&&this.settings.reportNonstrict(\"unicodeTextInMathMode\",'Latin-1/Unicode text character \"'+e[0]+'\" used in math mode',t);var h,l=_[this.mode][e].group,m=a.range(t);if(G.hasOwnProperty(l)){var c=l;h={type:\"atom\",mode:this.mode,family:c,loc:m,text:e}}else h={type:l,mode:this.mode,loc:m,text:e};o=h}else{if(!(e.charCodeAt(0)>=128))return null;this.settings.strict&&(z(e.charCodeAt(0))?\"math\"===this.mode&&this.settings.reportNonstrict(\"unicodeTextInMathMode\",'Unicode text character \"'+e[0]+'\" used in math mode',t):this.settings.reportNonstrict(\"unknownSymbol\",'Unrecognized Unicode character \"'+e[0]+'\" ('+e.charCodeAt(0)+\")\",t)),o={type:\"textord\",mode:this.mode,loc:a.range(t),text:e}}if(this.consume(),s)for(var u=0;u<s[0].length;u++){var d=s[0][u];if(!pa[d])throw new i(\"Unknown accent ' \"+d+\"'\",t);var p=pa[d][this.mode];if(!p)throw new i(\"Accent \"+d+\" unsupported in \"+this.mode+\" mode\",t);o={type:\"accent\",mode:this.mode,loc:a.range(t),label:p,isStretchy:!1,isShifty:!0,base:o}}return o},t}();ga.endOfExpression=[\"}\",\"\\\\endgroup\",\"\\\\end\",\"\\\\right\",\"&\"],ga.endOfGroup={\"[\":\"]\",\"{\":\"}\",\"\\\\begingroup\":\"\\\\endgroup\"},ga.SUPSUB_GREEDINESS=1;var xa=function(t,e){if(!(\"string\"==typeof t||t instanceof String))throw new TypeError(\"KaTeX can only parse string typed expression\");var r=new ga(t,e);delete r.gullet.macros.current[\"\\\\df@tag\"];var a=r.parse();if(r.gullet.macros.get(\"\\\\df@tag\")){if(!e.displayMode)throw new i(\"\\\\tag works only in display equations\");r.gullet.feed(\"\\\\df@tag\"),a=[{type:\"tag\",mode:\"text\",body:a,tag:r.parse()}]}return a},va=function(t,e,r){e.textContent=\"\";var a=ya(t,r).toNode();e.appendChild(a)};\"undefined\"!=typeof document&&\"CSS1Compat\"!==document.compatMode&&(\"undefined\"!=typeof console&&console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype.\"),va=function(){throw new i(\"KaTeX doesn't work in quirks mode.\")});var ba=function(t,e,r){if(r.throwOnError||!(t instanceof i))throw t;var a=Lt.makeSpan([\"katex-error\"],[new E(e)]);return a.setAttribute(\"title\",t.toString()),a.setAttribute(\"style\",\"color:\"+r.errorColor),a},ya=function(t,e){var r=new u(e);try{var a=xa(t,r);return Se(a,t,r)}catch(e){return ba(e,t,r)}},wa={version:\"0.10.2\",render:va,renderToString:function(t,e){return ya(t,e).toMarkup()},ParseError:i,__parse:function(t,e){var r=new u(e);return xa(t,r)},__renderToDomTree:ya,__renderToHTMLTree:function(t,e){var r=new u(e);try{return function(t,e,r){var a=me(t,we(r)),n=Lt.makeSpan([\"katex\"],[a]);return ke(n,r)}(xa(t,r),0,r)}catch(e){return ba(e,t,r)}},__setFontMetrics:function(t,e){P[t]=e},__defineSymbol:W,__defineMacro:oa,__domTree:{Span:N,Anchor:I,SymbolNode:E,SvgNode:R,PathNode:L,LineNode:H}};e.default=wa}]).default});\n\n})(!$tw.browser ? $tw.fakeDocument : window.document)\n",
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/katex/katex.min.js",
            "module-type": "library"
        },
        "$:/plugins/tiddlywiki/katex/mhchem.min.js": {
            "text": "/* eslint-disable */\n/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */\n/* vim: set ts=2 et sw=2 tw=80: */\n\n/*************************************************************\n *\n *  KaTeX mhchem.js\n *\n *  This file implements a KaTeX version of mhchem version 3.3.0.\n *  It is adapted from MathJax/extensions/TeX/mhchem.js\n *  It differs from the MathJax version as follows:\n *    1. The interface is changed so that it can be called from KaTeX, not MathJax.\n *    2. \\rlap and \\llap are replaced with \\mathrlap and \\mathllap.\n *    3. Four lines of code are edited in order to use \\raisebox instead of \\raise.\n *    4. The reaction arrow code is simplified. All reaction arrows are rendered\n *       using KaTeX extensible arrows instead of building non-extensible arrows.\n *    5. \\tripledash vertical alignment is slightly adjusted.\n *\n *    This code, as other KaTeX code, is released under the MIT license.\n * \n * /*************************************************************\n *\n *  MathJax/extensions/TeX/mhchem.js\n *\n *  Implements the \\ce command for handling chemical formulas\n *  from the mhchem LaTeX package.\n *\n *  ---------------------------------------------------------------------\n *\n *  Copyright (c) 2011-2015 The MathJax Consortium\n *  Copyright (c) 2015-2018 Martin Hensel\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\n\n//\n// Coding Style\n//   - use '' for identifiers that can by minified/uglified\n//   - use \"\" for strings that need to stay untouched\n\n// version: \"3.3.0\" for MathJax and KaTeX\n\n/****************************************\n*****************************************\n* TiddlyWiki: moved the katex-module definitions to wrapper.js\n*****************************************\n*****************************************/\n\n  //\n  //  This is the main function for handing the \\ce and \\pu commands.\n  //  It takes the argument to \\ce or \\pu and returns the corresponding TeX string.\n  //\n\n  // TiddlyWiki: replaced `var chemParse =` with `module.exports =` ... no more modifications in this file\n  module.exports = function (tokens, stateMachine) {\n    // Recreate the argument string from KaTeX's array of tokens.\n    var str = \"\";\n    var expectedLoc = tokens[tokens.length - 1].loc.start\n    for (var i = tokens.length - 1; i >= 0; i--) {\n      if(tokens[i].loc.start > expectedLoc) {\n        // context.consumeArgs has eaten a space.\n        str += \" \";\n        expectedLoc = tokens[i].loc.start;\n      }\n      str += tokens[i].text;\n      expectedLoc += tokens[i].text.length;\n    }\n    var tex = texify.go(mhchemParser.go(str, stateMachine));\n    return tex;\n  };\n\n  //\n  // Core parser for mhchem syntax  (recursive)\n  //\n  /** @type {MhchemParser} */\n  var mhchemParser = {\n    //\n    // Parses mchem \\ce syntax\n    //\n    // Call like\n    //   go(\"H2O\");\n    //\n    go: function (input, stateMachine) {\n      if (!input) { return []; }\n      if (stateMachine === undefined) { stateMachine = 'ce'; }\n      var state = '0';\n\n      //\n      // String buffers for parsing:\n      //\n      // buffer.a == amount\n      // buffer.o == element\n      // buffer.b == left-side superscript\n      // buffer.p == left-side subscript\n      // buffer.q == right-side subscript\n      // buffer.d == right-side superscript\n      //\n      // buffer.r == arrow\n      // buffer.rdt == arrow, script above, type\n      // buffer.rd == arrow, script above, content\n      // buffer.rqt == arrow, script below, type\n      // buffer.rq == arrow, script below, content\n      //\n      // buffer.text_\n      // buffer.rm\n      // etc.\n      //\n      // buffer.parenthesisLevel == int, starting at 0\n      // buffer.sb == bool, space before\n      // buffer.beginsWithBond == bool\n      //\n      // These letters are also used as state names.\n      //\n      // Other states:\n      // 0 == begin of main part (arrow/operator unlikely)\n      // 1 == next entity\n      // 2 == next entity (arrow/operator unlikely)\n      // 3 == next atom\n      // c == macro\n      //\n      /** @type {Buffer} */\n      var buffer = {};\n      buffer['parenthesisLevel'] = 0;\n\n      input = input.replace(/\\n/g, \" \");\n      input = input.replace(/[\\u2212\\u2013\\u2014\\u2010]/g, \"-\");\n      input = input.replace(/[\\u2026]/g, \"...\");\n\n      //\n      // Looks through mhchemParser.transitions, to execute a matching action\n      // (recursive)\n      //\n      var lastInput;\n      var watchdog = 10;\n      /** @type {ParserOutput[]} */\n      var output = [];\n      while (true) {\n        if (lastInput !== input) {\n          watchdog = 10;\n          lastInput = input;\n        } else {\n          watchdog--;\n        }\n        //\n        // Find actions in transition table\n        //\n        var machine = mhchemParser.stateMachines[stateMachine];\n        var t = machine.transitions[state] || machine.transitions['*'];\n        iterateTransitions:\n        for (var i=0; i<t.length; i++) {\n          var matches = mhchemParser.patterns.match_(t[i].pattern, input);\n          if (matches) {\n            //\n            // Execute actions\n            //\n            var task = t[i].task;\n            for (var iA=0; iA<task.action_.length; iA++) {\n              var o;\n              //\n              // Find and execute action\n              //\n              if (machine.actions[task.action_[iA].type_]) {\n                o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n              } else if (mhchemParser.actions[task.action_[iA].type_]) {\n                o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n              } else {\n                throw [\"MhchemBugA\", \"mhchem bug A. Please report. (\" + task.action_[iA].type_ + \")\"];  // Trying to use non-existing action\n              }\n              //\n              // Add output\n              //\n              mhchemParser.concatArray(output, o);\n            }\n            //\n            // Set next state,\n            // Shorten input,\n            // Continue with next character\n            //   (= apply only one transition per position)\n            //\n            state = task.nextState || state;\n            if (input.length > 0) {\n              if (!task.revisit) {\n                input = matches.remainder;\n              }\n              if (!task.toContinue) {\n                break iterateTransitions;\n              }\n            } else {\n              return output;\n            }\n          }\n        }\n        //\n        // Prevent infinite loop\n        //\n        if (watchdog <= 0) {\n          throw [\"MhchemBugU\", \"mhchem bug U. Please report.\"];  // Unexpected character\n        }\n      }\n    },\n    concatArray: function (a, b) {\n      if (b) {\n        if (Array.isArray(b)) {\n          for (var iB=0; iB<b.length; iB++) {\n            a.push(b[iB]);\n          }\n        } else {\n          a.push(b);\n        }\n      }\n    },\n\n    patterns: {\n      //\n      // Matching patterns\n      // either regexps or function that return null or {match_:\"a\", remainder:\"bc\"}\n      //\n      patterns: {\n        // property names must not look like integers (\"2\") for correct property traversal order, later on\n        'empty': /^$/,\n        'else': /^./,\n        'else2': /^./,\n        'space': /^\\s/,\n        'space A': /^\\s(?=[A-Z\\\\$])/,\n        'space$': /^\\s$/,\n        'a-z': /^[a-z]/,\n        'x': /^x/,\n        'x$': /^x$/,\n        'i$': /^i$/,\n        'letters': /^(?:[a-zA-Z\\u03B1-\\u03C9\\u0391-\\u03A9?@]|(?:\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))))+/,\n        '\\\\greek': /^\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))/,\n        'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,\n        '$one lowercase latin letter$ $': /^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$/,\n        'one lowercase greek letter $': /^(?:\\$?[\\u03B1-\\u03C9]\\$?|\\$?\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\\s*\\$?)(?:\\s+|\\{\\}|(?![a-zA-Z]))$/,\n        'digits': /^[0-9]+/,\n        '-9.,9': /^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))/,\n        '-9.,9 no missing 0': /^[+\\-]?[0-9]+(?:[.,][0-9]+)?/,\n        '(-)(9.,9)(e)(99)': function (input) {\n          var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))?(\\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))\\))?(?:([eE]|\\s*(\\*|x|\\\\times|\\u00D7)\\s*10\\^)([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\}))?/);\n          if (m && m[0]) {\n            return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        '(-)(9)^(-9)': function (input) {\n          var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+)?)\\^([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\})/);\n          if (m && m[0]) {\n            return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        'state of aggregation $': function (input) {  // ... or crystal system\n          var a = mhchemParser.patterns.findObserveGroups(input, \"\", /^\\([a-z]{1,3}(?=[\\),])/, \")\", \"\");  // (aq), (aq,$\\infty$), (aq, sat)\n          if (a  &&  a.remainder.match(/^($|[\\s,;\\)\\]\\}])/)) { return a; }  //  AND end of 'phrase'\n          var m = input.match(/^(?:\\((?:\\\\ca\\s?)?\\$[amothc]\\$\\))/);  // OR crystal system ($o$) (\\ca$c$)\n          if (m) {\n            return { match_: m[0], remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        '_{(state of aggregation)}$': /^_\\{(\\([a-z]{1,3}\\))\\}/,\n        '{[(': /^(?:\\\\\\{|\\[|\\()/,\n        ')]}': /^(?:\\)|\\]|\\\\\\})/,\n        ', ': /^[,;]\\s*/,\n        ',': /^[,;]/,\n        '.': /^[.]/,\n        '. ': /^([.\\u22C5\\u00B7\\u2022])\\s*/,\n        '...': /^\\.\\.\\.(?=$|[^.])/,\n        '* ': /^([*])\\s*/,\n        '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^{\", \"\", \"\", \"}\"); },\n        '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", \"$\", \"$\", \"\"); },\n        '^a': /^\\^([0-9]+|[^\\\\_])/,\n        '^\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '^\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '^\\\\x': /^\\^(\\\\[a-zA-Z]+)\\s*/,\n        '^(-1)': /^\\^(-?\\d+)/,\n        '\\'': /^'/,\n        '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_{\", \"\", \"\", \"}\"); },\n        '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", \"$\", \"$\", \"\"); },\n        '_9': /^_([+\\-]?[0-9]+|[^\\\\])/,\n        '_\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '_\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '_\\\\x': /^_(\\\\[a-zA-Z]+)\\s*/,\n        '^_': /^(?:\\^(?=_)|\\_(?=\\^)|[\\^_]$)/,\n        '{}': /^\\{\\}/,\n        '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"{\", \"}\", \"\"); },\n        '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"{\", \"\", \"\", \"}\"); },\n        '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\"); },\n        '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"${\", \"\", \"\", \"}$\"); },\n        '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"$\", \"\", \"\", \"$\"); },\n        '=<>': /^[=<>]/,\n        '#': /^[#\\u2261]/,\n        '+': /^\\+/,\n        '-$': /^-(?=[\\s_},;\\]/]|$|\\([a-z]+\\))/,  // -space -, -; -] -/ -$ -state-of-aggregation\n        '-9': /^-(?=[0-9])/,\n        '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\\s,;\\)\\]\\}]))/,\n        '-': /^-/,\n        'pm-operator': /^(?:\\\\pm|\\$\\\\pm\\$|\\+-|\\+\\/-)/,\n        'operator': /^(?:\\+|(?:[\\-=<>]|<<|>>|\\\\approx|\\$\\\\approx\\$)(?=\\s|$|-?[0-9]))/,\n        'arrowUpDown': /^(?:v|\\(v\\)|\\^|\\(\\^\\))(?=$|[\\s,;\\)\\]\\}])/,\n        '\\\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\bond{\", \"\", \"\", \"}\"); },\n        '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\\u2192\\u27F6\\u21CC])/,\n        'CMT': /^[CMT](?=\\[)/,\n        '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"[\", \"\", \"\", \"]\"); },\n        '1st-level escape': /^(&|\\\\\\\\|\\\\hline)\\s*/,\n        '\\\\,': /^(?:\\\\[,\\ ;:])/,  // \\\\x - but output no space before\n        '\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '\\\\ca': /^\\\\ca(?:\\s+|(?![a-zA-Z]))/,\n        '\\\\x': /^(?:\\\\[a-zA-Z]+\\s*|\\\\[_&{}%])/,\n        'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,  // only those with numbers in front, because the others will be formatted correctly anyway\n        'others': /^[\\/~|]/,\n        '\\\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\frac{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\overset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underbrace{\", \"\", \"\", \"}_\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\"); },\n        '\\\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color\", \"\\\\\", \"\", /^(?=\\{)/, \"{\", \"\", \"\", \"}\"); },\n        '\\\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\ce{\", \"\", \"\", \"}\"); },\n        'oxidation$': /^(?:[+-][IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,\n        'd-oxidation$': /^(?:[+-]?\\s?[IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,  // 0 could be oxidation or charge\n        'roman numeral': /^[IVX]+/,\n        '1/2$': /^[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+(?:\\$[a-z]\\$|[a-z])?$/,\n        'amount': function (input) {\n          var match;\n          // e.g. 2, 0.5, 1/2, -2, n/2, +;  $a$ could be added later in parsing\n          match = input.match(/^(?:(?:(?:\\([+\\-]?[0-9]+\\/[0-9]+\\)|[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+|[+\\-]?[0-9]+[.,][0-9]+|[+\\-]?\\.[0-9]+|[+\\-]?[0-9]+)(?:[a-z](?=\\s*[A-Z]))?)|[+\\-]?[a-z](?=\\s*[A-Z])|\\+(?!\\s))/);\n          if (match) {\n            return { match_: match[0], remainder: input.substr(match[0].length) };\n          }\n          var a = mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\");\n          if (a) {  // e.g. $2n-1$, $-$\n            match = a.match_.match(/^\\$(?:\\(?[+\\-]?(?:[0-9]*[a-z]?[+\\-])?[0-9]*[a-z](?:[+\\-][0-9]*[a-z]?)?\\)?|\\+|-)\\$$/);\n            if (match) {\n              return { match_: match[0], remainder: input.substr(match[0].length) };\n            }\n          }\n          return null;\n        },\n        'amount2': function (input) { return this['amount'](input); },\n        '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,\n        'formula$': function (input) {\n          if (input.match(/^\\([a-z]+\\)$/)) { return null; }  // state of aggregation = no formula\n          var match = input.match(/^(?:[a-z]|(?:[0-9\\ \\+\\-\\,\\.\\(\\)]+[a-z])+[0-9\\ \\+\\-\\,\\.\\(\\)]*|(?:[a-z][0-9\\ \\+\\-\\,\\.\\(\\)]+)+[a-z]?)$/);\n          if (match) {\n            return { match_: match[0], remainder: input.substr(match[0].length) };\n          }\n          return null;\n        },\n        'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,\n        '/': /^\\s*(\\/)\\s*/,\n        '//': /^\\s*(\\/\\/)\\s*/,\n        '*': /^\\s*[*.]\\s*/\n      },\n      findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {\n        /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */\n        var _match = function (input, pattern) {\n          if (typeof pattern === \"string\") {\n            if (input.indexOf(pattern) !== 0) { return null; }\n            return pattern;\n          } else {\n            var match = input.match(pattern);\n            if (!match) { return null; }\n            return match[0];\n          }\n        };\n        /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */\n        var _findObserveGroups = function (input, i, endChars) {\n          var braces = 0;\n          while (i < input.length) {\n            var a = input.charAt(i);\n            var match = _match(input.substr(i), endChars);\n            if (match !== null  &&  braces === 0) {\n              return { endMatchBegin: i, endMatchEnd: i + match.length };\n            } else if (a === \"{\") {\n              braces++;\n            } else if (a === \"}\") {\n              if (braces === 0) {\n                throw [\"ExtraCloseMissingOpen\", \"Extra close brace or missing open brace\"];\n              } else {\n                braces--;\n              }\n            }\n            i++;\n          }\n          if (braces > 0) {\n            return null;\n          }\n          return null;\n        };\n        var match = _match(input, begExcl);\n        if (match === null) { return null; }\n        input = input.substr(match.length);\n        match = _match(input, begIncl);\n        if (match === null) { return null; }\n        var e = _findObserveGroups(input, match.length, endIncl || endExcl);\n        if (e === null) { return null; }\n        var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin));\n        if (!(beg2Excl || beg2Incl)) {\n          return {\n            match_: match1,\n            remainder: input.substr(e.endMatchEnd)\n          };\n        } else {\n          var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);\n          if (group2 === null) { return null; }\n          /** @type {string[]} */\n          var matchRet = [match1, group2.match_];\n          return {\n            match_: (combine ? matchRet.join(\"\") : matchRet),\n            remainder: group2.remainder\n          };\n        }\n      },\n\n      //\n      // Matching function\n      // e.g. match(\"a\", input) will look for the regexp called \"a\" and see if it matches\n      // returns null or {match_:\"a\", remainder:\"bc\"}\n      //\n      match_: function (m, input) {\n        var pattern = mhchemParser.patterns.patterns[m];\n        if (pattern === undefined) {\n          throw [\"MhchemBugP\", \"mhchem bug P. Please report. (\" + m + \")\"];  // Trying to use non-existing pattern\n        } else if (typeof pattern === \"function\") {\n          return mhchemParser.patterns.patterns[m](input);  // cannot use cached var pattern here, because some pattern functions need this===mhchemParser\n        } else {  // RegExp\n          var match = input.match(pattern);\n          if (match) {\n            var mm;\n            if (match[2]) {\n              mm = [ match[1], match[2] ];\n            } else if (match[1]) {\n              mm = match[1];\n            } else {\n              mm = match[0];\n            }\n            return { match_: mm, remainder: input.substr(match[0].length) };\n          }\n          return null;\n        }\n      }\n    },\n\n    //\n    // Generic state machine actions\n    //\n    actions: {\n      'a=': function (buffer, m) { buffer.a = (buffer.a || \"\") + m; },\n      'b=': function (buffer, m) { buffer.b = (buffer.b || \"\") + m; },\n      'p=': function (buffer, m) { buffer.p = (buffer.p || \"\") + m; },\n      'o=': function (buffer, m) { buffer.o = (buffer.o || \"\") + m; },\n      'q=': function (buffer, m) { buffer.q = (buffer.q || \"\") + m; },\n      'd=': function (buffer, m) { buffer.d = (buffer.d || \"\") + m; },\n      'rm=': function (buffer, m) { buffer.rm = (buffer.rm || \"\") + m; },\n      'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || \"\") + m; },\n      'insert': function (buffer, m, a) { return { type_: a }; },\n      'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; },\n      'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; },\n      'copy': function (buffer, m) { return m; },\n      'rm': function (buffer, m) { return { type_: 'rm', p1: m || \"\"}; },\n      'text': function (buffer, m) { return mhchemParser.go(m, 'text'); },\n      '{text}': function (buffer, m) {\n        var ret = [ \"{\" ];\n        mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));\n        ret.push(\"}\");\n        return ret;\n      },\n      'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); },\n      'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); },\n      'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; },\n      'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; },\n      'ce': function (buffer, m) { return mhchemParser.go(m); },\n      '1/2': function (buffer, m) {\n        /** @type {ParserOutput[]} */\n        var ret = [];\n        if (m.match(/^[+\\-]/)) {\n          ret.push(m.substr(0, 1));\n          m = m.substr(1);\n        }\n        var n = m.match(/^([0-9]+|\\$[a-z]\\$|[a-z])\\/([0-9]+)(\\$[a-z]\\$|[a-z])?$/);\n        n[1] = n[1].replace(/\\$/g, \"\");\n        ret.push({ type_: 'frac', p1: n[1], p2: n[2] });\n        if (n[3]) {\n          n[3] = n[3].replace(/\\$/g, \"\");\n          ret.push({ type_: 'tex-math', p1: n[3] });\n        }\n        return ret;\n      },\n      '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); }\n    },\n    //\n    // createTransitions\n    // convert  { 'letter': { 'state': { action_: 'output' } } }  to  { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }\n    // with expansion of 'a|b' to 'a' and 'b' (at 2 places)\n    //\n    createTransitions: function (o) {\n      var pattern, state;\n      /** @type {string[]} */\n      var stateArray;\n      var i;\n      //\n      // 1. Collect all states\n      //\n      /** @type {Transitions} */\n      var transitions = {};\n      for (pattern in o) {\n        for (state in o[pattern]) {\n          stateArray = state.split(\"|\");\n          o[pattern][state].stateArray = stateArray;\n          for (i=0; i<stateArray.length; i++) {\n            transitions[stateArray[i]] = [];\n          }\n        }\n      }\n      //\n      // 2. Fill states\n      //\n      for (pattern in o) {\n        for (state in o[pattern]) {\n          stateArray = o[pattern][state].stateArray || [];\n          for (i=0; i<stateArray.length; i++) {\n            //\n            // 2a. Normalize actions into array:  'text=' ==> [{type_:'text='}]\n            // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)\n            //\n            /** @type {any} */\n            var p = o[pattern][state];\n            if (p.action_) {\n              p.action_ = [].concat(p.action_);\n              for (var k=0; k<p.action_.length; k++) {\n                if (typeof p.action_[k] === \"string\") {\n                  p.action_[k] = { type_: p.action_[k] };\n                }\n              }\n            } else {\n              p.action_ = [];\n            }\n            //\n            // 2.b Multi-insert\n            //\n            var patternArray = pattern.split(\"|\");\n            for (var j=0; j<patternArray.length; j++) {\n              if (stateArray[i] === '*') {  // insert into all\n                for (var t in transitions) {\n                  transitions[t].push({ pattern: patternArray[j], task: p });\n                }\n              } else {\n                transitions[stateArray[i]].push({ pattern: patternArray[j], task: p });\n              }\n            }\n          }\n        }\n      }\n      return transitions;\n    },\n    stateMachines: {}\n  };\n\n  //\n  // Definition of state machines\n  //\n  mhchemParser.stateMachines = {\n    //\n    // \\ce state machines\n    //\n    //#region ce\n    'ce': {  // main parser\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        'else':  {\n          '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } },\n        'oxidation$': {\n          '0': { action_: 'oxidation-output' } },\n        'CMT': {\n          'r': { action_: 'rdt=', nextState: 'rt' },\n          'rd': { action_: 'rqt=', nextState: 'rdt' } },\n        'arrowUpDown': {\n          '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } },\n        'uprightEntities': {\n          '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } },\n        'orbital': {\n          '0|1|2|3': { action_: 'o=', nextState: 'o' } },\n        '->': {\n          '0|1|2|3': { action_: 'r=', nextState: 'r' },\n          'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' },\n          '*': { action_: [ 'output', 'r=' ], nextState: 'r' } },\n        '+': {\n          'o': { action_: 'd= kv',  nextState: 'd' },\n          'd|D': { action_: 'd=', nextState: 'd' },\n          'q': { action_: 'd=',  nextState: 'qd' },\n          'qd|qD': { action_: 'd=', nextState: 'qd' },\n          'dq': { action_: [ 'output', 'd=' ], nextState: 'd' },\n          '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n        'amount': {\n          '0|2': { action_: 'a=', nextState: 'a' } },\n        'pm-operator': {\n          '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\\\pm' } ], nextState: '0' } },\n        'operator': {\n          '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n        '-$': {\n          'o|q': { action_: [ 'charge or bond', 'output' ],  nextState: 'qd' },\n          'd': { action_: 'd=', nextState: 'd' },\n          'D': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          'q': { action_: 'd=',  nextState: 'qd' },\n          'qd': { action_: 'd=', nextState: 'qd' },\n          'qD|dq': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n        '-9': {\n          '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } },\n        '- orbital overlap': {\n          'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n          'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } },\n        '-': {\n          '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          '3': { action_: { type_: 'bond', option: \"-\" } },\n          'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n          'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          'b': { action_: 'b=' },\n          'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n          'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n          'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' },\n          'D|qD|p': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n        'amount2': {\n          '1|3': { action_: 'a=', nextState: 'a' } },\n        'letters': {\n          '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },\n          'q|dq': { action_: ['output', 'o='], nextState: 'o' },\n          'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } },\n        'digits': {\n          'o': { action_: 'q=', nextState: 'q' },\n          'd|D': { action_: 'q=', nextState: 'dq' },\n          'q': { action_: [ 'output', 'o=' ], nextState: 'o' },\n          'a': { action_: 'o=', nextState: 'o' } },\n        'space A': {\n          'b|p|bp': {} },\n        'space': {\n          'a': { nextState: 'as' },\n          '0': { action_: 'sb=false' },\n          '1|2': { action_: 'sb=true' },\n          'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' },\n          '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} },\n        '1st-level escape': {\n          '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] },\n          '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } },\n        '[(...)]': {\n          'r|rt': { action_: 'rd=', nextState: 'rd' },\n          'rd|rdt': { action_: 'rq=', nextState: 'rdq' } },\n        '...': {\n          'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: \"...\" } ], nextState: '3' },\n          '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } },\n        '. |* ': {\n          '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } },\n        'state of aggregation $': {\n          '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } },\n        '{[(': {\n          'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n          '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n          '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } },\n        ')]}': {\n          '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' },\n          'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } },\n        ', ': {\n          '*': { action_: [ 'output', 'comma' ], nextState: '0' } },\n        '^_': {  // ^ and _ without a sensible argument\n          '*': { } },\n        '^{(...)}|^($...$)': {\n          '0|1|2|as': { action_: 'b=', nextState: 'b' },\n          'p': { action_: 'b=', nextState: 'bp' },\n          '3|o': { action_: 'd= kv', nextState: 'D' },\n          'q': { action_: 'd=', nextState: 'qD' },\n          'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } },\n        '^a|^\\\\x{}{}|^\\\\x{}|^\\\\x|\\'': {\n          '0|1|2|as': { action_: 'b=', nextState: 'b' },\n          'p': { action_: 'b=', nextState: 'bp' },\n          '3|o': { action_: 'd= kv', nextState: 'd' },\n          'q': { action_: 'd=', nextState: 'qd' },\n          'd|qd|D|qD': { action_: 'd=' },\n          'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } },\n        '_{(state of aggregation)}$': {\n          'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n        '_{(...)}|_($...$)|_9|_\\\\x{}{}|_\\\\x{}|_\\\\x': {\n          '0|1|2|as': { action_: 'p=', nextState: 'p' },\n          'b': { action_: 'p=', nextState: 'bp' },\n          '3|o': { action_: 'q=', nextState: 'q' },\n          'd|D': { action_: 'q=', nextState: 'dq' },\n          'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n        '=<>': {\n          '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } },\n        '#': {\n          '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"#\" } ], nextState: '3' } },\n        '{}': {\n          '*': { action_: { type_: 'output', option: 1 },  nextState: '1' } },\n        '{...}': {\n          '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' },\n          'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n        '$...$': {\n          'a': { action_: 'a=' },  // 2$n$\n          '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },  // not 'amount'\n          'as|o': { action_: 'o=' },\n          'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n        '\\\\bond{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: \"3\" } },\n        '\\\\frac{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } },\n        '\\\\overset{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } },\n        '\\\\underset{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } },\n        '\\\\underbrace{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } },\n        '\\\\,': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } },\n        '\\\\x{}{}|\\\\x{}|\\\\x': {\n          '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' },\n          '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } },\n        'others': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } },\n        'else2': {\n          'a': { action_: 'a to o', nextState: 'o', revisit: true },\n          'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true },\n          'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true },\n          '*': { action_: [ 'output', 'copy' ], nextState: '3' } }\n      }),\n      actions: {\n        'o after d': function (buffer, m) {\n          var ret;\n          if ((buffer.d || \"\").match(/^[0-9]+$/)) {\n            var tmp = buffer.d;\n            buffer.d = undefined;\n            ret = this['output'](buffer);\n            buffer.b = tmp;\n          } else {\n            ret = this['output'](buffer);\n          }\n          mhchemParser.actions['o='](buffer, m);\n          return ret;\n        },\n        'd= kv': function (buffer, m) {\n          buffer.d = m;\n          buffer.dType = 'kv';\n        },\n        'charge or bond': function (buffer, m) {\n          if (buffer['beginsWithBond']) {\n            /** @type {ParserOutput[]} */\n            var ret = [];\n            mhchemParser.concatArray(ret, this['output'](buffer));\n            mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n            return ret;\n          } else {\n            buffer.d = m;\n          }\n        },\n        '- after o/d': function (buffer, m, isAfterD) {\n          var c1 = mhchemParser.patterns.match_('orbital', buffer.o || \"\");\n          var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || \"\");\n          var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || \"\");\n          var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || \"\");\n          var hyphenFollows =  m===\"-\" && ( c1 && c1.remainder===\"\"  ||  c2  ||  c3  ||  c4 );\n          if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {\n            buffer.o = '$' + buffer.o + '$';\n          }\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (hyphenFollows) {\n            mhchemParser.concatArray(ret, this['output'](buffer));\n            ret.push({ type_: 'hyphen' });\n          } else {\n            c1 = mhchemParser.patterns.match_('digits', buffer.d || \"\");\n            if (isAfterD && c1 && c1.remainder==='') {\n              mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));\n              mhchemParser.concatArray(ret, this['output'](buffer));\n            } else {\n              mhchemParser.concatArray(ret, this['output'](buffer));\n              mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n            }\n          }\n          return ret;\n        },\n        'a to o': function (buffer) {\n          buffer.o = buffer.a;\n          buffer.a = undefined;\n        },\n        'sb=true': function (buffer) { buffer.sb = true; },\n        'sb=false': function (buffer) { buffer.sb = false; },\n        'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; },\n        'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; },\n        'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; },\n        'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; },\n        'state of aggregation': function (buffer, m) {\n          return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') };\n        },\n        'comma': function (buffer, m) {\n          var a = m.replace(/\\s*$/, '');\n          var withSpace = (a !== m);\n          if (withSpace  &&  buffer['parenthesisLevel'] === 0) {\n            return { type_: 'comma enumeration L', p1: a };\n          } else {\n            return { type_: 'comma enumeration M', p1: a };\n          }\n        },\n        'output': function (buffer, m, entityFollows) {\n          // entityFollows:\n          //   undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)\n          //   1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)\n          //   2 = 1 + the entity can have an amount, so output a\\, instead of converting it to o (can only apply to states a|as)\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret;\n          if (!buffer.r) {\n            ret = [];\n            if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {\n              //ret = [];\n            } else {\n              if (buffer.sb) {\n                ret.push({ type_: 'entitySkip' });\n              }\n              if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) {\n                buffer.o = buffer.a;\n                buffer.a = undefined;\n              } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {\n                buffer.o = buffer.a;\n                buffer.d = buffer.b;\n                buffer.q = buffer.p;\n                buffer.a = buffer.b = buffer.p = undefined;\n              } else {\n                if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || \"\")) {\n                  buffer.dType = 'oxidation';\n                } else if (buffer.o && buffer.dType==='kv' && !buffer.q) {\n                  buffer.dType = undefined;\n                }\n              }\n              ret.push({\n                type_: 'chemfive',\n                a: mhchemParser.go(buffer.a, 'a'),\n                b: mhchemParser.go(buffer.b, 'bd'),\n                p: mhchemParser.go(buffer.p, 'pq'),\n                o: mhchemParser.go(buffer.o, 'o'),\n                q: mhchemParser.go(buffer.q, 'pq'),\n                d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')),\n                dType: buffer.dType\n              });\n            }\n          } else {  // r\n            /** @type {ParserOutput[]} */\n            var rd;\n            if (buffer.rdt === 'M') {\n              rd = mhchemParser.go(buffer.rd, 'tex-math');\n            } else if (buffer.rdt === 'T') {\n              rd = [ { type_: 'text', p1: buffer.rd || \"\" } ];\n            } else {\n              rd = mhchemParser.go(buffer.rd);\n            }\n            /** @type {ParserOutput[]} */\n            var rq;\n            if (buffer.rqt === 'M') {\n              rq = mhchemParser.go(buffer.rq, 'tex-math');\n            } else if (buffer.rqt === 'T') {\n              rq = [ { type_: 'text', p1: buffer.rq || \"\"} ];\n            } else {\n              rq = mhchemParser.go(buffer.rq);\n            }\n            ret = {\n              type_: 'arrow',\n              r: buffer.r,\n              rd: rd,\n              rq: rq\n            };\n          }\n          for (var p in buffer) {\n            if (p !== 'parenthesisLevel'  &&  p !== 'beginsWithBond') {\n              delete buffer[p];\n            }\n          }\n          return ret;\n        },\n        'oxidation-output': function (buffer, m) {\n          var ret = [ \"{\" ];\n          mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));\n          ret.push(\"}\");\n          return ret;\n        },\n        'frac-output': function (buffer, m) {\n          return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'overset-output': function (buffer, m) {\n          return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'underset-output': function (buffer, m) {\n          return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'underbrace-output': function (buffer, m) {\n          return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) };\n        },\n        'r=': function (buffer, m) { buffer.r = m; },\n        'rdt=': function (buffer, m) { buffer.rdt = m; },\n        'rd=': function (buffer, m) { buffer.rd = m; },\n        'rqt=': function (buffer, m) { buffer.rqt = m; },\n        'rq=': function (buffer, m) { buffer.rq = m; },\n        'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }\n      }\n    },\n    'a': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '1', revisit: true } },\n        '$(...)$': {\n          '*': { action_: 'tex-math tight', nextState: '1' } },\n        ',': {\n          '*': { action_: { type_: 'insert', option: 'commaDecimal' } } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {}\n    },\n    'o': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '1', revisit: true } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '\\\\ca': {\n          '*': { action_: { type_: 'insert', option: 'circa' } } },\n        '\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: '{text}' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {}\n    },\n    'text': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '{...}': {\n          '*': { action_: 'text=' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '\\\\greek': {\n          '*': { action_: [ 'output', 'rm' ] } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: [ 'output', 'copy' ] } },\n        'else': {\n          '*': { action_: 'text=' } }\n      }),\n      actions: {\n        'output': function (buffer) {\n          if (buffer.text_) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'text', p1: buffer.text_ };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    'pq': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'state of aggregation $': {\n          '*': { action_: 'state of aggregation' } },\n        'i$': {\n          '0': { nextState: '!f', revisit: true } },\n        '(KV letters),': {\n          '0': { action_: 'rm', nextState: '0' } },\n        'formula$': {\n          '0': { nextState: 'f', revisit: true } },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '!f', revisit: true } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: 'text' } },\n        'a-z': {\n          'f': { action_: 'tex-math' } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '-9.,9': {\n          '*': { action_: '9,9'  } },\n        ',': {\n          '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: 'color-output' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: 'color0-output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: 'ce' } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'state of aggregation': function (buffer, m) {\n          return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') };\n        },\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') };\n        }\n      }\n    },\n    'bd': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'x$': {\n          '0': { nextState: '!f', revisit: true } },\n        'formula$': {\n          '0': { nextState: 'f', revisit: true } },\n        'else': {\n          '0': { nextState: '!f', revisit: true } },\n        '-9.,9 no missing 0': {\n          '*': { action_: '9,9' } },\n        '.': {\n          '*': { action_: { type_: 'insert', option: 'electron dot' } } },\n        'a-z': {\n          'f': { action_: 'tex-math' } },\n        'x': {\n          '*': { action_: { type_: 'insert', option: 'KV x' } } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '\\'': {\n          '*': { action_: { type_: 'insert', option: 'prime' } } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: 'text' } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: 'color-output' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: 'color0-output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: 'ce' } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') };\n        }\n      }\n    },\n    'oxidation': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'roman numeral': {\n          '*': { action_: 'roman-numeral' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        'else': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || \"\" }; }\n      }\n    },\n    'tex-math': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ 'output', 'ce' ] } },\n        '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'o=' } },\n        'else': {\n          '*': { action_: 'o=' } }\n      }),\n      actions: {\n        'output': function (buffer) {\n          if (buffer.o) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'tex-math', p1: buffer.o };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    'tex-math tight': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ 'output', 'ce' ] } },\n        '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'o=' } },\n        '-|+': {\n          '*': { action_: 'tight operator' } },\n        'else': {\n          '*': { action_: 'o=' } }\n      }),\n      actions: {\n        'tight operator': function (buffer, m) { buffer.o = (buffer.o || \"\") + \"{\"+m+\"}\"; },\n        'output': function (buffer) {\n          if (buffer.o) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'tex-math', p1: buffer.o };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    '9,9': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        ',': {\n          '*': { action_: 'comma' } },\n        'else': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'comma': function () { return { type_: 'commaDecimal' }; }\n      }\n    },\n    //#endregion\n    //\n    // \\pu state machines\n    //\n    //#region pu\n    'pu': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        'space$': {\n          '*': { action_: [ 'output', 'space' ] } },\n        '{[(|)]}': {\n          '0|a': { action_: 'copy' } },\n        '(-)(9)^(-9)': {\n          '0': { action_: 'number^', nextState: 'a' } },\n        '(-)(9.,9)(e)(99)': {\n          '0': { action_: 'enumber', nextState: 'a' } },\n        'space': {\n          '0|a': {} },\n        'pm-operator': {\n          '0|a': { action_: { type_: 'operator', option: '\\\\pm' }, nextState: '0' } },\n        'operator': {\n          '0|a': { action_: 'copy', nextState: '0' } },\n        '//': {\n          'd': { action_: 'o=', nextState: '/' } },\n        '/': {\n          'd': { action_: 'o=', nextState: '/' } },\n        '{...}|else': {\n          '0|d': { action_: 'd=', nextState: 'd' },\n          'a': { action_: [ 'space', 'd=' ], nextState: 'd' },\n          '/|q': { action_: 'q=', nextState: 'q' } }\n      }),\n      actions: {\n        'enumber': function (buffer, m) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (m[0] === \"+-\"  ||  m[0] === \"+/-\") {\n            ret.push(\"\\\\pm \");\n          } else if (m[0]) {\n            ret.push(m[0]);\n          }\n          if (m[1]) {\n            mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n            if (m[2]) {\n              if (m[2].match(/[,.]/)) {\n                mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));\n              } else {\n                ret.push(m[2]);\n              }\n            }\n            m[3] = m[4] || m[3];\n            if (m[3]) {\n              m[3] = m[3].trim();\n              if (m[3] === \"e\"  ||  m[3].substr(0, 1) === \"*\") {\n                ret.push({ type_: 'cdot' });\n              } else {\n                ret.push({ type_: 'times' });\n              }\n            }\n          }\n          if (m[3]) {\n            ret.push(\"10^{\"+m[5]+\"}\");\n          }\n          return ret;\n        },\n        'number^': function (buffer, m) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (m[0] === \"+-\"  ||  m[0] === \"+/-\") {\n            ret.push(\"\\\\pm \");\n          } else if (m[0]) {\n            ret.push(m[0]);\n          }\n          mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n          ret.push(\"^{\"+m[2]+\"}\");\n          return ret;\n        },\n        'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; },\n        'space': function () { return { type_: 'pu-space-1' }; },\n        'output': function (buffer) {\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret;\n          var md = mhchemParser.patterns.match_('{(...)}', buffer.d || \"\");\n          if (md  &&  md.remainder === '') { buffer.d = md.match_; }\n          var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || \"\");\n          if (mq  &&  mq.remainder === '') { buffer.q = mq.match_; }\n          if (buffer.d) {\n            buffer.d = buffer.d.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n            buffer.d = buffer.d.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n          }\n          if (buffer.q) {  // fraction\n            buffer.q = buffer.q.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n            buffer.q = buffer.q.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n            var b5 = {\n              d: mhchemParser.go(buffer.d, 'pu'),\n              q: mhchemParser.go(buffer.q, 'pu')\n            };\n            if (buffer.o === '//') {\n              ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q };\n            } else {\n              ret = b5.d;\n              if (b5.d.length > 1  ||  b5.q.length > 1) {\n                ret.push({ type_: ' / ' });\n              } else {\n                ret.push({ type_: '/' });\n              }\n              mhchemParser.concatArray(ret, b5.q);\n            }\n          } else {  // no fraction\n            ret = mhchemParser.go(buffer.d, 'pu-2');\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    },\n    'pu-2': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '*': {\n          '*': { action_: [ 'output', 'cdot' ], nextState: '0' } },\n        '\\\\x': {\n          '*': { action_: 'rm=' } },\n        'space': {\n          '*': { action_: [ 'output', 'space' ], nextState: '0' } },\n        '^{(...)}|^(-1)': {\n          '1': { action_: '^(-1)' } },\n        '-9.,9': {\n          '0': { action_: 'rm=', nextState: '0' },\n          '1': { action_: '^(-1)', nextState: '0' } },\n        '{...}|else': {\n          '*': { action_: 'rm=', nextState: '1' } }\n      }),\n      actions: {\n        'cdot': function () { return { type_: 'tight cdot' }; },\n        '^(-1)': function (buffer, m) { buffer.rm += \"^{\"+m+\"}\"; },\n        'space': function () { return { type_: 'pu-space-2' }; },\n        'output': function (buffer) {\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret = [];\n          if (buffer.rm) {\n            var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || \"\");\n            if (mrm  &&  mrm.remainder === '') {\n              ret = mhchemParser.go(mrm.match_, 'pu');\n            } else {\n              ret = { type_: 'rm', p1: buffer.rm };\n            }\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    },\n    'pu-9,9': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '0': { action_: 'output-0' },\n          'o': { action_: 'output-o' } },\n        ',': {\n          '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } },\n        '.': {\n          '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } },\n        'else': {\n          '*': { action_: 'text=' } }\n      }),\n      actions: {\n        'comma': function () { return { type_: 'commaDecimal' }; },\n        'output-0': function (buffer) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          buffer.text_ = buffer.text_ || \"\";\n          if (buffer.text_.length > 4) {\n            var a = buffer.text_.length % 3;\n            if (a === 0) { a = 3; }\n            for (var i=buffer.text_.length-3; i>0; i-=3) {\n              ret.push(buffer.text_.substr(i, 3));\n              ret.push({ type_: '1000 separator' });\n            }\n            ret.push(buffer.text_.substr(0, a));\n            ret.reverse();\n          } else {\n            ret.push(buffer.text_);\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        },\n        'output-o': function (buffer) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          buffer.text_ = buffer.text_ || \"\";\n          if (buffer.text_.length > 4) {\n            var a = buffer.text_.length - 3;\n            for (var i=0; i<a; i+=3) {\n              ret.push(buffer.text_.substr(i, 3));\n              ret.push({ type_: '1000 separator' });\n            }\n            ret.push(buffer.text_.substr(i));\n          } else {\n            ret.push(buffer.text_);\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    }\n    //#endregion\n  };\n\n  //\n  // texify: Take MhchemParser output and convert it to TeX\n  //\n  /** @type {Texify} */\n  var texify = {\n    go: function (input, isInner) {  // (recursive, max 4 levels)\n      if (!input) { return \"\"; }\n      var res = \"\";\n      var cee = false;\n      for (var i=0; i < input.length; i++) {\n        var inputi = input[i];\n        if (typeof inputi === \"string\") {\n          res += inputi;\n        } else {\n          res += texify._go2(inputi);\n          if (inputi.type_ === '1st-level escape') { cee = true; }\n        }\n      }\n      if (!isInner && !cee && res) {\n        res = \"{\" + res + \"}\";\n      }\n      return res;\n    },\n    _goInner: function (input) {\n      if (!input) { return input; }\n      return texify.go(input, true);\n    },\n    _go2: function (buf) {\n      /** @type {undefined | string} */\n      var res;\n      switch (buf.type_) {\n        case 'chemfive':\n          res = \"\";\n          var b5 = {\n            a: texify._goInner(buf.a),\n            b: texify._goInner(buf.b),\n            p: texify._goInner(buf.p),\n            o: texify._goInner(buf.o),\n            q: texify._goInner(buf.q),\n            d: texify._goInner(buf.d)\n          };\n          //\n          // a\n          //\n          if (b5.a) {\n            if (b5.a.match(/^[+\\-]/)) { b5.a = \"{\"+b5.a+\"}\"; }\n            res += b5.a + \"\\\\,\";\n          }\n          //\n          // b and p\n          //\n          if (b5.b || b5.p) {\n            res += \"{\\\\vphantom{X}}\";\n            res += \"^{\\\\hphantom{\"+(b5.b||\"\")+\"}}_{\\\\hphantom{\"+(b5.p||\"\")+\"}}\";\n            res += \"{\\\\vphantom{X}}\";\n            res += \"^{\\\\smash[t]{\\\\vphantom{2}}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n            res += \"_{\\\\vphantom{2}\\\\mathllap{\\\\smash[t]{\"+(b5.p||\"\")+\"}}}\";\n          }\n          //\n          // o\n          //\n          if (b5.o) {\n            if (b5.o.match(/^[+\\-]/)) { b5.o = \"{\"+b5.o+\"}\"; }\n            res += b5.o;\n          }\n          //\n          // q and d\n          //\n          if (buf.dType === 'kv') {\n            if (b5.d || b5.q) {\n              res += \"{\\\\vphantom{X}}\";\n            }\n            if (b5.d) {\n              res += \"^{\"+b5.d+\"}\";\n            }\n            if (b5.q) {\n              res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n            }\n          } else if (buf.dType === 'oxidation') {\n            if (b5.d) {\n              res += \"{\\\\vphantom{X}}\";\n              res += \"^{\"+b5.d+\"}\";\n            }\n            if (b5.q) {\n              res += \"{\\\\vphantom{X}}\";\n              res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n            }\n          } else {\n            if (b5.q) {\n              res += \"{\\\\vphantom{X}}\";\n              res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n            }\n            if (b5.d) {\n              res += \"{\\\\vphantom{X}}\";\n              res += \"^{\"+b5.d+\"}\";\n            }\n          }\n          break;\n        case 'rm':\n          res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          break;\n        case 'text':\n          if (buf.p1.match(/[\\^_]/)) {\n            buf.p1 = buf.p1.replace(\" \", \"~\").replace(\"-\", \"\\\\text{-}\");\n            res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          } else {\n            res = \"\\\\text{\"+buf.p1+\"}\";\n          }\n          break;\n        case 'roman numeral':\n          res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          break;\n        case 'state of aggregation':\n          res = \"\\\\mskip2mu \"+texify._goInner(buf.p1);\n          break;\n        case 'state of aggregation subscript':\n          res = \"\\\\mskip1mu \"+texify._goInner(buf.p1);\n          break;\n        case 'bond':\n          res = texify._getBond(buf.kind_);\n          if (!res) {\n            throw [\"MhchemErrorBond\", \"mhchem Error. Unknown bond type (\" + buf.kind_ + \")\"];\n          }\n          break;\n        case 'frac':\n          var c = \"\\\\frac{\" + buf.p1 + \"}{\" + buf.p2 + \"}\";\n          res = \"\\\\mathchoice{\\\\textstyle\"+c+\"}{\"+c+\"}{\"+c+\"}{\"+c+\"}\";\n          break;\n        case 'pu-frac':\n          var d = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          res = \"\\\\mathchoice{\\\\textstyle\"+d+\"}{\"+d+\"}{\"+d+\"}{\"+d+\"}\";\n          break;\n        case 'tex-math':\n          res = buf.p1 + \" \";\n          break;\n        case 'frac-ce':\n          res = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'overset':\n          res = \"\\\\overset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'underset':\n          res = \"\\\\underset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'underbrace':\n          res =  \"\\\\underbrace{\" + texify._goInner(buf.p1) + \"}_{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'color':\n          res = \"{\\\\color{\" + buf.color1 + \"}{\" + texify._goInner(buf.color2) + \"}}\";\n          break;\n        case 'color0':\n          res = \"\\\\color{\" + buf.color + \"}\";\n          break;\n        case 'arrow':\n          var b6 = {\n            rd: texify._goInner(buf.rd),\n            rq: texify._goInner(buf.rq)\n          };\n          var arrow = \"\\\\x\" + texify._getArrow(buf.r);\n          if (b6.rq) { arrow += \"[{\" + b6.rq + \"}]\"; }\n          if (b6.rd) {\n            arrow += \"{\" + b6.rd + \"}\";\n          } else {\n            arrow += \"{}\";\n          }\n          res = arrow;\n          break;\n        case 'operator':\n          res = texify._getOperator(buf.kind_);\n          break;\n        case '1st-level escape':\n          res = buf.p1+\" \";  // &, \\\\\\\\, \\\\hlin\n          break;\n        case 'space':\n          res = \" \";\n          break;\n        case 'entitySkip':\n          res = \"~\";\n          break;\n        case 'pu-space-1':\n          res = \"~\";\n          break;\n        case 'pu-space-2':\n          res = \"\\\\mkern3mu \";\n          break;\n        case '1000 separator':\n          res = \"\\\\mkern2mu \";\n          break;\n        case 'commaDecimal':\n          res = \"{,}\";\n          break;\n          case 'comma enumeration L':\n          res = \"{\"+buf.p1+\"}\\\\mkern6mu \";\n          break;\n        case 'comma enumeration M':\n          res = \"{\"+buf.p1+\"}\\\\mkern3mu \";\n          break;\n        case 'comma enumeration S':\n          res = \"{\"+buf.p1+\"}\\\\mkern1mu \";\n          break;\n        case 'hyphen':\n          res = \"\\\\text{-}\";\n          break;\n        case 'addition compound':\n          res = \"\\\\,{\\\\cdot}\\\\,\";\n          break;\n        case 'electron dot':\n          res = \"\\\\mkern1mu \\\\bullet\\\\mkern1mu \";\n          break;\n        case 'KV x':\n          res = \"{\\\\times}\";\n          break;\n        case 'prime':\n          res = \"\\\\prime \";\n          break;\n        case 'cdot':\n          res = \"\\\\cdot \";\n          break;\n        case 'tight cdot':\n          res = \"\\\\mkern1mu{\\\\cdot}\\\\mkern1mu \";\n          break;\n        case 'times':\n          res = \"\\\\times \";\n          break;\n        case 'circa':\n          res = \"{\\\\sim}\";\n          break;\n        case '^':\n          res = \"uparrow\";\n          break;\n        case 'v':\n          res = \"downarrow\";\n          break;\n        case 'ellipsis':\n          res = \"\\\\ldots \";\n          break;\n        case '/':\n          res = \"/\";\n          break;\n        case ' / ':\n          res = \"\\\\,/\\\\,\";\n          break;\n        default:\n          assertNever(buf);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];  // Missing texify rule or unknown MhchemParser output\n      }\n      assertString(res);\n      return res;\n    },\n    _getArrow: function (a) {\n      switch (a) {\n        case \"->\": return \"rightarrow\";\n        case \"\\u2192\": return \"rightarrow\";\n        case \"\\u27F6\": return \"rightarrow\";\n        case \"<-\": return \"leftarrow\";\n        case \"<->\": return \"leftrightarrow\";\n        case \"<-->\": return \"rightleftarrows\";\n        case \"<=>\": return \"rightleftharpoons\";\n        case \"\\u21CC\": return \"rightleftharpoons\";\n        case \"<=>>\": return \"rightequilibrium\";\n        case \"<<=>\": return \"leftequilibrium\";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    },\n    _getBond: function (a) {\n      switch (a) {\n        case \"-\": return \"{-}\";\n        case \"1\": return \"{-}\";\n        case \"=\": return \"{=}\";\n        case \"2\": return \"{=}\";\n        case \"#\": return \"{\\\\equiv}\";\n        case \"3\": return \"{\\\\equiv}\";\n        case \"~\": return \"{\\\\tripledash}\";\n        case \"~-\": return \"{\\\\mathrlap{\\\\raisebox{-.1em}{$-$}}\\\\raisebox{.1em}{$\\\\tripledash$}}\";\n        case \"~=\": return \"{\\\\mathrlap{\\\\raisebox{-.2em}{$-$}}\\\\mathrlap{\\\\raisebox{.2em}{$\\\\tripledash$}}-}\";\n        case \"~--\": return \"{\\\\mathrlap{\\\\raisebox{-.2em}{$-$}}\\\\mathrlap{\\\\raisebox{.2em}{$\\\\tripledash$}}-}\";\n        case \"-~-\": return \"{\\\\mathrlap{\\\\raisebox{-.2em}{$-$}}\\\\mathrlap{\\\\raisebox{.2em}{$-$}}\\\\tripledash}\";\n        case \"...\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n        case \"....\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n        case \"->\": return \"{\\\\rightarrow}\";\n        case \"<-\": return \"{\\\\leftarrow}\";\n        case \"<\": return \"{<}\";\n        case \">\": return \"{>}\";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    },\n    _getOperator: function (a) {\n      switch (a) {\n        case \"+\": return \" {}+{} \";\n        case \"-\": return \" {}-{} \";\n        case \"=\": return \" {}={} \";\n        case \"<\": return \" {}<{} \";\n        case \">\": return \" {}>{} \";\n        case \"<<\": return \" {}\\\\ll{} \";\n        case \">>\": return \" {}\\\\gg{} \";\n        case \"\\\\pm\": return \" {}\\\\pm{} \";\n        case \"\\\\approx\": return \" {}\\\\approx{} \";\n        case \"$\\\\approx$\": return \" {}\\\\approx{} \";\n        case \"v\": return \" \\\\downarrow{} \";\n        case \"(v)\": return \" \\\\downarrow{} \";\n        case \"^\": return \" \\\\uparrow{} \";\n        case \"(^)\": return \" \\\\uparrow{} \";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    }\n  };\n\n  //\n  // Helpers for code anaylsis\n  // Will show type error at calling position\n  //\n  /** @param {number} a */\n  function assertNever(a) {}\n  /** @param {string} a */\n  function assertString(a) {}\n",
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/katex/mhchem.min.js",
            "module-type": "library"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Bold.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Bold.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Bold.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Bold.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Bold.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Bold.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-BoldItalic.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-BoldItalic.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Italic.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Italic.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-BoldItalic.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-BoldItalic.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-Italic.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-Italic.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Bold.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Bold.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Italic.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Italic.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Script-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Script-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size1-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size1-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size2-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size2-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size3-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size3-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size4-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size4-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Typewriter-Regular.woff": {
            "text": "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",
            "title": "$:/plugins/tiddlywiki/katex/fonts/KaTeX_Typewriter-Regular.woff",
            "type": "application/font-woff"
        },
        "$:/plugins/tiddlywiki/katex/katex-logo": {
            "title": "$:/plugins/tiddlywiki/katex/katex-logo",
            "text": "$$\\KaTeX$$\n"
        },
        "$:/plugins/tiddlywiki/katex/latex-parser.js": {
            "title": "$:/plugins/tiddlywiki/katex/latex-parser.js",
            "text": "/*\\\ntitle: $:/plugins/tiddlywiki/katex/latex-parser.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for LaTeX. For example:\n\n```\n\t$$latex-goes-here$$\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except latex-parser \n\\rules only latex-parser \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"latex-parser\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$(?!\\$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = /\\$\\$/mg;\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext,\n\t\tdisplayMode;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tdisplayMode = text.indexOf('\\n') != -1;\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tdisplayMode = false;\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"latex\",\n\t\tattributes: {\n\t\t\ttext: {\n\t\t\t\ttype: \"text\",\n\t\t\t\tvalue: text\n\t\t\t},\n\t\t\tdisplayMode: {\n\t\t\t\ttype: \"text\",\n\t\t\t\tvalue: displayMode ? \"true\" : \"false\"\n\t\t\t}\n\t\t}\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/plugins/tiddlywiki/katex/readme": {
            "title": "$:/plugins/tiddlywiki/katex/readme",
            "text": "This is a TiddlyWiki plugin for mathematical and chemical typesetting based on [ext[KaTeX from Khan Academy|http://khan.github.io/KaTeX/]] (v0.10.2) and [ext[mhchem|https://github.com/mhchem/MathJax-mhchem]] through a [ext[Katex extension|https://github.com/KaTeX/KaTeX/tree/master/contrib/mhchem]].\n\nIt is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/katex]]\n"
        },
        "$:/plugins/tiddlywiki/katex/snippets/logo": {
            "title": "$:/plugins/tiddlywiki/katex/snippets/logo",
            "tags": "$:/tags/KaTeX/Snippet",
            "text": "$$\\KaTeX$$\n"
        },
        "$:/plugins/tiddlywiki/katex/styles": {
            "title": "$:/plugins/tiddlywiki/katex/styles",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n/* KaTeX styles */\n\n{{$:/plugins/tiddlywiki/katex/katex.min.css}}\n\n/* Force text-rendering  (see https://github.com/Jermolene/TiddlyWiki5/issues/2500) */\n\n.katex {\n    text-rendering: auto;\n}\n\n/* Avoid TW5's max-width: 100% */\n\n.katex svg {\n  max-width: initial;\n}\n\n/* Override font URLs */\n\n@font-face {\n\tfont-family: KaTeX_AMS;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Caligraphic;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Caligraphic;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Caligraphic-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Fraktur;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Fraktur;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Fraktur-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-BoldItalic.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Italic.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_Main;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Main-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Math;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Math-Italic.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_SansSerif;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Bold.woff'>>) format('woff');\n\tfont-weight: 700;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_SansSerif;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Italic.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: italic;\n}\n\n@font-face {\n\tfont-family: KaTeX_SansSerif;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_SansSerif-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Script;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Script-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size1;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size1-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size2;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size2-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size3;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size3-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Size4;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Size4-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: KaTeX_Typewriter;\n\tsrc: url(<<datauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_Typewriter-Regular.woff'>>) format('woff');\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n"
        },
        "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown": {
            "title": "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown",
            "text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$view tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$transclude tiddler=<<snippetTitle>> mode=\"inline\"/>\n\n</$view>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/KaTeX/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/KaTeX/Snippet\"\n\ttext=\"\"\"$$snippet$$\"\"\"\n\tcaption=\"description shown in dropdown\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n\n[ext[KaTeX functions catalogue|https://khan.github.io/KaTeX/function-support.html]]\n\n[ext[Chemical equations reference|https://mhchem.github.io/MathJax-mhchem/]]\n"
        },
        "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex": {
            "title": "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/plugins/tiddlywiki/katex/katex-logo",
            "caption": "katex",
            "description": "create and insert preconfigured KaTeX snippets",
            "condition": "[<targetTiddler>!is[image]]",
            "dropdown": "$:/plugins/tiddlywiki/katex/ui/EditorToolbar/katex-dropdown",
            "text": ""
        },
        "$:/plugins/tiddlywiki/katex/usage": {
            "title": "$:/plugins/tiddlywiki/katex/usage",
            "text": "!! Reference:\n\n# Mathematical typesetting: [ext[https://katex.org/docs/supported.html]]\n# Chemical typesetting: [ext[https://mhchem.github.io/MathJax-mhchem/]]\n\n<hr>\n\nThe usual way to include ~LaTeX is to use `$$`. For example:\n\n```\n$$\\displaystyle f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi$$\n```\n\nSingle line equations will render in inline mode. If there are newlines between the `$$` delimiters, the equations will be rendered in display mode.\n\nThe underlying widget can also be used directly, giving more flexibility:\n\n```\n<$latex text=\"f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi\" displayMode=\"true\"></$latex>\n```\n\nThe KaTeX widget is provided under the name `<$latex>` and is also available under the alias `<$katex>`. It's better to use the generic `<$latex>` name unless you are running multiple ~LaTeX plugins and wish to specifically target KaTeX.\n"
        },
        "$:/plugins/tiddlywiki/katex/wrapper.js": {
            "title": "$:/plugins/tiddlywiki/katex/wrapper.js",
            "text": "/*\\\ntitle: $:/plugins/tiddlywiki/katex/wrapper.js\ntype: application/javascript\nmodule-type: widget\n\nWrapper for `katex.min.js` that provides a `<$latex>` widget. It is also available under the alias `<$katex>`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar katex = require(\"$:/plugins/tiddlywiki/katex/katex.min.js\"),\n    chemParse = require(\"$:/plugins/tiddlywiki/katex/mhchem.min.js\"),\n\tWidget = require(\"$:/core/modules/widgets/widget.js\").widget;\n// Add \\ce, \\pu, and \\tripledash to the KaTeX macros.\nkatex.__defineMacro(\"\\\\ce\", function(context) {\n  return chemParse(context.consumeArgs(1)[0], \"ce\")\n});\nkatex.__defineMacro(\"\\\\pu\", function(context) {\n  return chemParse(context.consumeArgs(1)[0], \"pu\");\n});\n//  Needed for \\bond for the ~ forms\n//  Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not \n//  a mathematical minus, U+2212. So we need that extra 0.56.\nkatex.__defineMacro(\"\\\\tripledash\", \"{\\\\vphantom{-}\\\\raisebox{2.56mu}{$\\\\mkern2mu\"\n+ \"\\\\tiny\\\\text{-}\\\\mkern1mu\\\\text{-}\\\\mkern1mu\\\\text{-}\\\\mkern2mu$}}\");\n\nvar KaTeXWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKaTeXWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKaTeXWidget.prototype.render = function(parent,nextSibling) {\n\t// Housekeeping\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Get the source text\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\tvar displayMode = this.getAttribute(\"displayMode\",this.parseTreeNode.displayMode || \"false\") === \"true\";\n\t// Render it into a span\n\tvar span = this.document.createElement(\"span\"),\n\t\toptions = {throwOnError: false, displayMode: displayMode};\n\ttry {\n\t\tif(!this.document.isTiddlyWikiFakeDom) {\n\t\t\tkatex.render(text,span,options);\n\t\t} else {\n\t\t\tspan.innerHTML = katex.renderToString(text,options);\n\t\t}\n\t} catch(ex) {\n\t\tspan.className = \"tc-error\";\n\t\tspan.textContent = ex;\n\t}\n\t// Insert it into the DOM\n\tparent.insertBefore(span,nextSibling);\n\tthis.domNodes.push(span);\n};\n\n/*\nCompute the internal state of the widget\n*/\nKaTeXWidget.prototype.execute = function() {\n\t// Nothing to do for a katex widget\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKaTeXWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.latex = KaTeXWidget;\nexports.katex = KaTeXWidget;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "widget"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/bold": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/bold",
            "list-after": "$:/core/ui/EditorToolbar/bold",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/bold",
            "caption": "{{$:/language/Buttons/Bold/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Bold/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((bold))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"**\"\n\tsuffix=\"**\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1",
            "list-after": "$:/core/ui/EditorToolbar/heading-1",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-1",
            "caption": "{{$:/language/Buttons/Heading1/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Heading1/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((heading-1))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2",
            "list-after": "$:/core/ui/EditorToolbar/heading-2",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-2",
            "caption": "{{$:/language/Buttons/Heading2/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Heading2/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((heading-2))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"2\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3",
            "list-after": "$:/core/ui/EditorToolbar/heading-3",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-3",
            "caption": "{{$:/language/Buttons/Heading3/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Heading3/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((heading-3))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"3\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4",
            "list-after": "$:/core/ui/EditorToolbar/heading-4",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-4",
            "caption": "{{$:/language/Buttons/Heading4/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Heading4/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((heading-4))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"4\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5",
            "list-after": "$:/core/ui/EditorToolbar/heading-5",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-5",
            "caption": "{{$:/language/Buttons/Heading5/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Heading5/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((heading-5))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"5\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6",
            "list-after": "$:/core/ui/EditorToolbar/heading-6",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-6",
            "caption": "{{$:/language/Buttons/Heading6/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Heading6/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((heading-6))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"6\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/italic": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/italic",
            "list-after": "$:/core/ui/EditorToolbar/italic",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/italic",
            "caption": "{{$:/language/Buttons/Italic/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Italic/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((italic))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"*\"\n\tsuffix=\"*\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet",
            "list-after": "$:/core/ui/EditorToolbar/list-bullet",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-bullet",
            "caption": "{{$:/language/Buttons/ListBullet/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/ListBullet/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((list-bullet))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number",
            "list-after": "$:/core/ui/EditorToolbar/list-number",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-number",
            "caption": "{{$:/language/Buttons/ListNumber/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/ListNumber/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((list-number))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"1.\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line",
            "list-after": "$:/core/ui/EditorToolbar/mono-line",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-line",
            "caption": "{{$:/language/Buttons/MonoLine/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/MonoLine/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((mono-line))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
        },
        "$:/plugins/tiddlywiki/markdown/EditorToolbar/quote": {
            "title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/quote",
            "list-after": "$:/core/ui/EditorToolbar/quote",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/quote",
            "caption": "{{$:/language/Buttons/Quote/Caption}} (Markdown)",
            "description": "{{$:/language/Buttons/Quote/Hint}}",
            "condition": "[<targetTiddler>type[text/x-markdown]]",
            "shortcuts": "((quote))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\">\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/config/markdown/breaks": {
            "title": "$:/config/markdown/breaks",
            "text": "false"
        },
        "$:/config/markdown/linkNewWindow": {
            "title": "$:/config/markdown/linkNewWindow",
            "text": "true"
        },
        "$:/config/markdown/linkify": {
            "title": "$:/config/markdown/linkify",
            "text": "false"
        },
        "$:/config/markdown/quotes": {
            "title": "$:/config/markdown/quotes",
            "text": "“”‘’"
        },
        "$:/config/markdown/renderWikiText": {
            "title": "$:/config/markdown/renderWikiText",
            "text": "true"
        },
        "$:/config/markdown/renderWikiTextPragma": {
            "title": "$:/config/markdown/renderWikiTextPragma",
            "text": "\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock"
        },
        "$:/config/markdown/typographer": {
            "title": "$:/config/markdown/typographer",
            "text": "false"
        },
        "$:/language/Docs/Types/text/x-markdown": {
            "title": "$:/language/Docs/Types/text/x-markdown",
            "description": "Markdown",
            "name": "text/x-markdown",
            "group": "Text"
        },
        "$:/plugins/tiddlywiki/markdown/remarkable.js": {
            "text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=e||self).remarkable={})}(this,function(e){\"use strict\";var t={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"⁡\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",AMP:\"&\",amp:\"&\",And:\"⩓\",and:\"∧\",andand:\"⩕\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsd:\"∡\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",ap:\"≈\",apacir:\"⩯\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"⁡\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",Barwed:\"⌆\",barwed:\"⌅\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",Because:\"∵\",because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxDL:\"╗\",boxDl:\"╖\",boxdL:\"╕\",boxdl:\"┐\",boxDR:\"╔\",boxDr:\"╓\",boxdR:\"╒\",boxdr:\"┌\",boxH:\"═\",boxh:\"─\",boxHD:\"╦\",boxHd:\"╤\",boxhD:\"╥\",boxhd:\"┬\",boxHU:\"╩\",boxHu:\"╧\",boxhU:\"╨\",boxhu:\"┴\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxUL:\"╝\",boxUl:\"╜\",boxuL:\"╛\",boxul:\"┘\",boxUR:\"╚\",boxUr:\"╙\",boxuR:\"╘\",boxur:\"└\",boxV:\"║\",boxv:\"│\",boxVH:\"╬\",boxVh:\"╫\",boxvH:\"╪\",boxvh:\"┼\",boxVL:\"╣\",boxVl:\"╢\",boxvL:\"╡\",boxvl:\"┤\",boxVR:\"╠\",boxVr:\"╟\",boxvR:\"╞\",boxvr:\"├\",bprime:\"‵\",Breve:\"˘\",breve:\"˘\",brvbar:\"¦\",Bscr:\"ℬ\",bscr:\"𝒷\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsol:\"\\\\\",bsolb:\"⧅\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",Cap:\"⋒\",cap:\"∩\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",CenterDot:\"·\",centerdot:\"·\",Cfr:\"ℭ\",cfr:\"𝔠\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",cir:\"○\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",Colon:\"∷\",colon:\":\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",Conint:\"∯\",conint:\"∮\",ContourIntegral:\"∮\",Copf:\"ℂ\",copf:\"𝕔\",coprod:\"∐\",Coproduct:\"∐\",COPY:\"©\",copy:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",Cross:\"⨯\",cross:\"✗\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",Cup:\"⋓\",cup:\"∪\",cupbrcap:\"⩈\",CupCap:\"≍\",cupcap:\"⩆\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",Dagger:\"‡\",dagger:\"†\",daleth:\"ℸ\",Darr:\"↡\",dArr:\"⇓\",darr:\"↓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",DD:\"ⅅ\",dd:\"ⅆ\",ddagger:\"‡\",ddarr:\"⇊\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",Diamond:\"⋄\",diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrow:\"↓\",Downarrow:\"⇓\",downarrow:\"↓\",DownArrowBar:\"⤓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVector:\"↽\",DownLeftVectorBar:\"⥖\",DownRightTeeVector:\"⥟\",DownRightVector:\"⇁\",DownRightVectorBar:\"⥗\",DownTee:\"⊤\",DownTeeArrow:\"↧\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",ecir:\"≖\",Ecirc:\"Ê\",ecirc:\"ê\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",eDot:\"≑\",edot:\"ė\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp:\" \",emsp13:\" \",emsp14:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",Escr:\"ℰ\",escr:\"ℯ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",ExponentialE:\"ⅇ\",exponentiale:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ffi\",fflig:\"ff\",ffllig:\"ffl\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"fi\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"fl\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",ForAll:\"∀\",forall:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",Fscr:\"ℱ\",fscr:\"𝒻\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",gE:\"≧\",ge:\"≥\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",ges:\"⩾\",gescc:\"⪩\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",Gg:\"⋙\",gg:\"≫\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gl:\"≷\",gla:\"⪥\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gnE:\"≩\",gne:\"⪈\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",GT:\">\",Gt:\"≫\",gt:\">\",gtcc:\"⪧\",gtcir:\"⩺\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",hArr:\"⇔\",harr:\"↔\",harrcir:\"⥈\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",Hfr:\"ℌ\",hfr:\"𝔥\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",Hopf:\"ℍ\",hopf:\"𝕙\",horbar:\"―\",HorizontalLine:\"─\",Hscr:\"ℋ\",hscr:\"𝒽\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"⁣\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",Ifr:\"ℑ\",ifr:\"𝔦\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"IJ\",ijlig:\"ij\",Im:\"ℑ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",in:\"∈\",incare:\"℅\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",Int:\"∬\",int:\"∫\",intcal:\"⊺\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"⁣\",InvisibleTimes:\"⁢\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",Iscr:\"ℐ\",iscr:\"𝒾\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"⁢\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",Lang:\"⟪\",lang:\"⟨\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",Larr:\"↞\",lArr:\"⇐\",larr:\"←\",larrb:\"⇤\",larrbfs:\"⤟\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",lat:\"⪫\",lAtail:\"⤛\",latail:\"⤙\",late:\"⪭\",lates:\"⪭︀\",lBarr:\"⤎\",lbarr:\"⤌\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",lE:\"≦\",le:\"≤\",LeftAngleBracket:\"⟨\",LeftArrow:\"←\",Leftarrow:\"⇐\",leftarrow:\"←\",LeftArrowBar:\"⇤\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVector:\"⇃\",LeftDownVectorBar:\"⥙\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrow:\"↔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTee:\"⊣\",LeftTeeArrow:\"↤\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangle:\"⊲\",LeftTriangleBar:\"⧏\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVector:\"↿\",LeftUpVectorBar:\"⥘\",LeftVector:\"↼\",LeftVectorBar:\"⥒\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",les:\"⩽\",lescc:\"⪨\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",Ll:\"⋘\",ll:\"≪\",llarr:\"⇇\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoust:\"⎰\",lmoustache:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lnE:\"≨\",lne:\"⪇\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftarrow:\"⟵\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longleftrightarrow:\"⟷\",longmapsto:\"⟼\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",longrightarrow:\"⟶\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"‎\",lrtri:\"⊿\",lsaquo:\"‹\",Lscr:\"ℒ\",lscr:\"𝓁\",Lsh:\"↰\",lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",LT:\"<\",Lt:\"≪\",lt:\"<\",ltcc:\"⪦\",ltcir:\"⩹\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",mid:\"∣\",midast:\"*\",midcir:\"⫰\",middot:\"·\",minus:\"−\",minusb:\"⊟\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",Mscr:\"ℳ\",mscr:\"𝓂\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ʼn\",napprox:\"≉\",natur:\"♮\",natural:\"♮\",naturals:\"ℕ\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",ne:\"≠\",nearhk:\"⤤\",neArr:\"⇗\",nearr:\"↗\",nearrow:\"↗\",nedot:\"≐̸\",NegativeMediumSpace:\"​\",NegativeThickSpace:\"​\",NegativeThinSpace:\"​\",NegativeVeryThinSpace:\"​\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nhArr:\"⇎\",nharr:\"↮\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlArr:\"⇍\",nlarr:\"↚\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nLeftarrow:\"⇍\",nleftarrow:\"↚\",nLeftrightarrow:\"⇎\",nleftrightarrow:\"↮\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"⁠\",NonBreakingSpace:\" \",Nopf:\"ℕ\",nopf:\"𝕟\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangle:\"⋪\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangle:\"⋫\",NotRightTriangleBar:\"⧐̸\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",npar:\"∦\",nparallel:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",npre:\"⪯̸\",nprec:\"⊀\",npreceq:\"⪯̸\",nrArr:\"⇏\",nrarr:\"↛\",nrarrc:\"⤳̸\",nrarrw:\"↝̸\",nRightarrow:\"⇏\",nrightarrow:\"↛\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nVDash:\"⊯\",nVdash:\"⊮\",nvDash:\"⊭\",nvdash:\"⊬\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwArr:\"⇖\",nwarr:\"↖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",ocir:\"⊚\",Ocirc:\"Ô\",ocirc:\"ô\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",Or:\"⩔\",or:\"∨\",orarr:\"↻\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",Otimes:\"⨷\",otimes:\"⊗\",otimesas:\"⨶\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",par:\"∥\",para:\"¶\",parallel:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plus:\"+\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",Popf:\"ℙ\",popf:\"𝕡\",pound:\"£\",Pr:\"⪻\",pr:\"≺\",prap:\"⪷\",prcue:\"≼\",prE:\"⪳\",pre:\"⪯\",prec:\"≺\",precapprox:\"⪷\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",precsim:\"≾\",Prime:\"″\",prime:\"′\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportion:\"∷\",Proportional:\"∝\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",Qopf:\"ℚ\",qopf:\"𝕢\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",QUOT:'\"',quot:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",Rang:\"⟫\",rang:\"⟩\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",Rarr:\"↠\",rArr:\"⇒\",rarr:\"→\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",rAtail:\"⤜\",ratail:\"⤚\",ratio:\"∶\",rationals:\"ℚ\",RBarr:\"⤐\",rBarr:\"⤏\",rbarr:\"⤍\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",Re:\"ℜ\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",rect:\"▭\",REG:\"®\",reg:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",Rfr:\"ℜ\",rfr:\"𝔯\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrow:\"→\",Rightarrow:\"⇒\",rightarrow:\"→\",RightArrowBar:\"⇥\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVector:\"⇂\",RightDownVectorBar:\"⥕\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTee:\"⊢\",RightTeeArrow:\"↦\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangle:\"⊳\",RightTriangleBar:\"⧐\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVector:\"↾\",RightUpVectorBar:\"⥔\",RightVector:\"⇀\",RightVectorBar:\"⥓\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"‏\",rmoust:\"⎱\",rmoustache:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",Ropf:\"ℝ\",ropf:\"𝕣\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",Rscr:\"ℛ\",rscr:\"𝓇\",Rsh:\"↱\",rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",Sc:\"⪼\",sc:\"≻\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",sccue:\"≽\",scE:\"⪴\",sce:\"⪰\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdot:\"⋅\",sdotb:\"⊡\",sdote:\"⩦\",searhk:\"⤥\",seArr:\"⇘\",searr:\"↘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"­\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",sol:\"/\",solb:\"⧄\",solbar:\"⌿\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",squ:\"□\",Square:\"□\",square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",Sub:\"⋐\",sub:\"⊂\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",Subset:\"⋐\",subset:\"⊂\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succ:\"≻\",succapprox:\"⪸\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",Sum:\"∑\",sum:\"∑\",sung:\"♪\",Sup:\"⋑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",Supset:\"⋑\",supset:\"⊃\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swArr:\"⇙\",swarr:\"↙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",Therefore:\"∴\",therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\"  \",thinsp:\" \",ThinSpace:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",Tilde:\"∼\",tilde:\"˜\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",times:\"×\",timesb:\"⊠\",timesbar:\"⨱\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",top:\"⊤\",topbot:\"⌶\",topcir:\"⫱\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",TRADE:\"™\",trade:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",Uarr:\"↟\",uArr:\"⇑\",uarr:\"↑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrow:\"↑\",Uparrow:\"⇑\",uparrow:\"↑\",UpArrowBar:\"⤒\",UpArrowDownArrow:\"⇅\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",updownarrow:\"↕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",Upsi:\"ϒ\",upsi:\"υ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTee:\"⊥\",UpTeeArrow:\"↥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",vArr:\"⇕\",varr:\"↕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",Vbar:\"⫫\",vBar:\"⫨\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",VDash:\"⊫\",Vdash:\"⊩\",vDash:\"⊨\",vdash:\"⊢\",Vdashl:\"⫦\",Vee:\"⋁\",vee:\"∨\",veebar:\"⊻\",veeeq:\"≚\",vellip:\"⋮\",Verbar:\"‖\",verbar:\"|\",Vert:\"‖\",vert:\"|\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",Wedge:\"⋀\",wedge:\"∧\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xhArr:\"⟺\",xharr:\"⟷\",Xi:\"Ξ\",xi:\"ξ\",xlArr:\"⟸\",xlarr:\"⟵\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrArr:\"⟹\",xrarr:\"⟶\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",Yuml:\"Ÿ\",yuml:\"ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"​\",Zeta:\"Ζ\",zeta:\"ζ\",Zfr:\"ℨ\",zfr:\"𝔷\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",Zopf:\"ℤ\",zopf:\"𝕫\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"‍\",zwnj:\"‌\"},r=Object.prototype.hasOwnProperty;function n(e){return o=e,(n=t)&&r.call(n,o)?t[e]:e;var n,o}var o=Object.prototype.hasOwnProperty;function s(e,t){return!!e&&o.call(e,t)}function i(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach(function(r){e[r]=t[r]})}}),e}var a=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;function u(e){return e.indexOf(\"\\\\\")<0?e:e.replace(a,\"$1\")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function c(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}var p=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function f(e,t){var r=0,o=n(t);return t!==o?o:35===t.charCodeAt(0)&&h.test(t)&&l(r=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?c(r):e}function g(e){return e.indexOf(\"&\")<0?e:e.replace(p,f)}var d=/[&<>\"]/,m=/[&<>\"]/g,b={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\"};function v(e){return b[e]}function k(e){return d.test(e)?e.replace(m,v):e}var A=Object.freeze({isString:function(e){return\"[object String]\"===function(e){return Object.prototype.toString.call(e)}(e)},has:s,assign:i,unescapeMd:u,isValidEntityCode:l,fromCodePoint:c,replaceEntities:g,escapeHtml:k}),y={};y.blockquote_open=function(){return\"<blockquote>\\n\"},y.blockquote_close=function(e,t){return\"</blockquote>\"+x(e,t)},y.code=function(e,t){return e[t].block?\"<pre><code>\"+k(e[t].content)+\"</code></pre>\"+x(e,t):\"<code>\"+k(e[t].content)+\"</code>\"},y.fence=function(e,t,r,n,o){var i,a,l=e[t],c=\"\",p=r.langPrefix;if(l.params){if(a=(i=l.params.split(/\\s+/g)).join(\" \"),s(o.rules.fence_custom,i[0]))return o.rules.fence_custom[i[0]](e,t,r,n,o);c=' class=\"'+p+k(g(u(a)))+'\"'}return\"<pre><code\"+c+\">\"+(r.highlight&&r.highlight.apply(r.highlight,[l.content].concat(i))||k(l.content))+\"</code></pre>\"+x(e,t)},y.fence_custom={},y.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},y.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},y.hr=function(e,t,r){return(r.xhtmlOut?\"<hr />\":\"<hr>\")+x(e,t)},y.bullet_list_open=function(){return\"<ul>\\n\"},y.bullet_list_close=function(e,t){return\"</ul>\"+x(e,t)},y.list_item_open=function(){return\"<li>\"},y.list_item_close=function(){return\"</li>\\n\"},y.ordered_list_open=function(e,t){var r=e[t];return\"<ol\"+(r.order>1?' start=\"'+r.order+'\"':\"\")+\">\\n\"},y.ordered_list_close=function(e,t){return\"</ol>\"+x(e,t)},y.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},y.paragraph_close=function(e,t){var r=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(r?x(e,t):\"\")},y.link_open=function(e,t,r){var n=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\",o=r.linkTarget?' target=\"'+r.linkTarget+'\"':\"\";return'<a href=\"'+k(e[t].href)+'\"'+n+o+\">\"},y.link_close=function(){return\"</a>\"},y.image=function(e,t,r){var n=' src=\"'+k(e[t].src)+'\"',o=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\";return\"<img\"+n+(' alt=\"'+(e[t].alt?k(g(u(e[t].alt))):\"\")+'\"')+o+(r.xhtmlOut?\" /\":\"\")+\">\"},y.table_open=function(){return\"<table>\\n\"},y.table_close=function(){return\"</table>\\n\"},y.thead_open=function(){return\"<thead>\\n\"},y.thead_close=function(){return\"</thead>\\n\"},y.tbody_open=function(){return\"<tbody>\\n\"},y.tbody_close=function(){return\"</tbody>\\n\"},y.tr_open=function(){return\"<tr>\"},y.tr_close=function(){return\"</tr>\\n\"},y.th_open=function(e,t){var r=e[t];return\"<th\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.th_close=function(){return\"</th>\"},y.td_open=function(e,t){var r=e[t];return\"<td\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.td_close=function(){return\"</td>\"},y.strong_open=function(){return\"<strong>\"},y.strong_close=function(){return\"</strong>\"},y.em_open=function(){return\"<em>\"},y.em_close=function(){return\"</em>\"},y.del_open=function(){return\"<del>\"},y.del_close=function(){return\"</del>\"},y.ins_open=function(){return\"<ins>\"},y.ins_close=function(){return\"</ins>\"},y.mark_open=function(){return\"<mark>\"},y.mark_close=function(){return\"</mark>\"},y.sub=function(e,t){return\"<sub>\"+k(e[t].content)+\"</sub>\"},y.sup=function(e,t){return\"<sup>\"+k(e[t].content)+\"</sup>\"},y.hardbreak=function(e,t,r){return r.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},y.softbreak=function(e,t,r){return r.breaks?r.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},y.text=function(e,t){return k(e[t].content)},y.htmlblock=function(e,t){return e[t].content},y.htmltag=function(e,t){return e[t].content},y.abbr_open=function(e,t){return'<abbr title=\"'+k(g(e[t].title))+'\">'},y.abbr_close=function(){return\"</abbr>\"},y.footnote_ref=function(e,t){var r=Number(e[t].id+1).toString(),n=\"fnref\"+r;return e[t].subId>0&&(n+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+r+'\" id=\"'+n+'\">['+r+\"]</a></sup>\"},y.footnote_block_open=function(e,t,r){return(r.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n')+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},y.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},y.footnote_open=function(e,t){return'<li id=\"fn'+Number(e[t].id+1).toString()+'\"  class=\"footnote-item\">'},y.footnote_close=function(){return\"</li>\\n\"},y.footnote_anchor=function(e,t){var r=\"fnref\"+Number(e[t].id+1).toString();return e[t].subId>0&&(r+=\":\"+e[t].subId),' <a href=\"#'+r+'\" class=\"footnote-backref\">↩</a>'},y.dl_open=function(){return\"<dl>\\n\"},y.dt_open=function(){return\"<dt>\"},y.dd_open=function(){return\"<dd>\"},y.dl_close=function(){return\"</dl>\\n\"},y.dt_close=function(){return\"</dt>\\n\"},y.dd_close=function(){return\"</dd>\\n\"};var x=y.getBreak=function(e,t){return(t=function e(t,r){return++r>=t.length-2?r:\"paragraph_open\"===t[r].type&&t[r].tight&&\"inline\"===t[r+1].type&&0===t[r+1].content.length&&\"paragraph_close\"===t[r+2].type&&t[r+2].tight?e(t,r+2):r}(e,t))<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};function w(){this.rules=i({},y),this.getBreak=y.getBreak}function C(){this.__rules__=[],this.__cache__=null}function E(e,t,r,n,o){this.src=e,this.env=n,this.options=r,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}function D(e,t){var r,n,o,s=-1,i=e.posMax,a=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,r=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))r++;else if(93===o&&0===--r){n=!0;break}e.parser.skipToken(e)}return n?(s=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=r-1,e.pos=a,e.isInLabel=u,s}function _(e,t,r,n){var o,s,i,a,u,l;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),1))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,s),0===(l=e.slice(s+2,i).trim()).length?-1:(n.abbreviations||(n.abbreviations={}),void 0===n.abbreviations[\":\"+u]&&(n.abbreviations[\":\"+u]=l),i)}function B(e){var t=g(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function q(e,t){var r,n,o,s=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(r=e.src.charCodeAt(t)))return!1;if(62===r)return o=B(u(e.src.slice(s+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===r&&t+1<i?t+=2:t++}return!1}for(n=0;t<i&&32!==(r=e.src.charCodeAt(t))&&!(r<32||127===r);)if(92===r&&t+1<i)t+=2;else{if(40===r&&++n>1)break;if(41===r&&--n<0)break;t++}return s!==t&&(o=u(e.src.slice(s,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function F(e,t){var r,n=t,o=e.posMax,s=e.src.charCodeAt(t);if(34!==s&&39!==s&&40!==s)return!1;for(t++,40===s&&(s=41);t<o;){if((r=e.src.charCodeAt(t))===s)return e.pos=t+1,e.linkContent=u(e.src.slice(n+1,t)),!0;92===r&&t+1<o?t+=2:t++}return!1}function M(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}function S(e,t,r,n){var o,s,i,a,u,l,c,p,h;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),0))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!q(o,i))return-1;for(c=o.linkContent,l=i=o.pos,i+=1;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<a&&l!==i&&F(o,i)?(p=o.linkContent,i=o.pos):(p=\"\",i=l);i<a&&32===o.src.charCodeAt(i);)i++;return i<a&&10!==o.src.charCodeAt(i)?-1:(h=M(e.slice(1,s)),void 0===n.references[h]&&(n.references[h]={title:p,href:c}),i)}w.prototype.renderInline=function(e,t,r){for(var n=this.rules,o=e.length,s=0,i=\"\";o--;)i+=n[e[s].type](e,s++,t,r,this);return i},w.prototype.render=function(e,t,r){for(var n=this.rules,o=e.length,s=-1,i=\"\";++s<o;)\"inline\"===e[s].type?i+=this.renderInline(e[s].children,t,r):i+=n[e[s].type](e,s,t,r,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,r=-1;t--;)if(this.__rules__[++r].name===e)return r;return-1},C.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach(function(e){e.enabled&&e.alt.forEach(function(e){t.indexOf(e)<0&&t.push(e)})}),e.__cache__={},t.forEach(function(t){e.__cache__[t]=[],e.__rules__.forEach(function(r){r.enabled&&(t&&r.alt.indexOf(t)<0||e.__cache__[t].push(r.fn))})})},C.prototype.at=function(e,t,r){var n=this.__find__(e),o=r||{};if(-1===n)throw new Error(\"Parser rule not found: \"+e);this.__rules__[n].fn=t,this.__rules__[n].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,r){var n=r||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:n.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach(function(e){e.enabled=!1}),e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0},this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1},this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},E.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},E.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},E.prototype.cacheSet=function(e,t){for(var r=this.cache.length;r<=e;r++)this.cache.push(0);this.cache[e]=t},E.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var T=\" \\n()[]'\\\".,!?-\";function L(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var R=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,N=/\\((c|tm|r|p)\\)/gi,z={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};var P=/['\"]/,j=/['\"]/g,I=/[-\\s()\\[\\]]/,O=\"’\";function U(e,t){return!(t<0||t>=e.length)&&!I.test(e[t])}function H(e,t,r){return e.substr(0,t)+r+e.substr(t+1)}var V=[[\"block\",function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],[\"abbr\",function(e){var t,r,n,o,s=e.tokens;if(!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"paragraph_open\"===s[t-1].type&&\"inline\"===s[t].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=_(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"references\",function(e){var t,r,n,o,s=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"inline\"===s[t].type&&\"paragraph_open\"===s[t-1].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=S(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"inline\",function(e){var t,r,n,o=e.tokens;for(r=0,n=o.length;r<n;r++)\"inline\"===(t=o[r]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],[\"footnote_tail\",function(e){var t,r,n,o,s,i,a,u,l,c=0,p=!1,h={};if(e.env.footnotes&&(e.tokens=e.tokens.filter(function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],l=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,h[\":\"+l]=u,!1):(p&&u.push(e),!p)}),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:c++}),t=0,r=i.length;t<r;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:c++}),i[t].tokens?((a=[]).push({type:\"paragraph_open\",tight:!1,level:c++}),a.push({type:\"inline\",content:\"\",level:c,children:i[t].tokens}),a.push({type:\"paragraph_close\",tight:!1,level:--c})):i[t].label&&(a=h[\":\"+i[t].label]),e.tokens=e.tokens.concat(a),s=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,n=0;n<o;n++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:n,level:c});s&&e.tokens.push(s),e.tokens.push({type:\"footnote_close\",level:--c})}e.tokens.push({type:\"footnote_block_close\",level:--c})}}],[\"abbr2\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(h=\"(^|[\"+T.split(\"\").map(L).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map(function(e){return e.substr(1)}).sort(function(e,t){return t.length-e.length}).map(L).join(\"|\")+\")($|[\"+T.split(\"\").map(L).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(h,\"g\")),c=e.env.abbrRegExp,r=0,n=f.length;r<n;r++)if(\"inline\"===f[r].type)for(t=(o=f[r].children).length-1;t>=0;t--)if(\"text\"===(s=o[t]).type){for(u=0,i=s.content,c.lastIndex=0,l=s.level,a=[];p=c.exec(i);)c.lastIndex>u&&a.push({type:\"text\",content:i.slice(u,p.index+p[1].length),level:l}),a.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+p[2]],level:l++}),a.push({type:\"text\",content:p[2],level:l}),a.push({type:\"abbr_close\",level:--l}),u=c.lastIndex-p[3].length;a.length&&(u<i.length&&a.push({type:\"text\",content:i.slice(u),level:l}),f[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1)))}}],[\"replacements\",function(e){var t,r,n,o,s,i;if(e.options.typographer)for(s=e.tokens.length-1;s>=0;s--)if(\"inline\"===e.tokens[s].type)for(t=(o=e.tokens[s].children).length-1;t>=0;t--)\"text\"===(r=o[t]).type&&(n=r.content,n=(i=n).indexOf(\"(\")<0?i:i.replace(N,function(e,t){return z[t.toLowerCase()]}),R.test(n)&&(n=n.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),r.content=n)}],[\"smartquotes\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(e.options.typographer)for(b=[],d=e.tokens.length-1;d>=0;d--)if(\"inline\"===e.tokens[d].type)for(m=e.tokens[d].children,b.length=0,t=0;t<m.length;t++)if(\"text\"===(r=m[t]).type&&!P.test(r.text)){for(a=m[t].level,f=b.length-1;f>=0&&!(b[f].level<=a);f--);b.length=f+1,s=0,i=(n=r.content).length;e:for(;s<i&&(j.lastIndex=s,o=j.exec(n));)if(u=!U(n,o.index-1),s=o.index+1,g=\"'\"===o[0],(l=!U(n,s))||u){if(p=!l,h=!u)for(f=b.length-1;f>=0&&(c=b[f],!(b[f].level<a));f--)if(c.single===g&&b[f].level===a){c=b[f],g?(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[2]),r.content=H(r.content,o.index,e.options.quotes[3])):(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[0]),r.content=H(r.content,o.index,e.options.quotes[1])),b.length=f;continue e}p?b.push({token:t,pos:o.index,single:g,level:a}):h&&g&&(r.content=H(r.content,o.index,O))}else g&&(r.content=H(r.content,o.index,O))}}]];function G(){this.options={},this.ruler=new C;for(var e=0;e<V.length;e++)this.ruler.push(V[e][0],V[e][1])}function $(e,t,r,n,o){var s,i,a,u,l,c,p;for(this.src=e,this.parser=t,this.options=r,this.env=n,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",c=0,p=!1,a=u=c=0,l=(i=this.src).length;u<l;u++){if(s=i.charCodeAt(u),!p){if(32===s){c++;continue}p=!0}10!==s&&u!==l-1||(10!==s&&u++,this.bMarks.push(a),this.eMarks.push(u),this.tShift.push(c),p=!1,c=0,a=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function Z(e,t){var r,n,o;return(n=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])?-1:42!==(r=e.src.charCodeAt(n++))&&45!==r&&43!==r?-1:n<o&&32!==e.src.charCodeAt(n)?-1:n}function W(e,t){var r,n=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(n+1>=o)return-1;if((r=e.src.charCodeAt(n++))<48||r>57)return-1;for(;;){if(n>=o)return-1;if(!((r=e.src.charCodeAt(n++))>=48&&r<=57)){if(41===r||46===r)break;return-1}}return n<o&&32!==e.src.charCodeAt(n)?-1:n}G.prototype.process=function(e){var t,r,n;for(t=0,r=(n=this.ruler.getRules(\"\")).length;t<r;t++)n[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var r=this.src.length;e<r&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,r){if(e<=r)return e;for(;e>r;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,r,n){var o,s,i,a,u,l=e;if(e>=t)return\"\";if(l+1===t)return s=this.bMarks[l]+Math.min(this.tShift[l],r),i=n?this.eMarks[l]+1:this.eMarks[l],this.src.slice(s,i);for(a=new Array(t-e),o=0;l<t;l++,o++)(u=this.tShift[l])>r&&(u=r),u<0&&(u=0),s=this.bMarks[l]+u,i=l+1<t||n?this.eMarks[l]+1:this.eMarks[l],a[o]=this.src.slice(s,i);return a.join(\"\")};var J={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach(function(e){J[e]=!0});var Y=/^<([a-zA-Z]{1,15})[\\s\\/>]/,K=/^<\\/([a-zA-Z]{1,15})[\\s>]/;function Q(e,t){var r=e.bMarks[t]+e.blkIndent,n=e.eMarks[t];return e.src.substr(r,n-r)}function X(e,t){var r,n,o=e.bMarks[t]+e.tShift[t],s=e.eMarks[t];return o>=s?-1:126!==(n=e.src.charCodeAt(o++))&&58!==n?-1:o===(r=e.skipSpaces(o))?-1:r>=s?-1:r}var ee=[[\"code\",function(e,t,r){var n,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=n=t+1;n<r;)if(e.isEmpty(n))n++;else{if(!(e.tShift[n]-e.blkIndent>=4))break;o=++n}return e.line=n,e.tokens.push({type:\"code\",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],[\"fences\",function(e,t,r,n){var o,s,i,a,u,l=!1,c=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(c+3>p)return!1;if(126!==(o=e.src.charCodeAt(c))&&96!==o)return!1;if(u=c,(s=(c=e.skipChars(c,o))-u)<3)return!1;if((i=e.src.slice(c,p).trim()).indexOf(\"`\")>=0)return!1;if(n)return!0;for(a=t;!(++a>=r||(c=u=e.bMarks[a]+e.tShift[a])<(p=e.eMarks[a])&&e.tShift[a]<e.blkIndent);)if(e.src.charCodeAt(c)===o&&!(e.tShift[a]-e.blkIndent>=4||(c=e.skipChars(c,o))-u<s||(c=e.skipSpaces(c))<p)){l=!0;break}return s=e.tShift[t],e.line=a+(l?1:0),e.tokens.push({type:\"fence\",params:i,content:e.getLines(t+1,a,s,!0),lines:[t,e.line],level:e.level}),!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d=e.bMarks[t]+e.tShift[t],m=e.eMarks[t];if(d>m)return!1;if(62!==e.src.charCodeAt(d++))return!1;if(e.level>=e.options.maxNesting)return!1;if(n)return!0;for(32===e.src.charCodeAt(d)&&d++,u=e.blkIndent,e.blkIndent=0,a=[e.bMarks[t]],e.bMarks[t]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i=[e.tShift[t]],e.tShift[t]=d-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),o=t+1;o<r&&!((d=e.bMarks[o]+e.tShift[o])>=(m=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(d++)){if(s)break;for(g=!1,h=0,f=p.length;h<f;h++)if(p[h](e,o,r,!0)){g=!0;break}if(g)break;a.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(d)&&d++,a.push(e.bMarks[o]),e.bMarks[o]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i.push(e.tShift[o]),e.tShift[o]=d-e.bMarks[o];for(l=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:c=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=l,c[1]=e.line,h=0;h<i.length;h++)e.bMarks[h+t]=a[h],e.tShift[h+t]=i[h];return e.blkIndent=u,!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t];if((a+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(a++))&&45!==o&&95!==o)return!1;for(s=1;a<u;){if((i=e.src.charCodeAt(a++))!==o&&32!==i)return!1;i===o&&s++}return!(s<3||!n&&(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level}),0))},[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b,v,k,A,y,x,w,C,E=!0;if((p=W(e,t))>=0)d=!0;else{if(!((p=Z(e,t))>=0))return!1;d=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(p-1),n)return!0;for(b=e.tokens.length,d?(c=e.bMarks[t]+e.tShift[t],f=Number(e.src.substr(c,p-c-1)),e.tokens.push({type:\"ordered_list_open\",order:f,lines:k=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:k=[t,0],level:e.level++}),o=t,v=!1,y=e.parser.ruler.getRules(\"list\");!(!(o<r)||((h=(m=e.skipSpaces(p))>=e.eMarks[o]?1:m-p)>4&&(h=1),h<1&&(h=1),s=p-e.bMarks[o]+h,e.tokens.push({type:\"list_item_open\",lines:A=[t,0],level:e.level++}),a=e.blkIndent,u=e.tight,i=e.tShift[t],l=e.parentType,e.tShift[t]=m-e.bMarks[t],e.blkIndent=s,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,r,!0),e.tight&&!v||(E=!1),v=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=a,e.tShift[t]=i,e.tight=u,e.parentType=l,e.tokens.push({type:\"list_item_close\",level:--e.level}),o=t=e.line,A[1]=o,m=e.bMarks[t],o>=r)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(C=!1,x=0,w=y.length;x<w;x++)if(y[x](e,o,r,!0)){C=!0;break}if(C)break;if(d){if((p=W(e,o))<0)break}else if((p=Z(e,o))<0)break;if(g!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:d?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),k[1]=o,e.line=o,E&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,b),!0},[\"paragraph\",\"blockquote\"]],[\"footnote\",function(e,t,r,n){var o,s,i,a,u,l=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(l+4>c)return!1;if(91!==e.src.charCodeAt(l))return!1;if(94!==e.src.charCodeAt(l+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(a=l+2;a<c;a++){if(32===e.src.charCodeAt(a))return!1;if(93===e.src.charCodeAt(a))break}return!(a===l+2||a+1>=c||58!==e.src.charCodeAt(++a)||!n&&(a++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(l+2,a-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),o=e.bMarks[t],s=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(a)-a,e.bMarks[t]=a,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,r,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=s,e.bMarks[t]=o,e.tokens.push({type:\"footnote_reference_close\",level:--e.level}),0))},[\"paragraph\"]],[\"heading\",function(e,t,r,n){var o,s,i,a=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(a>=u)return!1;if(35!==(o=e.src.charCodeAt(a))||a>=u)return!1;for(s=1,o=e.src.charCodeAt(++a);35===o&&a<u&&s<=6;)s++,o=e.src.charCodeAt(++a);return!(s>6||a<u&&32!==o||!n&&(u=e.skipCharsBack(u,32,a),(i=e.skipCharsBack(u,35,a))>a&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:s,lines:[t,e.line],level:e.level}),a<u&&e.tokens.push({type:\"inline\",content:e.src.slice(a,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:s,level:e.level}),0))},[\"paragraph\",\"blockquote\"]],[\"lheading\",function(e,t,r){var n,o,s,i=t+1;return!(i>=r||e.tShift[i]<e.blkIndent||e.tShift[i]-e.blkIndent>3||(o=e.bMarks[i]+e.tShift[i])>=(s=e.eMarks[i])||45!==(n=e.src.charCodeAt(o))&&61!==n||(o=e.skipChars(o,n),(o=e.skipSpaces(o))<s||(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:\"heading_open\",hLevel:61===n?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===n?1:2,level:e.level}),0)))}],[\"htmlblock\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t],l=e.tShift[t];if(a+=l,!e.options.html)return!1;if(l>3||a+2>=u)return!1;if(60!==e.src.charCodeAt(a))return!1;if(33===(o=e.src.charCodeAt(a+1))||63===o){if(n)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(s=e.src.slice(a,u).match(K)))return!1}else if(!(s=e.src.slice(a,u).match(Y)))return!1;if(!0!==J[s[1].toLowerCase()])return!1;if(n)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},[\"paragraph\",\"blockquote\"]],[\"table\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g;if(t+2>r)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(s=Q(e,t+1),!/^[-:| ]+$/.test(s))return!1;if((l=s.split(\"|\"))<=2)return!1;for(p=[],a=0;a<l.length;a++){if(!(h=l[a].trim())){if(0===a||a===l.length-1)continue;return!1}if(!/^:?-+:?$/.test(h))return!1;58===h.charCodeAt(h.length-1)?p.push(58===h.charCodeAt(0)?\"center\":\"right\"):58===h.charCodeAt(0)?p.push(\"left\"):p.push(\"\")}if(-1===(s=Q(e,t).trim()).indexOf(\"|\"))return!1;if(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),p.length!==l.length)return!1;if(n)return!0;for(e.tokens.push({type:\"table_open\",lines:f=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"th_open\",align:p[a],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:l[a].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:g=[t+2,0],level:e.level++}),u=t+2;u<r&&!(e.tShift[u]<e.blkIndent)&&-1!==(s=Q(e,u).trim()).indexOf(\"|\");u++){for(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"td_open\",align:p[a],level:e.level++}),c=l[a].substring(124===l[a].charCodeAt(0)?1:0,124===l[a].charCodeAt(l[a].length-1)?l[a].length-1:l[a].length).trim(),e.tokens.push({type:\"inline\",content:c,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),f[1]=g[1]=u,e.line=u,!0},[\"paragraph\"]],[\"deflist\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(n)return!(e.ddIndent<0)&&X(e,t)>=0;if(c=t+1,e.isEmpty(c)&&++c>r)return!1;if(e.tShift[c]<e.blkIndent)return!1;if((o=X(e,c))<0)return!1;if(e.level>=e.options.maxNesting)return!1;l=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:u=[t,0],level:e.level++}),i=t,s=c;e:for(;;){for(b=!0,m=!1,e.tokens.push({type:\"dt_open\",lines:[i,i],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:a=[c,0],level:e.level++}),d=e.tight,h=e.ddIndent,p=e.blkIndent,g=e.tShift[s],f=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=o-e.bMarks[s],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,s,r,!0),e.tight&&!m||(b=!1),m=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=g,e.tight=d,e.parentType=f,e.blkIndent=p,e.ddIndent=h,e.tokens.push({type:\"dd_close\",level:--e.level}),a[1]=c=e.line,c>=r)break e;if(e.tShift[c]<e.blkIndent)break e;if((o=X(e,c))<0)break;s=c}if(c>=r)break;if(i=c,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((s=i+1)>=r)break;if(e.isEmpty(s)&&s++,s>=r)break;if(e.tShift[s]<e.blkIndent)break;if((o=X(e,s))<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),u[1]=c,e.line=c,b&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,l),!0},[\"paragraph\"]],[\"paragraph\",function(e,t){var r,n,o,s,i,a,u=t+1;if(u<(r=e.lineMax)&&!e.isEmpty(u))for(a=e.parser.ruler.getRules(\"paragraph\");u<r&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,s=0,i=a.length;s<i;s++)if(a[s](e,u,r,!0)){o=!0;break}if(o)break}return n=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,n.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:n,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,r){for(var n,o=this.ruler.getRules(\"\"),s=o.length,i=t,a=!1;i<r&&(e.line=i=e.skipEmptyLines(i),!(i>=r))&&!(e.tShift[i]<e.blkIndent);){for(n=0;n<s&&!o[n](e,i,r,!1);n++);if(e.tight=!a,e.isEmpty(e.line-1)&&(a=!0),(i=e.line)<r&&e.isEmpty(i)){if(a=!0,++i<r&&\"list\"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var re=/[\\n\\t]/g,ne=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,oe=/\\u00a0/g;function se(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,r,n){var o,s=0,i=0;if(!e)return[];(e=(e=e.replace(oe,\" \")).replace(ne,\"\\n\")).indexOf(\"\\t\")>=0&&(e=e.replace(re,function(t,r){var n;return 10===e.charCodeAt(r)?(s=r+1,i=0,t):(n=\"    \".slice((r-s-i)%4),i=r-s+1,n)})),o=new $(e,this,t,r,n),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],ae=0;ae<256;ae++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function le(e,t){var r,n,o,s=t,i=!0,a=!0,u=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;s<u&&e.src.charCodeAt(s)===l;)s++;return s>=u&&(i=!1),(o=s-t)>=4?i=a=!1:(32!==(n=s<u?e.src.charCodeAt(s):-1)&&10!==n||(i=!1),32!==r&&10!==r||(a=!1),95===l&&(ue(r)&&(i=!1),ue(n)&&(a=!1))),{can_open:i,can_close:a,delims:o}}\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach(function(e){ie[e.charCodeAt(0)]=1});var ce=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var pe=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var he=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"],fe=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,ge=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;function de(e,t){return e=e.source,t=t||\"\",function r(n,o){return n?(o=o.source||o,e=e.replace(n,o),r):new RegExp(e,t)}}var me=de(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",/[^\"'=<>`\\x00-\\x20]+/)(\"single_quoted\",/'[^']*'/)(\"double_quoted\",/\"[^\"]*\"/)(),be=de(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)(\"attr_value\",me)(),ve=de(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",be)(),ke=de(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",ve)(\"close_tag\",/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/)(\"comment\",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)(\"processing\",/<[?].*?[?]>/)(\"declaration\",/<![A-Z]+\\s+[^>]*>/)(\"cdata\",/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/)();var Ae=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,ye=/^&([a-z][a-z0-9]{1,31});/i;var xe=[[\"text\",function(e,t){for(var r=e.pos;r<e.posMax&&!se(e.src.charCodeAt(r));)r++;return r!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,r)),e.pos=r,!0)}],[\"newline\",function(e,t){var r,n,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(r=e.pending.length-1,n=e.posMax,!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){for(var s=r-2;s>=0;s--)if(32!==e.pending.charCodeAt(s)){e.pending=e.pending.substring(0,s+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(o++;o<n&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],[\"escape\",function(e,t){var r,n=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(n))return!1;if(++n<o){if((r=e.src.charCodeAt(n))<256&&0!==ie[r])return t||(e.pending+=e.src[n]),e.pos+=2,!0;if(10===r){for(t||e.push({type:\"hardbreak\",level:e.level}),n++;n<o&&32===e.src.charCodeAt(n);)n++;return e.pos=n,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}],[\"backticks\",function(e,t){var r,n,o,s,i,a=e.pos;if(96!==e.src.charCodeAt(a))return!1;for(r=a,a++,n=e.posMax;a<n&&96===e.src.charCodeAt(a);)a++;for(o=e.src.slice(r,a),s=i=a;-1!==(s=e.src.indexOf(\"`\",i));){for(i=s+1;i<n&&96===e.src.charCodeAt(i);)i++;if(i-s===o.length)return t||e.push({type:\"code\",content:e.src.slice(a,s).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],[\"del\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===s)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&126===e.src.charCodeAt(n);)n++;if(n>u+3)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&126!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"ins\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===s)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&43===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&43!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"mark\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===s)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&61===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&61!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"emphasis\",function(e,t){var r,n,o,s,i,a,u,l=e.posMax,c=e.pos,p=e.src.charCodeAt(c);if(95!==p&&42!==p)return!1;if(t)return!1;if(r=(u=le(e,c)).delims,!u.can_open)return e.pos+=r,t||(e.pending+=e.src.slice(c,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=c+r,a=[r];e.pos<l;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(n=(u=le(e,e.pos)).delims,u.can_close){for(s=a.pop(),i=n;s!==i;){if(i<s){a.push(s-i);break}if(i-=s,0===a.length)break;e.pos+=s,s=a.pop()}if(0===a.length){r=s,o=!0;break}e.pos+=n;continue}u.can_open&&a.push(n),e.pos+=n}return o?(e.posMax=e.pos,e.pos=c+r,t||(2!==r&&3!==r||e.push({type:\"strong_open\",level:e.level++}),1!==r&&3!==r||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==r&&3!==r||e.push({type:\"em_close\",level:--e.level}),2!==r&&3!==r||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+r,e.posMax=l,!0):(e.pos=c,!1)}],[\"sub\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(126!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sub\",level:e.level,content:n.replace(ce,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"sup\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(94!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sup\",level:e.level,content:n.replace(pe,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"links\",function(e,t){var r,n,o,s,i,a,u,l,c=!1,p=e.pos,h=e.posMax,f=e.pos,g=e.src.charCodeAt(f);if(33===g&&(c=!0,g=e.src.charCodeAt(++f)),91!==g)return!1;if(e.level>=e.options.maxNesting)return!1;if(r=f+1,(n=D(e,f))<0)return!1;if((a=n+1)<h&&40===e.src.charCodeAt(a)){for(a++;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a>=h)return!1;for(f=a,q(e,a)?(s=e.linkContent,a=e.pos):s=\"\",f=a;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&f!==a&&F(e,a))for(i=e.linkContent,a=e.pos;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);else i=\"\";if(a>=h||41!==e.src.charCodeAt(a))return e.pos=p,!1;a++}else{if(e.linkLevel>0)return!1;for(;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&91===e.src.charCodeAt(a)&&(f=a+1,(a=D(e,a))>=0?o=e.src.slice(f,a++):a=f-1),o||(void 0===o&&(a=n+1),o=e.src.slice(r,n)),!(u=e.env.references[M(o)]))return e.pos=p,!1;s=u.href,i=u.title}return t||(e.pos=r,e.posMax=n,c?e.push({type:\"image\",src:s,title:i,alt:e.src.substr(r,n-r),level:e.level}):(e.push({type:\"link_open\",href:s,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=a,e.posMax=h,!0}],[\"footnote_inline\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;return!(a+2>=i||94!==e.src.charCodeAt(a)||91!==e.src.charCodeAt(a+1)||e.level>=e.options.maxNesting||(r=a+2,(n=D(e,a+1))<0||(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=r,e.posMax=n,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,s=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(s)},e.linkLevel--),e.pos=n+1,e.posMax=i,0)))}],[\"footnote_ref\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;if(a+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(a))return!1;if(94!==e.src.charCodeAt(a+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(n=a+2;n<i;n++){if(32===e.src.charCodeAt(n))return!1;if(10===e.src.charCodeAt(n))return!1;if(93===e.src.charCodeAt(n))break}return!(n===a+2||n>=i||(n++,r=e.src.slice(a+2,n-1),void 0===e.env.footnotes.refs[\":\"+r]||(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+r]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:r,count:0},e.env.footnotes.refs[\":\"+r]=o):o=e.env.footnotes.refs[\":\"+r],s=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:\"footnote_ref\",id:o,subId:s,level:e.level})),e.pos=n,e.posMax=i,0)))}],[\"autolink\",function(e,t){var r,n,o,s,i,a=e.pos;return!(60!==e.src.charCodeAt(a)||(r=e.src.slice(a)).indexOf(\">\")<0||((n=r.match(ge))?he.indexOf(n[1].toLowerCase())<0||(i=B(s=n[0].slice(1,-1)),!e.parser.validateLink(s)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=n[0].length,0)):!(o=r.match(fe))||(i=B(\"mailto:\"+(s=o[0].slice(1,-1))),!e.parser.validateLink(i)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=o[0].length,0))))}],[\"htmltag\",function(e,t){var r,n,o,s=e.pos;return!(!e.options.html||(o=e.posMax,60!==e.src.charCodeAt(s)||s+2>=o||33!==(r=e.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(e){var t=32|e;return t>=97&&t<=122}(r)||!(n=e.src.slice(s).match(ke))||(t||e.push({type:\"htmltag\",content:e.src.slice(s,s+n[0].length),level:e.level}),e.pos+=n[0].length,0)))}],[\"entity\",function(e,t){var r,o,s=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(s))return!1;if(s+1<i)if(35===e.src.charCodeAt(s+1)){if(o=e.src.slice(s).match(Ae))return t||(r=\"x\"===o[1][0].toLowerCase()?parseInt(o[1].slice(1),16):parseInt(o[1],10),e.pending+=l(r)?c(r):c(65533)),e.pos+=o[0].length,!0}else if(o=e.src.slice(s).match(ye)){var a=n(o[1]);if(o[1]!==a)return t||(e.pending+=a),e.pos+=o[0].length,!0}return t||(e.pending+=\"&\"),e.pos++,!0}]];function we(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Ce}function Ce(e){var t=e.trim().toLowerCase();return-1===(t=g(t)).indexOf(\":\")||-1===[\"vbscript\",\"javascript\",\"file\",\"data\"].indexOf(t.split(\":\")[0])}we.prototype.skipToken=function(e){var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.pos;if((r=e.cacheGet(s))>0)e.pos=r;else{for(t=0;t<o;t++)if(n[t](e,!0))return void e.cacheSet(s,e.pos);e.pos++,e.cacheSet(s,e.pos)}},we.prototype.tokenize=function(e){for(var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.posMax;e.pos<s;){for(r=0;r<o&&!(t=n[r](e,!1));r++);if(t){if(e.pos>=s)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},we.prototype.parse=function(e,t,r,n){var o=new E(e,this,t,r,n);this.tokenize(o)};var Ee={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}};function De(e,t,r){this.src=t,this.env=r,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function _e(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),t&&null!=t.linkify&&console.warn(\"linkify option is removed. Use linkify plugin instead:\\n\\nimport Remarkable from 'remarkable';\\nimport linkify from 'remarkable/linkify';\\nnew Remarkable().use(linkify)\\n\"),this.inline=new we,this.block=new te,this.core=new G,this.renderer=new w,this.ruler=new C,this.options={},this.configure(Ee[e]),this.set(t||{})}function Be(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}function qe(e,t){for(var r=e.length-1;r>=0;r--)!0===t(e[r])&&e.splice(r,1)}function Fe(e){throw new Error(\"Unhandled case for value: '\"+e+\"'\")}_e.prototype.set=function(e){i(this.options,e)},_e.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enable(e.components[r].rules,!0)})},_e.prototype.use=function(e,t){return e(this,t),this},_e.prototype.parse=function(e,t){var r=new De(this,e,t);return this.core.process(r),r.tokens},_e.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},_e.prototype.parseInline=function(e,t){var r=new De(this,e,t);return r.inlineMode=!0,this.core.process(r),r.tokens},_e.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Me=function(){function e(e){void 0===e&&(e={}),this.tagName=\"\",this.attrs={},this.innerHTML=\"\",this.whitespaceRegex=/\\s+/,this.tagName=e.tagName||\"\",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||\"\"}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||\"\"},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr(\"class\",e)},e.prototype.addClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);t=s.shift();)-1===Be(o,t)&&o.push(t);return this.getAttrs().class=o.join(\" \"),this},e.prototype.removeClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);o.length&&(t=s.shift());){var i=Be(o,t);-1!==i&&o.splice(i,1)}return this.getAttrs().class=o.join(\" \"),this},e.prototype.getClass=function(){return this.getAttrs().class||\"\"},e.prototype.hasClass=function(e){return-1!==(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||\"\"},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return[\"<\",e,t=t?\" \"+t:\"\",\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+'=\"'+e[r]+'\"');return t.join(\" \")},e}();var Se=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className=\"\",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||\"\"}return e.prototype.build=function(e){return new Me({tagName:\"a\",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},r=this.createCssClass(e);return r&&(t.class=r),this.newWindow&&(t.target=\"_blank\",t.rel=\"noopener noreferrer\"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var r=[t],n=e.getCssClassSuffixes(),o=0,s=n.length;o<s;o++)r.push(t+\"-\"+n[o]);return r.join(\" \")}return\"\"},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var r=t.length,n=t.location;return\"smart\"===n?function(e,t,r){var n,o;null==r?(r=\"&hellip;\",o=3,n=8):(o=r.length,n=r.length);var s=function(e){var t=\"\";return e.scheme&&e.host&&(t+=e.scheme+\"://\"),e.host&&(t+=e.host),e.path&&(t+=\"/\"+e.path),e.query&&(t+=\"?\"+e.query),e.fragment&&(t+=\"#\"+e.fragment),t},i=function(e,t){var n=t/2,o=Math.ceil(n),s=-1*Math.floor(n),i=\"\";return s<0&&(i=e.substr(s)),e.substr(0,o)+r+i};if(e.length<=t)return e;var a=t-o,u=function(e){var t={},r=e,n=r.match(/^([a-z]+):\\/\\//i);return n&&(t.scheme=n[1],r=r.substr(n[0].length)),(n=r.match(/^(.*?)(?=(\\?|#|\\/|$))/i))&&(t.host=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\/(.*?)(?=(\\?|#|$))/i))&&(t.path=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\?(.*?)(?=(#|$))/i))&&(t.query=n[1],r=r.substr(n[0].length)),(n=r.match(/^#(.*?)$/i))&&(t.fragment=n[1]),t}(e);if(u.query){var l=u.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);l&&(u.query=u.query.substr(0,l[1].length),e=s(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\\./,\"\"),e=s(u)),e.length<=t)return e;var c=\"\";if(u.host&&(c+=u.host),c.length>=a)return u.host.length==t?(u.host.substr(0,t-o)+r).substr(0,a+n):i(c,a).substr(0,a+n);var p=\"\";if(u.path&&(p+=\"/\"+u.path),u.query&&(p+=\"?\"+u.query),p){if((c+p).length>=a)return(c+p).length==t?(c+p).substr(0,t):(c+i(p,a-c.length)).substr(0,a+n);c+=p}if(u.fragment){var h=\"#\"+u.fragment;if((c+h).length>=a)return(c+h).length==t?(c+h).substr(0,t):(c+i(h,a-c.length)).substr(0,a+n);c+=h}if(u.scheme&&u.host){var f=u.scheme+\"://\";if((c+f).length<a)return(f+c).substr(0,t)}if(c.length<=t)return c;var g=\"\";return a>0&&(g=c.substr(-1*Math.floor(a/2))),(c.substr(0,Math.ceil(a/2))+r+g).substr(0,a+n)}(e,r):\"middle\"===n?function(e,t,r){if(e.length<=t)return e;var n,o;null==r?(r=\"&hellip;\",n=8,o=3):(n=r.length,o=r.length);var s=t-o,i=\"\";return s>0&&(i=e.substr(-1*Math.floor(s/2))),(e.substr(0,Math.ceil(s/2))+r+i).substr(0,s+n)}(e,r):function(e,t,r){return function(e,t,r){var n;return e.length>t&&(null==r?(r=\"&hellip;\",n=3):n=r.length,e=e.substring(0,t-n)+r),e}(e,t,r)}(e,r)},e}(),Te=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText=\"\",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),Le=function(e,t){return(Le=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function Re(e,t){function r(){this.constructor=e}Le(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var Ne=function(){return(Ne=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},ze=function(e){function t(t){var r=e.call(this,t)||this;return r.email=\"\",r.email=t.email,r}return Re(t,e),t.prototype.getType=function(){return\"email\"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return\"mailto:\"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(Te),Pe=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"\",r.hashtag=\"\",r.serviceName=t.serviceName,r.hashtag=t.hashtag,r}return Re(t,e),t.prototype.getType=function(){return\"hashtag\"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case\"twitter\":return\"https://twitter.com/hashtag/\"+t;case\"facebook\":return\"https://www.facebook.com/hashtag/\"+t;case\"instagram\":return\"https://instagram.com/explore/tags/\"+t;default:throw new Error(\"Unknown service name to point hashtag to: \"+e)}},t.prototype.getAnchorText=function(){return\"#\"+this.hashtag},t}(Te),je=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.mention=\"\",r.mention=t.mention,r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.getType=function(){return\"mention\"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case\"twitter\":return\"https://twitter.com/\"+this.mention;case\"instagram\":return\"https://instagram.com/\"+this.mention;case\"soundcloud\":return\"https://soundcloud.com/\"+this.mention;default:throw new Error(\"Unknown service name to point mention to: \"+this.serviceName)}},t.prototype.getAnchorText=function(){return\"@\"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),r=this.getServiceName();return r&&t.push(r),t},t}(Te),Ie=function(e){function t(t){var r=e.call(this,t)||this;return r.number=\"\",r.plusSign=!1,r.number=t.number,r.plusSign=t.plusSign,r}return Re(t,e),t.prototype.getType=function(){return\"phone\"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return\"tel:\"+(this.plusSign?\"+\":\"\")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(Te),Oe=function(e){function t(t){var r=e.call(this,t)||this;return r.url=\"\",r.urlMatchType=\"scheme\",r.protocolUrlMatch=!1,r.protocolRelativeMatch=!1,r.stripPrefix={scheme:!0,www:!0},r.stripTrailingSlash=!0,r.decodePercentEncoding=!0,r.schemePrefixRegex=/^(https?:\\/\\/)?/i,r.wwwPrefixRegex=/^(https?:\\/\\/)?(www\\.)?/i,r.protocolRelativeRegex=/^\\/\\//,r.protocolPrepended=!1,r.urlMatchType=t.urlMatchType,r.url=t.url,r.protocolUrlMatch=t.protocolUrlMatch,r.protocolRelativeMatch=t.protocolRelativeMatch,r.stripPrefix=t.stripPrefix,r.stripTrailingSlash=t.stripTrailingSlash,r.decodePercentEncoding=t.decodePercentEncoding,r}return Re(t,e),t.prototype.getType=function(){return\"url\"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&amp;/g,\"&\")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,\"\")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,\"$1\")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,\"\")},t.prototype.removeTrailingSlash=function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,\"&quot;\").replace(/%26/gi,\"&amp;\").replace(/%27/gi,\"&#39;\").replace(/%3C/gi,\"&lt;\").replace(/%3E/gi,\"&gt;\");try{return decodeURIComponent(t)}catch(e){return t}},t}(Te),Ue=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},He=/[A-Za-z]/,Ve=/[0-9]/,Ge=/\\s/,$e=/['\"]/,Ze=/[\\x00-\\x1F\\x7F]/,We=/A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source,Je=We+/\\u00a9\\u00ae\\u2000-\\u3300\\ud83c\\ud000-\\udfff\\ud83d\\ud000-\\udfff\\ud83e\\ud000-\\udfff/.source+/\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source,Ye=/0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source,Ke=Je+Ye,Qe=Je+Ye,Xe=\"(?:[\"+Ye+\"]{1,3}\\\\.){3}[\"+Ye+\"]{1,3}\",et=\"[\"+Qe+\"](?:[\"+Qe+\"\\\\-]{0,61}[\"+Qe+\"])?\",tt=function(e){return\"(?=(\"+et+\"))\\\\\"+e},rt=function(e){return\"(?:\"+tt(e)+\"(?:\\\\.\"+tt(e+1)+\"){0,126}|\"+Xe+\")\"},nt=new RegExp(\"[\"+Qe+\"]\"),ot=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,st=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=new RegExp(\"[\"+Qe+\"!#$%&'*+/=?^_`{|}~-]\"),t.strictTldRegex=new RegExp(\"^\"+ot.source+\"$\"),t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,r=this.localPartCharRegex,n=this.strictTldRegex,o=[],s=e.length,i=new it,a={m:\"a\",a:\"i\",i:\"l\",l:\"t\",t:\"o\",o:\":\"},u=0,l=0,c=i;u<s;){var p=e.charAt(u);switch(l){case 0:h(p);break;case 1:f(e.charAt(u-1),p);break;case 2:g(p);break;case 3:d(p);break;case 4:m(p);break;case 5:b(p);break;case 6:v(p);break;case 7:k(p);break;default:Fe(l)}u++}return x(),o;function h(e){\"m\"===e?A(1):r.test(e)&&A()}function f(e,t){\":\"===e?r.test(t)?(l=2,c=new it(Ne({},c,{hasMailtoPrefix:!0}))):y():a[e]===t||(r.test(t)?l=2:\".\"===t?l=3:\"@\"===t?l=4:y())}function g(e){\".\"===e?l=3:\"@\"===e?l=4:r.test(e)||y()}function d(e){\".\"===e?y():\"@\"===e?y():r.test(e)?l=2:y()}function m(e){nt.test(e)?l=5:y()}function b(e){\".\"===e?l=7:\"-\"===e?l=6:nt.test(e)||x()}function v(e){\"-\"===e||\".\"===e?x():nt.test(e)?l=5:x()}function k(e){\".\"===e||\"-\"===e?x():nt.test(e)?(l=5,c=new it(Ne({},c,{hasDomainDot:!0}))):x()}function A(e){void 0===e&&(e=2),l=e,c=new it({idx:u})}function y(){l=0,c=i}function x(){if(c.hasDomainDot){var r=e.slice(c.idx,u);/[-.]$/.test(r)&&(r=r.slice(0,-1));var s=c.hasMailtoPrefix?r.slice(\"mailto:\".length):r;(function(e){var t=(e.split(\".\").pop()||\"\").toLowerCase();return n.test(t)})(s)&&o.push(new ze({tagBuilder:t,matchedText:r,offset:c.idx,email:s}))}y()}},t}(Ue),it=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},at=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split(\"://\")[1]),t.split(\"/\")[0].indexOf(\"..\")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),r=t&&t[0].toLowerCase();return\"javascript:\"!==r&&\"vbscript:\"!==r},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf(\".\"))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(\":[^\\\\s]*?[\"+We+\"]\"),e.ipRegex=/[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,e}(),ut=function(e){function t(t){var r,n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=(r=new RegExp(\"[/?#](?:[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]?!:,.;✓]*[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]✓])?\"),new RegExp([\"(?:\",\"(\",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/.source,rt(2),\")\",\"|\",\"(\",\"(//)?\",/(?:www\\.)/.source,rt(6),\")\",\"|\",\"(\",\"(//)?\",rt(10)+\"\\\\.\",ot.source,\"(?![-\"+Ke+\"])\",\")\",\")\",\"(?::[0-9]+)?\",\"(?:\"+r.source+\")?\"].join(\"\"),\"gi\")),n.wordCharRegExp=new RegExp(\"[\"+Qe+\"]\"),n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.stripPrefix,o=this.stripTrailingSlash,s=this.decodePercentEncoding,i=this.tagBuilder,a=[],u=function(){var r=t[0],u=t[1],c=t[4],p=t[5],h=t[9],f=t.index,g=p||h,d=e.charAt(f-1);if(!at.isValid(r,u))return\"continue\";if(f>0&&\"@\"===d)return\"continue\";if(f>0&&g&&l.wordCharRegExp.test(d))return\"continue\";if(/\\?$/.test(r)&&(r=r.substr(0,r.length-1)),l.matchHasUnbalancedClosingParen(r))r=r.substr(0,r.length-1);else{var m=l.matchHasInvalidCharAfterTld(r,u);m>-1&&(r=r.substr(0,m))}var b=[\"http://\",\"https://\"].find(function(e){return!!u&&-1!==u.indexOf(e)});if(b){var v=r.indexOf(b);r=r.substr(v),u=u.substr(v),f+=v}var k=u?\"scheme\":c?\"www\":\"tld\",A=!!u;a.push(new Oe({tagBuilder:i,matchedText:r,offset:f,urlMatchType:k,url:r,protocolUrlMatch:A,protocolRelativeMatch:!!g,stripPrefix:n,stripTrailingSlash:o,decodePercentEncoding:s}))},l=this;null!==(t=r.exec(e));)u();return a},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,r=e.charAt(e.length-1);if(\")\"===r)t=\"(\";else{if(\"]\"!==r)return!1;t=\"[\"}for(var n=0,o=0,s=e.length-1;o<s;o++){var i=e.charAt(o);i===t?n++:i===r&&(n=Math.max(n-1,0))}return 0===n},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var r=0;t&&(r=e.indexOf(\":\"),e=e.slice(r));var n=new RegExp(\"^((.?//)?[-.\"+Qe+\"]*[-\"+Qe+\"]\\\\.[-\"+Qe+\"]+)\").exec(e);return null===n?-1:(r+=n[1].length,e=e.slice(n[1].length),/^[^-.A-Za-z0-9:\\/?#]/.test(e)?r:-1)},t}(Ue),lt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegex=new RegExp(\"#[_\"+Qe+\"]{1,139}(?![_\"+Qe+\"])\",\"g\"),r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.nonWordCharRegex,o=this.serviceName,s=this.tagBuilder,i=[];null!==(t=r.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||n.test(u)){var l=t[0],c=t[0].slice(1);i.push(new Pe({tagBuilder:s,matchedText:l,offset:a,serviceName:o,hashtag:c}))}}return i},t}(Ue),ct=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=/(?:(?:(?:(\\+)?\\d{1,3}[-\\040.]?)?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\\040.]?(?:\\d[-\\040.]?){6,12}\\d+))([,;]+[0-9]+#?)*/g,t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.tagBuilder,o=[];null!==(t=r.exec(e));){var s=t[0],i=s.replace(/[^0-9,;#]/g,\"\"),a=!(!t[1]&&!t[2]),u=0==t.index?\"\":e.substr(t.index-1,1),l=e.substr(t.index+s.length,1),c=!u.match(/\\d/)&&!l.match(/\\d/);this.testMatch(t[3])&&this.testMatch(s)&&c&&o.push(new Ie({tagBuilder:n,matchedText:s,offset:t.index,number:i,plusSign:a}))}return o},t.prototype.testMatch=function(e){return/\\D/.test(e)},t}(Ue),pt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegexes={twitter:new RegExp(\"@[_\"+Qe+\"]{1,50}(?![_\"+Qe+\"])\",\"g\"),instagram:new RegExp(\"@[_.\"+Qe+\"]{1,30}(?![_\"+Qe+\"])\",\"g\"),soundcloud:new RegExp(\"@[-_.\"+Qe+\"]{1,50}(?![-_\"+Qe+\"])\",\"g\")},r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){var t,r=this.serviceName,n=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,s=this.tagBuilder,i=[];if(!n)return i;for(;null!==(t=n.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||o.test(u)){var l=t[0].replace(/\\.+$/g,\"\"),c=l.slice(1);i.push(new je({tagBuilder:s,matchedText:l,offset:a,serviceName:r,mention:c}))}}return i},t}(Ue);function ht(e,t){for(var r=t.onOpenTag,n=t.onCloseTag,o=t.onText,s=t.onComment,i=t.onDoctype,a=new ft,u=0,l=e.length,c=0,p=0,h=a;u<l;){var f=e.charAt(u);switch(c){case 0:g(f);break;case 1:d(f);break;case 2:b(f);break;case 3:m(f);break;case 4:v(f);break;case 5:k(f);break;case 6:A(f);break;case 7:y(f);break;case 8:x(f);break;case 9:w(f);break;case 10:C(f);break;case 11:E(f);break;case 12:D(f);break;case 13:_();break;case 14:B(f);break;case 15:q(f);break;case 16:F(f);break;case 17:M(f);break;case 18:S(f);break;case 19:T(f);break;case 20:L(f);break;default:Fe(c)}u++}function g(e){\"<\"===e&&N()}function d(e){\"!\"===e?c=13:\"/\"===e?(c=2,h=new ft(Ne({},h,{isClosing:!0}))):\"<\"===e?N():He.test(e)?(c=3,h=new ft(Ne({},h,{isOpening:!0}))):(c=0,h=a)}function m(e){Ge.test(e)?(h=new ft(Ne({},h,{name:P()})),c=4):\"<\"===e?N():\"/\"===e?(h=new ft(Ne({},h,{name:P()})),c=12):\">\"===e?(h=new ft(Ne({},h,{name:P()})),z()):He.test(e)||Ve.test(e)||\":\"===e||R()}function b(e){\">\"===e?R():He.test(e)?c=3:R()}function v(e){Ge.test(e)||(\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():\"=\"===e||$e.test(e)||Ze.test(e)?R():c=5)}function k(e){Ge.test(e)?c=6:\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)&&R()}function A(e){Ge.test(e)||(\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)?R():c=5)}function y(e){Ge.test(e)||('\"'===e?c=8:\"'\"===e?c=9:/[>=`]/.test(e)?R():\"<\"===e?N():c=10)}function x(e){'\"'===e&&(c=11)}function w(e){\"'\"===e&&(c=11)}function C(e){Ge.test(e)?c=4:\">\"===e?z():\"<\"===e&&N()}function E(e){Ge.test(e)?c=4:\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():(c=4,u--)}function D(e){\">\"===e?(h=new ft(Ne({},h,{isClosing:!0})),z()):c=4}function _(t){\"--\"===e.substr(u,2)?(u+=2,h=new ft(Ne({},h,{type:\"comment\"})),c=14):\"DOCTYPE\"===e.substr(u,7).toUpperCase()?(u+=7,h=new ft(Ne({},h,{type:\"doctype\"})),c=20):R()}function B(e){\"-\"===e?c=15:\">\"===e?R():c=16}function q(e){\"-\"===e?c=18:\">\"===e?R():c=16}function F(e){\"-\"===e&&(c=17)}function M(e){c=\"-\"===e?18:16}function S(e){\">\"===e?z():\"!\"===e?c=19:\"-\"===e||(c=16)}function T(e){\"-\"===e?c=17:\">\"===e?z():c=16}function L(e){\">\"===e?z():\"<\"===e&&N()}function R(){c=0,h=a}function N(){c=1,h=new ft({idx:u})}function z(){var t=e.slice(p,h.idx);t&&o(t,p),\"comment\"===h.type?s(h.idx):\"doctype\"===h.type?i(h.idx):(h.isOpening&&r(h.name,h.idx),h.isClosing&&n(h.name,h.idx)),R(),p=u+1}function P(){var t=h.idx+(h.isClosing?2:1);return e.slice(t,u).toLowerCase()}p<u&&function(){var t=e.slice(p,u);o(t,p),p=u+1}()}var ft=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||\"tag\",this.name=e.name||\"\",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},gt=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:\"end\"},this.className=\"\",this.replaceFn=null,this.context=void 0,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email=\"boolean\"==typeof t.email?t.email:this.email,this.phone=\"boolean\"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=\"boolean\"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash=\"boolean\"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=\"boolean\"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding;var r=this.mention;if(!1!==r&&\"twitter\"!==r&&\"instagram\"!==r&&\"soundcloud\"!==r)throw new Error(\"invalid `mention` cfg - see docs\");var n=this.hashtag;if(!1!==n&&\"twitter\"!==n&&\"facebook\"!==n&&\"instagram\"!==n)throw new Error(\"invalid `hashtag` cfg - see docs\");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,r){return new e(r).link(t)},e.parse=function(t,r){return new e(r).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:\"boolean\"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:\"boolean\"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:\"boolean\"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{scheme:e,www:e}:{scheme:\"boolean\"!=typeof e.scheme||e.scheme,www:\"boolean\"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return\"number\"==typeof e?{length:e,location:\"end\"}:function(e,t){for(var r in t)t.hasOwnProperty(r)&&void 0===e[r]&&(e[r]=t[r]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:\"end\"})},e.prototype.parse=function(e){var t=this,r=[\"a\",\"style\",\"script\"],n=0,o=[];return ht(e,{onOpenTag:function(e){r.indexOf(e)>=0&&n++},onText:function(e,r){if(0===n){var s=function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var r,n=[],o=0;r=t.exec(e);)n.push(e.substring(o,r.index)),n.push(r[0]),o=r.index+r[0].length;return n.push(e.substring(o)),n}(e,/(&nbsp;|&#160;|&lt;|&#60;|&gt;|&#62;|&quot;|&#34;|&#39;)/gi),i=r;s.forEach(function(e,r){if(r%2==0){var n=t.parseText(e,i);o.push.apply(o,n)}i+=e.length})}},onCloseTag:function(e){r.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort(function(e,t){return e.getOffset()-t.getOffset()});for(var t=0;t<e.length-1;t++){var r=e[t],n=r.getOffset(),o=r.getMatchedText().length,s=n+o;if(t+1<e.length){if(e[t+1].getOffset()===n){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<s&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||qe(e,function(e){return\"hashtag\"===e.getType()}),this.email||qe(e,function(e){return\"email\"===e.getType()}),this.phone||qe(e,function(e){return\"phone\"===e.getType()}),this.mention||qe(e,function(e){return\"mention\"===e.getType()}),this.urls.schemeMatches||qe(e,function(e){return\"url\"===e.getType()&&\"scheme\"===e.getUrlMatchType()}),this.urls.wwwMatches||qe(e,function(e){return\"url\"===e.getType()&&\"www\"===e.getUrlMatchType()}),this.urls.tldMatches||qe(e,function(e){return\"url\"===e.getType()&&\"tld\"===e.getUrlMatchType()}),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var r=this.getMatchers(),n=[],o=0,s=r.length;o<s;o++){for(var i=r[o].parseMatches(e),a=0,u=i.length;a<u;a++)i[a].setOffset(t+i[a].getOffset());n.push.apply(n,i)}return n},e.prototype.link=function(e){if(!e)return\"\";for(var t=this.parse(e),r=[],n=0,o=0,s=t.length;o<s;o++){var i=t[o];r.push(e.substring(n,i.getOffset())),r.push(this.createMatchReturnVal(i)),n=i.getOffset()+i.getMatchedText().length}return r.push(e.substring(n)),r.join(\"\")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),\"string\"==typeof t?t:!1===t?e.getMatchedText():t instanceof Me?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new lt({tagBuilder:e,serviceName:this.hashtag}),new st({tagBuilder:e}),new ct({tagBuilder:e}),new pt({tagBuilder:e,serviceName:this.mention}),new ut({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new Se({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version=\"3.11.0\",e.AnchorTagBuilder=Se,e.HtmlTag=Me,e.matcher={Email:st,Hashtag:lt,Matcher:Ue,Mention:pt,Phone:ct,Url:ut},e.match={Email:ze,Hashtag:Pe,Match:Te,Mention:je,Phone:Ie,Url:Oe},e}(),dt=/www|@|\\:\\/\\//;function mt(e){return/^<\\/a\\s*>/i.test(e)}function bt(){var e=[],t=new gt({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function vt(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d=e.tokens,m=null;for(r=0,n=d.length;r<n;r++)if(\"inline\"===d[r].type)for(p=0,t=(o=d[r].children).length-1;t>=0;t--)if(\"link_close\"!==(s=o[t]).type){if(\"htmltag\"===s.type&&(g=s.content,/^<a[>\\s]/i.test(g)&&p>0&&p--,mt(s.content)&&p++),!(p>0)&&\"text\"===s.type&&dt.test(s.content)){if(m||(h=(m=bt()).links,f=m.autolinker),i=s.content,h.length=0,f.link(i),!h.length)continue;for(a=[],c=s.level,u=0;u<h.length;u++)e.inline.validateLink(h[u].url)&&((l=i.indexOf(h[u].text))&&a.push({type:\"text\",content:i.slice(0,l),level:c}),a.push({type:\"link_open\",href:h[u].url,title:\"\",level:c++}),a.push({type:\"text\",content:h[u].text,level:c}),a.push({type:\"link_close\",level:--c}),i=i.slice(l+h[u].text.length));i.length&&a.push({type:\"text\",content:i,level:c}),d[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1))}}else for(t--;o[t].level!==s.level&&\"link_open\"!==o[t].type;)t--}e.Remarkable=_e,e.linkify=function(e){e.core.ruler.push(\"linkify\",vt)},e.utils=A,Object.defineProperty(e,\"__esModule\",{value:!0})});\n",
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/markdown/remarkable.js",
            "module-type": "library"
        },
        "$:/plugins/tiddlywiki/markdown/images/new-markdown-button": {
            "title": "$:/plugins/tiddlywiki/markdown/images/new-markdown-button",
            "tags": "$:/tags/Image",
            "text": "<svg class=\"tc-image-new-markdown-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n    <g fill-rule=\"evenodd\">\n        <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n        <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n        <path d=\"M3.23876972,39.5396716 C3.23876972,35.9653274 6.13586353,33.0691646 9.7141757,33.0691646 L98.1283744,33.0691646 C101.706101,33.0691646 104.60378,35.9646626 104.60378,39.5396716 L104.60378,84.8296213 C104.60378,88.4039654 101.706687,91.3001282 98.1283744,91.3001282 L9.7141757,91.3001282 C6.13644944,91.3001282 3.23876972,88.4046302 3.23876972,84.8296213 L3.23876972,39.5396716 L3.23876972,39.5396716 Z M-2.15298617,39.5396716 L-2.15298617,84.8296213 C-2.15298617,91.3833243 3.15957363,96.6918841 9.7141757,96.6918841 L98.1283744,96.6918841 C104.684083,96.6918841 109.995536,91.382138 109.995536,84.8296213 L109.995536,39.5396716 C109.995536,32.9859686 104.682977,27.6774087 98.1283744,27.6774087 L9.7141757,27.6774087 C3.15846686,27.6774087 -2.15298617,32.9871549 -2.15298617,39.5396716 Z M14.0222815,80.5166164 L14.0222815,43.8526764 L24.8057933,43.8526764 L35.589305,57.3320661 L46.3728168,43.8526764 L57.1563286,43.8526764 L57.1563286,80.5166164 L46.3728168,80.5166164 L46.3728168,59.4887685 L35.589305,72.9681582 L24.8057933,59.4887685 L24.8057933,80.5166164 L14.0222815,80.5166164 Z M81.4192301,80.5166164 L65.2439624,62.723822 L76.0274742,62.723822 L76.0274742,43.8526764 L86.810986,43.8526764 L86.810986,62.723822 L97.5944978,62.723822 L81.4192301,80.5166164 Z\"transform=\"translate(53.921275, 62.184646) rotate(-60.000000) translate(-53.921275, -62.184646) \"></path>\n    </g>\n</svg>"
        },
        "$:/plugins/tiddlywiki/markdown/new-markdown-button": {
            "title": "$:/plugins/tiddlywiki/markdown/new-markdown-button",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}} {{$:/language/Buttons/NewMarkdown/Caption}}",
            "description": "{{$:/language/Buttons/NewMarkdown/Hint}}",
            "list-after": "$:/core/ui/Buttons/new-tiddler",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=\"text/x-markdown\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewMarkdown/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/plugins/tiddlywiki/markdown/readme": {
            "title": "$:/plugins/tiddlywiki/markdown/readme",
            "text": "This is a TiddlyWiki plugin for parsing Markdown text, using the [[Remarkable|https://github.com/jonschlinkert/remarkable]] library.\n\nIt is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/markdown]]\n"
        },
        "$:/plugins/tiddlywiki/markdown/usage": {
            "title": "$:/plugins/tiddlywiki/markdown/usage",
            "text": "! Plugin Configuration\n\n|!Config |!Default |!Description |\n| <code>[[breaks|$:/config/markdown/breaks]]</code>| ``false``|Remarkable library config: Convert '\\n' in paragraphs into ``<br>`` |\n| <code>[[linkify|$:/config/markdown/linkify]]</code>| ``false``|Remarkable library config: Autoconvert URL-like text to links |\n| <code>[[linkNewWindow|$:/config/markdown/linkNewWindow]]</code>| ``true``|For external links, should clicking on them open a new window/tab automatically? |\n| <code>[[quotes|$:/config/markdown/quotes]]</code>| ``“”‘’``|Remarkable library config: Double + single quotes replacement pairs, when ``typographer`` enabled |\n| <code>[[renderWikiText|$:/config/markdown/renderWikiText]]</code>| ``true``|After Markdown is parsed, should any text elements be handed off to the ~WikiText parser for further processing? |\n| <code>[[renderWikiTextPragma|$:/config/markdown/renderWikiTextPragma]]</code>| ``\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock``|When handing off to the ~WikiText parser, what pragma rules should it follow? |\n| <code>[[typographer|$:/config/markdown/typographer]]</code>| ``false``|Remarkable library config: Enable some language-neutral replacement + quotes beautification |\n\n! Creating ~WikiLinks\n\nCreate wiki links with the usual Markdown link syntax targeting `#` and the target tiddler title:\n\n```\n[link text](#TiddlerTitle)\n```\n\nIf the target tiddler has a space in its name, that name must be URL-escaped to be detected as a URL:\n\n```\n[link text](#Test%20Tiddler)\n```\n\n! Images\n\nMarkdown image syntax can be used to reference images by tiddler title or an external URI. For example:\n\n```\n![alt text](/path/to/img.jpg \"Title\")\n\n![alt text](Motovun Jack.jpg \"Title\")\n```\n"
        },
        "$:/plugins/tiddlywiki/markdown/wrapper.js": {
            "title": "$:/plugins/tiddlywiki/markdown/wrapper.js",
            "text": "/*\\\ntitle: $:/plugins/tiddlywiki/markdown/wrapper.js\ntype: application/javascript\nmodule-type: parser\n\nWraps up the remarkable parser for use as a Parser in TiddlyWiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar r = require(\"$:/plugins/tiddlywiki/markdown/remarkable.js\");\n\nvar Remarkable = r.Remarkable,\n\tlinkify = r.linkify,\n\tutils = r.utils;\n\n///// Set up configuration options /////\nfunction parseAsBoolean(tiddlerName) {\n\treturn $tw.wiki.getTiddlerText(tiddlerName).toLowerCase() === \"true\";\n}\nvar pluginOpts = {\n\tlinkNewWindow: parseAsBoolean(\"$:/config/markdown/linkNewWindow\"),\n\trenderWikiText: parseAsBoolean(\"$:/config/markdown/renderWikiText\"),\n\trenderWikiTextPragma: $tw.wiki.getTiddlerText(\"$:/config/markdown/renderWikiTextPragma\").trim()\n};\nvar remarkableOpts = {\n\tbreaks: parseAsBoolean(\"$:/config/markdown/breaks\"),\n\tquotes: $tw.wiki.getTiddlerText(\"$:/config/markdown/quotes\"),\n\ttypographer: parseAsBoolean(\"$:/config/markdown/typographer\")\n};\nvar accumulatingTypes = {\n\t\"text\": true,\n\t\"softbreak\": true\n};\n\nvar md = new Remarkable(remarkableOpts);\n\nif (parseAsBoolean(\"$:/config/markdown/linkify\")) {\n\tmd = md.use(linkify);\n}\n\nfunction findTagWithType(nodes, startPoint, type, level) {\n\tfor (var i = startPoint; i < nodes.length; i++) {\n\t\tif (nodes[i].type === type && nodes[i].level === level) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Remarkable creates nodes that look like:\n * [\n *   { type: 'paragraph_open'},\n *   { type: 'inline', content: 'Hello World', children:[{type: 'text', content: 'Hello World'}]},\n *   { type: 'paragraph_close'}\n * ]\n *\n * But TiddlyWiki wants the Parser (https://tiddlywiki.com/dev/static/Parser.html) to emit nodes like:\n *\n * [\n *   { type: 'element', tag: 'p', children: [{type: 'text', text: 'Hello World'}]}\n * ]\n */\nfunction convertNodes(remarkableTree, isStartOfInline) {\n\tlet out = [];\n\tvar accumulatedText = '';\n\tfunction withChildren(currentIndex, currentLevel, closingType, nodes, callback) {\n\t\tvar j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel);\n\t\tif (j === false) {\n\t\t\tconsole.error(\"Failed to find a \" + closingType + \" node after position \" + currentIndex);\n\t\t\tconsole.log(nodes);\n\t\t\treturn currentIndex + 1;\n\t\t}\n\t\tlet children = convertNodes(nodes.slice(currentIndex + 1, j));\n\t\tcallback(children);\n\t\treturn j;\n\t}\n\tfunction wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) {\n\t\treturn withChildren(currentIndex, currentLevel, closingType, nodes, function(children) {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: elementTag,\n\t\t\t\tchildren: children\n\t\t\t});\n\t\t});\n\t}\n\n\tfor (var i = 0; i < remarkableTree.length; i++) {\n\t\tvar currentNode = remarkableTree[i];\n\t\tswitch (currentNode.type) {\n\t\tcase \"paragraph_open\":\n\t\t\ti = wrappedElement(\"p\", i, currentNode.level, \"paragraph_close\", remarkableTree);\n\t\t\tbreak;\n\n\t\tcase \"heading_open\":\n\t\t\ti = wrappedElement(\"h\" + currentNode.hLevel, i, currentNode.level, \"heading_close\", remarkableTree);\n\t\t\tbreak;\n\n\t\tcase \"bullet_list_open\":\n\t\t\ti = wrappedElement(\"ul\", i, currentNode.level, \"bullet_list_close\", remarkableTree);\n\t\t\tbreak;\n\n\t\tcase \"ordered_list_open\":\n\t\t\ti = wrappedElement('ol', i, currentNode.level,'ordered_list_close', remarkableTree);\n\t\t\tbreak;\n\n\t\tcase \"list_item_open\":\n\t\t\ti = wrappedElement(\"li\", i, currentNode.level, \"list_item_close\", remarkableTree);\n\t\t\tbreak;\n\n\t\tcase \"link_open\":\n\t\t\ti = withChildren(i, currentNode.level, \"link_close\", remarkableTree, function(children) {\n\t\t\t\tif (currentNode.href[0] !== \"#\") {\n\t\t\t\t\t// External link\n\t\t\t\t\tvar attributes = {\n\t\t\t\t\t\tclass: { type: \"string\", value: \"tc-tiddlylink-external\" },\n\t\t\t\t\t\thref: { type: \"string\", value: currentNode.href },\n\t\t\t\t\t\trel: { type: \"string\", value: \"noopener noreferrer\" }\n\t\t\t\t\t};\n\t\t\t\t\tif (pluginOpts.linkNewWindow) {\n\t\t\t\t\t\tattributes.target = { type: \"string\", value: \"_blank\" };\n\t\t\t\t\t}\n\t\t\t\t\tout.push({\n\t\t\t\t\t\ttype: \"element\",\n\t\t\t\t\t\ttag: \"a\",\n\t\t\t\t\t\tattributes: attributes,\n\t\t\t\t\t\tchildren: children\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Internal link\n\t\t\t\t\tout.push({\n\t\t\t\t\t\ttype: \"link\",\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tto: { type: \"string\", value: decodeURI(currentNode.href.substr(1)) }\n\t\t\t\t\t\t},\n\t\t\t\t\t\tchildren: children\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"code\":\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: currentNode.block ? \"pre\" : \"code\",\n\t\t\t\tchildren: [{ type: \"text\", text: currentNode.content }]\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"fence\":\n\t\t\tout.push({\n\t\t\t\ttype: \"codeblock\",\n\t\t\t\tattributes: {\n\t\t\t\t\tlanguage: { type: \"string\", value: currentNode.params },\n\t\t\t\t\tcode: { type: \"string\", value: currentNode.content }\n\t\t\t\t}\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"image\":\n\t\t\tout.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttooltip: { type: \"string\", value: currentNode.alt },\n\t\t\t\t\tsource: { type: \"string\", value: decodeURIComponent(currentNode.src) }\n\t\t\t\t}\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"softbreak\":\n\t\t\tif (remarkableOpts.breaks) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: \"br\",\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\taccumulatedText = accumulatedText + '\\n';\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase \"hardbreak\":\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: \"br\",\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"th_open\":\n\t\tcase \"td_open\":\n\t\t\tvar elementTag = currentNode.type.slice(0, 2);\n\t\t\ti = withChildren(i, currentNode.level, elementTag + \"_close\", remarkableTree, function(children) {\n\t\t\t\tvar attributes = {};\n\t\t\t\tif (currentNode.align) {\n\t\t\t\t\tattributes.style = { type: \"string\", value: \"text-align:\" + currentNode.align };\n\t\t\t\t}\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: elementTag,\n\t\t\t\t\tattributes: attributes,\n\t\t\t\t\tchildren: children\n\t\t\t\t});\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"hr\":\n\t\t\tout.push({\n\t\t\t\ttype: 'element',\n\t\t\t\ttag: 'hr',\n\t\t\t});\n\t\t\tbreak;\n\n\t\tcase \"inline\":\n\t\t\tout = out.concat(convertNodes(currentNode.children, true));\n\t\t\tbreak;\n\n\t\tcase \"text\":\n\t\t\t// We need to merge this text block with the upcoming text block and parse it all together.\n\t\t\taccumulatedText = accumulatedText + currentNode.content;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tif (currentNode.type.substr(currentNode.type.length - 5) === \"_open\") {\n\t\t\t\tvar tagName = currentNode.type.substr(0, currentNode.type.length - 5);\n\t\t\t\ti = wrappedElement(tagName, i, currentNode.level, tagName + \"_close\", remarkableTree);\n\t\t\t} else {\n\t\t\t\tconsole.error(\"Unknown node type: \" + currentNode.type, currentNode);\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: currentNode.content\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\t// We test to see if we process the block now, or if there's\n\t\t// more to accumulate first.\n\t\tif (accumulatedText\n\t\t\t&& (\n\t\t\t\tremarkableOpts.breaks ||\n\t\t\t\t(i+1) >= remarkableTree.length ||\n\t\t\t\t!accumulatingTypes[remarkableTree[i+1].type]\n\t\t\t)\n\t\t) {\n\t\t\t// The Markdown compiler thinks this is just text.\n\t\t\t// Hand off to the WikiText parser to see if there's more to render\n\t\t\t// But only if it's configured to, and we have more than whitespace\n\t\t\tif (!pluginOpts.renderWikiText || accumulatedText.match(/^\\s*$/)) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: accumulatedText\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// If we're inside a block element (div, p, td, h1), and this is the first child in the tree,\n\t\t\t\t// handle as a block-level parse. Otherwise not.\n\t\t\t\tvar parseAsInline = !(isStartOfInline && i === 0);\n\t\t\t\tvar textToParse = accumulatedText;\n\t\t\t\tif (pluginOpts.renderWikiTextPragma !== \"\") {\n\t\t\t\t\ttextToParse = pluginOpts.renderWikiTextPragma + \"\\n\" + textToParse;\n\t\t\t\t}\n\t\t\t\tvar wikiParser = $tw.wiki.parseText(\"text/vnd.tiddlywiki\", textToParse, {\n\t\t\t\t\tparseAsInline: parseAsInline\n\t\t\t\t});\n\t\t\t\tvar rs = wikiParser.tree;\n\n\t\t\t\t// If we parsed as a block, but the root element the WikiText parser gave is a paragraph,\n\t\t\t\t// we should discard the paragraph, since the way Remarkable nests its nodes, this \"inline\"\n\t\t\t\t// node is always inside something else that's a block-level element\n\t\t\t\tif (!parseAsInline\n\t\t\t\t\t&& rs.length === 1\n\t\t\t\t\t&& rs[0].type === \"element\"\n\t\t\t\t\t&& rs[0].tag === \"p\"\n\t\t\t\t) {\n\t\t\t\t\trs = rs[0].children;\n\t\t\t\t}\n\n\t\t\t\t// If the original text element started with a space, add it back in\n\t\t\t\tif (rs.length > 0\n\t\t\t\t\t&& rs[0].type === \"text\"\n\t\t\t\t\t&& (accumulatedText[0] === \" \" || accumulatedText[0] === \"\\n\")\n\t\t\t\t) {\n\t\t\t\t\trs[0].text = \" \" + rs[0].text;\n\t\t\t\t}\n\t\t\t\tout = out.concat(rs);\n\t\t\t}\n\t\t\taccumulatedText = '';\n\t\t}\n\t}\n\treturn out;\n}\n\nvar MarkdownParser = function(type, text, options) {\n\tvar tree = md.parse(text, {});\n\t//console.debug(tree);\n\ttree = convertNodes(tree);\n\t//console.debug(tree);\n\n\tthis.tree = tree;\n};\n\nexports[\"text/x-markdown\"] = MarkdownParser;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "parser"
        }
    }
}
Zhiheng Lin's Second Brain
Library
no

/* cyrillic-ext */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWJ0bbck.woff2) format('woff2');
  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
/* cyrillic */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFUZ0bbck.woff2) format('woff2');
  unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* greek-ext */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWZ0bbck.woff2) format('woff2');
  unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVp0bbck.woff2) format('woff2');
  unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFWp0bbck.woff2) format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFW50bbck.woff2) format('woff2');
  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Open Sans';
  font-style: normal;
  font-weight: 400;
  src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v17/mem8YaGs126MiZpBA-UFVZ0b.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
// Imported when using footnote
.tc-drop-down dd {
  max-width: 300px;
  word-break: break;
  white-space: normal;
  margin: 0;
  padding: 0;
}

.tc-drop-down dd a {
  display: inline;
  padding: 0
}

.tc-drop-down dl {
  margin: 0;
}
code {
  background-color: transparent !important;
  border: 0px !important;
}

/* External Link Styles */
button.tc-tiddlylink,
a.tc-tiddlylink,
a.tc-tiddlylink-external,
a.tc-tiddlylink-external:visited  {
  color: <<colour "primary">>;
}

button.tc-tiddlylink:hover,
a.tc-tiddlylink:hover,
a.tc-tiddlylink-external:hover {
  text-decoration: none;
  
  background: linear-gradient(to left,#ff8a00,#da1b60);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

a.tc-tiddlylink-external {
  text-decoration: none;
  border-bottom: dashed 1px red;
}

hr {
    border: none;
    border-bottom: 2px dashed red;
    display: block;
    width: 100%;
    height: 0px;
}

/* Custom Styles */
.onlyice-strong {
  color: <<colour "primary">>;
  font-weight: bold;
  font-size: 125%;
}

/* Tweak Code Blocks without Language Specified */
pre {
  padding: .5em;
  overflow-y: scroll;
}

/* Beautiful background for inline code */
p>code, td>code, li>code {
  padding: 3px;
  background: -webkit-gradient(linear,left top,right top,from(#ffe8cc),to(#f5f5f5));
  background: linear-gradient(to right,#f5f5f5,#ffe8cc);
}

figcaption {
  text-align: center;
	color: #777;
}

/* Table header in red */
table thead tr td, table th {
  background-color: #f04747;
	color: white;
}

/* Prevent word wrap in codeblocks (use horizontal scroll instead) */
pre.hljs, pre.hljs code {
    word-wrap: normal;
    white-space: pre;
}

pre::-webkit-scrollbar-track {
	-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
	background-color  : #F5F5F5;
}

pre::-webkit-scrollbar {
	width: 8px;
  height: 8px;
	background-color: #F5F5F5;
}

pre::-webkit-scrollbar-thumb {
	background-color: #F90;
	background-image: -webkit-linear-gradient(45deg,
			rgba(255, 255, 255, .2) 25%,
			transparent 25%,
			transparent 50%,
			rgba(255, 255, 255, .2) 50%,
			rgba(255, 255, 255, .2) 75%,
			transparent 75%,
			transparent)
}

/* Gradient background for codeblocks */
.hljs, pre {
  background: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(245,245,245,1) 100%);
}

/* Selection */
::selection {
  background-color: #ff385f;
  color: #fff;
  -webkit-text-fill-color: #fff !important;
}

.limit-code-block-height>pre {
  max-height: 400px;
}
/* Box */
/* Usage (in emmet): div.box<Tab> */
.box {
  border: 2px dotted <<colour "primary">>;
	border-radius: 0.5em;
	padding: 0 1em;
	margin-block-end: 1em;
}
.doc-def {
	font-style: normal;
	font-weight: bold;
}

.doc-em {
	font-style: italic;
	font-variant: small-caps;
	text-decoration: none;
}

.doc-strong {
	color: <<colour alert-highlight>>;
	font-style: normal;
	font-weight: bold;
}

.doc-foreign {
	font-style: italic;
}

.doc-place {
	background-color: <<color background>>;
	border: none;
	color: <<color very-muted-foreground>>;
	font-style: normal;
	font-weight: bold;
}

.doc-button,
.doc-tab,
.doc-tag,
.doc-tiddler,
.doc-field,
.doc-value,
.doc-operator,
.doc-var,
.doc-widget,
.doc-attr,
.doc-param {
	background-color: <<color background>>;
	border: none;
	color: <<color very-muted-foreground>>;
	font-weight: bold;
	padding: 0;
}

a .doc-place,
a .doc-button,
a .doc-tab,
a .doc-tag,
a .doc-tiddler,
a .doc-field,
a .doc-value,
a .doc-operator,
a .doc-var,
a .doc-widget,
a .doc-attr {
	color: <<color tiddler-link-foreground>>;
}

.doc-button svg {
	height: 1em;
}

td svg {
	height: 1em;
}

.doc-key {
	color: <<color very-muted-foreground>>;
	font-weight: bold;
}

.doc-clink code {
	color: <<colour tiddler-link-foreground>>;
}

.doc-preamble {
	border: 2px solid <<colour code-border>>;
	color: <<colour very-muted-foreground>>;
	font-size: 90%;
	margin-left: 0;
	padding: 0.5em 0.7em;
}

.doc-note dt {
	color: <<colour very-muted-foreground>>;
}
.doc-note dd {
	border-left: 2px solid <<colour code-border>>;
	padding-left: 0.6em;
}

.doc-example {
	margin: 1em 0;
	padding: 0.8em 0;
}
.doc-example:hover {
	background-color: <<colour code-background>>;
}
.doc-example ul {
	margin-bottom: 0;
	padding-bottom: 0;
	margin-top: 0.2em;
}
.doc-example pre:first-child {
	margin-top: 0;
}
.doc-example-result {
	border-left: 5px solid <<colour blockquote-bar>>;
	border-right: 5px solid <<colour blockquote-bar>>;
	margin-left: 0;
	margin-right: 0;
	padding: 0 10px;
}
.doc-example-result ul {
	margin-left: 0;
	padding-left: 10px;
}
.doc-example-result ol {
	margin-left: 0;
	padding-left: 20px;
}

.doc-table th, .doc-table tr {
	vertical-align: top;
}
.doc-table th a {
	font-weight: bold;
}

tr.doc-table-subheading {
	height: 2em;
	vertical-align: middle;
}

.doc-table.before-tiddler-body {
	margin-top: 2em;
}

.doc-icon-block {
	border-left: 2px solid <<colour code-border>>;
	margin-left: 3em;
	padding-left: 0.6em;
	position: relative;
}
.doc-block-icon {
	position: absolute;
	left: -3em;
	top: 0.2em;
}
.doc-block-icon .tc-image-tip {
	fill: <<colour primary>>;
}
.doc-block-icon .tc-image-warning {
	fill: <<colour alert-highlight>>;
}
.doc-block-icon .tc-image-info-button {
	fill: <<colour primary>>;
}

$:/themes/tiddlywiki/seamless
{
    "tiddlers": {
        "$:/themes/tiddlywiki/seamless/base": {
            "title": "$:/themes/tiddlywiki/seamless/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "list-after": "$:/themes/tiddlywiki/vanilla/base",
            "text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n/*\nRules copied from Snow White\n*/\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected svg {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal-displayed {\n\t<<filter \"blur(4px)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n/*\nSeamless modifications\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t/* Drop the tiddler frame padding */\n\tbody.tc-body .tc-tiddler-frame {\n\t\tpadding: 0;\n\t}\n\n\t/* Move the sidebar up so that the title lines up */\n\tbody.tc-body .tc-sidebar-scrollable {\n\t\tpadding: 43px 0 28px 42px;\n\t}\n\n\t/* Stop the tiddler info panel from bleeding into the tiddler frame padding */\n\tbody.tc-body .tc-tiddler-info {\n\t\tmargin: 0;\n\t}\n\n\t/* Stop message boxes from bleeding into the tiddler frame padding */\n\tbody.tc-body .tc-message-box {\n\t\tmargin: 21px 0 21px 0;\n\t}\n\n}\n\n/* Use the tiddler background colour for the page background */\nhtml body.tc-body {\n\tbackground-color: <<colour background>>;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour background>>;\n}\n\n/* Adjust the colour of the page controls */\nbody.tc-body .tc-page-controls svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n/* Adjust the colour of the sidebar selected tabs */\nbody.tc-body .tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour background>>;\n}\n"
        }
    }
}
{
    "tiddlers": {
        "$:/themes/tiddlywiki/snowwhite/base": {
            "title": "$:/themes/tiddlywiki/snowwhite/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
        }
    }
}
{
    "tiddlers": {
        "$:/themes/tiddlywiki/vanilla/themetweaks": {
            "title": "$:/themes/tiddlywiki/vanilla/themetweaks",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
            "text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
        },
        "$:/themes/tiddlywiki/vanilla/base": {
            "title": "$:/themes/tiddlywiki/vanilla/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  outline-offset: initial;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n        background-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n    border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    left: -50px;\n    top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    right: -80px;\n    bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n  vertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n  font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-sidebar-lists .tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\ttransition:  min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\t\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n  font-style: italic;\n  font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n    height: 1.2em;\n    width: 1.2em;\n    margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg  {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n  fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n  fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n  fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n  fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n  fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n  fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n  fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n  fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n  fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg  {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n    width: auto;\n    margin-bottom: 0px;\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical  {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical  {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical  {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n    display: block;\n    width: 100%;\n    text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n    flex: 1 0;\n    background: <<colour tiddler-editor-background>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n    white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n    background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n    padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n    flex: 3 1;\n    border-left: 0.5em solid <<colour muted-foreground>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n    line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n    font-size: 0.8em;\n    margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n    align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n    margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n    padding: 2px 7px;\n    font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\tfill: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n    margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n    text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n    margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n    vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n::-webkit-file-upload-button {\n\tcursor:pointer;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n    margin: 0;\n    padding: 0;\n    border: none;\n    background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n    \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n    \tlist-style-type: none;\n    \tpadding-left: 0;\n    \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n    \tpadding-left: 1em;    \n}\n\n.tc-tree button { \n    \tcolor: #acacac;\n}\n\n.tc-tree svg {\n     \tfill: #acacac;\n}\n\n.tc-tree span svg {\n    \twidth: 1em;\n    \theight: 1em;\n    \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n    \tcolor: lightgray;\n}\n\nselect {\n        color: <<colour select-tag-foreground>>;\n        background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
            "text": "15px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
            "text": "22px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
            "text": "14px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
            "text": "20px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
            "text": "0px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storytop": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
            "text": "0px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storyright": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
            "text": "770px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
            "text": "770px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
            "text": "686px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
            "text": "960px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
            "text": "350px"
        },
        "$:/themes/tiddlywiki/vanilla/options/stickytitles": {
            "title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
            "text": "no"
        },
        "$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
            "title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
            "text": "fixed-fluid"
        },
        "$:/themes/tiddlywiki/vanilla/options/codewrapping": {
            "title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
            "text": "pre-wrap"
        },
        "$:/themes/tiddlywiki/vanilla/reset": {
            "title": "$:/themes/tiddlywiki/vanilla/reset",
            "type": "text/plain",
            "text": "/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n  -moz-tab-size: 4;\n  tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n  margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n  font-family:\n    system-ui,\n    -apple-system, /* Firefox supports this but not yet `system-ui` */\n    'Segoe UI',\n    Roboto,\n    Helvetica,\n    Arial,\n    sans-serif,\n    'Apple Color Emoji',\n    'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n  height: 0; /* 1 */\n  color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n  text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n  font-family:\n    ui-monospace,\n    SFMono-Regular,\n    Consolas,\n    'Liberation Mono',\n    Menlo,\n    monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n  font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n  text-indent: 0; /* 1 */\n  border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n  -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n  box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n  padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n  display: list-item;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
            "text": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""
        },
        "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
            "text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
            "text": "fixed"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
            "text": "auto"
        },
        "$:/themes/tiddlywiki/vanilla/sticky": {
            "title": "$:/themes/tiddlywiki/vanilla/sticky",
            "text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
        }
    }
}
17px
30px
16px
24px
50px
1050px
1000px
900px
fixed-fluid
no

Monaco, Consolas, "Noto Mono", "Lucida Console", "DejaVu Sans Mono", monospace

"Open Sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", "DejaVu Sans", "Noto Sans CJK", "Microsoft Yahei", sans-serif
zoomin
|!Name |奇特的一生 |
|!Author |[苏] 格拉宁 [译] 侯焕闳 / 唐其慈  |
|!Edition |N/A |
|!Release Date |March, 2001 |
|!ISBN-13 |978-7535021175 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

这本书主要讲了柳比歇夫为了实现他的成就,使用的方法和做的事情。

!! 动机

他是个科学狂,认为科学工作者,不是圣贤和英雄,便是庸人、坏蛋。他崇拜巴扎洛夫,愿意为了自己的事业付出比常人多很多倍的精力。

!! 方法

他重视碎片时间,称之为“时间下脚料”,一切碎片时间都拿来利用。

他觉得应该根据精神状态来选择做什么事情,学什么东西。早晨清醒时看严肃的学术内容,累了就看休闲一点的书。

他把工作划分为两类,第一类为创造性工作,第二类为日常事务,包括做学术报告、讲课、开学术讨论会。除了第一类工作,第二类工作他都竭力按时完成。

柳比歇夫掌握的学科和知识比一般科学家多很多。他用了一种记录时间的办法,在统计他的时间消耗。

他的时间笔记做了非常详细、细分的树状结构,用来分析他在哪一类型的事情中花费的时间。比如:

```
基本科研
   |- 分类工作
   |- 杂事
   |- 校对《达达派研究》
   |- 日常参考书
       |- 陀布尔让斯基《人类的进化》
       |- 亚诺什卡罗埃《动物没有思想》
       |- ...
   |- ...
```

!! 修养和情操

书中描绘了柳比歇夫与其他学者讨论文学作品的书信,以及他和一些其他人交往的故事。可以感受到他们那种讨论的氛围很好,不会一言不合就怎样怎样,有些人虽然偏执,但是也不会一定要别人接受他的观点。

同时描绘了作者在战乱年代的一些生活故事,显示出他并不是只生活在科学世界里的。他也有一般人要过的日常生活。


|!Origin |{{!!web-page-url}} |

 的作者。它在 2016 年检查出患上一种罕见的癌症,基本无法治愈,于是他选择了安乐死。这篇博客文章是他在知道患病后写的。作为一个接近死亡的人谈论如何面对死亡,他的平静和坦诚另人佩服,同时又谈论了一些如何与临终前的人交流的方式。

下文中 Bob 代指要死掉的那个人。

!! 与 Bob 交流的方式

> 此外,不要打电话给他然后在电话上哭,如果你感觉快要哭了,先掛断电话等个十分鐘后再打。流眼泪不是问题,可是对Bob而言,「自怜」比任何其它情绪都更加灰暗。我知道该怎麼主导自己的情绪,但大部分其他Bob们的心灵还是很脆弱的。

这里面的一些描述很中肯。让我想起以前跟临终的人交流时犯了很多错误,没有从他们的角度去思考。这跟我这阵子看李松蔚的「一小时外」有一样的感触。人际交往的过程,多从对方的角度去思考,会让事情进行地更好。思维的懒惰真是无处不在,不区分技能层面的和人际交流层面的。

!! 关于安乐死

> 令我感到震撼的是,都已经是2016年了依然很少国家允许安乐死,强制要求病人承受腐烂的折磨后与无效的急救。安乐死跟癌症特别有关系,因為癌症是主要的死因之一。如果你所属选区的民意代表反对的话,请他抽空让你能跟他游说一下,有尊严地死亡才是正确的方式。

有尊严地死,比痛苦地没有尊严地活着要好得多……

!! 关于小孩

> 我的小孩分别是 12 岁、9 岁、5 岁。没有父亲陪著长大是一件非常不好的事情,但这是现实。但我将活在他们的 DNA 裡面、活在 Youtube 上无尽的会议演讲裡面,活在我的文章裡面。
> 这几年来我已经慢慢地向他们解释很多遍:终有一天我会走,或早或晚。每个人都会死,是的,小 Gregor,你也是呀。那是生命的一部分。
> 小 Gregor,想像你有一盒乐高玩具,你拼了一栋房子,留著它又一直继续拼新的房子,旧的都不拆掉的话会发生什麼事?”盒子会变成空的,爹地”,很好,这就对了,那麼你能继续盖新房子吗?”不可以,不行了” 。嗯,我们就像乐高游戏的房子,死了以后我们会被拆解,就像回到盒子裡,让新的身体可以被生出来,这就是生死之转轮。
> 不过,他们最常看到的是自己的老爸快乐又轻鬆(不是因為止痛剂的缘故),而且好几个礼拜都感觉蛮正常地在跟他们说再见。我好感恩没有突然掛掉,我好感恩没有像植物人那样失去心智。
> 而且我已经告诉我的孩子们要会游泳、骑单车、溜冰跟射击,要会煮东西、要去旅行,要去露营,要会使用新的科技而不必害怕。Gregor 三岁的时候就在玩 Minecraft,左手键盘,右手滑鼠。Noemie 七岁的时候就学会用手枪。他们会讲好几种语言。他们有自信而且学得很快,就跟他们老爸一样。
> 每个人都应该认识死亡的意义。构成一个完整的个体的核心之一就是接纳自己“生命有限”这个真相。当然,我们要為活下去打拼,然而当它要成為过去的时候,我们就拥抱这个终点吧。我很高兴自己能把这门功课亲自传授给孩子们,以前从来没有人会告诉我这些事情。

这个部分写得真是很动情。

---

这阵子接触了他和 Tiddlywiki 的作者,都是老程序员,看他们的内容很有意思,语言平实、经验老练,内容也往往挺有价值。
AAA (Arrange-Act-Assert) pattern 是编写测试用例时的通用模式。

Arrange 表示在执行测试用例前的准备工作,比如新建测试数据库,注入 mock client 等等。大多数测试框架都提供了这种功能:

* [[Jest|https://jestjs.io/docs/en/setup-teardown]] 的 `beforeAll()` `beforeEach()`
* Python [[unitest|https://docs.python.org/3.8/library/unittest.html#unittest.TestCase.setUp]] 中的 `setup()`

Act 则是实际去调用要测试的代码。

Assert 即检查调用结果是否符合预期。


联盟营销。

!! Definitions

它是基于 ''共享利润''(revenue sharing)的想法。

> Affiliate marketing is the process of earning a commission by promoting other people’s (or company’s) products. You find a product you like, promote it to others and earn a piece of the profit for each sale that you make.
> -- [[Pat Flynn's Smart Passive Income|http://www.smartpassiveincome.com/affiliate-marketing-strategies/]]

简单地说,就是通过推销别人的产品获得佣金。但准确的说,联盟营销涉及到多方,生产商品者和营销者同样是这种生意的参与者。它是一个把产品生产和营销分配到多方的商业模式。

!!! The Merchant(商品生产方)

> Sometimes also known as the creator, the seller, the brand, the retailer, or the vendor. This is the party that creates the product. It can be a big company, like Dyson, who produces vacuum cleaners.
> Or, it can be a single individual like Mariah Coz, who sells online courses to female entrepreneurs.

!!! The Affiliate(营销者)

> This party is sometimes also known as the publisher. Affiliates can also range from single individuals to entire companies.  An affiliate marketing business can produce a few hundred dollars in commissions each month or tens of millions of dollars.

典型的业务模式:

* 推荐别人生产的商品,比如 [[这个站|https://www.thisiswhyimbroke.com/new/]] 推荐有趣的小玩意

!!! The Consumer(消费者)

即是消费者。营销者会在多个渠道投放内容,以吸引消费者购买:社交网络、digital billboards、以及通过搜索引擎做博客内容营销。越来越多人选择让用户知道他们是营销网络的一部分;而不是偷偷通过用户的流量赚钱。

!!! The Network(网络)

网络是指提供中间服务的服务商。比如你往往需要有帮你解决收款和送达商品到用户手中的服务。同时一些网络商也往往提供了很多商品供你进行营销。[[Clickbank|http://www.clickbank.com/]] 和 [[Amazon Associates|https://affiliate-program.amazon.com/]] 是好的例子。

!! References

* [[Affiliate Marketing Made Simple: A Step-by-Step Guide - Neilpatel|https://neilpatel.com/what-is-affiliate-marketing/]]
这里的内容主要来自 Neilpatel 的 [[教程|https://neilpatel.com/what-is-affiliate-marketing/]]。他主要侧重于数字产品的分销。

对于你制作的数字产品,可以通过 [[Gumroad|https://gumroad.com/]] 或者 [[Digital Product Delivery|https://getdpd.com/]] 上架。这些平台提供的分销能力可以使其他人参与销售,并且得到利润分成。亦可以自建分销平台,如 [[Tech Interview Pro|https://www.techseries.dev/pages/affiliate]]。

难的部分在于如何找到愿意帮你销售、并且他的观众中有对你产品感兴趣的人。作者举了一些例子,比如如果你卖建沙堡的数字内容,那你可以 Google 到教沙堡的线下团队,让他们在网站上帮你一起做销售。这样做到互补。

一般来说你需要给 50% 甚至更多给到对方。因为数字产品的复制成本极低,因此给对方高一点的分成,对双方都好。比如 [[TechLead|https://www.youtube.com/channel/UC4xKdmAXFh4ACyhpiQ_3qBw]] 和 [[Joma|https://www.youtube.com/channel/UCV0qA-eDDICsRR9rPcnG7tw]] 做的 [[Tech Interview Pro|https://www.techseries.dev/]],在 [[分销协议|https://www.techseries.dev/pages/affiliate]] 上写了分成比例为 50%。


[[Algorithms (Jeff Erickson)]] 对算法给的定义是:

> An algorithm is an ''explicit'', ''precise'', ''unambiguous'', ''mechanically-executable'' sequence of elementary instructions, usually intended to accomplish a specific purpose.

比如要计算两个数字相乘。问题本身包含了输入及预期的输出,算法则是用来表达输入如何变成输出的过程。

输入:存在两个数组 $$X[0..m-1]$$ 和 $$Y[0..n-1]$$ 用来表示数字。

$$x = \displaystyle\sum_{i=0}^{m-1}X[i] \cdot 10^i$$ and $$y = \displaystyle\sum_{j=0}^{n-1}Y[j] \cdot 10^j$$

输出:得到数组 $$Z[0..m+n-1]$$,表示相乘结果。

算法:用加法和单个数字的乘法来计算:

$$x \cdot y = \displaystyle\sum_{i=0}^{m-1}\sum_{j=0}^{n-1}(X[i] \cdot Y[j] \cdot 10^{i+j})$$

上面是精确的数学公式表达。也可以用类似计算机伪码的方表达:

```
FibonacciMultiply(X [0 .. m − 1], Y [0 .. n − 1]):
    hold ← 0
    for k ← 0 to n + m − 1
        for all i and j such that i + j = k
            hold ← hold + X [i] · Y [ j]
        Z[k] ← hold mod 10
        hold ← bhold/10c
    return Z[0 .. m + n − 1]
```

这几个算法的时间复杂度都是 $$O(mn)$$,因为计算量取决于单个数字相乘的次数。


这个条目写字符串的相关算法和设施。

字符串的算法多数跟搜索有关。Wikipedia 的 [[Strings 模板页|https://en.wikipedia.org/wiki/Template:Strings]] 给出了一个与字符串相关的知识结构。

|!Name |Algorithms |
|!Author |Jeff Erickson |
|!Edition |N/A |
|!Release Date |June 13, 2019 |
|!ISBN-13 |978-1792644832 |
|!Medium |电子书 |

作者在 preface 中描述了阅读本书的前置要求(prerequisites)。''这本书不适合作为算法和数据结构的入门书。''它要求懂数学、编程、基础算法、数据结构及分析等。
从算法的定义说起:

> An algorithm is an ''explicit'', ''precise'', ''unambiguous'', ''mechanically-executable'' sequence of elementary instructions, usually intended to accomplish a specific purpose.

讲到算法的历史。算法一词并 ''不是'' 从希腊语词跟 arithmos (meaning "number") 和 algos (meaning "pain") 演化而来,而是由波斯数学家花拉子米演变而来。花拉子米写了《代数学》,细节我没有看。

然后用 [[格子乘法|https://zh.wikipedia.org/wiki/%E6%A0%BC%E5%AD%90%E4%B9%98%E6%B3%95]](Lattice Multiplication)来演示了什么是算法。纪录进 [[Algorithm: Core Concepts]]。

电脑控制手机。

GenyMotion 出了一个工具 [[scrcpy|https://github.com/Genymobile/scrcpy]],可以很方便地在电脑连接真机或者模拟器。支持全平台。常用命令:

```shell
scrcpy --turn-screen-off --stay-awake
```

华为自带的百度输入法无法支持在物理键盘上打中文。''QQ 输入法'' 可以支持,还有五笔输入法。

华为也有工具,可以在电脑上控制华为手机,但仅有 Windows / MacOS 平台。
! Recovery

Android 的主流 recovery 软件有两家:

* [[TWRP|https://twrp.me/]]
* [[ClockworkMod Recovery|http://forum.xda-developers.com/wiki/ClockworkMod_Recovery]]

! Root 后如何进行 OTA 升级?

Root 之后的 Nexus 手机,还是可以收到 Google 官方的 OTA (Over the air) 升级提醒。但是直接升级往往会将 Root 权限丢失,甚至直接升级失败。

[[FlashFire|https://play.google.com/store/apps/details?id=eu.chainfire.flash]] 可以解决这个问题。安装它之后,收到 OTA 升级时不要在系统界面点升级,而是打开这个应用让它帮你做升级。这样 root 权限不会丢失,也不会出现奇怪的问题。
Android Studio 是 Google 基于 JetBrains IntelliJ 基础上做的官方 Android 开发工具。

!! Arch Linux 上安装配置

AUR 中有包,直接安装。

问题比较大的是 HiDPI 问题,在我的 4K 屏幕上有图标的怪异。解决过程参考了 [[JB 的文档|https://intellij-support.jetbrains.com/hc/en-us/articles/360007994999-HiDPI-configuration]]。具体过程:

# Android Studio 中内置的 JDK 是 JDK8,将它换成 JetBrains 维护的 JDK11([[文档|https://intellij-support.jetbrains.com/hc/en-us/articles/206544879-Selecting-the-JDK-version-the-IDE-will-run-under?page=3]]):
## 安装「Choose Runtime」插件
## 运行它,选择如 `jbrsdk-11_0_9_1-linux-x64-b1207.1` 的 JDK 进行安装
## 安装完后 IDE 会自动重启,在 Help => About 中看看是否应用上
##* 如果没应用上,是 Google 写的启动脚本(`/opt/android-studio/bin/studio.sh`)有 bug,打开它进行修改:<div>

```bash
# 定位到这两行:
if [ -z "$JDK" -a -s "${XDG_CONFIG_HOME:-$HOME/.config}/Google/AndroidStudio4.1/studio.jdk" ]; then
  USER_JRE=`"$CAT" $HOME/.AndroidStudio4.1/config/studio.jdk`

# 修改成:
if [ -z "$JDK" -a -s "${XDG_CONFIG_HOME:-$HOME/.config}/Google/AndroidStudio4.1/studio.jdk" ]; then
  USER_JRE=`"$CAT" ${XDG_CONFIG_HOME:-$HOME/.config}/Google/AndroidStudio4.1/studio.jdk`
```

这样启动时才会使用 `studio.jdk` 中定义的 JDK(也就是 Choose Runtime 插件设置的)来运行。重启 IDE,观察是否用上新的 JDK。

</div>
# 点击 Help => Edit Custom VM Options...,写入下面两行:<div>

```
-Dsun.java2d.uiScale.enabled=true
-Dsun.java2d.uiScale=2
```

文档说 `-Dsun.java2d.uiScale` 可以支持浮点数,但实测不行。用 2 有点大,但是比不用好。

重启 IDE 观察效果。

</div>
!! God object

> In object-oriented programming, a god object is an object that knows too much or does too much. - [[Wikipedia|https://en.wikipedia.org/wiki/God_object]]

God object 指的是面向对像编程里面,一个类的职责太多,包含的数据太多。这样会使得这个类全知全能,与代码各模块耦合太多,难维护等。

好的策略是使用分治的方法,把类按职责拆分成多个小的类。
服务网关,API 网关。

|!Name |Advanced Programming in the UNIX® Environment |
|!Author |W. Richard Stevens, Stephen A. Rago |
|!Edition |3rd |
|!Release Date |May 14, 2013 |
|!ISBN-13 |978-0-321-63773-4 |
|!Medium |电子书 |

!! 1.2 UNIX Architecture

{{unix-architecture}}

!! 1.3 Logging In

!!! Login Name

`/etc/passwd` stores:

* login name
* user id
* group id
* etc.

!!! Shell

Explains availability of different shell in different UNIX systems, and their different features and history.

!! 1.5 Input and Output

!!! Unbuffered I/O v.s. Standard I/O

Functions:

|                |Functions          |Header file |
|Unbuffered I/O |read, write, etc   |`unistd.h`   |
|Standard I/O   |scanf, printf, etc |`stdio.h`    |

By using Standard I/O, you don't need to maintain buffer by yourself.

!! 1.6 Programs and Processes

!!! Process Control

Three primary functions: `fork`, `exec`, `waitpid`. (Didn't explain further)

!! 1.7 Error Handling

The file `errno.h` defines the symbol `errno` and many error constants.

`man 3 errno` describes the meanings of error constants.

`errno` is never set to 0, so you should examine its value only when the return value from a function indicates that an error occurred.

Helper functions:

|Signature                    |Header file |
|char *strerror(int errnum)   |`string.h`  |
|void perror(const char *msg) |`stdio.h`   |

`strerror`:
This function maps `errnum`, which is typically the `errno` value, into an error message and returns a pointer to the string.

`perror`:
It outputs the string pointed to by `msg`, followed by a colon and a space, followed by the error message corresponding to the value of `errno`, followed by a newline.

!! 1.10 Time Values

# Calendar time, also called Epoch time, start from 1970/01/01 00:00:00
# Process time, also called CPU time, measured in clock ticks, which have been 50, 60, or 100 ticks per second.

Unix System maintains three values for a process:

* Clock time
* User CPU time
* System CPU time

```bash
$ cd /usr/include
$ time -p grep _POSIX_SOURCE */*.h > /dev/null
real 0m0.81s
user 0m0.11s
sys 0m0.07s
```

!! 1.11 System Calls and Library Functions

{{system-calls-and-library-functions}}
这章主要讲了 Unix 相关标准,以及一些限制。

!! 2.2 Unix Standardization

这里涉及的几个重要规范是:

# ISO C
# IEEE POSIX
# The Single UNIX Specification

!! 2.2.1 ISO C

C 语言的规范是 ANSI 在 1989 年发布的,所以 C89 也被称作 ANSI C。一年后 ISO 收纳了这份 C 标准,有了 C90 跟 ISO C 的说法。C89 跟 C90 指的是同一份规范。这之后还有 C95, C99, C11,Wikipedia 上的 [[ANSI C|https://en.wikipedia.org/wiki/ANSI_C]] 有简要描述。

现阶段最新的 gcc 6.1 默认使用的 C 语言规范是 `gnu11`,即 GNU dialect of ISO C11。默认的 C++ 规范是 `gnu++14`,即 GNU dialect of `-std=c++14`。([[来源|https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/C-Dialect-Options.html]])

!! 2.2.2 IEEE POSIX

Portable Operating System Interface (POSIX) 定义了操作系统的接口需要实现什么功能。由 IEEE 维护,一开始制订时基于 Unix 系统,但是不限制在 Unix 上。

POSIX 一开始是指 IEEE Standard 1003.1-1988。这个规范又被称作 POSIX.1。这个规范也是这本书内容所涉及的规范。同时这个规范包含了 C 语言的规范。

满足这个规范的操作系统实现,被称作 POSIX compliant。貌似大部分主流操作系统是 POSIX compliant 的(但是不重要,反正你在 Unix/Linux 平台编程时,程序是相对容易在各个操作系统间移植的;而为 Windows 写的程序往往用途不一样,没有必要与 Linux 程序在代码上兼容)。

POSIX 的后续发展可以参考 [[Wikipedia 页面|https://en.wikipedia.org/wiki/POSIX]]。

<<.tip 'POSIX 只定义了接口规范,但是没定义实现规范,所以不同的 POSIX compliant 系统(如 Linux 和 Windows)可能有不同的系统 API。'>>

!! 2.2.3 The Single UNIX Specification

The Single Unix Specification (SUS) 是 POSIX 的超集,定义了一些额外的功能(如文件同步、进程线程间同步等),由 The Open Group 维护。

SUS 定义了 X/Open System Interfaces (XSI),实现了 XSI 的操作系统叫作 XSI conforming。The Open Group 持有 UNIX 的商标,只有遵守 SUS 规范(即也实现了 XSI)的操作系统,才可以被称作 UNIX 操作系统。它的发展历史,参考 [[Wikipedia 页面|https://en.wikipedia.org/wiki/Single_UNIX_Specification]]。

!! 2.3 Unix System Implementations

这部分很复杂,而且不重要,在 Wikipedia 上找了张图:

{{unix-history-simple.svg}}

!! 2.5 Limits

规范定义了一些限制。主要分为编译期知道的,比如一个 short 整形的最小取值;和运行期知道的,如文件名最长可以是多少字节(跟文件系统 (ext2, ext4, etc) 相关)。为了解决这个问题,规范定义了三种类型的限制:

# 编译期知道的限制(通过头文件)
# 跟文件/目录无关的,运行期知道的限制(通过 `sysconf` 函数)
# 跟文件/目录相关的,运行期知道的限制(通过 `pathconf` 函数)

简单的说:ISO C 定义了数值类型相关的限制,POSIX.1 定义了操作系统相关的限制。XSI 的限制,不是太受关心。

!!! 2.5.1 ISO C Limits

ISO C 定义的编译期限制都放在 `<limits.h>` 头文件中。定义这些限制的目的,应该是让不同的系统(主要跟 CPU 相关,有不同的整型长度)可以用上补码运算(one's complement)。

{{integer-value-limits}}

留意其中比较奇怪的,是 `CHAR_MIN` 跟 `CHAR_MAX` 的值。对于一个提供 signed char 的系统(如 Linux),`CHAR_MIN` 跟 `SCHAR_MIN` 一样,`CHAR_MAX` 跟 `SCHAR_MAX` 一样;而对于一个提供 unsigned char 的系统(如 [[IBM AIX 6.1|https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.files/limits.h.htm]]),`CHAR_MIN` 则跟 `UCHAR_MIN` 一样,`CHAR_MAX` 同理。

浮点数的限制定义在 `<float.h>`。

POSIX.1 对 C 规范做了扩展,要求:

* INT_MAX >= 2,147,483,647
* INT_MIN <= -2,147,483,647
* UINT_MAX >= 4,294,967,295
* CHAR_BIT == 8,SCHAR_MIN == -128,SCHAR_MAX == 127,UCHAR_MAX == 255

ISO 还定义了几个限制。`FOPEN_MAX` 定义了一个进程同时可以打开的文件数,`TMP_MAX` 定义了 `tmpnam` 创建的临时文件的文件名长度限制,`FILENAME_MAX` 定义了文件名的长度限制,但是没什么用,因为 POSIX.1 定义了更好的 `NAME_MAX` 和 `PATH_MAX`。一般不需要关注他们,因为你不会遇到这些问题。

{{iso-limits-on-various-platforms}}

!!! 2.5.2 POSIX Limits

POSIX.1 定义了一些限制。

{{posix-1-mininum-values-limits}}

但是这些限制存在的问题是,它有些值太小了不适合使用(比如 `_POSIX_OPEN_MAX` 才 20 个),而且大多数的 UNIX 系统都提供了更大的限制值。因此这表中 25 个值中,都存在一个跟本地系统相关的限制值。其中大部分(并不保证全部都有本地限制)定义在 `<limits.h>` 中,名称是其 POSIX 对应名去掉 `_POSIX_` 前缀,如 `_POSIX_OPEN_MAX` 的 local limit 定义为了 `OPEN_MAX`。

<<.tip "可以通过 `/usr/include/limits.h` 文件为入口,一层层看到上面提到的变量。">>

!!! 2.5.3 XSI Limits

We don't care.

!!! 2.5.4 `sysconf`, `pathconf`, and `fpathconf` Functions

```c
#include <unistd.h>
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathconf(int fd, int name);

All three return: corresponding value if OK, −1 on error (see later)
```

`sysconf` 的参数基本上是相关的 POSIX.1 限制名(2.5.2)加上 `_SC_` 前缀,如 `_SC_ARG_MAX`, `_SC_OPEN_MAX`;`pathconf` 和 `fpathconf` 是相应限制名加上 `_PC_` 前缀。

关于返回值:

# 如果 `name` 不是合适的值,这些函数返回 `-1` 并设 `errno` 为 `EINVAL`
# 有一些 `name` 会返回该值不可知(indeterminate),体现在返回 `-1` 但是不改变 `errno` 的值
# `_SC_CLK_TCK` 的返回值被用于与 `times` 系列函数一起使用(8.17 节详述)

<<.tip "编程实现上(参考书中代码例子),应该在调用这类函数前,先将 `errno` 设为 0,再判断调用后的 `errno`。">>

对于 `pathconf` 和 `fpathconf` 有一些限制如果不被满足,那么返回结果是未定义的;比如 `_PC_MAX_CANON` 和 ` _PC_MAX_INPUT` 的文件对象必需是个 terminal。这些使用时查阅即可。

<<.warning "这里得到的有些限制值被发现有不正确的。比如在 Linux 上,`SYMLOOP_MAX` 返回值为无限制,但是代码文件里面写死了软链接在不为循环的情况下遍历的最高次数为 40。同时在 Linux 下,如果 glibc 库不认识你的文件系统,那么 `pathconf` 和 `fpathconf` 得到的值只是 “educated guess”。">>

{{examples-of-configuration-limits}}

总而言之,''获取一个限制值的办法是'':

# 定义在 `limits.h` 中,去掉 `POSIX_` 前缀的常量,比如 `OPEN_MAX`
# 如果 `limits.h` 中无定义相应的常量或者其值为 -1,使用 `sysconf` 或者 `pathconf` 拿到的值,如 `sysconf(_SC_OPEN_MAX)`;如果 `limits.h` 中的常量的值为 0,必须用 `sysconf` `pathconf` 判断这个常量是否受到支持
# 如果上一步的函数调用拿不到值,给一个猜测的值
# `POSIX_` 前缀的相应常量值,是对这个限制的最高要求,实际场景一般不使用

!!! 2.5.5 Indeterminate Runtime Limits

有一些限制可能在运行时仍不可知。书里举了两个例子,`PATH_MAX` 和 `OPEN_MAX`。

如果你需要为 `getpwd` 这类函数分配内存空间时,你需要关注路径的最大长度是多少,即 `PATH_MAX` 变量。`PATH_MAX` 存在的问题是:

# `PATH_MAX` 有可能不存在在 `<limits.h>` 中,这时我们需要调用 `pathconf`
# `pathconf` 获取 `PATH_MAX` 时返回的是相对路径的最大长度,因此我们需要传入根路径,再对返回结果加 1
# 如果 `pathconf` 获取不到值,我们只能给一个猜想的值
# POSIX.1 2001 版本前,并没有规定 `pathconf` 返回的值中是否包含最后的空字符;Single UNIX Specification 有指明需要

作者写了一段程序用来获取绝对路径的最长长度,值得参考。

`OPEN_MAX` 的使用场景,出现在一个后台进程需要关闭全部文件时。有些人假设 `<sys/param.h>` 中存在 `NOFILE`(not portable),写了这样的程序:

```c
#include <sys/param.h>
for (i = 0; i < NOFILE; i++)
    close(i);
```

还有人用 `<stdio.h>` 中定义的 `_NFILE`。这些都是不可移植的。正确的做法类似上一例子,优先用定义了的宏(`OPEN_MAX`),如果不存在用 `pathconf`,如果 `pathconf` 无法确定,那就用我们猜的值。

在 `OPEN_MAX` 不受限制的情况下(比如你用 `ulimit` 修改了它),Linux 会返回 `LONG_MAX`。作者觉得这是个不好的实践,因为会导致上面的程序尝试关闭 2,147,483,647 个文件描述符,浪费一堆 CPU。

支持 `getrlimit` 的系统(XSI conforming),可以使用这个函数获取一个进程可打开的最大文件数,效果同作者 figure 2.17 里写的程序类似。

!! 2.6 Options

这节主要讲了一些选项(Option),他们的值用来表示系统是否支持这种功能。比如 `_PC_NO_TRUNC` 为 -1 时表示系统不支持这个功能,大于 0 时表示文件名大于 `NAME_MAX` 时会产生错误。有一些选项(如 `_POSIX_READER_WRITER_LOCKS`)的值是 200809L,表示是 POSIX1.2008 规范加进来的功能。

`_SC_VERSION` `_SC_XOPEN_VERSION` 分别可以看系统支持的 POSIX 规范版本、XSI 功能对应的 SUS 规范的版本。

!! 2.7 Feature Test Macros

一些系统实现可能会定义除了 POSIX、XSI 以外,自己的常量定义。如果想让程序不依赖这些常量定义,可以在编译时指定变量 `_POSIX_C_SOURCE` ,比如 `cc -D_POSIX_C_SOURCE=200809L file.c` 表示 `file.c` 遵守 POSIX.1 规范。同样的 XSI 规范对应的变量是 `_XOPEN_SOURCE`。

!! 2.8 Primitive System Data Types

POSIX 定义了一些数据类型,用来表示某种特殊的含义。比如 `size_t` 可以用来表示字符串长度。这样做的目的是为了让写程序的不需要去关心具体的数据大小,比如你要存一个字符串长度,你不需要去考虑用 `unsigned short` 还是 `unsigned int`,你只需要直接用 `size_t` 就好了。你也不需要去知道 `size_t` 表示多大的数据范围。同时 `size_t` 可能在不同的系统上有不同的数据范围。

{{primitive-system-data-types}}

!! 2.9 Differences Between Standards

ISO C 与 POSIX 规范有冲突时,POSIX 规范会尊重 ISO C。绝大多数是没有冲突的,但是也有一些小情况有冲突。比如对于 `clock_t`,ISO C 函数 `clock` 返回一个进程所使用的 CPU 时间,你需要拿他除以 `CLOCKS_PER_SEC` 来表示使用了多少秒;但是对于 POSIX 的 `times` 系列函数,返回的值需要除以 `sysconf` 获取的 clock ticks per second 值来表示使用了多少秒。这里不同的 per second 值可能导致 `clock_t` 的单位不一样。
这章主要讲 Unbuffered I/O,文件系统的原子操作,以及操作系统内核是如何维护相关数据结构的。

!! 3.3 `open` and `openat` Functions

```c
#include <fcntl.h>
int open(const char *path, int oflag, ... /* mode_t mode */ );
int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ );
// Both return: file descriptor if OK, −1 on error
```

`oflags` 可以是多个 flag 用或操作组合起来。但是对于下面 5 个选项,你必须提供其中之一:

* `O_RDONLY`: 0
* `O_WRONLY`: 1
* `O_RDWR`: ''2''
* `O_EXEC`: 3
* `O_SEARCH`: 4 (绝大多数系统没有实现它)

其他选项大多数是一些控制功能,比如文件不存在时创建文件(`O_CREAT`),再比如如果目标不是目录抛出错误(`O_DIRECTORY`)。有几个 `SYNC` 变量需要留意下:

* `O_SYNC`:`write` 请求会在物理 I/O 完成后,数据跟文件属性都更改后返回
* `O_DSYNC`:`write` 请求会在写数据的物理 I/O 完成后返回,并且如果文件属性的改动不会影响到读取刚写入的数据,则不会等文件属性更新好再返回
* `O_RSYNC`:使 `read` 请求在其读取的文件区域的 pending write 做完后返回。这个选项比较特殊,各系统的实现不一样。比如 Mac OSX 没有实现这个选项,Linux 把它当作与 `O_SYNC` 等同。

其他选项,有需要时再查就好了。

`openat` 的含义是,在 `fd` 这个路径上打开 `path` 文件。它的应用场景在:

# 可以实现 a per-thread "current working directory"。多线程程序拥有同样的 working directory,在一个线程中更改 working directory 时会影响到其他线程。所以可以给每个线程单独分配一个目录的 `fd`,然后用 `openat` 函数相对于这个 `fd` 打开文件,就能实现一个线程一个“工作目录”了。([[Reference|https://stackoverflow.com/questions/35478448/why-is-openat-needed-to-avoid-a-two-step-race-condition-with-stat-and-then-ope]])
# 避免 time-of-check-to-time-of-use (TOCTTOU) 错误。书中没有详细说明,但是我发现一个 [[StackOverflow 问题|http://stackoverflow.com/questions/36708171/how-can-openat-avoid-tocttou-errors]] 指出了原因。如果用 `openat`,打开的文件始终是相对于 `fd` 对应的目录的,无论这个目录是否被外部改名或者移动了;如果不用 `openat`,那么有可能你检查目录权限后,这个目录被移走了,后续的文件写入就失败了。这同时可以避免一些安全问题。

!! 3.4 `creat` Function

`creat` 函数等同于 `open(path, O_WRONLY | O_CREAT | O_TRUNC, mode)`。这个函数现在没什么用了,它出现的原因是一些老的系统的 `open` 函数没法创建函数,所以需要 `creat` 函数来创建文件。

!! 3.5 `close` Function

调用 `close` 会释放纪录锁(record lock)。进程结束时,内核会把它打开的文件描述符全部关掉。

!! 3.6 `lseek` Function

每个打开的文件描述符,都有一个对应的当前文件偏移(current file offset),表示 `write` 请求在文件的哪个位置写入。`lseek` 可以修改这个文件偏移值。`lseek` 函数会返回新的文件偏移值,所以可以用来判断文件大小(not sure whether it's best practice);失败会返回 -1,可以用来判断 `fd` 是不是 not seekable 的,比如 pipe, FIFO, socket 是 not seekable 的,`lseek` 会返回 -1 并设 `errno` 为 `ESPIPE`。

`lseek` 可以修改文件偏移到比当前文件大小更大的值,然后写入数据会造成空洞。空洞不会占用磁盘空间,被 `read` 时返回的是 0。

`read` 跟 `write` 函数都会使文件偏移值增大。

!! 3.7 `read` Function

```c
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);
// Returns: number of bytes read, 0 if end of file, −1 on error
```

没有太多复杂的东西。需要留意的一点是,`read` 读到的内容长度(也就是它的返回值)不一定等于 `nbytes`,比如读到文件末、或者向网络或者终端读的时候。

!! 3.8 `write` Function

Nothing special.

!! 3.9 I/O Efficiency

作者用 `read` 函数不同的 `nbytes` 值,实验了在一个 4K 对齐的文件系统内读一个大文件。结论是 `nbytes` 为 4096 时性能最佳。同时由于一些文件系统有一些 read-ahead 的机制来提升性能,所以 `nbytes` 大到了 32 字节后,性能基本上跟 4096 时差别不大。

!! 3.10 File Sharing

这节主要讲了文件在内核中用怎样的数据结构来表示。这样可以引入不同的进程是如何读写同个文件的。

[img[kernel-data-structure-for-open-files]]

* Process table 保存 file descriptor flags,比如 close-on-exec
* File table 保存 file status flags,比如 read, write, append, sync 和 nonblocking,同时保存当前文件偏移
* v-node 是在 VFS (Virtual File System) 层引入的概念,用的是封装不同文件系统的差异;i-node 的实现文件系统相关的,但是它的数据结构在不同的文件系统间通用

这个图说明了,不同的进程是可以打开同个文件的,因为他们的 process table 和 file table 不一样。同时在一个进程内,可以有多个 fd 指向同一个文件(`dup` 函数,后面有讲);`fork` 出来的子进程拥有和父进程一样的 process table、file table。

另外,`O_APPEND` 选项会使每次 `write` 时,内核会帮你 `lseek` 到文件末尾再写入,同时保证这个过程是原子的,保证了多进程写同一个文件时,内容不会被写乱。

!! 3.11 Atomic Operations

The Single UNIX Specification 提供了两个函数用来做原子读写:`pread`, `pwrite`。这两个函数可以保证 “`lseek` 到文件某个位置后进行读写操作” 这个过程是原子的,并且调用完后不会修改 current file offset。

<<.tip "这两个函数接口没有提供类似 `lseek` 的 `whence` 参数(`SEEK_SET`, `SEEK_CUR`, `SEEK_END`),因为它是不必要的。可以思考下为什么。">>

另外一个涉及原子操作的场景,是在创建文件时。为 `open` 同时指定 `O_CREAT` 和 `O_EXCL` 时,如果文件已存在会报错。但是这种情况下,“判断文件是否已经存在”和“创建文件”这两个过程是一起(atomic)被执行的。如果你想实现“文件不存在时则创建它”,那么你应该用这两个参数。

<<.tip "对于 Python 来说如何解决这个问题呢?Python 3.3 以前,可以使用 `os.open()`,它提供了与 C 函数 `open()` 一样的接口;3.3 及以后,可以内置函数 `open()`,它提供了一个 `x` 模式,作用是一样的。参考这个 [[StackOverflow 问题|https://stackoverflow.com/questions/10978869/safely-create-a-file-if-and-only-if-it-does-not-exist-with-python]]。">>

!! 3.12 `dup` and `dup2` Function

```c
#include <unistd.h>
int dup(int fd);
int dup2(int fd, int fd2);
// Both return: new file descriptor if OK, −1 on error
```

{{kernel-data-structures-after-dup}}

这两个函数,可以复制出一个新的 fd,指向一样的 file table。区别在于,新的 fd 的 `FD_CLOEXEC` 会被清掉(`dup2` 只在 `fd` 不等于 `fd2` 时清掉)。

对于 `dup2`,如果 `fd2` 已经存在并且不等于 `fd`,则会先被 `close()` 掉;如果相等,则什么都不做就返回 `fd` 值。

`dup(fd)` 等价于 `fcntl(fd, F_DUPFD, 0)`;`dup2(fd, fd2)` 近似等价于 `close(fd2); fcntl(fd, F_DUPFD, fd2)`,区别在于 `dup2` 是原子的,并不会把 `close()` 和 `fcntl()` 拆开做,同时有一些 `errno` 不一样。

!! 3.13 `sync`, `fsync`, and `fdatasync` Functions

大部分 UNIX 系统内核提供了 buffer cache 机制。buffer cache 是一块存在在内存中,并且不会被换出的缓存。它用来作为硬盘或者其它低速设备的内容缓存。比如你对硬盘的写入,可能会被缓存起来而不是马上写入硬盘,同时操作系统有可能把小的写入操作组合成大的操作;同时你读取的文件内容如果在 buffer cache 中,那么内核可以直接给你而不需要读硬盘。[[据说|http://osr507doc.xinuos.com/en/PERFORM/buffer_cache.html]] buffer cache 可以减少 85% 的磁盘 IO。

调用 `sync` 会告诉系统,尽快把 buffer cache 里的改动写到磁盘里,但是它不等数据写完后返回,而是马上返回,所以没什么卵用(参考 [[这个回答|http://stackoverflow.com/a/26014504/1189076]] 的评论)。`fsync` 和 `fdatasync` 是针对某个 fd 的,它会等到 buffer cache 中的数据写完再返回;区别在于 `fdatasync` 不会等文件的属性被更新再返回。

!! 3.14 `fcntl` Function

```c
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */ );
// Returns: depends on cmd if OK (see following), −1 on error
```

五个功能:

# Duplicate an existing descriptor (cmd = F_DUPFD or F_DUPFD_CLOEXEC)
# Get/set file descriptor flags (cmd = F_GETFD or F_SETFD)
# Get/set file status flags (cmd = F_GETFL or F_SETFL)
# Get/set asynchronous I/O ownership (cmd = F_GETOWN or F_SETOWN)
# Get/set record locks (cmd = F_GETLK, F_SETLK, or F_SETLKW)

其中第四、五项暂时没有细讲,只说了前三个。

如果要判断某个 fd 以什么访问模式打开,需要用 `F_GETFL` 的结果与 `O_ACCMODE` 做与运算,再看结果是 `O_RDONLY` 还是 `O_WRONLY`, `O_RDWR`。原因很简单。

留意使用 `F_SETFL` 前要先 Get 出来,避免把已有的 flag 给干掉了。

书中给出了一个使用 `fcntl` 的场景,比如你的程序读的是标准输入进行,但是提供把标准输入重定向到文件的,又是 shell 做的。所以你没有机会在 `open()` 时指定 flag(是 shell 打开的文件)。这时候你可以用 `fcntl` 改变文件 flag。

文中又对 `O_SYNC` 做了实验,显示 Linux 下使用 `fcntl` 设置 `O_SYNC` 是无效的。然后使用 `O_SYNC` / `fsync` / `fdatasync` 这些方式写文件,消耗的时间跟系统实现很相关,并不如你预测的那样。

!! 3.15 `ioctl` Function

这些函数主要是 Terminal I/O 在用,不需要怎么关注。

!! 3.16 `/dev/fd`

主要用在命令行上,`/dev/fd/0` 表示标准输入,`/dev/fd/1` 表示标准输出等等,如:

```cmd
$ filter file2 | cat file1 /dev/fd/0 file3 | lpr
```

在大部分系统中,程序中 `open("/dev/fd/13", mode)` 相当于 `dup(13)`,`mode` 参数被忽略;但是 Linux 的实现机制不太一样,它的 `/dev/fd/n` 是个软链接到具体文件,所以 `mode` 还是生效的。
这一章有很多类似的函数:

* `stat`, `fstat`, `fstatat`, `lstat`
* `chmod`, `fchmod`, `fchmodat`
* `chown`, `fchown`, `fchownat`, `lchown`

依次是:

* 无任何前缀后缀,对一个路径做操作
* 带 `f` 前缀,对一个 fd 做操作
* 带 `f` 前缀,`at` 后缀,对一个 fd 的相对路径做操作
* 带 `l` 前缀,对软链接做操作

!! 4.2 `stat`, `fstat`, `fstatat`, and `lstat` Functions

```c
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf );
int fstat(int fd, struct stat *buf );
int lstat(const char *restrict pathname, struct stat *restrict buf );
int fstatat(int fd, const char *restrict pathname,
struct stat *restrict buf, int flag);
// All four return: 0 if OK, −1 on error
```

* `stat` 的对象如果是个软链,会跟过去;`lstat` 则不会,读的是软链本身
* `stat`, `lstat` 的参数是个路径字符串,而 `fstat` 是个 fd;同时 `fstat` 无法读取一个软链,因为 `open` 无法打开一个软链本身
* `fstatat` 类似 `openat`,跟相对路径有关

!! 4.3 File Types

# Regular file
# Directory file
# Block special file: 提供带缓冲的 I/O 访问,例如磁盘设备
# Character special file: 提供不带缓冲的 I/O 访问,例如终端设备。所有设备,要么是 block 要么是 character
# FIFO: 也称命名管道 named pipe
# Socket
# Symbolic link

可以用 `<sys/stat.h>` 中提供的宏,通过 `stat` 结构的 `st_mode` 参数判断一个文件是什么类型的。比如 `S_ISLNK(s.st_mode)`。

!! 4.4 Set-User-ID and Set-Group-ID

一个 ''进程'' 有这些 ID 跟它相关:

|real uid, real gid |who we really are |
|effective uid, effective gid, supplementary gid |used for file access permission check |
|saved set-user-ID, saved set-group-ID |saved by `exec` functions |

* real uid / gid
** 这两个 id 就是你的 uid, gid
** 不能被改变 <<footnote "[1]" "除了 `sudo` 类应用">>
* effective uid / gid
** 一般跟 real uid / gid 是一样的
** 被系统用来做文件访问权限检查(下一节讲)
** 假如进程的可执行文件被设上了 set-user-ID / set-group-ID 位,那么这两个 ID 就是文件的 owner uid / gid,而不是你自己了
** `passwd(1)` 是个例子,因为它改密码时需要修改一些 root 的文件。可以用 `stat /usr/bin/passwd` 看看
* supplementary gid 在下一节讲
* saved set-user-ID, saved set-group-ID 在第 8 章讲

!! 4.5 File Access Permissions

前面讲到的 7 种类型的文件,都有 3 组权限:(user / group / other) x (read / write / execute)。对于不同类型的文件,read / write / execute 这三个动作有不同的语义。

这里面主要讲了文件和目录的访问权限。文件的访问权限比较简单,目录的比较复杂。书里讲得不够简练,[[ArchWiki|https://wiki.archlinux.org/index.php/File_permissions_and_attributes]] 中的条目更好:

{{ file-permissions }}

需要留意的有:

# `open(2)` / `stat(2)` 一个文件时,会对文件路径做 path resolution,你需要有路径的每一个 component 目录的执行权限。比如对于 `/usr/include/stdio.h`,你需要 `/`, `/usr`, `/usr/include` 三者的执行权限。
# 就算你 `open(2)` 的是一个当前目录下的文件,也需要当前目录的执行权限。`vim README.txt` implies `vim ./README.txt`。
# 目录的执行权限很重要,如果对一个目录没有执行权限,那你基本上什么事情都做不了,包括读 / 写这个目录里的文件,创建 / 删除这个目录中的文件等等,`ls` / `rm` 都将不工作。这些命令往往会使用 `stat` 函数,而这导致需要做 path resolution,从而使内核去检查目录的执行权限。

内核怎样判断一个进程是否可以对文件做操作呢?

# 如果你的 effective user id 是 root,啥都可以做
# 如果你的 effective user id 跟文件的 owner id 一样,那么看文件权限的 user 部分
# 如果你的 effective group id / supplementary group id 跟文件的 group id 一样,那么看文件权限的 group 部分
# 上面都不满足,那看 other 部分

!!! `setuid` and `setgid`

一个文件 / 目录可以被打上 `setuid` ("set user ID upon execution")和 `setgid` ("set group ID upon execution")位。`chmod` 命令行可以做这个事情:

```bash
$ chmod u+s test
$ ls -l test
-rwSr--r-- 1 onlyicelin users 0 2016-10-31 21:22 test
$ chmod +x test
$ ls -l test
-rwsr--r-- 1 onlyicelin users 0 2016-10-31 21:22 test
```

留意上面 `ls` 输出结果中,有大写的 `S` 和小写的 `s`。大写的 `S` 表示 `setuid` 位被置上,但是执行权限没有被置上;这表示 `setuid` 位基本上是无用的。小写的 `s` 表示两个位都有被置上。

!! 4.6 Ownership of New Files and Directories

POSIX.1 要求,一个进程创建新文件时,新文件的 user ID 需要是进程的 effective user ID,而 group ID 可以在以下两种任选一种:

# 进程的 effective group ID
# 新文件所在的文件夹的 group ID

对于 Linux 来说(参考 `man 2 chown` 中的 Ownership of new files):

# 如果文件系统被 mount 上时置了 `grpid` 选项,那么新文件的 group ID 为所在文件夹的 group ID;
# 如果文件系统被 mount 上时置了 `nogrpid` 选项,而且所在文件夹被置上了 `setgid` 位,那么新文件的 group ID 就是所在文件夹的 group ID
# 非上述两种情况,为进程的 effective group ID

!! 4.7 `access` and `faccessat` Functions

内核判断一个进程对文件的权限是看 effective user/group ID,而 `access` 和 `facessat` 提供了让进程判断自身的 real user/group ID 有无访问某文件的能力。这两个函数很少需要被用到。

!! 4.8 `umask` Function

`umask` 函数可以改变一个进程创建文件时的文件访问权限。你用 `umask` 函数设定 `S_IRGRP` 这类位后,`open` / `creat` 参数创建的文件的权限里面,会将这些位 ''去掉''。

一个进程会默认继承它的父进程的 `umask` 值。你可以在 Shell 中使用 `umask(1)` 命令查看和修改 `umask` 值。比如我的 Arch Linux 默认为 0022,即新创建的文件,默认是没有给 group 和 other 写权限的,它的权限应该是 `-rwxr-xr-x`。

注意:

# 编程上,如果你希望控制你创建文件的权限,那么你需要手动置 `umask(0)`
# `vim` / `touch` 命令等创建出来的文件,考虑到安全,默认是在 `umask` 的基础上再去掉执行权限。默认是 `-rw-r--r--`。

!! 4.9 `chmod`, `fchmod`, and `fchmodat` Functions

用来修改文件权限。进程的 effective user ID 需要是文件的 uid 或 root。考虑到安全,有一些情况下内核会帮你清掉某些位:

# 一个程序为普通文件设置 sticky bit 时,Solaris 会自动清掉这个位;Linux / Mac OS X 不会。普通文件的 sticky bit 没有作用。
# 由于创建一个新文件时,它的 group ID 可能跟当前进程的 effective group ID & supplementary group ID 都不一样(回顾前面 set-group-ID 目录);所以这时候如果你没有 root 权限,那么你没法给这个新文件设上 set-group-ID 位。这样可以避免你新建了一个带有 set-group-ID 位、但是又不属于你自身的 groups 的一个文件;这样别人运行它时,也无法以它的 group ID 作为 effective group ID,避免一些安全问题。简单地说,你没法为一个不属于你的组的文件设置 set-group-ID 位,尽管这个文件是你创建的。

<<.tip "Linux 等系统还实现了一些额外的安全措施。比如一个非 root 用户(不确定是 real user ID 还是 effective user ID)写入一个带有 set-user-ID / set-group-ID 的文件时,会自动清掉这两个位。这样可以防止恶意用户篡改文件后进行攻击。>>

!! 4.10 Sticky Bit

Sticky bit 在代码中为 `S_ISVTX`(saved-text bit)。以前磁盘存储器非常慢时,运行一个带有 sticky bit 的程序时,内核会把程序放进 swap 区以提升程序性能(顺序访问快过随机访问)。现在的系统实现无视在普通文件上的这个位。

但是新的系统给了它新的含义,你可以为一个目录设 sticky bit。这样意味着这个目录的文件只在下列三个条件至少满足一个时可以被写入 / 删除 / 重命名等:

# 你拥有这个文件
# 你拥有整个目录
# 你是超级用户(root)

这基本上是设计给 `/tmp` / `/var/tmp` 这种目录用的,多人使用但是又需要互不干扰。

`ls` 命令看一个带有 sticky bit 的目录权限时,最后一位会是 `t`,比如 `drwxrwxrwt`。可以用 `chmod +t` 为一个目录设置 sticky bit。

!! 4.11 `chown`, `fchown`, `fchownat`, and `lchown` Functions

修改文件所有者 / 组的函数。注意几点:

# 超级用户可以改任何文件的所有者
# 非超级用户并且拥有该文件,看文件的 pathconf ` _POSIX_CHOWN_RESTRICTED` 是否被应用上:
## 如果被应用上,你没法改文件的 uid,只能改 gid 到你自己的组(group + supplementary groups)
## 如果没被应用上,你可以改文件的 uid / gid 到别的 uid / gid
## Linux 默认应用上这个限制
# 基于安全考虑,大多数情况下,`chown` 后 set-user-ID 和 set-group-ID 会被清掉

!! 4.12 File Size

一个文件有两个大小:

# 文件大小(空洞也算进里面)
# 文件所占的 block(表示实际存储消耗的块,不算进空洞)

空洞会被 `read(2)` 成为一串 `\0` 的序列。

!! 4.13 File Truncation

`truncate`, `ftruncate`可以把一个文件 truncate 到特定长度。如果这个长度值大于文件本身长度,很可能会创建一个空洞。

<<.tip "为啥没有 `ftruncateat` 函数?感觉 API 设计不一致。">>



!! Refernce

# `man 7 symlink` 应该是一个关于软链接的综合文档















!! 7.3 Process Termination

Normal termination occurs in five ways:

# Return from main
# Calling `exit`
# Calling `_exit` or `_Exit`
# Return of the last thread from its start routine
# Calling `pthread_exit` from the last thread

Abnormal termination occurs in three ways:

# Calling `abort`
# Receipt of a signal
# Response of the last thread to a cancellation request

!!! Exit Functions

```c
#include <stdlib.h>
void exit(int status);
void _Exit(int status);

#include <unistd.h>
void _exit(int status);
```

* `_Exit` and `_exit` return to kernel immediately
* `exit` performs certain cleanup processing and then return to kernel (call `fclose` to all open stream for example)

`exit(0)` is the same as `return 0` in the `main` function.

---

When exit status undefined:

* Call exit function without an exit status
* `main` does a return without a return value
* the `main` function is not declared to return an integer

If the return type of `main` is an integer, both explicit return 0 or implicit return ("falls off the end") will make the exit status 0

---

ISO C 1999 implies that the return type of main defaults to `int`.

```c
main() {}   // Return value is 0 in c99, undefined before c99
```

---

{{start-and-terminate}}

!! 7.5 Environment List

```c
extern char **environ;
```

{{environment-strings}}

!! 7.6 Memory Layout of a C program

This section simply describe the memory layout of a C program. Refer to CSAPP for more information.

!! 7.8 Memory allocation

Although `sbrk` can expand or contract the memory of a process, most versions of `malloc` and free never decrease their memory size. The space that we free is available for a later allocation, but the freed space is not usually returned to the kernel; instead, that space is kept in the `malloc` pool.

This may explain why the memory consumed by a process rarely decreases.

!! 7.9 Environment Variables

Warning: don't use the `putenv` function. `putenv` is free to place the *name=value* string passed to it directly into the environment, without copy it. So it would be an error to pass a string allocated on the stack, since the memory would be reused after we return from the current function.

!! 7.10 `setjmp` and `longjmp` Functions

!!! Automatic, Register, and Volatile Variables

Refer to the code files `setjmp_variables.c`.

When we return to the code as a result of the `longjmp`, do the variables have values corresponding to those when the `setjmp` was previous called (i.e. their values rolled back), or are their values left alone?

<<.warning 'It depends on implementations. The standard left it indeterminate.'>>

# Most implementations do not try to roll back automatic variables and register variables. (*seems not like this*)
# If you have an automatic variables that you don't want rolled back, define it with the `volatile` attribute.
# Global or static variables are left alone when `longjmp` is executed.

!! Exercises

Q: 7.4 Some UNIX system implementations purposely arrange that, when a program is executed, location 0 in the data segment is not accessible. why?

A: This provides a way to terminate the process when it tries to dereference a null pointer, a common C programming error.
Arch Linux 相关的经验、使用技巧,以及与桌面环境相关的内容。偏系统层面、Shell 相关的内容,会放在 [[Linux]] 下。


使用 [[yuk7/ArchWSL|https://github.com/yuk7/ArchWSL]] 将 Arch Linux 安装在 Windows Subsystem for Linux 上。

用 [[goreliu/wsl-terminal|https://github.com/goreliu/wsl-terminal]] 作终端模拟器,比 Cmder 更易用。wsl-terminal 提供了「在此处打开」的能力。在选项中,使用 `base16-brewer.minttyrc` 主题,并把「显示粗字体颜色」关掉。

<<.warning "目前(2018-07-07)它的 multi-tab 版本启动不起来,你要用普通版本。">>

所以你可以用普通版本搭配 tmux 实现多标签页。tmux 的启动配置放在 `~/.zshrc.local` 中,key binding 为 <kbd>Ctrl-N</kbd> 新建标签页,<kbd>Shift-LeftN</kbd> <kbd>Shift-RightN</kbd> 切换,<kbd>Ctrl-B,[N</kbd> 屏幕缓存区用 vi 来操作。
环境变量的设置,针对不同的 shell 和使用场景各有不同。[[Arch Wiki|https://wiki.archlinux.org/index.php/environment_variables]] 有非常好的描述。KDE Plasma 也有自己的 [[文档|https://userbase.kde.org/Session_Environment_Variables]]。

!! 查看

打开一个终端,在里面输入 `envs` / `printenvs`,可以看到目前终端环境中的环境变量。

运行中的进程的环境变量会存在 `/proc/$PID/environ` 文件中,使用 sed 查看:

```shell
sed 's:\x0:\n:g' /proc/$PID/environ
```

!! 设置

针对 logging / non-logging shell,以及 interactive / non-interactive shell 的设置:[[Environment Variables about Login / Non-Login Shell]]。

如果某些环境变量需要被 GUI 程序使用(比如将 `PUB_HOSTED_URL` 传给 Android Studio),你可以在相应的桌面环境规定的地方写入环境变量。比如 Plasma 5 会读取 `$HOME/.config/plasma-workspace/env/` 下的所有 `.sh` 文件,因此可以在其下创建 `flutter.sh`,写入:

```shell
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
```

如果终端也想用这些变量,在终端的 RC 文件中(如 oh-my-zsh 的 `~/.zshrc.local`)中 `source` 之:

```shell
source $HOME/.config/plasma-workspace/env/flutter.sh
```
找出哪个程序占用了全局热键。

在日常使用中经常会发现,在 IDE 里面某个热键按了没有作用,这个时候可能是它被注册成了全局热键。

可以先看看 Plasma 的 Global Shortcut 和 Standard Shortcut 界面,找找它在不在里面。如果没有,可以用类型下面的脚本来判断:

```bash
xdotool key Control_L+Shift_L+e
xdotool key XF86LogGrabInfo
xdotool keyup Control_L+Shift_L+e;
```

执行后再打开 `/var/log/Xorg.0.log` 观察日志。
对于 27 寸的 4K 屏幕,按下面做配置。

对于 GTK 程序,在 `~/.xprofile` 中,添加这些:

```
# GDK 3 (GTK 3)
export GDK_SCALE=2
export GDK_DPI_SCALE=1
```

在系统设置中:

* 在 Fonts 设置中,Force DPI 设为 144
* 不要去设置系统设置中的 Displays => Scale Display,会引起渲染时经常有怪线的 [[问题|https://unix.stackexchange.com/questions/414836/ugly-horizontal-lines-displayed-in-kate-and-konsole-with-fractional-hidpi-scalin]]

Chrome 的 UI 大小如果不合适,在启动参数中加入 `--force-device-scale-factor=2`。具体值可以再调试。

!! Resources

* [[HiDPI - Arch Wiki|https://wiki.archlinux.org/index.php/HiDPI]]
这里是新安装 Arch Linux 的注意事项。主要针对这两台机器:

* 台式机:CPU 为 i7 9700k,显卡 NVIDIA RTX 2060,UEFI 系统,27 寸 4K 屏幕
* 笔记本:Dell 燃 7000(Ins14-7460-D1605S),UEFI 系统,14 寸 1080P 屏幕

UEFI 带来的问题:

* 需要把 Dell 笔记本的 SecureBoot 关掉<<footnote "[1]" "开机时按 F2 进固件设置页">>,不然无法引导 USB 安装媒介,也无法引导装好后的系统
* 需要有一个特殊的分区做 `/boot` 挂载点,分区类型为 ESL,容量在 500M 左右
* boot-loader 选择 systemd-boot,照着 wiki 搞就行,注意 Intel code;如果 `/boot` 分区下少了 `vmlinuz-linux`, `initramfs-linux.img` 等几个文件,pacman 重装下 `linux` 包试试

笔记本的触摸板需要装开源的 `libinput`,同时设一些基本配置,如双指点击时后键,三指时中键;无法实现类似 Pinch to zoom 等高级功能,体验比 Windows 下差很多。Synaptics 似乎不愿意搞 Linux 驱动。

USB 安装时注意把 `plasma-meta` 装了;不要装 `kde-applications` / `kde-applications-meta`,是软件包,大多数用不到;把 `plasma-nm` 也装了,是 NetworkManager 的 widget,方便你连上 Wi-Fi。

参考 Arch Wiki HiDPI 条目,设置一些 HiDPI 相关的配置:

* SDDM、Chrome<<footnote "[2]" "`--force-device-scale-factor=1.2`">> 可能需要配置
* Fonts 设置中,
** Dell 笔记本上,设置 Force DPI 设为 144
** 在 27 寸 4K 屏幕上对 Anti-aliasing 用 Vendor default
* 不要去设置系统设置中的 Displays => Scale Display,会引起渲染时经常有怪线的 [[问题|https://unix.stackexchange.com/questions/414836/ugly-horizontal-lines-displayed-in-kate-and-konsole-with-fractional-hidpi-scalin]]

对于台式机的 4K 分辨率下,NVIDIA RTX 2060 显卡在实际运行时像 30fps,使用很不流畅。在 NVIDIA X Server Settings 设置程序中,X Server Display Configuration => Advanced 中把 Force Composition Pipeline 及 Force Full Composition Pipeline 关掉,保存到 X Server 配置文件中解决。

装 oh-my-zsh。用 pacman 装 zsh-syntax-highlighting 及 zsh-autosuggestions。其他的配置由 yadm 搞定。

`visudo` 里增加 `Defaults env_keep += "EDITOR"`,这样 sudo 后调用编辑器可以是你设的 EDITOR(比如 Vim),而不是默认的 nano。

在 Windows Behaviour 设置中,把 <kbd>Alt+LeftMouse</kbd> 移动窗口的功能关掉,annoying。

在 Global Shortcuts 中把 Kwin 的 Walk Through Windows of Current Application 的快捷键关掉(<kbd>Alt-Backtick</kbd>),因为 JetBrains 的 IDE 用这个快捷键打开 VCS 面板。

把 `Dropbox/Fonts/MicrosoftYahei/` 文件夹中的字体,安装进系统,这样就可以渲染中文字体了。

配置 BBR 拥塞算法。

参照 [[Eye Candy]] 做系统美化。

安装 fcitx(五笔应该在 `fcitx-table-extra` 中),然后 yadm pull,配置文件中把一些快捷键去掉,比如 <kbd>Ctrl+Alt+S</kbd> <kbd>Ctrl+Alt+E</kbd> <kbd>Ctrl+Alt+H</kbd>(很长时间不知道 <kbd>Ctrl+Alt+S</kbd> 被谁占用了);同时把中文标点的映射弄得舒服一点

按 Arch Wiki 的 [[说明|https://wiki.archlinux.org/index.php/SSH_keys#Start_ssh-agent_with_systemd_user]],把 SSH agent 用 Systemd 跑起一个 user service,service 文件已经在 yadm 仓库中了。
! pacman

[[Reference|https://wiki.archlinux.org/index.php/pacman]]

Remove all the cached packages that are not currently installed:

```bash
pacman -Sc
```

Remove all the cache:

```bash
pacman -Scc
```

Clean the cache automatically after pacman transactions:

```ini
# /etc/pacman.d/hooks/remove_cache_packages.hook
[Trigger]
Operation = Remove
Operation = Install
Operation = Upgrade
Type = Package
Target = *

[Action]
Description = Keep the last cache and the currently installed.
When = PostTransaction
Exec = /usr/bin/paccache -rvk2
```

! yay

[[yay|https://github.com/Jguer/yay]] 表示 yet another yaourt,是个用 go 写的程序。

!! Install

```bash
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg
sudo pacman -U yay-*.tar.xz
```

!! Usage

Examples [[here|https://github.com/Jguer/yay#examples-of-custom-operations]].

Present package-installation selection menu:

```bash
yay <Search Term>
```

Upgrade All AUR Packages:

```bash
yay -Syu --aur --noconfirm --sudoloop
```

Print system statistics:

```bash
yay -Ps
```

Clean unneeded dependencies:

```bash
yay -Yc
```
Arch Linux 疑难杂症。

!! 启动后 USB 设备不可用(2019/09)

键盘和鼠标均没有反应。按电源键后会关机,关机过程中可见这种错误:

```
usb 2-3: device descriptor read/64, error -101
```

查了一下 [[帖子|https://paulphilippov.com/articles/how-to-fix-device-not-accepting-address-error]],他认为是硬件问题,建议把全部 USB 设备拔掉再启动。按它的思路我找到了有问题的设备,拔掉后就 OK 了。

!! 解决看视频时的撕裂问题

用 Arch Linux 看在线视频(优酷,YouTube 等),以及看本地视频时,都会有一种撕裂感(tearing),感觉在水平方向上视频有一些错位。

做了一番 Google 后,在 ArchWiki 找到了 [[答案|https://wiki.archlinux.org/index.php/NVIDIA/Tips_and_tricks#Avoid_tearing_with_GeForce_500.2F600.2F700.2F900_series_cards]]。解决办法是在 `/etc/X11/xorg.conf.d/20-nvidia.conf` 文件的 Screen 段中,加入一行:

```conf
Option "metamodes" "nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"
```

重启后生效。但是有个副作用是一些 OpenGL 的程序性能降低。不过打游戏的话就不要在 Linux 上玩了……
使用 QEMU 搭载 KVM,在 Arch Linux 宿主机上运行 Windows 操作系统。

QEMU + KVM 在性能上比 VirtualBox / VMware 好得多。

文档主要在 Arch Wiki:

* [[QEMU|https://wiki.archlinux.org/index.php/QEMU]]
* [[KVM|https://wiki.archlinux.org/index.php/KVM]]

先按这两个文档配置好 QEMU 及 KVM。装好 virt-manager(Virtual Machine Manager)。

在 [[这里|https://www.microsoft.com/en-us/software-download/windows10ISO]] 下载 Windows 安装包,用 ISO 镜像。

通过 virt-manager 新建一个虚拟机:

* 将 ISO 文件作为光驱设备
* 添加一个 SATA 类型的硬盘作为磁盘
* 其他选项使用默认的即可

按正常流程安装好 Windows。这个过程可能会非常慢,SATA 类型的磁盘非常慢,后面会优化。

安装过程中,先在 [[这里|https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html#virtio-win-direct-downloads]] 下好 Virtio 的 Windows 驱动;在页面里找到 stable virtio-win ISO 字样的文件,下载下来。然后也作为一个光驱设备加载进虚拟机中。这个光盘中的文件是 Windows 作为 QEMU guest 下的''各种驱动'',''非常非常必要''。

Windows 安装好后,在 Windows 中打开 virtio-win 的光驱,找到根目录下的安装程序安装驱动。

装好后,开始做一些优化。

!! 磁盘 I/O 速度优化

磁盘的 bus type 为 VirtIO 时性能最佳。需要 Windows 中装 virtio-scsi 驱动配置。这个驱动在 virtio-win 那一步已经安装了,但是需要绕下路才能启用,不然开机时会蓝屏。

先在 virt-manager 中为虚拟机新加一个 VirtIO 类型的磁盘,容量随意。然后仍然使用之前的 SATA 盘开机,观察「磁盘管理」程序中新磁盘是否被正常识别。如果被正常识别说明驱动安装 OK,如果没有,则去「设备管理器」中选择该磁盘,安装驱动程序,从 virtio-win ISO 中搜索驱动。

然后可以关机,将系统盘从 SATA 改为 VirtIO,再开机观察是否正常。如果正常,就把第二磁盘去掉。

!! 显示效果优化

显示设备默认用的 QXL,已经是最好的。如果你想支持 4K 分辨率,在 virt-manager 的 Preference 中解锁 XML 编辑,然后在虚拟机的 Video QXL 中的 XML 中,将 vgamem 的值调到 65535。

重启虚拟机后,即可以上 4K 分辨率。

!! Windows guest 与 Linux host 同步文件

Samba 性能太差。用 WinSCP 的目录监听同步功能。但可能只能 Windows => Linux 单向同步。

!! Windows 中使用翻墙服务

直接通过网络访问 Linux host 中的翻墙服务。
|!Name |你的灯亮着吗? |
|!Author |Donald C. Gause / Gerald M.Weinberg [译]俞月圆 |
|!Edition |N/A |
|!Release Date |January 2014 |
|!ISBN-13 |978-7115335630 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

一开始以为是解决问题的书,后来以为是人际关系的书,再后来变成了哲学书。很短很精彩。豆瓣上有人说这是项目经理必读书,我觉得有些道理。

下次遇到烦心的问题时,来这本书看看。

!! 第1章 一个问题

啊没想到

> 让我们从大厦房东第欧根尼·梁龙先生的角度来看看这个问题。如果将他作为服务对象,得到的解决方案会大不相同

问题是什么?

> 初出茅庐的问题解决者总在还没定义好问题的时候就仓促地给出解决方案。

> 在实际操作中,一方面,对日常生活中自然产生的问题,不可能给出独一无二、完全明确的定义;另一方面,如果不能就问题本身达成一定程度的共识,几乎可以肯定,最后找到的解决方案无法切中要害。这种时候,一般都是在为说话嗓门最大、口才最好或者资产最雄厚的人解决问题。

!! 第10章 注意你所表达的含义

这一章太有意思了

> “没有什么对我们的顾客来说好得过了头。”橱窗上有这样一句标语。但是它想表达什么含义呢?是说: “全世界没有什么东西对我们的顾客来说好得过了头。” 还是: “对我们的顾客来说好得过了头的东西不存在。” 这是个愚蠢的文字游戏吗?难道不是每个人都清楚标语的含义吗?如果前面关于问题措辞的讨论有用的话,可能不是这样的。人们一次又一次地看到好心的问题解决者拟出看起来无比清晰的问题表述,却在“没有什么”

!! 第11章 烟雾缭绕

我在这点做得很差。

> 当别人可以妥善解决自己的问题时,不要越俎代庖。
 
> 如果这是别人的问题,就把它当成是别人的问题。

!! 第13章 隧道尽头的灯光

这个故事太聪明了!

> 一定有别的更好的办法。 借着工程师的一点点帮助,总工程师采用了“这是他们的问题”这一方法,来取代此前的种种折腾。他假设司机有很强的愿望解决问题,只是需要一点小小的提醒。他还假设,如果司机都通过了驾照考试,他们就不会是彻头彻尾的傻瓜。司机们需要的只是在隧道尽头设置一块标志牌,上面写着: ◎你的灯亮着吗? 如果司机们笨到连这句话都看不明白,那电池耗尽应该只是他们所碰到的问题中最简单的一个了。 这块标志牌解决了问题。标语很简洁,所以牌子上能放得下好几种语言的译文。总工程师永远记得从这段经历中学到的一课:

!! 第15章 麦特兹锡恩先生解决了问题

???

> 毫无疑问,就像某些大学学院院长、银行副总裁和其他中层干部一样,他被选出来正是因为能力不足。

能这样一直反向思考的人不会太多,包括我自己也不能。

> “也许我对官僚的看法是不公正的。并不是所有的选拔都由高层来进行。毕竟,灰脸男人应对和我一样的旅客的时间要远远长于他的上级。旅客对待他的方式肯定会对他产生影响。如果他面对我的问题和要求拒不妥协,也许这是因为之前有成千上万的旅客对他很粗鲁,把他当成一个阴郁的、机器人式的小公务员。也许我才是问题的根源呢?”

这个故事让「问题的根源出自哪里」有了意义,而不是一个类似的「问题是什么」

> 大多数情况下,问题的根源在你自己身上。

想一想是不是这样。

> 大多数情况下,问题的根源在你自己身上。

!! 第18章 不怕累的汤姆被玩具耍了

> “我最大的问题就是不善于解决问题。”瞎说!在大多数情况下,只要知道问题是什么,解决问题就是一件非常不值一提的事情。也许之所以学校总是培养出能力不足的问题解决者,就是因为学生们从来没有机会自己去发现问题是什么,而是老师说问题是什么就是什么,的确如此。

说什么大实话

> 怎么了,即使我们在解决的不是“真正的”问题,由于我们想要解决它,它对我们而言也就成了真正的问题,解决的方式越像英雄越好。

!! 第20章 一项优先任务

想不想要解决问题?而不是因为能解决问题所以解决问题。

> 人们永远没有足够的时间去考虑到底是不是想要它,但永远有足够的时间去为之后悔。
|!Name |掌控习惯 |
|!Author |[美]詹姆斯·克利尔 [译]迩东晨 |
|!Edition |N/A |
|!Release Date |July, 2019 |
|!ISBN-13 |9787559632265 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

豆瓣链接:[[https://book.douban.com/subject/34326931/]]。

书中的方法论总结:

<figure>
[img width=500 [atomic-habits-good-habits]]
<figcaption>如何养成好习惯</figcaption>
</figure>

<figure>
[img width=500 [atomic-habits-bad-habits]]
<figcaption>如何戒除坏习惯</figcaption>
</figure>

如果想 ''详细'' 回顾书的内容,上微信读书看原书及我做的划线和笔记。

我还做了一份思维导图,但制作过程太耗时且无益,所以只做了半本书的内容:

* 📝 <<coslink "MindMaster Pro 文件" "/files/books/atomic-habits/atomic-habits.emmx">>
* 📝 <<coslink "PDF" "/files/books/atomic-habits/atomic-habits.pdf">>

<<display-pdf path:"/files/books/atomic-habits/atomic-habits.pdf" title:"atomic-habits.pdf">>


!! Resources

* [[Multimedia Wiki|https://wiki.multimedia.cx/index.php/Main_Page]]
* [[ffmpeg Documentation|http://ffmpeg.org/documentation.html]]
* [[ffmpeg tutorial - Danger|http://dranger.com/ffmpeg/]]
* [[CSDN Blog of 雷霄骅|http://blog.csdn.net/leixiaohua1020]]
!! Concepts

Authentication 和 authorization 经常被实现在同套 authentication system 中。

* Authentication 指认证,通常是用户用帐号名密码登录的过程
* Authorization 指授权,表示用户有无权限执行某操作,访问某资源等

<<.note "我对 authorization 了解甚少。目前看 authentication 跟 authorization 的关联可能不大。后面考虑把这两块内容拆分。">>

!! Tasks

* Register:
** Username and email validation
** Password strength requirement
** Email / username normalization
** Password hashing
* Reset password:
** Password of the user should be unusable
* Login:
** Throutte for login attempt
* Change / reset password:
** Invalidate existing sessions
** New password should not be the same as the old
* No request after a specific time (etc. 1 day)
** Invalidate session
* Believed that passwords of some user has been revealed / accounts stolen
** Batch reset passwords
* CAPTCHA
* Authentication system implementation in Single-page Application
** https://jcbaey.com/authentication-in-spa-reactjs-and-vuejs-the-right-way



!! Resources (and to-reads)

* [[Everything you ever wanted to know about building a secure password reset feature|https://www.troyhunt.com/everything-you-ever-wanted-to-know/]]
* [[Secure Account Management Fundamentals|https://www.pluralsight.com/courses/secure-account-management-fundamentals]]
* [[Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0|https://learning.oreilly.com/library/view/solving-identity-management/9781484250952/]]:这本书看起来比较专业

认证方式多种多样,除了最常见的密码认证之外,还有很多别的方法。这篇 [[文章|https://www.wordfence.com/learn/how-passwords-work-and-cracking-passwords/#introduction-to-authentication]] 有非常好的描述。

常用的有:

* Something you know: 密码、银行卡 PIN 码等
* Something you have: 门禁卡、手机收到的验证码等
* Something you are: 指纹、虹膜等

较少使用的有:

* Somewhere you are: 比如你住的地方的传统邮箱
* Something you can do: 比如你的笔迹
* Something you exhibit: 比如核磁共振能扫出来的一个神经学特征
* Someone you know: 比如社交网络图谱或者信任链

!! Resources

* [[Password Authentication and Password Cracking|https://www.wordfence.com/learn/how-passwords-work-and-cracking-passwords/]]
在很久以前大家刚用密码来做认证时,密码是以明文存储在数据库中的。这样会导致一旦数据库泄漏,则所有用户的密码都被黑客获取。

!! Encrypted password

简单的解决办法可以是,把密码做加密,这样数据库中不再是明文密码。但是一旦黑客同时拿到数据库及加密方式、密钥等,那他一样可以获得密码原文。

!! Password hashing

对密码做哈希再存数据库可以解决这个问题。由于哈希出来的结果不可逆,数据库管理员或者黑客即使获得了数据,也无法逆向出密码原文。

但是这里存在一个问题,黑客可以预先计算出大量常见密码串的哈希值,然后拿数据库中哈希过的密码去查,就可以查出原来的密码。这种预先计算出来的数据被称为「彩虹表」。为了对抗这种方法,我们需要对密码「加盐」。

「加盐」即是随机生成一小段数据,将它加在密码上再做哈希:

{{ password-hash-salting }}

「加盐」使得黑客破解密码的成本大大提高。不加盐时黑客只需要一张彩虹表就可以破解,但是一旦各数据库中加了不同的盐,那黑客需要预先计算好非常多的彩虹表才可以做破解。

一般一个多用户的系统中,对每个用户使用不同的盐是更好的实践,因为黑客破解时需要计算更多的彩虹表。但是注意这并不表示密码是绝对安全的。如果黑客要破解的密码价值足够高(比如破解美国总统的密码),那他们仍然可以运用大量算力将单个密码破解出来。

!! "Stretching" password

随着 CPU 速度越来越高,像 MD5 这种在设计之初计算得非常慢的哈希函数,在现代 CPU 上的计算速度已经非常快。同时 GPU 在做这类计算上速度又比 CPU 更快。因此黑客计算彩虹表的开销大幅下降。因此大家又想出了一个被称为「stretching」的方法。它的想法很简单,就是于其只做一次哈希,不如做多次哈希(将哈希出来的结果继续哈希)。这样黑客破解时的计算成本就变高了。哈希的次数被称为迭代次数(iteration)。Django 2.2 中默认对密码做 150000 次迭代。

同时一些哈希算法被设计成故意运行缓慢的:

* [[PBKDF2|http://en.wikipedia.org/wiki/PBKDF2]]:特点是过程中会生成一个 key,这个 key 是通过伪随机函数、密码原文和盐计算出来的,而且计算次数可以指定的。Django 默认使用这个算法,并且 [[RFC 8018|https://tools.ietf.org/html/rfc8018]] (2017) 及 [[NIST|https://dx.doi.org/10.6028/NIST.SP.800-132]] 推荐使用它
* [[Bcrypt|https://en.wikipedia.org/wiki/Bcrypt]]:OpenBSD、SUSE Linux 的默认哈希函数。特点是你可以指定「复杂度」来影响算法的计算速度
* [[Scrypt|https://en.wikipedia.org/wiki/Scrypt]]:特点是难被并行运行,使得 GPU 农场无用武之地
* [[Argon2|https://en.wikipedia.org/wiki/Argon2]]:也是一个评价较高的算法

!! Strong passwords are important

虽然开发者在保存密码上做足了功课,似乎你的密码已经坚不可破。但是设置一个强密码还是很必须的。密码的位数越多、其中涉及的特殊字符组合越复杂,黑客破解时的计算成本也呈指数上升。

!! Server-relief

对于像 Google、Facebook 这样的大公司,经常会有大量用户同时登录,这对服务器 CPU 和内存的消耗是非常大的。Server-relief 即是指,将一些计算放在客户端去做,再将结果发给服务端做最终校验。

!! Django auth implementation

{{ Django: Auth: Password Hashing }}

!! Libraries

* [[libsodium|https://download.libsodium.org/doc/password_hashing]]: 目前最被推荐的 crypto 库。文档有一节讲 [[password hashing|https://download.libsodium.org/doc/password_hashing]]

!! Resources

* [[Password Authentication and Password Cracking - Wordfence|https://www.wordfence.com/learn/how-passwords-work-and-cracking-passwords/]]: 直白的语言描述如何做密码认证
* [[Salted Password Hashing - Doing it Right|https://crackstation.net/hashing-security.htm]]: 写得非常好,而且对密码重置有独到的见解
* [[Password Storage Cheatsheet - OSWAP|https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html]]: 我没细看,但是应该是不错的材料
最简单的认证协议是 HTTP Basic Authentication,不在这里描述。

有价值的内容是:

* [[OAuth 2.0]]
* JWT
* OpenID
* Singer Sign On


虽然 AutoHotKey 是 Windows 平台上最流行的管理控制脚本工具,但是其语法纠结,写起来不是太愉快。可以优先用 PowerShell 或者 BAT 解决的事情,不要用 AutoHotKey。AutoHotKey 应该适合于做一些 Key Binding。

!! 调整音量快捷键

* <kbd>Win+F9</kbd> 切换静音
* <kbd>Win+F10</kbd> 降低音量
* <kbd>Win+F11</kbd> 升高音量

```ahk
#F9::Volume_Mute
#F10::Volume_Down
#F11::Volume_Up
```

!! 把剪贴板的内容以 Keystroke 形式发出

在 IPython Notebook 的 Terminal 上,没法用 <kbd>Ctrl+V</kbd> 粘贴内容,只好搞了个脚本,用 <kbd>Win+F12</kbd> 把剪贴板内容打上去。

<<.warning "剪贴板的内容过多时/有中文时,这个脚本似乎会有性能问题。">>

```ahk
#F12::SendInput, %Clipboard%
```



<<.note "这里的内容大多数来自 [[Designing Data-intensive Applications]] 的第三章。">>

目前绝大多数 RDBMS 的索引是用 B 树(B-Tree)及其增强版 B+ 树(B+Tree)实现的,比如 InnoDB 使用的是 B+ 树。

B 树 / B+ 树为了使其适用于磁盘存储,它将数据分成了 ''固定大小的页''(多数是 4KB),每次读写都操作一个页,跟操作系统读写硬盘类似。

!! B 树

{{ b-tree }}

B 树长得跟图中类似。每一个蓝色块表示一个页。对于非叶子页,页定义了一批 ''区间''(如 $$key < 7$$,$$7 < key < 16$$ 等)、''边界值''(如 7,16 等)、区间中数据所在的 ''子页的引用'',以及各值的 data pointer(图中蓝色箭头表示,比如值所对应的数据行所在的文件位置)。

''一旦数据在父页出现,就不会出现在子页。''比如第一层的 7 并没有出现在下一层中。

对于叶子页,它并没有子页,只有值本身(比如 9、12)及其 data pointer。

!! B+ 树

{{ b-plus-tree }}

''与 B 树不一样的地方在于'':

* 非叶子页中的值,也会出现在子页中,比如图中的 7;同时非叶子页中不再存 data pointer,data pointer 仅存在叶子页中。意味着如果你想找 7 的 data pointer,那必须查到叶子页中
* 叶子页中,相邻的页之间会有指针连接起来(图中黄色箭头),类似链表。这对于数据库场景中做范围查询有帮助

[[Designing Data-intensive Applications Ch03]] 中的插图:

[img width=700 [b-plus-tree-illustrated]]

!! 操作

无论插入删除元素,由于 B+ 树的第一点特性,它会比 B 树更容易操作:

[img width=700 [b-plus-tree-insert-data]]

删除元素则比较复杂,暂无研究。

!! 特性

这个算法保证了这颗树永远是平衡的。一颗有 n 个 key 的 B 树的深度是 $$O(\log n)$$。每个页中包含的分区数称为 ''分支因子''(branching factor)。实践中 B 树的分支因子非常大,一个 4 层、单页 4KB 以及分支因子为 500 的树可以存储 256TB 数据。

!! 可靠性

一般需要搭配 WAL 以避免写一半时 crash 引起的数据损坏,比如 InnoDB 的 [[redo log|InnoDB: Concept: Redo Log]]。

修改 B+ 树时需要精细的并发控制,一般使用轻量的锁。

!! 优化

* 有些数据库(如 LMDB)使用 copy-on-write 方式,不需要维护一份 WAL
* 页中的 key 值不一定要是完整的。可以只纪录初始 key 值,后面的 key 使用偏移量来表达,这样一页可以塞进更多的 key
* 一些数据库会尝试让树的叶子页在磁盘上是连续的,使得查询大量数据时 I/O 性能更佳

!! 参考

* [[Designing Data-intensive Applications Ch03]]
* [[All About Indexes Part 2: MySQL Index Structure and Performance - Vertabelo Database Modeler|https://www.vertabelo.com/blog/all-about-indexes-part-2-mysql-index-structure-and-performance/]]
* [[Difference between B tree and B+ tree - GeeksforGeeks|https://www.geeksforgeeks.org/difference-between-b-tree-and-b-tree/]]

[[Babel|http://babeljs.io/]] 是一个 JavaScript 转译器(transpiler),它把高版本的 ECMAScript 转译成低版本的,用来兼容仍未支持高版本的运行环境。比如有些浏览器并不支持 ES2015 的特性,那么 Babel 可以把 ES2015 的代码转换成 ES3 的,这样这些浏览器就可以运行了。Babel 的另一大使用场景,是将 React 的 JSX 转译成 JS 代码。

!! 概念和设施

''前端'':Babel 提供了 CLI 和 API 等多种模式,供用户(用 CLI)、构建系统(如 Babel)、测试框架(如 Jest)等使用。[[Setup 页|https://babeljs.io/setup]] 显示了各种整合方式。其中 `@babel/core` 包是核心。

''插件'':Babel 提供的一系列 [[插件|https://babeljs.io/docs/plugins]],每个插件实际上实现了一套转换规则,如 [[@babel/plugin-transform-spread|https://babeljs.io/docs/en/babel-plugin-transform-spread]],把 spread syntax 转换成未支持 ES2015 环境可以运行的代码:

```javascript
// Input
var a = ['a', 'b', 'c'];
var b = [...a, 'foo'];
var c = foo(...a);

// Output
var a = ['a', 'b', 'c'];
var b = a.concat(['foo']);
var c = foo.apply(void 0, a);
```

''预设集'':Babel 提供了 [[presets|https://babeljs.io/docs/en/presets]],表示一套特定的插件合集。官方也提供了一些核心的 presets:

* [[@babel/preset-env|https://babeljs.io/docs/en/babel-preset-env]]:一个智能的 preset,让你可以自由使用新的 JS 特性,并可以指定要支持的浏览器版本,由 babel 帮你确定需使用哪些插件
* [[@babel/preset-react|https://babeljs.io/docs/en/babel-preset-react]]:支持 React
* [[@babel/preset-typescript|https://babeljs.io/docs/en/babel-preset-typescript]]:支持 TypeScript

''配置'':一般配些 preset 或者 plugin。见 [[官方文档|https://babeljs.io/docs/en/config-files]]。

!! 快速上手

参考官方的 [[Setup|https://babeljs.io/docs/setup/]] 文档。其中 CLI 和 Webpack 应该是最常见的场景。
这里的分类比较混乱,有按软件类型分类的(如 [[Database]]、[[Message Queue]]),也有按软件开发体系分类的(如 [[Microservice]]),也有 [[SRE]](site reliability engineering)。内容丰富后再梳理。

学习的过程:

# 了解适用的场景,解决了什么问题
# 学习基础用法
# 学习各种需求 / 问题场景下,如何使用该中间件解决(比如 V2EX 上用 Redis 做频率控制)
# 学习它所拥有的运维工具
# 学习它如何做平行扩展,多机分布等


When you want to batch download images from website, consider using Firefox with [[DownThemAll!|https://addons.mozilla.org/zh-cn/firefox/addon/downthemall/]] plugin.

Open DownThemAll! dialogue, you can see a text section called ''Mask''. The `*text*` placeholder would be replace by the `alt` attribute of the `<img>` tag. You can use `*text*.*ext*` mask to download images.

For instance, if you want to download NextRadio album covers, you can generate a web page with many `<img>` elements with `alt` attribute:

```html
<img class="nr-image-thumb" src="http://imgcache.qq.com/fm/photo/album/rmid_album_720/2/k/001c4m0d3SXH2k.jpg?r=1490963406203" alt=" 什么值得买(71316)">
<img class="nr-image-thumb" src="http://imgcache.qq.com/fm/photo/album/rmid_album_720/M/g/0041bWZF1QbPMg.jpg?r=1490963406203" alt=" 小情人资讯:青岛西海岸交易行情分析(73071)">
```
! C++ Related

Bazel 编译 C++ 项目时,生成的调试信息中的文件路径,使用的是相对路径。在使用 gdb 调试时注意设置 `$cwd`。参考 [[C++ Toolchain]]。
[[BearTalking|http://www.beartalking.com/]],狗熊有话说,是款不错的音频节目。

收听地址:[[网易云音乐|http://music.163.com/#/djradio?id=3672003]] | [[荔枝 FM|http://www.lizhi.fm/22080/]]

<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="http://music.163.com/outchain/player?type=3&id=14383242&auto=1&height=66"></iframe>

这期 Podcast 讲述了《火星救援》 (The Martian) 一书的内容,以及它流行起来的一个过程。一些观点有所启发:

1. 《火星救援》中矛盾的双方,从一般故事中的 人 vs 人,变成 人 vs 环境,这使得故事脉络相对简单,作者也不需要为一般故事中的以人为反派做一些复杂的设定,发挥空间更大

2. 作者是个 Geek,对书本内的内容的真实性相当考究,使得这本书的 bug 很少。而且它使用了连载的形式,连载过程中吸引了很多真正的科学家来观看,对书中内容提供了一些宝贵的意见

---

打算看完手头的这些书,就找这本书的原版书来看看。一是锻炼英文,另外想看看可否作为入门天文学的一个桥梁,多一些兴趣,多一些乐趣。
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="http://music.163.com/outchain/player?type=3&id=15064030&auto=1&height=66"></iframe>

现行的基础教育实在是种效率低下的过程,在学生最有求知欲的年龄,却要求他们机械地做题,要求他们在长达四五十分钟无趣的课堂上集中精力,要求他们服从纪律盲从师长。

这真是极大的浪费……

Khan 的经历跟做法都挺有意思。基础教育肯定会面临一个大改革,我想身处其中。

这期节目值得回顾一次,里面读到的这本书,有时间也值得看一看。另外教育制度的发展,也可以做一个简单的调研。
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="http://music.163.com/outchain/player?type=3&id=15653031&auto=1&height=66"></iframe>

这期的内容,狗熊结合了他的生活经历,讲述了 KK 新作《必然》里面提到的几个观点。

其中的观点不算新颖,但是感觉还没引起足够的重视(包括对我):

# 未来很多工作都将被机器所取代
# 人类会跟机器更加紧密地协作
# 未来的社会属于创造性人才的,属于可以驾驭机器做事情的

机器人取代人类工作的步骤,描述得挺有意思:

# 机器人干不了我做的事情
# 好吧,它还是会很多事情,但是我做的事情它不一定都会
# 好吧,我做的事情它都会,但是它经常出故障,需要我来处理
# 好吧,它常规工作时从不出错,但是我需要训练它学习新任务
# 好吧,就让它做我原来的工作吧,这个工作本来就不应该是人类干的
# 我的新工作,不仅好玩多了,工资还高,机器人绝对干不了我现在做的事情
# 跳至第 2 步

另外,KK 提到了“屏读”会改变信息流动性,对各种信息形式(音乐、书本、知识)等有很深远的影响。

有一个例子挺有意思,大狗熊提到之前会有囤书的行为,比如看到一本 Kindle 电子书觉得有兴趣,会先买下来,有时间再看;但是现在他觉得没必要这样做,因为信息的流动变快了,想看的时候随时点一下就可以购买下来看。这样会更加高效,节约大量时间。 ''收藏、囤集的思维方式是建立在商品稀缺、流通缓慢的工业时代的行为模式。''
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="http://music.163.com/outchain/player?type=3&id=16047015&auto=1&height=66"></iframe>

原有的一些观点:

读书的数量还没上去时,先不要讲质量。有了数量才能更好地判断质量。举例讲了一些只看过《三体》人,就觉得它是最好的科幻小说,但是他们还没接触过阿西莫夫等其他作家的小说,只是接触到科幻小说的一点皮毛。

又提到干货、湿货的问题。门户网站、新闻等内容基本上是湿货,一般人看了后没有增长知识,而只是增加了 谈资 。干货应该是那些能引发你思考,并能内化成为自己知识体系中的一部分的内容。

另外一些观点并不新鲜,但是我很认同:

1. 读书不要说没时间
2. 读完书要有文字形式的产出
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="http://music.163.com/outchain/player?type=3&id=16180090&auto=1&height=66"></iframe>

这期讲的书是《异类》。这本书从另外一些视角讲述了一些名人成功背后的少为人知的因素,用以说明外部环境对人的巨大影响。这期没有太多触动,道理大家都懂,故事不够有感染力。

1. 加拿大冰球队中,1~3月的球员成绩最好,更容易经过选拔。是其他球员不够努力吗?并不是。原因是加拿大冰球队以球员出生年份的每个自然年分队,即某一年1月出生的球员,与该年其他月份的球员一起竞争。由于青春期的球员身体处在成长期,1月份的球员身体条件会相对更好,因此慢慢积累了优势。这就是马太效应,强者越强,弱者越弱。

2. Java 创始人当时读书的密西根大学,有些全美数一数二的计算机资源。

3. Beatles 成名前去了德国高密度演出,有了一天演出8小时的条件,帮组他们磨练出重要的舞台表演技能和乐队风格。

4. 奥本海默出生富裕家庭,良好的教育是他不愿意盲从权威。
Mosh 的 [[Redux 课程|https://codewithmosh.com/courses/783424/lectures/14780820]] 中讲述了一个「行为测试」的概念。即不要纠结于单元测试去测每一个函数,更多是去测代码的行为。

譬如在使用 Redux 时,核心的流程是:

# 生成 action
# 分发(dispatch)action
# 观察 store 中的 state 数据变化

那么测试就应该 ''重点观察 state 数据的变化'',而不是关心 action object 生成得对不对。

另外 Mosh 还演示了一下测试的思路。代码中有一个 action 是 `loadBugs`,即加载 bug 列表。这个 bug 列表数据存在服务器中,如果拉取过,会在本地有个缓存。那么测试的内容也要包含缓存相关的逻辑。它列了一个''流程'':

```
- loading bugs
  - if they exist in the cache
	  * they should come from the cache
	- if they don't exist in the cache
	  * they should be fetched from the server
	  - loading indicator
		  * should be true while fetching
			* should be false after bugs are fetched
			* should be false if the server fails
```

''应该列出这样的流程表,再去写实际的测试代码。''
|!Name |一小时外:知乎李松蔚自选集 |
|!Author |李松蔚 |
|!Edition |N/A |
|!Release Date |January 2th, 2015 |
|!ISBN-13 |N/A |
|!Medium |多看阅读 |
|!Rating |{{!!rating}} |

!! 心理咨询不会让所有人开心

四川地震,辛辛苦苦盖了几年的房子塌了,再怎样做心理咨询也改变不了,难以开心起来。

> 也许有人会问,既然我花了这么多篇幅,去证明心理咨询不能让所有人都开心,那么我究竟有一个怎样的主张,难道我主张就应该让不开心的人陷入痛苦的深渊?心理咨询无能去改变无可改变的事实,就让绝望的人不希图被拯救,继续步富士康十二条年轻的生命之后尘?还有人会问:心理咨询如果都不能让人开心,那么它究竟能有什么用?
> 对于后一个问题,我想引用美国一位精神分析学家的观点作为回答。她说心理治疗的目标,并不是制造一种廉价的甚至虚幻的开心,恰恰相反,它应当致力于让来访者有更高的内省力,更强的自主感,更符合现实的自尊,更清晰地认识并处理自身情绪的能力,面对困境时更强的自我力量以及自我协调性,爱的能力,工作的能力,以及成熟依赖的能力——最终的目标,是进入一种她称之为“平和”的心境。而那也许是一个人毕生的追求。

又一个例子:

> 2009 年在四川灾区,和当地一个学校的校长聊天。他说地震过去一年了,老师们情绪还是很不好,教学积极性很低。他很着急,他跟老师讲:失去的反正都回不来了,要向前看,要乐观,要奋斗。我对他说,这个思想没错,但这个态度错了。经历那样的痛苦,每个人都应该体会悲痛。这是对生命基本的尊重。用高亢的乐观去展望未来的美好,这是天上的东西;用严肃的沉痛去体味现下的哀伤,这是地上的东西。而人类终究还是生活在地上的。我其实很不明白为什么一旦有人不开心了,就会有很多热心人凑过来,使尽浑身解数想让他开心。甚至连他自己都很着急,觉得自己没用,这么一点破事老是挂在心上,影响学习,影响工作。我觉得这是真正的倒行逆施。有太多人见不得别人不开心了,他们不但想成为心理咨询师,还干脆想成为救世主。他们对绝症的病人说:“没事啊,你一定会康复的!”但是如果是真正的心理咨询师,他也许只会握着那个病人的手,试着感受他当时的哀伤。

!! 为什么倾听很难?

这个故事写得太赞了,简洁又深刻:

> 病房里。
> 病人攥着你的手:“我快死了,他们都不肯告诉我,可我知道我这个病治不好。”
> 你忍不住想说:“您别多想了,没那回事。”
> 可是你不能说这句话,否则他只好一声叹息,把剩下的话咽回肚里。
> 病人使劲睁着混浊的眼睛,看你:“这个病治不好,你知道的,对吧?”
> 你忍不住想说:“不会啊!您就安心养病吧,我们还等着陪您出去玩呢。”
> 可是你不能说这句话,否则他只好一声叹息,把剩下的话咽回肚里。
> 你心里在搜肠刮肚地,想替他证明这件事还有希望:有这样的例子吗?即便这种情况也还可以有救?就算百分之一的可能性也好……不要悲观了,振作起来呀。
> 可是所有安慰他的话,都没有安静地坐在那里,让他讲,对他有帮助。
> ——但是安静地坐在那里,让他讲,倾听他对生命如此深重无力的绝望,是最难最难的一件事情。他无力反抗,你也不反抗,你们共同承受着生活的绝望。

我第一次看到李松蔚的文章就是这篇。下面这段写得真是太精辟了,当时看了感触很大:

> 拜一些社交培训所赐,倾听近来被包装为一种上等的社交技巧。他们问我:“你们搞心理咨询的是不是很善于跟别人快速建立关系?因为你们懂得倾听。”
> 还有人希望我传授几招倾听的技巧,以便相亲时显得自己更温柔善解人意。
> 他们不知道的是,心里存了太多“自我”的私念,就做不到纯粹的倾听了。
> 因为倾听,意味着情感的分享。需要放弃自己的立场,完全进入对方的世界。大多数人说到倾听的重要性,都只想表现自己很有耐心,以便为自己赢得更多的好处。但总有些时候这是行不通的,我们忍不住打断对方,因为我们忘不掉自己。

!! 第二小时 | 行为背面的潜台词

> 我们会用“认知”这个概念去理解人的行为。换句话说,我们相信,人之所以做出这样那样的事,无论看上去多么荒唐无理,都是背后或明显,或隐蔽的想法所导致的。这些认知有时是适应的,有时则弊大于利。比较麻烦的一点是,认知内化之后,自己可能已经不自知。这就是很多人,长期保持着一些别人看来离谱的行为或情感反应的原因。

这句话我很认同。很多时候人们的行为都是有其原因的,只是藏得比较深,难以挖掘甚至发现。知道这一点后,可以对周围多一些思考。再拓展开,甚至每一个表情都是有其隐含的内容。

!! “努力”的陷阱

> 把以上几点结合起来,“努力就可以进步”这句话,我们可以翻译如下:
> 现在这样,是我不满意的。我想摆脱现在这样。我希望能够针对我不满意的方向,持续做一些特定的事情(我认为需要忍受大量的痛苦)——但愿,我就不用像现在这样了……
> “努力就可以进步”,你以为是很积极昂扬的,健康振奋的。
> 不是,它的潜台词,实则是很阴暗沉重的。最沉重的一点就在于:''现在,我不满意自己''。

「忍受痛苦」往往不是走向成功的正确路径。

> 我有时会尝试另一种思路,试图建立不一样的信念,这样问题会清爽很多。但这个过程非常艰难,也没法通过这道题目解释清楚。我在这里把这个信念写出来,供大家参考:
> “做事就可以有结果,不管做的是什么事,都一样。”
> 这句话和“努力就可以进步”,实质上是一回事,但是它们背后的情感含义完全不同。如果你用这句话来取代“努力就可以进步”,也许做事就会容易一些。大家感受一下。

!! 「疼痛」与「痛苦」

一个人说疼的时候,他真正的意图是什么?

> 这就是一个经典的心理学问题:一个行为会受到哪些因素的强化(有哪些好处)?要知道,呻吟作为一种典型的疼痛行为,很多时候是能带来获益的。有时候这是一种自我安慰,有时候这是一种人际呼唤。有人是为了求关注(快来心疼我),有人是为了抱怨(我好惨呀),也有人是为了惩罚别人(看我这么痛苦,你也不好受吧?)……在心理治疗当中,这个问题没有统一的答案,一定要结合这个人,和他所处环境的特点具体分析。
> 我在做心理咨询的时候,时常接触到这种有慢性疼痛的来访者。他们捂着头,哎哟哎哟地走进咨询室,好像已经身患绝症。通常来说,他们在> 生活中都会有比疼痛更难处理的问题,工作方面的,学习方面的,人际或家庭的。但是现在疼痛变成了所有问题中最关键的一环。比如:如果不治好我的头疼……哎哟,哎哟……我就没法静下心来复习考研。
这时候,他们身边往往有人会怀疑:“有那么疼吗?不会是你想逃避考研的借口吧?”

!! 身体的事交给身体

像睡不着觉这种事情,不要刻意去想着入睡,大脑解决不了,应该交给身体去做。

简单的技巧就是,排除掉杂乱的想法,感受一下自己的身体的感觉。

> 这里的要诀就在于:不要刻意。
> 什么叫不刻意?这是对大脑说的,就是放手,别去管自己管不了的事情。身体饿了,自然就想吃饭,困了,自然就能睡着。这背后,是对身体的信任感。要知道,很多人是不相信自己的身体的。总觉得什么事必须过一遍脑子,才踏实。其实呢,我们从来没关注过呼吸,但时刻都没有耽误呼吸。身体有能力把自己的事干好。

!! 心理学工作者的育儿观

很多人盲目相信育儿经:

> 问题就在于:生活中事事都存在完美的解决之道么?一条定律,一套准则,照章执行就足以避免一切麻烦?你相信这样轻巧的人生?恐怕每个人都不得不承认,总有些麻烦是不好解决,甚至无法解决的,这让我们焦虑,悔恨,手足无措,满心不安。但这,本身也是生活的一部分。
> 当然,这是很难接受的,谁都不愿和这些情绪相处。有时候,深信不疑地跟从一派理念,大概可以活得更笃定。只是对我来说,因为知道这些理论都不靠谱,似乎已经不存在皈依的可能。所以到后来,我渐渐形成了自己的想法,这个想法可以用四个字来概括:
> 适意就好。

一个人的精力和能力都有限,太执着于做难以做到的事情,往往是徒增烦恼。

二叉树。

!! 树的遍历

[img width=300 [binary-tree]]

Depth First Traversals:

* Inorder (Left, Root, Right) : 4 2 5 1 3
* Preorder (Root, Left, Right) : 1 2 4 5 3
* Postorder (Left, Right, Root) : 4 5 2 3 1

Breadth First or Level Order Traversal: 1 2 3 4 5

!!! 算法实现

* [[Binary Tree: Depth First Traversal]]
* [[Binary Tree: Level Order Traversal]]
二叉树的深度优先遍历。有三种顺序:

* 中序(inorder):root、左、右
** 或 root、右、左,没有本质区别
* 前序(preorder):左,root,右
* 后序(postorder):左,右,root

这里先阐述算法思路,后面给出完整代码示例。算法用递归写很容易,这里讲述 ''不用递归、用栈实现'' 的方法。还有一些奇技淫巧,连栈都不需要,我没有深入了解。

!! 中序

算法:

# Create an empty stack S.
# Initialize current node as root
# Push the current node to S and set current = current->left until current is NULL
# If current is NULL and stack is not empty then 
## Pop the top item from stack.
## Print the popped item, set current = popped_item->right 
## Go to step 3.
# If current is NULL and stack is empty then we are done.

''重点在于如何定义一次循环的逻辑边界。''在这里是这样定义的:

# 每次循环,给定一个头节点,将其一系列的左节点入栈
## ''如果这个头节点为空,跳过此步骤''
# 从栈 Pop 出一个节点,把其添加到遍历结果中
# ''把该节点的右节点列为下次循环的头节点''

重点在于加粗部分的逻辑,把连续 pop 给表达了进来。每次都把某一批左左左节点入栈。

!! 前序

有两种做法:

# 可以跟中序类似,区别仅在 push 元素进结果列表(answer)的时机不同;见下面代码中的 `preorderTraversal()`
# 更简洁的做法,从 root 入栈开始,每个循环 pop 出一个元素,并先后将其右节点、左节点入栈;见下面代码中的 `preorderTraversal2()`

!! 后序

后序是最难的部分。因为后序的遍历过程不是个尾递归问题(未理解)。这篇 [[文章|https://www.geeksforgeeks.org/iterative-postorder-traversal/]] 描述 ''用两个栈'' 的思路,非常好理解。它的思路是,把遍历过程反过来,把后面要访问的节点先入栈,最终再从栈里出一个个 pop 出来。

看看代码实现就能理解。

!! 代码

下面的代码以这颗树为测试用例:

```
       1
      / \
     2   3
    / \   \
   4   5   6
  /       / \
 7       8   9
              \
              10
```

<div class="limit-code-block-height">

```go
package main

import "fmt"

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func inorderTraversal(root *TreeNode) []int {
	answer := []int{}
	stack := []*TreeNode{}

	curr := root
	for curr != nil || len(stack) != 0 {
		for curr != nil {
			stack = append(stack, curr)
			curr = curr.Left
		}
		curr, stack = stack[len(stack)-1], stack[:len(stack)-1]
		answer = append(answer, curr.Val)
		curr = curr.Right
	}

	return answer
}

// Solution 1: Inorder 版稍加修改
func preorderTraversal(root *TreeNode) []int {
	answer := []int{}
	stack := []*TreeNode{}

	curr := root
	for curr != nil || len(stack) != 0 {
		for curr != nil {
			answer = append(answer, curr.Val)
			stack = append(stack, curr)
			curr = curr.Left
		}
		curr, stack = stack[len(stack)-1], stack[:len(stack)-1]
		curr = curr.Right
	}

	return answer
}

// Solution 2: 更好理解的方式
func preorderTraversal2(root *TreeNode) []int {
	answer := []int{}
	if root == nil {
		return answer
	}

	stack := []*TreeNode{root}
	for len(stack) != 0 {
		curr := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		answer = append(answer, curr.Val)

		if curr.Right != nil {
			stack = append(stack, curr.Right)
		}
		if curr.Left != nil {
			stack = append(stack, curr.Left)
		}
	}

	return answer
}

func postorderTraversal(root *TreeNode) []int {
	answer := []int{}
	firstStack := []*TreeNode{root}
	secondStack := []*TreeNode{}

	if root == nil {
		return answer
	}

	for len(firstStack) != 0 {
		curr := firstStack[len(firstStack)-1]
		firstStack = firstStack[:len(firstStack)-1]
		secondStack = append(secondStack, curr)

		if curr.Left != nil {
			firstStack = append(firstStack, curr.Left)
		}
		if curr.Right != nil {
			firstStack = append(firstStack, curr.Right)
		}
	}

	for len(secondStack) != 0 {
		answer = append(answer, secondStack[len(secondStack)-1].Val)
		secondStack = secondStack[:len(secondStack)-1]
	}
	return answer
}

func main() {
	root := &TreeNode{1,
		&TreeNode{2,
			&TreeNode{4, &TreeNode{7, nil, nil}, nil},
			&TreeNode{5, nil, nil}},
		&TreeNode{3, nil,
			&TreeNode{6,
				&TreeNode{8, nil, nil},
				&TreeNode{9,
					nil,
					&TreeNode{10, nil, nil},
				},
			}}}
	fmt.Println(inorderTraversal(root))
	fmt.Println(preorderTraversal(root))
	fmt.Println(preorderTraversal2(root))
	fmt.Println(postorderTraversal(root))
}
```

</div>

!! 参考

* [[Inorder Tree Traversal without Recursion|https://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion/]]
* [[Iterative Postorder Traversal - Set 1 (Using Two Stacks)|https://www.geeksforgeeks.org/iterative-postorder-traversal/]]

按层来遍历二叉树。思路非常简单,用 FIFO 队列来解决就好。

下面的代码以这颗树为测试用例:

```
       1
      / \
     2   3
    / \   \
   4   5   6
  /       / \
 7       8   9
              \
              10
```

```go
package main

import "fmt"

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func levelOrderTraversal(root *TreeNode) []int {
	queue := []*TreeNode{root}
	answer := []int{}

	for len(queue) != 0 {
		curr := queue[0]
		answer = append(answer, curr.Val)
		queue = queue[1:]

		if curr.Left != nil {
			queue = append(queue, curr.Left)
		}
		if curr.Right != nil {
			queue = append(queue, curr.Right)
		}
	}
	return answer
}

func main() {
	root := &TreeNode{1,
		&TreeNode{2,
			&TreeNode{4, &TreeNode{7, nil, nil}, nil},
			&TreeNode{5, nil, nil}},
		&TreeNode{3, nil,
			&TreeNode{6,
				&TreeNode{8, nil, nil},
				&TreeNode{9,
					nil,
					&TreeNode{10, nil, nil},
				},
			}}}
	fmt.Println(levelOrderTraversal(root))
}

```

区块链相关信息集结。

交易平台:

* [[火币网|https://www.huobipro.com/]]
* [[币安网|https://www.binance.com/]]

概念:

* Filecoin
* IPFS

资源:

* [[深入浅出区块链|https://learnblockchain.cn/]]

如何做好博客。

!! 内容聚焦

人们愿意看这个博客,肯定是因为里面的内容对他有价值。blog 不应该只是 log,它应该是一系列聚焦于某些主题的内容合辑。比如 [[苏洋的博客|https://soulteary.com/]] 中,可以看到他的内容索引:

{{ suyang-blog }}

[[罗磊的博客|https://luolei.org/]] 首页,就明显地把他的内容归为几类:

{{ luolei-blog }}

!! 版面设计

[[罗磊的博客|https://luolei.org/]] 很漂亮。但是他作为图片和视频内容为主的博主,可以有足够多的素材构建出带各种缩略图的漂亮首页。我的内容偏文字居多,而且偏知识型,可能要考虑 ''列表式'' 的页面。构建过程考虑自动生成多档缩略图。

首页应该作为一个内容索引页,把你最主要的好内容列举出来。

Typography 很重要,要让内容排版非常好看。

罗磊的海报分享功能挺赞,点文章的分享按钮后出这张海报:

[img width=250 [luolei-poster]]
Bloom Filter(布隆过滤器)是一种概率数据结构(probabilistic data structure)。''它被用来判断一个元素是否存在一个集合中'';''但它可能会有 false positive'',即元素不存在、但仍然报存在。False positive 的概率可以调校得很小。应用时需要考虑场景能否容忍 false positives。

''一些使用场景'':

* 注册新用户时判断用户名是否已被占用(能容忍一定程度的误报)
* Medium 在做推荐时,用它来判断用户是否看过文章
* Chrome 用它来判断是否恶意 URL

''它仅支持两个操作'':

* ''insert(x)'':插入一个数据到 bloom filter 中
* ''lookup(x)'':查找一个数据是否在 bloom filter 中,但是有一定概率报 false positive

!! 原理

开一个长度为 n 的 bit vector。选几个 hash function。每当有新数据被添加进来时,将其 hash 值运算出来再对 n 取余。将 bit vector 中相应的 bit 置为 1。比如:

{{ bloom-filter-illustration-1 }}

表示:

* `hash1("geeks") % 10 == 1`
* `hash2("geeks") % 10 == 4`
* `hash3("geeks") % 10 == 7`

同样的,"nerd" 加进来后:

{{ bloom-filter-illustration-2 }}

进行搜索时,也对搜索的 key 做如上相应的几次 hash 运算。比如查 "cats",如果得出的结果分别是 (3, 5, 7),bit vector 中这几个位置都是 1,因此 bloom filter 会认为 "cats" 存在,引起 false positive;如果得出的结果是 (3, 5, 6),由于 bit vector 中 6 的位置为 0,那么 "cats" 一定没有被加入进来过。

避免 false positive 的方法在于增大 bit vector 的位数。

因为可能存在不同的元素 hash 出来的三元组一致,因此 bloom filter 无法支持删除元素。

!! 如何选择哈希函数

几个哈希函数间应该是 ''互相独立的'',且哈希结果应该是 ''离散型均匀分布的''(discrete uniform distribution)。而且它应该足够快,因此 ''密码学中的哈希算法并不是很合适''(性能差一些)。

常用的有 murmur、fnv 及 HashMix 等。没有深入。

!! Scalable Bloom Filter

Redis 实现了 [[scalable bloom filter|https://medium.com/@RedisLabs/rebloom-bloom-filter-datatype-for-redis-98d500f2d0ab]]。

Redis 在初始化 bloom filter 时可以指定容纳元素的 capacity 以及 expansion rate:

```
BF.RESERVE {key} {error_rate} {capacity} [EXPANSION {expansion}] [NONSCALING]
```

比如 capacity 设为 1000,EXPANSION 保持默认的 2,那么:

# 假设初始的 bit array 长度为 n(不可在命令中设置,暂时没有了解它的值是什么)
# 不停添加元素,当添加到 1000 个(capacity)时,
# Redis 自动扩容,会新建一个 2n 长(视 expansion)的 bit array;老的 bit array 仍然保留

由于 bloom filter 没有保留元素的初始值,因此扩容过程并没有类似 hash table 的 rehashing 过程。扩容之后会有多个 bit array,因此:

* 新增元素时,只会插入最新的 bit array,避免老的 bit array 过于饱和而增加 false positive 的概率
* 搜索元素时,会搜索全部的 bit array,如果有任一匹配,则返回存在

!! 参考

* [[Bloom Filters - Introduction and Implementation - GeeksforGeeks|https://www.geeksforgeeks.org/bloom-filters-introduction-and-python-implementation/]]
* [[What are Bloom filters?. A tale of code, dinner, and a favour…|https://blog.medium.com/what-are-bloom-filters-1ec2a50c68ff]]
* [[Bloom Filters by Example|http://llimllib.github.io/bloomfilter-tutorial/]]
* [[ReBloom — Bloom Filter Datatype for Redis|https://medium.com/@RedisLabs/rebloom-bloom-filter-datatype-for-redis-98d500f2d0ab]]


各书中标记的信息:

* 页面顶部的表格:
** `Medium`: 选其一:微信读书、多看阅读、纸质书、电子书、[[网站|https://example.com]]
* 页面底部的 field:
** `rating`: 5-based rating
** `read-start`: 开始看书的时间,`yyyymm` 格式
* 对于不适用的字段,写 `N/A`

Find Books:

* [[我越来越强韧,大概是因为2019年读了这67本书|https://www.douban.com/note/749161089/]]




浏览器自动化,一般涉及到这些任务:

* 需要跟浏览器做交互,比如点按钮、输入文本等
* 截图、生成 PDF
* 比较复杂的爬虫,比如爬 AJAX 动态生成的网站

通用的思路:

* 利用浏览器插件 / UserScript,在浏览器层面解决
* 利用 Headless Chrome 搭配编程库(如 puppeteer)来实现
** 我现在熟练的是 puppeteer,但 [[nightmare|https://github.com/segmentio/nightmare]] 似乎也是个很好的工具
** Chrome 插件 [[segmentio/daydream|https://github.com/segmentio/daydream]] 可以根据你的操作生成 nightmare 或者 puppeteer 脚本
* 相对弱的方案是,利用按键精灵等非 Web 平台的工具来做,可能在一些场景更简单粗暴

生成 PDF 的解决方案,参考 141 期的 [[CodeTengu|https://weekly.codetengu.com/issues/141]],里面提到了 `wkhtmltopdf` 以及 `WeasyPrint`([[参考|https://blog.rebased.pl/2018/07/12/wkhtmltopdf-considered-harmful.html]]),暂不深入。


Puppeteer 的一些坑,需要注意避免。我用的是 Python 版的 [[pyppeteer|https://github.com/miyakogi/pyppeteer]],但是有些坑是对 Google 官方的 Node.js 版也适用。

!! `.click()`

无论是 `page.click()` / 或 `element.click()` 函数,都会触发对某个 HTML 元素的点击事件。但是有几点需要注意:

* Element 需要是在页面 viewport 中可见的。pyppeteer 的函数会自动 `_scrollIntoViewIfNeeded()`
* `.click()` 操作只是模拟了用户 ''用鼠标'' 在页面中某个位置点下按钮,并不是操作底层的 DOM API 去 fire 一个 click 事件,因此如果你要点的元素被其他内容 cover 了,比如被底部的 footer 挡到了,那么对元素的 `.click()` 操作会 click 到 footer 上,而点不到元素本身

!! Windows 上的特定问题

Windows 上使用时经常会出现 "Unable to remove Temporary User Data":

* 有人 [[提到|https://github.com/mikeyy/nonoCAPTCHA/issues/16]] 可能是因为使用了代理
* 有人 [[提到|https://github.com/miyakogi/pyppeteer/issues/183#issuecomment-456249402]] 应该先 `page.close()` 再 `browser.close()`(我觉得没道理)

我没调研过具体原因。''非常建议'' 不要在 Windows 去调试 puppeteer。

同时发现过 Celery 搭配 pyppeteer 时,Windows 上总是表现得不正常。使用 prefork 模型时,收到截图任务后不工作;使用 solo 模型时,收到任务会工作,但是又无法正常退出。

!! Websockets 库 7.0 API 变动引起的问题

症状是 pyppeteer 启动 browser 20 秒后,调用任何 API 都必现 `pyppeteer.errors.NetworkError: Protocol error Page.enable: Target closed.`。[[调研|https://github.com/miyakogi/pyppeteer/issues/158]] 了下,是 websockets 库发布了 7.0,API 变动引起的问题。

pyppeteer 0.0.25 中,对于安装依赖的限定很 [[松散|https://github.com/miyakogi/pyppeteer/blob/0.0.25/setup.py#L44]],全部是 `*` 匹配,导致 `websockets` 库发布了 7.0 后自动被使用上了。等待作者发布新版本修复前,需要手动在你的依赖管理工具(`poetry`, `pipenv`)中指定使用 `websockets=^6.0.0`。
这篇 wiki 来自对 [[Saving Images From a Headless Browser|https://intoli.com/blog/saving-images/]] 一文的转译,描述如何从 headless browser 中抓取图片。

适用的场景是:

* 有些图片不适合用其他手段(如 Python 爬虫)去下载,如:
** 写爬虫成本高过操作 headless browser
** 图片是仅在登录状态可见
** 图片是一次性的,如验证码等

下面介绍几种方案来下载 headless browser 中的图片。

!! 屏幕截图

这种方式比较简单粗暴,即是用 Puppeteer 的 API 定位到你要截图的元素,再调用相应的截图 API 去截图。缺点是只能截取到该图片在浏览器中展示的大小,比如在网页做了 responsive 的情况下,一个 2000x1500 的图可能仅以 1000x750 的大小展示出来,那么这种方式只会截取到 1000x750 的大小。代码示例如下:

Python 版:

{{ Snippets: Python: Puppeteer: Download Image by Screenshot }}

Node.js 版:

{{ Snippets: Node.JS: Puppeteer: Download Image by Screenshot }}

<<.warning "在非 headless 模式下时(`headless` 参数为 `false` 时),无论 Python 还是 Node.js 的 puppeteer 库都不能准确捕捉到图片位置,截取下来的图片是错的(网页的另一角)。这可能跟屏幕 DPI 有关系。在 headless 模式下则无此问题。">>

!! 通过页面 JavaScript 获取图片

浏览器提供了 Data URLs 用来序列化二进制数据:

```
data:<image format>;base64,<image data>
```

可以通过 base64 decode 获得图片内容。

用这个思路,你可以将图片内容画到一个新建的 Canvas 上,然后调用 `canvas.toDataURL()` 获取数据。这种方式会受到 CORS 的限制,并不是太完善。代码参考英文原文。

!! 用 DevTools 协议提取图片

Puppeteer 跟 Chrome 之间用 [[DevTools Protocol API|https://chromedevtools.github.io/devtools-protocol/]] 进行通讯。可以用 `Page.getResourceContent` 协议来获取图片资源的内容,也以 base64 方式传输。

根据这个 [[issue|https://github.com/miyakogi/pyppeteer/issues/95]],pyppeteer 并没有提供对 DevTools Protocol 协议的封装,需要自行开发。puppeteer 库则有私有 API 做了封装。
构建系统是一个软件开发中重要的组成部分。这里描述对通用的构建系统、以及某些场景下(如 Node.js 的本地扩展)的经验。

! C/C++

* CMake: 似乎是现代 C/C++ 程序最喜欢的构建系统。还没有多深入了解
* gyp: 看 [[Node.js: Build System]]
* Ninja ([[GitHub|https://github.com/ninja-build/ninja]] | [[官网|https://ninja-build.org/]]): 注重速度的小型构建系统,一般不直接使用,而是跟 gyp 或者 CMake 一起使用
* Autotools 
* Makefile

! Node.js 本地扩展相关

查看 [[Node.js: Build System]]。




Read these links:

* https://bulma.io/documentation/overview/colors/
* https://bulma.io/documentation/overview/functions/
* https://bulma.io/documentation/modifiers/color-helpers/
Bulma 是 [[一个|https://bulma.io/documentation/overview/start/]] 简单的 CSS 文件。

Bulma [[不影响你的 HTML|https://bulma.io/documentation/overview/classes/]]。你可以写任意的 HTML,再加上 Bulma 的 class 来做 styling。这也是为什么 Bulma 中会存在 `.input` 类,这使得你可以决定给哪些 `<input>` 加上样式。

Bulma 提供了你 [[定义|https://github.com/jgthms/bulma/blob/master/sass/base/generic.sass]] 全局的颜色、风格的能力。

Bulma 是模块化的。你可以只 [[加载|https://bulma.io/documentation/overview/modular/]] 你需要的部分。

Bulma 是 [[响应式|https://bulma.io/documentation/overview/responsiveness/]] 的。Mobile-first and vertical by default。

Bulma 提供了易用的 [[modifier|https://bulma.io/documentation/modifiers/syntax/]]。这些 modifier 往往是可叠加的,叠加之后能有不同的效果。
Bulma 的一些控件有 loading 状态(比如 [[button|https://bulma.io/documentation/elements/button/#states]]),具体展示控件变半透明并且有转圈。

这里的 GitHub [[issue|https://github.com/jgthms/bulma/issues/847#issuecomment-314110630]] 提供了一段代码,可以用来将任意元素置为 loading。我优化了一下,将动画速度调慢到 1s:

```sass
.element
  &.is-loading
    position: relative
    pointer-events: none
    opacity: 0.5

    &:after
      @include loader
      position: absolute
      top: calc(50% - 2.5em)
      left: calc(50% - 2.5em)
      width: 5em
      height: 5em
      border-width: 0.25em
      animation: spinAround 1000ms infinite linear
```

使用时,将你要置 loading 态的元素加入 `element` 及 `is-loading` CSS 类。效果如下:

[img width=300 [bulma-element-loading]]
参考 [[文档|https://bulma.io/documentation/modifiers/responsive-helpers/]] 及文档本身的网站是如何实现 responsive 的。

参考 Bulma 的 Layout 文档。

参考 https://bulma.io/documentation/modifiers/typography-helpers/#responsive-alignment
https://bulma.io/documentation/overview/mixins/

What's mixin?
主题:

* [[Bulmaswatch|https://jenil.github.io/bulmaswatch/]]
Read these links:

* https://bulma.io/documentation/modifiers/typography-helpers/
C 运行时,就是实现 C 规范的库。操作系统内核介于硬件与软件间,C 运行时介于内核与用户软件间。

在 Windows 上是 Microsoft Visual C Runtime Library,也就是你经常看到的 `vc_redist-x86.exe` 安装进来的,在控制面板里叫作 Microsoft Visual C++ 2017 Redistributable。

在 Linux 下,主流的 C 运行时实现是 glibc。大多数软件都是用 glibc 编译的,构成了 GNU 生态,也就是 GNU/Linux 这个名字的由来。GNU 跟 Linux 是紧紧绑定的。

但是后面有另外一个 C 运行时出来挑战 glibc 的地位,叫 [[Musl|https://www.musl-libc.org/]]。注重更好的性能、更小的可执行程序和安全。作者做的 benchmark 表示 Musl 在很多方面优于 glibc。

看了一个 [[Reddit 帖子|https://www.reddit.com/r/linuxmasterrace/comments/41q2m9/eli5_what_is_musl_and_glibc/]] 很好地解释了 Musl 的一些问题:

* glibc 编译出来的软件,无法跟 musl 的兼容。比如你想用 musl 编译你的程序,但是你用的库是 glibc 编译的,那你不得不重新把库用 musl 编译一次
* 大多数发行版会选择 glibc,因为它的生态庞大。如果发行版要同时支持 musl 和 glibc,那它要把全部包编译两份
* Systemd 「故意」用了 glibc 专有的部分 GNU 扩展,导致使用 Musl 的发行版,无法使用 glibc
* 闭源、专有软件等,可能无法重新用 musl 编译;各类驱动,如 nvidia 的显卡驱动,可能写了大量跟 glibc 具体实现相关的代码,移植到 Musl 很难

Musl 的一些使用场景:

* 专注于容器的发行版 Alpine 使用 Musl,非常轻量

!! 参考

* [[ELI5: What is musl and glibc?|https://www.reddit.com/r/linuxmasterrace/comments/41q2m9/eli5_what_is_musl_and_glibc/]]

给一个变量置上 `volatile` 标识符,表示要求编译器不对此变量做优化。

比如这样一段代码:

```c
uint32 status = 0;
  
while (status == 0)
{
  /*Let us assume that status isn't being changed 
  in this while loop or may be in our whole program*/
  
  /*So long as status (which could be reflecting 
  status of some IO port) is ZERO, do something*/
}
```

如果 `while` 循环体中 `status` 的值不会被改变,那编译器可能认为 `status` 的值一直是 0,并不需要在 `while` 中做判断。因此它可能把代码优化为 `while (true)` 的形式。

但是有些情况下,编译器是感知不到 `status` 值的变化的。比如你在写驱动程序,使用到某种 memory-mapped 内存时,内存的值可能随着外部 I/O 的变化而变化,因此这种情况下编译器无法从代码中感知到值会变化,此时需要给变量置上 `volatile` 标识符:

```c
volatile uint32 status = 0;
```

!! 参考

* [[Understanding “volatile” qualifier in C - Set 1 (Introduction)|https://www.geeksforgeeks.org/understanding-volatile-qualifier-c-set-1-introduction/]]

! Source Directory

gcc / g++ 编译时,如果启用 `-g` 选项,会把调试信息写进 ELF 文件中。这些信息里面,包含某些二进制代码所对应的源文件和相应行数,用来给 GDB 调试时显示源代码文件。有些构建系统会以相对路径(Bazel)写入这些文件,有些则会以绝对路径(如 CMake)。gdb 默认会从 `$cdir` (directory embedded in executable recorded during compilation) 和 `$cwd` (current working directory) 这两个地方去查找源文件,而且就算打断点时你给了绝对路径也没有用,gdb 还是会去上述两个目录找。

比如你有个 `main.c` 在编译时的当前目录下,那么编译出来,它的调试信息中,文件路径是 `./main.c`。你在 gdb 调试时,用 `breakpoint main.c:20` 是 OK 的,但是你用它的绝对路径,`breakpoint /home/onlyice/main.c:20` 则不行,会报 `No source file named /home/onlyice/main.c`。

在使用 [[Bazel]] 编译 istio/proxy 时,发现 [[Bazel]] 编译出来的调试信息也是用的相对路径。而用 CLion 去调试时,要把 Run Configuration 中的 Current Working Directory 设为项目的根目录,不然打的断点不会停下来,因为上面所描述的原因。


Microservice 界有 Canary Development / Canary Test 的说法。这是一个在用户不知情的情况下,把服务端应用程序慢慢发布出过的过程:

{{ canary-testing }}

比如上图中,一开始按 5% 比例,把程序新版本给用户使用。如果一切正常,再全部发布。全部发布的过程,可以是逐渐提高新版本比例(gradual rollouts),也就是腾讯中常讲的「灰度发布」;也可以是直接发布,类似 Chrome Canary 变成 Chrome Stable,或者 VSCode Insider 的机制。

Canary 是金丝雀,这个名字的来源是,以前挖矿的工人会带金丝雀,一里毒气浓度达到一定程度,金丝雀会先死去,这能警告工人们远离危险。

参考材料:

* [[CanaryRelease|https://martinfowler.com/bliki/CanaryRelease.html]]




!! Readability

* 默认使用 Open Sans字体,显示上舒服很多
* 使用 UserStyle 一节中提到的 [[全网字体替换|https://userstyles.org/styles/115780/consolas-2]] sheet,里面应用上了 `-webkit-font-smoothing: subpixel-antialiased` 使显示效果更佳
* 在 23~24 寸显示器上以 1080P 分辨率使用时,默认的显示比例调整成 125%
* 在 Windows 7 上使用 110% 的 DPI 设置,而不要使用「中等」选项;在 Windows 10 上使用「中等」选项

!! UserStyles

* 这个 style 可以让 Chrome 的字体渲染舒服很多:[[全网字体替换 - 微软雅黑、Consolas - 版本2|https://userstyles.org/styles/115780/consolas-2]]
** 修改 CSS 使英文字体使用 Open Sans 更佳,参考 [[Font and Font Rendering]]
** 中文字体可以尝试用 Noto Sans CJK SC,参考 [[Font and Font Rendering]]

!! Night Mode

用 [[Dark Reader|https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh]],是我见过效果最好的。

[[Midnight Lizard|https://chrome.google.com/webstore/detail/midnight-lizard/pbnndmlekkboofhnbonilimejonapojg]] 效果也不错,''但是会使 Gmail 网页版非常卡顿''。

!! Ad. Blocker

使用 [[uBlock Origin|https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm]]。

* v.s. AdBlock / AdBlock Plus:uBlock Origin 占用的资源少得多。AdBlock Plus 造成老婆刷淘宝时非常卡顿。
* v.s. uBlock:这个网站上的 [[uBlock|http://www.ublock.org]] 一开始是 uBlock Origin 的作者 [[Raymond Hill|https://github.com/gorhill]] 开发的,但是它没有精力维护就交给了 Chris Aljoudi。但是 Aljoudi 不讲道理,把 Raymond Hill 的名字完全移除了(参考 [[Reddit 讨论|https://www.reddit.com/r/ublock/comments/32mos6/ublock_vs_ublock_origin/]],所以 Raymond Hill 把交给 Chris 的 uBlock 仓库又 fork 一份自己维护,并改名 uBlock Origin。社区上倾向于使用 uBlock Origin,认为它在积极开发,而且道德上占优。

!! TOC Enhancement

使用 [[Smart TOC|https://chrome.google.com/webstore/detail/smart-toc/lifgeihcfpkmmlfjbailfpfhbahhibba]] 可以在任意页面显示出 TOC。这在一些没有显示 TOC、但是内容又非常长的页面有作用,可以让你先对文章的脉络有个整体的理解。[[同时也适用于长 tiddler|TiddlyWiki: In Tiddler TOC]]。
这里面收录的资源,里面提供了一些提升命令行使用效果的技巧或工具。

* [[CLI: Improved|https://remysharp.com/2018/08/23/cli-improved]]

对于一些机械劳动,运用好剪贴板能提升效率。有多串文本需要重复使用时,通过软件查看剪贴板历史,并进行快速的选择和输入。

我选择了 Ditto (Windows) 和 Klipper (Linux)。这两个软件都配置快捷键为 <kbd>Ctrl+Shift+V</kbd>。

! Windows 平台

Windows 平台只有一个剪贴版 buffer。

!! Ditto

Ditto 是一个简单的,中规中矩的剪贴板管理软件。能通过全局热键快速输入以前复制过的内容。界面丑。

!! 1Clipboard

PicPick 作者开发的,界面美观。但是没法直接输入历史剪贴板内容,操作上不如 Ditto 简便。

! Linux 平台

参考 [[Arch Wiki|https://wiki.archlinux.org/index.php/Clipboard#Background]],Linux 平台主要用两个剪贴版 buffer,分别是 PRIMARY 和 CLIPBOARD:

* PRIMARY: 鼠标选中的内容直接进这个 buffer,按鼠标中键粘贴
* CLIPBOARD: 选中内容后使用 <kbd>Ctrl+C</kbd> / <kbd>Ctrl+X</kbd> 才会进这个 buffer,<kbd>Ctrl+V</kbd> 粘贴

!! Klipper

Klipper 是 Plasma 自带的剪贴版管理工具,可以保存剪贴版历史并且配置热键快速弹出历史列表。它可以处理上述两种 buffer。

!! xclip

xclip 默认操作的是 PRIMARY buffer:

```bash
# Put your uptime in the X selection. Then middle click in an X application to paste.
uptime | xclip
```

可以加 `-selection clipboard` 参数使用 CLIPBOARD buffer。

! Alternatives

* [[CopyQ|https://hluk.github.io/CopyQ/]]:跨平台,功能未深入研究




这里存放 Mosh 的 [[课程|https://codewithmosh.com/]] 的目录结构,作为参考。

* Getting Started (32m)
*# What is Python (3:21)
*# Installing Python (1:52)
*# Python Interpreter (1:55)
*# Code Editors (1:19)
*# Your First Python Program (3:36)
*# Python Extension (2:52)
*# Linting Python Code (4:14)
*# Formatting Python Code (3:54)
*# Running Python Code (2:59)
*# Python Implementations (2:28)
*# How Python Code is Executed (2:46)
*# Quiz (1:37)
* Primitive Types (34m)
*# Variables (3:04)
*# Variable Names (3:02)
*# Strings (5:30)
*# Escape Sequences (2:40)
*# Formatted Strings (2:08)
*# String Methods (5:54)
*# Numbers (2:46)
*# Working with Numbers (2:09)
*# Type Conversion (5:04)
*# Quiz (2:43)
* Control Flow (37m)
*# Comparison Operators (2:04)
*# Conditional Statements (4:09)
*# Ternary Operator (2:09)
*# Logical Operators (4:02)
*# Short-circuit Evaluation (2:06)
*# Chaining Comparison Operators (1:22)
*# Quiz (1:43)
*# For Loops (3:38)
*# For..Else (2:46)
*# Nested Loops (2:44)
*# Iterables (3:08)
*# While Loops (4:59)
*# Infinite Loops (1:37)
*# Exercise (2:05)
* Functions (41m)
*# Defining Functions (2:24)
*# Arguments (2:20)
*# Types of Functions (4:02)
*# Keyword Arguments (2:00)
*# Default Arguments (1:35)
*# xargs (4:15)
*# xxargs (2:20)
*# Scope (5:09)
*# Debugging (6:50)
*# VSCode Coding Tricks - Windows (2:21)
*# VSCode Coding Tricks - Mac (1:49)
*# Exercise (1:29)
*# Solution (4:41)
*#Quick Note
* Data Structures (1h20m)
*# Lists (3:54)
*# Accessing Items (3:13)
*# List Unpacking (3:51)
*# Looping over Lists (2:54)
*# Adding or Removing Items (2:56)
*# Finding Items (1:28)
*# Sorting Lists (4:35)
*# Lambda Functions (1:49)
*# Map Function (3:25)
*# Filter Function (2:05)
*# List Comprehensions (3:10)
*# Zip Function (1:49)
*# Stacks (4:24)
*# Queues (2:50)
*# Tuples (4:02)
*# Swapping Variables (2:37)
*# Arrays (3:11)
*# Sets (4:03)
*# Dictionaries (5:24)
*# Dictionary Comprehensions (3:19)
*# Generator Expressions (3:51)
*# Unpacking Operator (4:05)
*# Exercise (6:21)
* Exceptions (20m)
*# Exceptions (2:16)
*# Handling Exceptions (4:10)
*# Handling Different Exceptions (3:05)
*# Cleaning Up (1:57)
*# The With Statement (3:07)
*# Raising Exceptions (3:21)
*# Cost of Raising Exceptions (4:41)
* Classes (1h25m)
*# Classes (2:35)
*# Creating Classes (3:45)
*# Constructors (4:37)
*# Class vs Instance Attributes (3:58)
*# Class vs Instance Methods (4:05)
*# Magic Methods (3:13)
*# Comparing Objects (3:11)
*# Performing Arithmetic Operations (1:31)
*# Making Custom Containers (6:55)
*# Private Members (3:40)
*# Properties (7:30)
*# Inheritance (4:23)
*# The Object Class (2:23)
*# Method Overriding (3:14)
*# Multi-level Inheritance (2:42)
*# Multiple Inheritance (3:22)
*# A Good Example of Inheritance (4:31)
*# Abstract Base Classes (4:50)
*# Polymorphism (3:56)
*# Duck Typing (2:50)
*# Extending Built-in Types (2:26)
*# Data Classes (4:36)
* Modules (20m)
*# Creating Modules (4:16)
*# Compiled Python Files (2:19)
*# Module Search Path (1:35)
*# Packages (2:27)
*# Sub-packages (1:01)
*# Intra-package References (1:36)
*# The dir Function (1:39)
*# Executing Modules as Scripts (2:55)
* Python Standard Library (1h)
*# Python Standard Library (0:51)
*# Working With Paths (4:48)
*# Working with Directories (4:14)
*# Working with Files (3:59)
*# Working with Zip Files (3:15)
*# Working with CSV Files (4:50)
*# Working with JSON Files (3:57)
*# Working with a SQLite Database (9:10)
*# Working with Timestamps (2:24)
*# Working with DateTimes (5:05)
*# Working with Time Deltas (2:41)
*# Generating Random Values (4:09)
*# Opening the Browser (1:12)
*# Sending Emails (6:48)
*# Templates (4:53)
*# Command-line Arguments (1:54)
*# Running External Programs (8:06)
* Python Package Index (1h30m)
*# Pypi (1:49)
*# Pip (6:23)
*# Virtual Environments (4:04)
*# Pipenv (3:40)
*# Virtual Environments in VSCode (3:49)
*# Pipfile (4:48)
*# Managing Dependencies (3:28)
*# Publishing Packages (8:22)
*# Docstrings (5:48)
*# Pydoc (4:06)
* Popular Python Packages (1h30m)
*# Introduction (1:41)
*# What are APIs (2:36)
*# Yelp API (2:51)
*# Searching for Businesses (9:54)
*# Hiding API Keys (2:05)
*# Sending Text Messages (6:02)
*# Web Scraping (9:06)
*# Browser Automation (11:28)
*# Working with PDFs (6:18)
*# Working with Excel Spreadsheets (9:52)
*# Command Query Separation Principle (4:39)
*# NumPy (9:05)
* Building Web Applications with Django (30m)
*# Introduction (1:43)
*# Your First Django Project (4:11)
*# Your First App (3:41)
*# Views (7:59)
*# Models (4:57)
*# Migrations (8:00)
*# Changing the Models (5:38)
*# Admin (4:29)
*# Customizing the Admin (6:55)
*# Database Abstraction API (3:52)
*# Templates (10:23)
*# Adding Bootstrap (4:19)
*# Customizing the Layout (2:23)
*# Sharing a Template Across Multiple Apps (3:48)
*# Url Parameters (4:37)
*# Getting a Single Object (3:48)
*# Raising 404 Errors (3:51)
*# Referencing Urls (3:47)
*# Creating APIs (9:26)
*# Adding the Homepage (4:27)
*# Getting Ready to Deploy (9:44)
*# Deployment (7:59)
* Machine Learning with Python (30m)
*# What is Machine Learning (1:58)
*# Machine Learning in Action (2:47)
*# Libraries and Tools (4:54)
*# Importing a Data Set (6:21)
*# Jupyter Shortcuts (5:26)
*# A Real Machine Learning Problem (3:17)
*# Preparing the Data (3:05)
*# Learning and Predicting (4:04)
*# Calculating the Accuracy (6:20)
*# Persisting Models (3:14)
*# Visualizing a Decision Tree (6:26)
*# What to Learn Next
*# Thank You
* Getting Started (00:28)
*# What is React (4:32)
*# Setting Up the Development Environment (3:37)
*# Your First React App (6:33)
*# Hello World (5:25)
*# Custom Configs (3:11)
*# Full-stack Architecture (2:44)
*# Course Structure (2:24)
*# Start Redux?
* ES6 Refresher (00:48)
*# Introduction (1:43)
*# Let vs Var vs Const (3:52)
*# Objects (2:45)
*# The this Keyword (2:49)
*# Binding this (2:36)
*# Arrow Functions (4:15)
*# Arrow Functions and this (4:14)
*# Array.map Method (3:36)
*# Object Destructuring (2:29)
*# Spread Operator (4:02)
*# Classes (3:45)
*# Inheritance (4:03)
*# Modules (4:11)
*# Named and Default Exports (5:15)
* Components (01:17)
*# Introduction (1:38)
*# Setting Up the Project (2:06)
*# Your First React Component (5:20)
*# Specifying Children (4:16)
*# Embedding Expressions (4:50)
*# Setting Attributes (5:45)
*# Rendering Classes Dynamically (4:18)
*# Rendering Lists (3:58)
*# Conditional Rendering (6:04)
*# Handling Events (2:49)
*# Binding Event Handlers (4:36)
*# Updating the State (2:14)
*# What Happens When State Changes (2:04)
*# Passing Event Arguments (3:04)
*# Setting Up the Vidly Project (5:38)
*# Exercises (3:25)
*# Building the Movies Component (7:18)
*# Deleting a Movie (5:18)
*# Conditional Rendering (3:26)
*# Summary (0:36)
* Composing Components (01:19)
*# Introduction (0:45)
*# Composing Components (3:45)
*# Passing Data to Components (3:11)
*# Passing Children (3:10)
*# Debugging React Apps (4:09)
*# Props vs State (2:24)
*# Raising and Handling Events (4:52)
*# Updating the State (4:38)
*# Single Source of Truth (3:55)
*# Removing the Local State (6:47)
*# Multiple Components in Sync (5:53)
*# Lifting the State Up (5:36)
*# Stateless Functional Components (2:29)
*# Destructuring Arguments (2:00)
*# Lifecycle Hooks (1:38)
*# Mounting Phase (5:34)
*# Updating Phase (4:20)
*# Unmounting Phase (1:26)
*# Exercise- Decrement Button (1:05)
*# Solution - Decrement Button (4:53)
*# Exercise- Like Component (1:44)
*# Solution- Like Component (12:26)
*# Summary (0:42)
* Pagination, Filtering, and Sorting (01:47)
*# Introduction (1:08)
*# Exercise- Pagination Component (1:01)
*# Pagination- Component Interface (3:47)
*# Pagination- Displaying Pages (6:48)
*# Pagination- Handling Page Changes (5:49)
*# Pagination- Paginating Data (6:14)
*# Pagination- Type Checking with PropTypes (4:56)
*# Exercise- ListGroup Component (1:24)
*# Filtering- Component Interface (5:32)
*# Filtering- Displaying Items (3:57)
*# Filtering- Default Props (2:06)
*# Filtering- Handling Selection (4:20)
*# Filtering- Implementing Filtering (2:59)
*# Filtering- Adding All Genres (3:39)
*# Sorting- Extracting MoviesTable (5:19)
*# Sorting- Raising the Sort Event (3:28)
*# Sorting- Implementing Sorting (5:13)
*# Sorting- Moving Responsibility (5:15)
*# Sorting- Extracting TableHeader (7:44)
*# Sorting- Extracting TableBody (3:12)
*# Sorting- Rendering Cell Content (8:02)
*# Sorting- Unique Keys - Final (2:58)
*# Sorting- Adding the Sort Icon (3:57)
*# Sorting- Extracting Table (3:51)
*# Sorting- Extracting a Method (3:18)
*# Destructuring Arguments (0:58)
*# Summary (0:51)
* Routing (00:53)
*# Introduction (0:33)
*# Setup (1:46)
*# Adding Routing (4:15)
*# Switch (2:26)
*# Link (4:20)
*# Route Props (2:10)
*# Passing Props (2:35)
*# Route Parameters (3:32)
*# Optional Parameters (2:06)
*# Query String Parameters (3:51)
*# Redirects (3:06)
*# Programmatic Navigation (2:20)
*# Nested Routing (4:35)
*# Exercises- NavBar and Routing (1:43)
*# Adding React Router (1:26)
*# Adding Routes (4:57)
*# Adding the NavBar (4:39)
*# Linking to the MovieForm (4:42)
*# Summary (0:31)
* Forms (01:34)
*# Introduction (0:38)
*# Building a Bootstrap Form (5:34)
*# Handling Form Submission (2:00)
*# Refs (3:58)
*# Controlled Elements (4:32)
*# Handling Multiple Inputs (2:49)
*# Common Errors (2:28)
*# Extracting a Reusable Input (3:57)
*# Validation (2:56)
*# A Basic Validation Implementation (3:11)
*# Displaying Validation Errors (3:42)
*# Validation on Change (4:19)
*# Joi (4:33)
*# Validating a Form Using Joi (4:43)
*# Validating a Field Using Joi (5:22)
*# Disabling the Submit Button (1:11)
*# Code Review (3:13)
*# Extracting a Reusable Form (4:51)
*# Extracting Helper Rendering Methods (8:18)
*# Register Form (1:42)
*# Code Review (1:10)
*# Exercise 2- Movie Form (3:18)
*# Code Review (8:24)
*# Exercise 3- Search Movies (1:22)
*# Code Review (5:12)
* Calling Backend Services (01:42)
*# Introduction (1:13)
*# JSON Placeholder (2:54)
*# Http Clients (2:56)
*# Getting Data (5:26)
*# Creating Data (4:52)
*# Lifecycle of a Request (2:50)
*# Updating Data (4:14)
*# Deleting Data (1:35)
*# Optimistic vs Pessimistic Updates (4:24)
*# Expected vs Unexpected Errors (6:40)
*# Handling Unexpected Errors Globally (7:54)
*# Extracting a Reusable Http Service (3:43)
*# Extracting a Config Module (1:36)
*# Displaying Toast Notifications (2:56)
*# Logging Errors (5:47)
*# Extracting a Logger Service (4:25)
*# Vidly Backend (1:50)
*# Installing MongoDB on Mac (3:58)
*# Installing MongoDB on Windows (5:39)
*# Setting Up the Node Backend (2:44)
*# Disabling Authentication (4:01)
*# Exercise- Connect Movies Page to the Backend (1:56)
*# Adding Http and Log Services (2:38)
*# Replacing FakeGenreService (3:23)
*# Replacing FakeMovieService (5:48)
*# Extracting a Config File (1:54)
*# Exercise- Connect Movie Form to the Backend (0:56)
*# Populating the Form (3:45)
*# Refactoring (2:30)
*# Saving the Movie (2:40)
*# Refactoring (2:36)
* Authentication and Authorization (01:41)
*# Introduction (0:49)
*# Registering a New User (2:37)
*# Submitting the Registration Form (4:30)
*# Handling Registration Errors (1:58)
*# Logging in a User (1:43)
*# Submitting the Login Form (2:23)
*# Handling Login Errors (1:51)
*# Storing the JWT (3:04)
*# Logging in the User upon Registration (5:37)
*# JSON Web Tokens (JWT) (3:59)
*# Getting the Current User (4:18)
*# Displaying the Current User on NavBar (4:48)
*# Logging out a User (2:44)
*# Refactoring (10:03)
*# Calling Protected API Endpoints (4:10)
*# Fixing Bi-directional Dependencies (2:43)
*# Authorization (6:30)
*# Showing or Hiding Elements based on the User (2:40)
*# Protecting Routes (2:50)
*# Extracting ProtectedRoute (5:55)
*# Redirecting after Login (5:40)
*# Exercise (0:19)
*# Hiding the Delete Column (4:19)
* Deployment (00:35)
*# Introduction (0:38)
*# Environment Variables (4:58)
*# Production Builds (2:48)
*# Getting Started with Heroku (2:06)
*# MongoDB in the Cloud (2:35)
*# Adding Code to a Git Repository (3:05)
*# Deploying to Heroku (3:01)
*# Viewing Logs (2:40)
*# Setting Environment Variables on Heroku (4:37)
*# Preparing the Font-end for Deployment (4:09)
*# Deploying the Front-end (2:38)
* Advanced Topics (01:04)
*# Introduction (0:31)
*# Source Code
*# Setting Up the Development Environment (3:13)
*# Higher Order Components (2:04)
*# Implementing a Higher Order Component (8:35)
*# Hooks (3:06)
*# The useState Hook (8:30)
*# The useEffect Hook (5:46)
*# Custom Hooks (3:04)
*# Fetching Data with Hooks (4:37)
*# Context (2:10)
*# Context in Class Components (9:46)
*# Context in Functional Components (3:33)
*# Updating the Context (7:06)
*# Consuming Multiple Contexts (2:24)
*# Thank You!
*# What to Learn Next
freecodecamp 有一个非常好的视频,全景式地讲了如何做编程相关视频:

<iframe width="560" height="315" src="https://www.youtube.com/embed/AsTagX5tG4E" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

一些观点我觉得有启发:

* 如果你要做的技术内容你也不是很懂,没有关系,可以边学边做
* 以你自己喜欢的方式,做出你自己的风格

将视频分为四类:

[img width=600 [coding-video-tutorial]]

[img width=600 [coding-video-informational]]

[img width=600 [coding-video-live-coding]]

[img width=600 [coding-video-entertainment]]

YouTube 的推荐算法 ''不关心'':

* 频道的上传频率
* 频道主给视频打的标签
* 频道之前的视频的表现。但之前视频质量高的,订阅也多,自然被推荐的概率会高一些
* 视频描述(但描述的第一段,对于搜索来说挺重要的)
* 频道订阅数
* 视频平均被看了多少百分比。YouTube 看重平均观看时长(绝对值),而不是百分比(相对值)

YouTube 的推荐算法,''最看重点击率和观看时长''。所以你往往需要好看的封面图来吸引点击,再用高质量的内容来提升时长。

小技巧:

* 使用 YouTube 的 end screens 功能,在视频结束时给出其他相关视频
* 如果是一系列的视频,在视频描述中给出播放列表的链接
* 发布长视频
开场白。

Programming with Mosh:

> Hi, my name is Mosh, and I'm going to be your instructor in this Python course.

<iframe width="560" height="315" src="https://www.youtube.com/embed/_uQrJ0TkZlc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Clever Programmer 用的是装逼流。播主说别的视频无聊,说他的视频 epic,用非常强的音乐带动节奏:

<iframe width="560" height="315" src="https://www.youtube.com/embed/4F2m91eKmts" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Tips:

* 每节课流程:讲概念,简单演示,给练习题,给答案,然后给一个 cheatsheet 做总结
* 强调不用做笔记做备忘,而应该注重于练习
* 练习考虑多题,每题难度递进


!! Outlines

|!目标                  |!内容长度   |
|说服听众学习 Python     |🍕🍕🍕     |
|这个课程的学习方法       |🍕🍕       |
|安装 Python 和 PyCharm |🍕🍕🍕🍕  |

* 说服听众学习 Python。分场景:
** 学生将其作为第一门语言:
*** Python 易上手
*** 对比 C / C++(大多数大学课程会使用它们作为第一语言)
** 学生将其作为第二门语言:
*** 乐趣

!! Scripts

!!! 介绍 Python

Hello 你好,这门课里,我会带你了解快速上手 Python 所需要的一切知识。

很多人刚接触到 Python 时会提的一个问题是:Python 值得我花时间去学习吗?那我们先来解答这个问题。

如果你之前完全没有编程基础,那我强烈推荐你将 Python 作为入门的第一门语言。Python 的语法简单优雅,语言特性上设计得很精巧,意味着你可以很快地上手。很多大学会使用 C 或 C++ 作为第一门语言,但我非常不推荐将它们作为第一门语言。一方面它们太复杂了,很多人在学 C 或 C++ 时,就在指针、内存管理、各种奇怪的编译选项中就搞得晕头转向;而 Python 作为抽象程度高的语言,你就不需要关心这些细节,这使得它对新手非常友好。另一方面,C 或 C++ 语言的应用面相对门槛高,比如大型游戏开发、数据库、服务器中间件等,这些领域并不是学了一门编程语言就可以开发的,还需要大量图形学、操作系统的知识。计算机作为一门非常注重实践的学科,如果你学了之后很难做出东西来,就容易缺乏动力和成就感。而 Python 的应用领域门槛较低,比如网站开发、爬虫、数据分析,这使得你比较容易做出东西来,也更有动力和成就感。

如果你已经有过编程基础了,想将 Python 作为第二或者第三语言,那也是非常好的。Python 的语言设计上简单精巧,学起来会很有乐趣。同时它的应用面广泛,而且在各领域都有发展了十几年的成熟框架,比如网站后台有 Django,爬虫有 Scrapy,数据分析有 Pandas 等等。这意味着你可以借助它们快速的开发出产品。Python 在自动化上也非常实用,所以你日常工作学习的琐碎事情,也可以让 Python 帮你完成。

!! 如何学习 Python?

在开始学习之前,让我们先看看应该怎样学习 Python。学编程非常好的一点是,你学了什么东西,马上可以写一段代码在电脑上跑起来,来验证你的理解是不是对的。如果你想学会编程,最重要的事情就是多练习,没有别的方式。我甚至不鼓励你花太多时间做笔记。编程入门的知识并不复杂,多用用你就会记在脑海里,不需要专门去做笔记。但我也会在每个视频里提供一份知识重点的文档,方便你后面查看,或者整合进你的笔记系统。

另外,很多编程课程存在的一个问题是,过于侧重于讲解而不是练习,而且讲解时用的项目又过于简单,所以很多人即使学完整个课程,需要自己实际写点什么时,又经常不知何从下手。针对这个问题,我会在每节课中给出有挑战性、但是你能独立完成的任务,通过自己实际解决问题来掌握写代码的技能。

!! 安装 Python 及 PyCharm

好,那让我们开始 Python 之旅吧!

首先你需要安装 Python。

[演示 Python 的安装...]

装完 Python 之后,你就有一个可以运行 Python 代码的解释器了。




















现在有个看起来非常有竞争力的 [[uTools|https://u.tools/]]。Electron based,有很多实用小工具,品味不错。但是代码闭源。后续可能会支持自定义插件。

!! Native Implements

Mac OS has several good softwares that inspire many of other implements. They are [[Alfred|https://www.alfredapp.com/]] and Spotlight. But Spotlight lacks of plugin mechanism and the community has contributed [[a unofficial solution|https://github.com/w0lfschild/Flashlight]].

!!! Wox <<plat-win>>

* No preview
* Many plugins
* Bad taste of UI / UX
* Not maintained any more

!!! Keypirinha <<plat-win>>

[[Keypirinha|http://keypirinha.com]] is very flexible and elegant. You can write plugins in Python. The problem is that it does not has a preview panel.

!! Cross-platform Implements (Most based on Electron)

|! |!With Preview|!Plugins |!Note |
|![[KELiON/cerebro|https://github.com/KELiON/cerebro]] |Yes |Many |Not under development |
|![[tinytacoteam/zazu|https://github.com/tinytacoteam/zazu]] |No |Some | |
|![[hainproject/hain|https://github.com/hainproject/hain]] |Yes |Some | |
|![[vutran/dext|https://github.com/vutran/dext]] |Yes |Some | |

!! See also

Closely related to [[Quick Launch and File Search]].
社群运营。

罗磊的 [[我为什么选择 Telegram 来运营粉丝社群 - 规则、经验和思考|https://luolei.org/why-i-choose-telegram/]] 值得一看。



配置放在 `~/.condarc` 或者 Conda 安装目录下的 `.condarc`。

!! 下载太慢

可以在 `.condarc` 中配置代理:

```yaml
proxy_servers:
  http: http://fm-proxy.oa.com:8080
  https: http://fm-proxy.oa.com:8080
```

也可以配置清华的代理:

```yaml
channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/
  - defaults
```
创建 Conda 自定义 channels。这个功能适用于这些场景:

* 你想在没有网络条件的机器上离线安装一些包
* 你有私有的 Python / 其他包,想通过 conda 来安装,你可以把这些包 build 好放自定义的 channel 中

这个文档描述第一种需求。

下面以在一个没有访问外网能力的机器上安装 Conda 并安装 Ansible 作为示例,描述怎样实现离线使用 Conda。这个方案不使用 conda env,只用默认的 env(root),但是道理是相通的。

首先你需要在有网络的机器上,安装一个 ''全新的'' Conda,并用 Conda 安装 Ansible:

```bash
# Download miniconda from https://conda.io/miniconda.html
sh Miniconda2-latest-Linux-x86_64.sh -b      # silent install
<conda_dir>/bin/conda install -c conda-forge ansible
<conda_dir>/bin/conda install mysql-python   # Ansible mysql_db module relies on this
```

这时你的 `<conda-dir>/pkgs` 里面会有 ansible, mysql-python 的包以及他们的依赖包。把这些包拷贝到一个单独的 `channel` 目录:

```bash
mkdir -p ~/conda-channel/linux-64
mkdir -p ~/conda-channel/noarch

cp <conda_dir>/pkgs/*.bz2 ~/conda-channel/linux-64
```

<<.info "如果你不确定你的包是不是 linux-64 的,看看 `pkgs/urls.txt` 文件。">>

安装 conda-build,并为 conda-channel 目录建索引:

```bash
<conda_dir>/bin/conda install conda-build
<conda_dir>/bin/conda index ~/conda-channel/linux-64 ~/conda-channel/noarch
```

`conda index` 会在相应的目录下建 `repodata.json` `repodata.json.bz2` 文件。把整个 conda-channel 目录打包,复制到你的目标环境(没有网络的环境),并解包。安装 Conda 后,用这个命令来安装 Ansible:

```bash
<conda_dir>/bin/conda install ansible mysql-python -c file://<conda_channel_dir> --override-channels
```

`--override-channels` 让 Conda 不去查询默认的(defaults)channel,只用 `-c` 选项给出的 channel 地址。

!! 其他选择

`conda install` 本身提供了 `--offline` 参数,可以从本地的缓存 `<conda>/pkgs` 中安装包。但是如果你把一个有网络条件的 Conda 中的 pkgs 下的包拷贝到新的 Conda 中,用 `--offline` 参数安装时总会报错。Does not work :-(

!! 参考

* [[Conda - Creating custom channels|https://conda.io/docs/user-guide/tasks/create-custom-channels.html]]
* [[Comment on GitHub issue|https://github.com/conda/conda/issues/7337#issuecomment-395500956]]
* [[conda install|https://conda.io/docs/commands/conda-install.html]]
See [[Python: Deployment]].
Conda 是一个跨平台的系统级包管理器。这个 [[幻灯片|https://speakerdeck.com/teoliphant/effectively-using-open-source-with-conda]] 有一些基础介绍。

Anaconda 公司维护了一批预编译好的包。这些包不止有带 C 扩展的 Python 库(比如 `mysql-python`),也有一些 C 库本身(如 `libpng`)。Conda 可以生成一套类似 virtualenv 的环境,包含 Python 本身、C 库以及 Python 库,以实现方便的部署和环境隔离。

[img width=500 [conda-packaging-solution]]

Anaconda 公司维护了几个产品:

* Conda:包管理器本身,类似 `yum` / `apt-get`
* miniconda:一个 Python 发行版,包含 Python 本体和 Conda,以及非常基础的 Python 库,如 `setuptools` 和 `pip`
* Anaconda:一个 Python 发行版,等于 miniconda 基础上再预装一两百个流行的 Python 库,主要针对 Data Science 场景
* Anaconda 仓库:官方维护的 1000+ 个库,包含 C 库和 Python 库
* Anaconda Cloud:一个云服务,可以托管企业自己打包的库(用 conda-build 打包),并提供部署的解决方案

快速链接:

* [[Conda 文档|https://conda.io/docs/]]
* [[官方仓库|https://repo.continuum.io/pkgs/]]
* [[Anaconda 官网|https://anaconda.org/]]

!! 特性

从 [[这里|https://speakerdeck.com/teoliphant/effectively-using-open-source-with-conda]] 抄的:

* Excellent support for “system-level” environments (like having mini VMs but much lighter weight than docker.io)
* Minimizes code-copies (uses hard/soft links if possible)
* Dependency solver using fast satisfiability solver (SAT solver)
* Simple format binary tar-ball + meta-data
* Meta-data allows static analysis of dependencies
* Easy to create multiple “channels” which are repositories for binary packages
* User installable (no root privileges needed)
* Can still use tools like pip --- conda fills in where they fail.

!! 具体实现

没有找到太详细的资源讲述 conda 的工作原理,但是从安装好的文件中可以观察到一些行为。

Conda 安装时会将很基础的系统库软链一份到 `<conda_dir>/x86_64-conda_cos6-linux-gnu/sysroot/lib/`,比如 `lib/libatomic.so.1.2.0`。

`<conda_dir>/lib/pkgconfig/` 中,各种路径参数会被设置成安装的路径,比如 `<conda_dir>/lib/pkgconfig/python-3.6.pc`:

```python
# See: man pkg-config
prefix=/home/onlyice/miniconda3
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: Python
Description: Python library
Requires:
Version: 3.6
Libs.private: -lpthread -ldl  -lutil -lrt
Libs: -L${libdir} -lpython3.6m
Cflags: -I${includedir}/python3.6m
```

`lib` 目录下用的库,大多是 hard link `pkg` 目录下的库的。可以通过观察 inode 得知。Anaconda 的工程师在这个 [[issue|https://github.com/conda/conda/issues/3308]] 中提到为什么要用 hard link 而不是用 soft link。

Conda 创建出来的新 env,跟 virtualenv 不太一样,会「拷贝」一份完整的 Python 和各种包,包括 `mysql` 那些。这个 env 会有 100M 以上大小。「拷贝」这个词不准确,conda 会优先使用 hard link 和 soft link,实在不行才会拷贝。

!! 预编译的包所使用的编译器

Anaconda 5 及以上,或者 conda 4.3.26 及以上版本,基线的编译器全面换成了 CentOS 6 / glibc 2.12([[来源|https://github.com/conda/conda/issues/6041#issuecomment-333215057]])。

同时 Anaconda 5 在编译器上,用了自己的工具集替换了系统默认工具集,参考这篇 [[文章|https://www.anaconda.com/blog/developer-blog/utilizing-the-new-compilers-in-anaconda-distribution-5/]]。
Conda 环境管理。

Conda 的命令行写得一般,而且莫名其妙地有两种管理 env 的方式,分别是直接用 `conda` 以及用 `conda-env`。

创建新环境:

* 如果你想通过 environment.yaml 文件创建新环境,只能用 `conda env`
* 如果你想通过指定包来创建新环境,只能用 `conda create`

导出已有环境:

* `conda list --export` 会导出当前所有 Conda 包,但是不会导出 pip 所安装的包,所以没什么用
* `conda env export` 会导出 Conda 包及 pip 安装的包,生成的文件即 environment.yaml,可以用来分享环境

用 environment.yaml 来实现「不同机器上环境一致」,应该是目前 Conda 的最佳实践。但是它的设计还是残缺的,这使得 Conda 难以成为广泛流行的部署工具。

对比 pipenv 提供的解决方案,pipenv 提供了 Pipfile 和 Pipfile.lock。Pipfile 用来指定项目中所依赖的库,比如我的项目用了 Django,那就在 Pipfile 中写入 Django 即可;pipenv 会自动帮我判断 Django 有个 pytz 的依赖,然后它会生成 Pipfile.lock 文件,里面包含了 Django 和 pytz,以及它们具体的版本号。

environment.yaml 就类似 Pipfile.lock,但是 Conda 没有提供 Pipfile 的机制。那么,假如我一开始 `conda install django`,那么 Django 跟 pytz 会同时会安装被纪录进环境依赖里;后面如果我想把 Django 换成 Flask,`conda uninstall django` 并不会帮我把 pytz 去掉。于是 pytz 作为一个没人用的依赖,存在在 conda env 里。

environment.yaml 中也可以指定 pip 的命令行选项,参考这个 [[pull request|https://github.com/conda/conda/pull/3969]]。但是 environment.yaml 的定位应该是机器生成而不是手写,意味着这个特性很鸡肋。

总的来说 environment.yaml 就跟 `pip freeze > requirements.txt` 一样残废。

参考:

* [[官方文档|https://conda.io/docs/user-guide/tasks/manage-environments.html]]
! Under Linux

!! Konsole <<plat-linux>>

[[Konsole|https://konsole.kde.org/]] 是 KDE / Plasma 下的默认虚拟终端,也是 Linux 下 ''首选'' 终端。功能强大且够用,重要的是 ''字体渲染'' 做得很赞。

使用时给 Setting => Profile => Appearance => Miscellaneous 中置 2px 的 line spacing,避免渲染 CJK 字符过于拥护的问题。

!! Yakuake <<plat-linux>>

[[Yakuake|https://yakuake.kde.org/]] 是一个 Drop-Down Terminal,默认按 F12 它就出现,再按一次就关闭。非常方便。

! Under Windows

!! Cmder <<plat-win>>

[[Cmder|http://cmder.net/]] 应该是我体验过的 Windows 本地终端中最好的。但是仍然需要做一些额外配置。

下载时注意下带 Git 版本的,这样你有一些 `ls` 类的软件可能用。

安装好后,需要做一些设置(菜单中的 Settings)。做调字体,然后调一些热键(Keys & Macro):

|!Key |!Change |
|<kbd>Ctrl+Backtick</kbd> |全局显示 / 隐藏键,与 JetBrains IDE 快键冲突,去掉 |
|<kbd>Ctrl+W</kbd> |默认是关闭当前 tab,改成 Delete word leftward to the cursor |

其他参考:[[IDE 内置 Terminal 使用 Cmder|JetBrains IDE]]。

!! XShell <<plat-win>>

Windows 下最好的远程终端 / SSH Client 软件。

!! 其他选择

Bash on Windows 可能是个不错的选择,但是暂时不想去看,cmder 已经足够好。

Babun, Cygwin, msys, msys2 这类,都是在 Windows 上建立一个类 *nix 环境来工作的,比较难维护,而且可能不完善。比如你在 Windows 上装了个 Python,在 Cygwin 中又装了个 Python;但是 Cygwin 里面的 Python 跑起来总会有一些奇怪的问题。而且这类软件的终端用起来并不是特别舒服。

! Under Android

!! JuiceSSH <<plat-android>>

[[JuiceSSH|https://play.google.com/store/apps/details?id=com.sonelli.juicessh&hl=en]] 是 Android 上最佳的本地 / 远程 Shell。体验很好,组合键的发送也相当方便。

内容的创造应该以盈利为目标。


如果你想做一个特定领域的、专业有价值的内容(niche),内容的主题是最重要的。

!! 目标群体

Smart Blogger 给 [[niche website|https://smartblogger.com/niche-website/]] 的定义是:

> A niche website is a website that caters to a small segment of a large market by focusing on a common, specific interest.

核心即是说,你应该面向一群特定的、有一定量的目标用户群,跟中文互联网经常看到的「垂直领域」有类似的含义。对于过于广泛的群体,往往个人或者小团队无法驾驭,而且竞争激烈难以胜出。因此要注重于某些特定的群体。

Makebook 也提到它的 [[方法论|https://makebook.io/#2-10]]:

# Start with a micro niche
# From micro niche to multi-niche
# From multi-niche to vertical integration
# From vertical integration to becoming a platform

即是从小的 niche 不断扩展成多个 niche,做垂直整合,最终也可以发展成大平台。

!! 内容方向

[[Neil Patel|https://neilpatel.com/what-is-affiliate-marketing/]] 提过最简单的内容创作,可以是评测别人的产品。比如做书评、评测风火轮玩具、评测 hair straightener。还有一种流行的形式是,把你评测的产品进行 ''对比''。评测产品的好处是,你可以在网站上放商品链接,这样可以通过联盟营销获利。

<TODO>

!! Resources

* [[How to build a niche website? - Smart Blogger|https://smartblogger.com/niche-website/]]
* [[What's a niche website? - Income Prodigy|https://incomeprodigy.com/what-is-a-niche-website/]]
这篇帖子用来维护我自己创作的所有内容。

!! 内容

长内容一般发在:

* [[博客|https://blog.zhiheng.io/]] 包含专业及生活内容
* [[知乎文章|https://www.zhihu.com/people/onlyice/posts]] 仅包含专业生活,不太适合放生活向
* [[豆瓣|https://www.douban.com/people/onlyice/]] 适合放豆瓣上流行话题的生活向和专业内容

短内容一般会同步发在这几个地方:

* Telegram Channel:
** [[专业向,公开|https://t.me/DetailsMatter]]
** 私人向,零碎
* [[Twitter|https://twitter.com/onlyice0328]]
* [[知乎想法|https://www.zhihu.com/people/onlyice/pins]]

个人知识库发布在 [[wiki.zhiheng.io|https://wiki.zhiheng.io/]]。

计算机技术相关的幻灯片发布在 [[Speaker Deck|https://speakerdeck.com/onlyice]]。

游戏评测发布在 [[Steam|https://steamcommunity.com/id/onlyice/recommended/]]。

!! 信息源筛选

Twitter 上维护的 [[列表|https://twitter.com/onlyice0328/lists]]。

RSS 列表在 [[Inoreader|https://www.inoreader.com/]] 上维护。

微信上给部分联系人打了标签。

!! 待筛选信息

有价值的公众号应该转成 RSS,或者用其他机制维护起来。在微信上面做阅读不太合适。

!! 待开发的平台

* Bilibili 及 YouTube:如果我有视频内容了
* 微信公众号
{{ interactive-content }}

KnightLab 提供了一系列 [[交互式叙事的工具|https://knightlab.northwestern.edu/projects/]],如上图所示。
一些原则、方法论。

* 内容需要提供价值
* 内容应该是聚焦于某一话题上的,''高密度聚焦'' 的信息
* 生产内容时也应该思考如何商业变现,或者延伸出其他的服务
** 比如 [[Rodolphe Dutel|https://www.indiehackers.com/product/remotive]] 一开始做远程者的 newsletter,到后面发展成一个提供远程工作机会发布的平台
* 不要在调性和人群不适合你内容的地方发布,比如「头条号」可能就价值不大
* 按适合特定平台的机制去玩,比如微信公众号及豆瓣可能就适合相对短但聚焦的内容

!! 100% 纯粹的高密度体验

{{ highly-focused }}

这个说法来自 Jonathan 在 PAX East 2016 游戏展上的 [[演讲|https://www.bilibili.com/video/av19693669/]]。也很准确地描述了我玩 The Witness 过程的体验。

Jonathan 认为它喜欢的文艺作品也是这样的。我觉得这个理念可以扩展到任何内容的创作、以及生活的方方面面。内容创作时应该保持整个过程都很紧抓眼球。以自己最大的能力输出干货,不要输出低价值的、娱乐的、水的内容。但是过程中保持一个好的「学习曲线」即可。
Blogging:

* Smart Blogger 的这篇 [[文章|https://smartblogger.com/niche-website/]] 非常有价值

Online courses:

* [[How to launch an online course and make $220,750 in 10 days|http://blog.videofruit.com/online-course-sell/]]
* [[How To Create & Sell Your Online Course The Right Way|http://blog.teachable.com/how-to-create-and-sell-your-online-course]]
* [[SPI 136: How to Build an Online Course that Sells with David Siteman Garland|http://www.smartpassiveincome.com/how-to-build-an-online-course-that-sells/]]

Ebooks:

* [[The Ultimate Guide to Publishing Your eBook on Amazon’s Kindle Platform|http://www.copyblogger.com/how-to-publish-kindle-ebook/]]
* [[How to (Really) Make $1,000,000 Selling E-Books – Real-World Case Studies|http://fourhourworkweek.com/2013/04/04/how-to-make-1000000-selling-e-books-tactics-and-case-studies/]]
* [[How to Start to Write an eBook and Actually Finish it in 30 Days|http://blog.sellfy.com/how-to-write-an-ebook/]]

Podcast/Audio:

* [[Podcasting for Beginners: The Complete Guide to Getting Started With Podcasts|https://blog.bufferapp.com/podcasting-for-beginners]]
* [[How to Start a Podcast – Pat’s Complete Step-By-Step Podcasting Tutorial|http://www.smartpassiveincome.com/how-to-start-a-podcast-podcasting-tutorial/]]
* [[How To Podcast: The Ultimate Guide to Podcasting|http://www.eofire.com/how-to-podcast/]]
|!Name |蛤蟆先生去看心理医生 |
|!Author |[英]罗伯特·戴博德 [译]陈赢 |
|!Edition |N/A |
|!Release Date |August, 2020 |
|!ISBN-13 |9787201161693 |
|!Medium |PDF |
|!Rating |{{!!rating}} |

豆瓣链接:[[https://book.douban.com/subject/35143790/]]。📝 <<coslink "原书及笔记" "/files/books/counselling-for-toads.pdf">>。

这本书的意义在于,给我提供了对自己及身边人的一些 ''行为的理解和启发''。

<div class="box">

> 蛤蟆沉思了一会儿说:「除了顺从我父母的意愿之外,我还总是想要取悦他们。我不确定自己有没有成功过,但我记得很清楚,我想让他们对我满意,为我骄傲。」他又停下思索了一会儿,接着说:「也许这就是我变得爱炫耀的原因。他们对我的所作所为从没有满意过或被打动过,所以我就放任自己用浮夸和愚蠢的行为来博得他们的关注。会是这样吗,苍鹭? 」

我的身边似乎也有这样的例子。童年得不到肯定,于是成年之后养成了一种对于小小成就夸大和炫耀的心理。我甚至怀疑有些长辈也如此。另外我在想,假如像以前兄弟姐妹比较多,而家里的话语权掌握在少数一两个小孩身上,会不会造成这里提到的问题?

</div>

<div class="box">

> 「亲爱的蛤蟆」,苍鹭耐心地说,「关键就在这里。撒泼正是表达愤怒的一种幼稚的方式。就像孩子听到大人说『不行,你不能这样!』这让孩子非常愤怒,同时又感到无助,因为对那个让他生气的大人,孩子没法用暴力或者带有攻击性的行为去回应,所以唯一能做的就是躺倒在地,又踢又叫。而当成年人也这么干的时候,我们会说他在『无理取闹』。」

我以前并没有想过,''撒泼是表达愤怒的一种方式''。甚至抑郁、沮丧也包括了愤怒的情绪。

</div>

<div class="box">

> 「我认为它是。」苍鹭说,「怄气的人是总绷着脸、阴沉沉的样子,而且安静得很反常。蛤蟆,在我看来,『适应型儿童』的所有行为里,''惬气是最能说明怎样用时间来稀释愤怒的例子''。通常这是孩子在权威之下无法随心所欲才做出的反应。成年人或许会因为输掉一场权力斗争而生闷气,也是同样道理。说白了,怄气是输家在对强大的赢家做出反应。

</div>

<div class="box">

> 「你说到了一个很重要的问题,蛤蟆,值得我们仔细想一想。我认为没有人能『让』我们产生什么感受,除非他们用蛮力胁迫你。说到底,是我们『选择』了自己的感受。我们『选择』了愤怒,我们『选择』了悲伤。」

这跟李松蔚的一个说法很像。我们的情绪只能由我们自己负责,情绪是我们对待事务的反应,是「我们自己」将其产生。

</div>

<div class="box">

>「亲爱的蛤蟆,」苍鹭耐心地回答,「一切的关键就在于那是『人生坐标』。一旦我们在童年决定用哪种态度和观点,我们就会在随后的人生里始终坚持自己的选择。这些态度和观点,变成我们存在的底层架构。从那以后,我们便建构出一个世界,不断确认和支持这些信念和预期。换一个词来说,我们把自己的人生变成了一个『自证预言』。」
>
>「等一下,我又听不懂了。我以为预言是预先说出会发生什么,好比以赛亚、何西阿,还有《圣经》里其他古老先知的预言一样。」
>
>「你说得对。但『''自证预言''』的意思是,''我们会控制事件的发生,从而确保预言会成真。我们会确保自己的世界和预期的一样。''」
>
>「好吧,可我们到底是怎么做的呢? 」蛤蟆有些吃惊地问。「我们并不知道未来会发生什么,所以我看不出我们是怎么影响未来的。即使再有把握,都永远不能预知下一刻会发生什么。」蛤蟆数年来参加赛马大会的经验就是证明。
>
>「我想,在这里引入一个新的概念会对你有帮助。」不等蛤蟆回答,苍鹭便走到挂纸板前写下了 「必然后果」这个词。蛤蟆眉头紧蹙,思索着:「你能举例说明吗? 」
>
>「当然可以。」苍鹭回答,「比如,喝酒过量的必然后果是什么? 」
>
>「我想是喝醉吧。」蛤蟆偶尔也会喝多的。
>「还有呢?」
>
>「第二天感觉很糟糕,那种宿醉的感觉。你说的是这个意思吗?」
>
>「对,很准确,这些都是喝醉的必然后果。所以你也可以说这是决定未来的一种方式。假如你认为生活让你不快乐,不善待你,那么今天喝醉就是你用的某种方法,它可以印证明天你会感觉悲惨的预期。换句话说,你创造了一个『自证预言』。」
>
>「可是,和朋友们喝几杯第二天头重脚轻,肯定用不着这么一本正经地解释一通,对吧? 」
>
>「当然了,我说的是一种长期重复的行为,这种行为可能持续一辈子,这类行为就被称为游戏。实际上,刚才说的这种游戏叫『酗酒』。」
>
>「游戏!」蛤蟆惊呼,「这听上去可不像个游戏。」
>
>「这是心理游戏,」苍鹭回答,「有本很出名的书叫《人间游戏》(Games People Play,美国心理学家艾瑞克•伯恩的著作)命名并描述了一百种心理游戏,『酗酒』是其中的一种。玩这类游戏的必然后果是,玩家最终会产生糟糕的、不快乐的情绪。」

这段对话对「自证预言」的描述太精彩了:「我们会控制事件的发生,从而确保预言会成真。我们会确保自己的世界和预期的一样。」我们按自己的方式理解自身和世界。并做出各种各样的事情加深这个印象。所以不开心的人会尝试让自己更不开心,觉得世界对它不公的人会找所有的理由来证明这一点,这导致了恶性循环。

</div>

这里放一些在创作上通用的方法和原则。更具体的创作领域的内容,放在:

* 做内容:[[Content Creation]]
* 做产品:[[Product Building]]
*# 产生创意:[[Product Building: Coming up with Ideas]]
*# 验证想法:[[Product Building: Validating your Idea]]
*# 构建产品:See [[Content Creation: Resources]]

这里的内容跟营销也紧密相关:

* [[Affiliate Marketing]]

这里以人为维度来组织内容,而不是以媒介(如播客、博客、知乎 Live 等)。以人为维度的好处是,这些内容往往更系统、更聚合在同一个话题上。YouTube 的内容也比较适合以人为维度来整合。

对比之下,[[Reading]] 更适合这两类:

* 系统性的内容,比如一本书、一门课程
* 零散的读书笔记,可以是看网页、学一个知乎 Live 等



!! See Also

与 [[Startup: Case]] 联动。


[[CSPRNG|https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator]] 指 cryptographically secure pseudo-random number generator,即一种算法,它可以得出「密码学安全的伪随机数」,而不仅仅是「统计学伪随机数」。这使得对这种伪随机数的使用更加安全。
!! Computer Security

计算机安全与网络安全。

* [[Computer & Internet Security: A Hands-on Approach|https://www.handsonsecurity.net/index.html]] 这本书似乎广受好评,使用的学校也很久。但是觉得需要有一定的 Linux 操作系统基础

!! Operating System

* http://pages.cs.wisc.edu/~remzi/OSTEP/
* https://learning.oreilly.com/library/view/operating-systems-in/9780471687238/
!! 时常翻阅

* [[CSS Tricks|https://css-tricks.com/]]: 看起来质量很高的教程站,同时这个站也太漂亮了
* [[CSS { In Real Life }|https://css-irl.info/how-to-enable-experimental-web-platform-features/]]: 有一些不错的教程和实际例子,可以练手用

!! 常用资源

* [[CSS Reference - A free visual guide to CSS|https://cssreference.io/]]: 理解 CSS 属性的作用时,可以看这里
* [[Learning web development (by MDN)|https://developer.mozilla.org/en-US/Learn/CSS]]
* [[CSS: The Definitive Guide, 4th Edition|https://learning.oreilly.com/library/view/css-the-definitive/9781449325053/]]
* [[CSS in Depth|https://learning.oreilly.com/library/view/css-in-depth/9781617293450/]]
* [[Relearn CSS Layout|https://every-layout.dev/]]
* [[CSS Pro Tips|https://github.com/AllThingsSmitty/css-protips]]

!! Roadmap

* [[Frontend Handbook 2019|https://frontendmasters.com/books/front-end-handbook/2019/]]
* [[Developer Roadmaps - CSS Tricks|https://css-tricks.com/developer-roadmaps/]]

!! Courses

* [[Frontend Master|https://frontendmasters.com/]]

!! 工具

* [[CSS Cheat Sheet|https://htmlcheatsheet.com/css/]]: 速查及常用小工具
* [[CodePen|https://codepen.io/]]: 有大量实用美观的 CSS snipptes
* [[The State of CSS|https://stateofcss.com/]]: 理解目前主流的 CSS 框架、工具等


|!Name |CSS In Depth |
|!Author |Keith J. Grant |
|!Edition |1st |
|!Release Date |March 2018 |
|!ISBN-13 |9781617293450 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

没有全部读。我的关注点在于基础知识、布局和 media query。不知道是否 CSS 本身太过细碎,我觉得这本书内容编排上也比较碎。如果能在逻辑顺畅的主线上让内容更加模块化会更好。另外有一些我觉得过时的内容也加了进来,比如 CSS 的 table layout,现在基本没听到有人用,我觉得没必要写进来。

内容被总结进了这些条目中:

* [[CSS: Concept: Cascade]]
* [[CSS: Concept: Inheritance]]
* [[CSS: Concept: Shorthand Properties]]
2.1 - 2.3 的内容整合在 [[CSS: Values and Units: Distance Units]] 中。

2.4 Viewport-relative units 这节被跳过,觉得不是很重要。

2.5 纪录在 [[CSS: Property: line-height]]。

2.6 Custom properties (aka CSS variables) 这节被跳过,观察过的 CSS 框架似乎少用这个特性,而是用 SASS / LESS 中相近的功能。
书中描述了一个简单的双栏布局的实现,纪录在 [[CSS: Layout: Implement: Traditional 2-column Implement]]。

CSS Table 那部分觉得没什么意义,因为这是当时为了废弃主流的 `<table>` 布局而出现的产物,但是用 `<div>` 和 `<ul>` 配合 CSS 来实现本来 `<table>` `<td>` 做的事情,让人觉得 [[没有意义|https://css-tricks.com/css-tables-are-not-a-solution/]](甚至更差)。

接下来的 Flexbox 我没有细看,因为书中讲得也不深。我觉得单独找时间来研究会更好。

配合使用 `min-height` 及 `max-height` 大部分情况下会比直接使用 `height` 更好。

垂直居中元素的作法,纪录在 [[CSS: Layout: Implement: Vertical Centering Content]]。

Negative margin,又是一个实用价值不大的特性。可能在 CSS 框架构建 column layout 时有用。

Collapsed margin,纪录在 [[CSS: Layout: Box Model]]。

3.5 Spacing elements within a container 不在关注之列。
这一节讲了使用 `float` 做一个商品介绍页面的方法。没有细看书,只看了代码并通过 diff 代码片断进行观察。

在 flexbox 是主流的今天,`float` 及 CSS Table 的使用不值得深究。

最后书中实现了一个简单的 [[grid system|CSS: Layout: Grid System]]。
根据 2019 年的 [[The State of CSS|https://2019.stateofcss.com/technologies/]],目前最好的方案是 Styled Components。

我看过 CSS modules,不太喜欢。这块我觉得不必深究,我大概率不会写很多 CSS,也遇不到那个需要 local scope 的时刻。





可参考下 [[大厂 H5 开发实战手册|https://juejin.im/book/5a7bfe595188257a7349b52a/section/5a8ebcabf265da4e9a496bdc]]。
Content placeholder 是指当页面在加载数据时,先给一个简单的内容加载动画,比如:

<iframe height="365" style="width: 100%;" scrolling="no" title="Content Placeholder with Pure CSS" src="https://codepen.io/fathy_ar/embed/zzYeNb?height=365&theme-id=default&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/fathy_ar/pen/zzYeNb'>Content Placeholder with Pure CSS</a> by Fathy AR
  (<a href='https://codepen.io/fathy_ar'>@fathy_ar</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

一般的做法有用 JS 的,有纯 CSS 动画,也有 SVG 的:

* JS: [[victorvoid/placeload.js|https://github.com/victorvoid/placeload.js]]
* CSS: [[placeholder-loading|https://github.com/zalog/placeholder-loading]]
* SVG: 没调研

我觉得用 CSS 是比较好的做法。实现上就是 CSS animation。自己做难度也不大,但是不想花时间自己做。Bulma 中没有内含这种样式,可能社区有提供(这样在样式更一致)。Ant Design 提供了一个 [[骨架屏|https://ant.design/components/skeleton-cn/]]。

!! Resources

* [[Content Placeholders: A Way to Style Waiting Time|https://www.codepicky.com/content-placeholders/]]
* [[Facebook Placeholders - CSS Ninja|https://cssninja.io/blog/post/facebook-placeholders]]
MDN 的 [[CSS Concepts|https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#Concepts]] 是非常好的参考材料。Wiki 不去做详尽的描述,偏简单及总结性。



!! Resources

* [[CSS Core Concepts - MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#Concepts]]
大部分情况下你都不应该用 `!important`。这会让你的样式混乱且难调试。MDN 总结出了这些规则:

* Always look for a way to use specificity before even considering `!important`
* Only use `!important` on page-specific CSS that overrides foreign CSS (from external libraries, like Bootstrap or normalize.css).
* Never use `!important` when you're writing a plugin/mashup.
* Never use `!important` on site-wide CSS.

带 `!important` 的 declaration 的 [[specificity|CSS: Concept: Cascade: Specificity]] 会高于不带的。如果多个 `!important` 属性冲突,会优先使用 specificity 高的;如果 specificity 一致,会优先选择后声明的。

!! Resources

* [[!important|https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity#The_!important_exception]]
* [[When Using !important is The Right Choice - CSS Tricks|https://css-tricks.com/when-using-important-is-the-right-choice/]]
! 问题

CSS 的 cascade,即是指某一选择器被多条 CSS 规则指定并有冲突时,指导浏览器应该选择哪条规则去执行。

比如给定一个元素:

```html
<h1 id="page-title" class="title">Wombat Coffee Roasters</h1>
```

有不同来源的多条 CSS 规则:

```css
// 来源 1
#page-title {
  font-family: sans-serif;
}

// 来源 2
#page-title {
  font-family: serif;
}

// 不同选择器
.title {
  font-family: monospace;
}
```

每个规则集中的选择器都是 `#page-title`,但是它们的内容是冲突的。

! 规则

!! 哪些 CSS 实体会参与 cascade 规则?

[[CSS declarations|CSS: Concept: Core]] 会参与。

这意味着部分没有 declaration 的 at-rule,如 `@font-face`,它的 descriptor 不参与 cascade;它会作为一个整体参与 cascade,如果有多个 descriptor 一样的 at-rule,浏览器会自动选择最合适的。

另外有一部分带 declaration 的 at-rule,`@media`、`@document` 及 `@supports` 会参与 cascade。`@keyframes` 不会,跟 `@font-face` 一样作为一个整体去参与。

`@import` 及 `@charset` 有自己特殊的规则。

!! CSS Origin

CSS 有三种 origin 的样式表:

* User-agent stylesheets:浏览器默认的样式表。比如如果你不指定 `<li>` 的样式时,它默认的 `list-style-type` 在浏览器中一般默认为 `disc`,即一个小圆点
* Author stylesheets:最常见的样式表,即网页中指定的样式
* User stylesheets:用户样式表,设计上是为了提供给用户指定一个默认样式表的能力,这个样式表可以覆盖 User-agent 样式表。但是实际上浏览器并不怎么支持这种模式,比如 Chrome [[移除了 User stylesheet 的支持|https://news.ycombinator.com/item?id=7329855]]。现实中用得非常少,目前看到的是可以通过浏览器扩展的 API 接口来指定,比如 Chrome 的 `insertCSS` [[接口|https://developer.chrome.com/extensions/tabs#method-insertCSS]] 中的 `cssOrigin` 参数,Firefox 中亦有相应参数。但是它们默认都是使用 author 类型。Chrome User Style 插件 [[Stylus|https://add0n.com/stylus.html]] 也是用的 author 类型

User stylesheets 在实际中使用得很少,下面不做讨论。

!! Cascading Algorithm

对于一个特定的 DOM 元素,如果存在有冲突的 declaration,是这样判定优先级的:

{{ css-declaration-precedence-flowchart }}

(图片来自 [[CSS in Depth]] 第一章)

其中的第一个判断在本文的讨论范围内。对于不同的 origin 及其 `!important` 属性,优先级如下:

|!Order  |!Origin     |!Importance |
|1       |user agent  |normal |
|2       |author      |normal |
|3       |animations  |  |
|4       |author      |`!important` |
|5       |user agent  |`!important` (rarely used) |
|6       |transitions |  |

数值越大的优先级越高。这套规则里面最常用来写特定的样式(author stylesheet)来覆盖默认的样式(user-agent stylesheet),比如下面的例子中将 `<a>` 元素以按钮的形式展现:

```css
#main-nav a {
  color: white;                 
  background-color: #13a4a4;    
  padding: 5px;                 
  border-radius: 2px;           
  text-decoration: none;        
}
```

对于 origin 相同的 declaration,他们的判断逻辑在 [[CSS: Concept: Cascade: Specificity]] 中描述。

关于 animation 及 transition 部分的内容,在相关的条目中描述。`!important` 有自己的 [[条目|CSS: Concept: !important]]。

! Resources

* [[CSS in Depth Chapter 1|https://learning.oreilly.com/library/view/css-in-depth/9781617293450/kindle_split_009.html]]
* [[Introducing the CSS Cascade - MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/Cascade]]
* [[CSS 2 Specification|https://www.w3.org/TR/CSS2/cascade.html#cascade]]

! TOC

! 背景

Specificity 是用来解决这样一个问题:对于有着多个互相冲突的 CSS declaration 的元素,应该选择并应用哪个 declaration 的规则。比如下面的例子:

```html
<h1 class="title" id="page-title">Hello World</h1>
```

```css
h1 {
  font-family: sans-serif;
}
.title {
  font-family: serif;
}
#page-title {
  font-family: monospace;
}
```

此时应该应用哪个 `font-family`?

! 规则

!! Specificity

CSS 中有这三类 selector,它们的 specificity 依次增加:

# Type selectors (`h1`) and pseudo-elements (`::before`)
# Class selectors (`.title`), attributes selectors (`[type="radio"]`) and pseudo-classes (`:hover`)
# ID selectors (`#page-title`)

CSS 会优先选择 specificity 更高的。

具体的计算规则在 CSS [[规范|https://www.w3.org/TR/2011/REC-CSS2-20110607/cascade.html#specificity]] 中,或者参考这个形象生动的 [[CSS SpeciFISHity|https://specifishity.com/]]。

!! Inline and !important

内联样式(`style="font-family: sans"`)优先级高于外部样式。但是 [[!important|CSS: Concept: !important]] 加入时会影响。具体优先级从高到低:

# inline `!important`
# non-inline `!important`
# inline normal
# non-inline normal

!! Exceptions

规则中还有一些例外(`:is()`, `:not`, `:where()` 等),比较罕见,不在这里做描述。需要时查询相应文档。

!! Directly targeted element vs. inherited

考虑这样的 CSS 及 HTML:

```
#parent {
  color: green;
}

h1 {
  color: purple;
}
```

```html
<body id="parent">
  <h1 class="a">Here is a title!</h1>
</body>
```

渲染出来的会是 `purple`。因为 `h1` 选择器直接选中了 `<h1>`,优先级会高于继承的属性。把 `h1` 换成 `.a` 也是一样的结果。

!! Special Order in styling `<a>` with pseudo-classes

写链接的 CSS 样式时,经常会用到这些 pseudo-classes:`:link`, `:visited`, `:hover` 及 `:active`。实际写样式时,它们的 specificity 都是一致的,因此需要按这样的顺序写:

```css
a:link {
  color: blue;
  text-decoration: none;
}
a:visited {
  color: purple;
}
a:hover {
  color: yellow;
  text-decoration: underline;
}
a:active {
  color: red;
}
```

如果你把 `a:hover` 跟 `a:active` 交换位置,那么鼠标点下(`:active`)链接时,颜色不会变成 `red`,而是维持在 `:hover` 状态下的 `:yello`。

下面是一个实例的例子:

<iframe height="265" style="width: 100%;" scrolling="no" title="How order of pseudo-classes in &lt;a&gt; affects styling" src="//codepen.io/onlyice/embed/qBWbbpL/?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/qBWbbpL/'>How order of pseudo-classes in &lt;a&gt; affects styling</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

!! Best Practice

[[CSS in Depth: Ch01]] 给出了一个非常中肯的建议,写 CSS 时尽量保持 specificity 在低的水平:

> As you can see from these examples, specificity tends to become a sort of arms race. This is particularly the case with large projects. It is generally best to keep specificity low when you can, so when you need to override something, your options are open.

同时书中还总结了两个建议:

* 不要在 selector 中用 ID
* 不要用 `!important`

对于 JS 库类作者,书中强烈建议不要用 JS 给元素加内联样式。这会导致使用方必须在 CSS 用大量的 `!important` 来覆盖你的样式。

!! Resources

* [[Specificity - MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity]]
* [[The “C” in CSS: The Cascade - CSS Tricks|https://css-tricks.com/the-c-in-css-the-cascade/]]
* [[CSS in Depth Chapter 1|https://learning.oreilly.com/library/view/css-in-depth/9781617293450/kindle_split_009.html]]
* [[Specifics on CSS Specificity - CSS Tricks|https://css-tricks.com/specifics-on-css-specificity/]]
* [[CSS 2 Specification|https://www.w3.org/TR/2011/REC-CSS2-20110607/cascade.html#specificity]]
CSS 的核心概念。

我在 LicidChart 上做了这张 [[图表|https://www.lucidchart.com/documents/edit/7201c564-a753-461f-86d2-adde29343728/0]],展示了最核心的概念:

[img width=500 [css-core-concepts-diagram]]

RuleSet 也经常被叫作 Rule。At-rule 中的每个 indentifier 都有自己的 syntax,并不是太通用。At-rule 中内容,可能是跟实际 styling 无关的 ''descriptor'',比如 `@font-face` 中指定字体名用的 `font-family`;也可能是跟 styling 有关的 ''declaration''。

!! Resources

* [[CSS Syntax and Semantics - MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/Reference#Syntax_and_semantics]]
`float` 属性在设计之初是用来做图文混排用的:

<iframe height="265" style="width: 100%;" scrolling="no" title="Origin Usage of float" src="//codepen.io/onlyice/embed/OJLjqNE/?height=265&theme-id=0&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/OJLjqNE/'>Origin Usage of float</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

被设置为 `float` 的块元素,会不按照正常文档流往下排列,而是飘向它的父容器的边缘。但是 `float` 最广泛的用途并不是图文混排,而是被大家当作排版工具。因为直到 flexbox 出现之前,CSS 里面并没有什么合适的排版工具,大家只能拿 `float` 来使用。

另外注意 `float` 的元素并不会撑大包含它的容器,比如容器是 200px 高,但是里面的 float 元素有 300px 高,那么它会被撑到容器外:

<iframe height="265" style="width: 100%;" scrolling="no" title="Overflowed float element" src="//codepen.io/onlyice/embed/OJLjqNE/?height=265&theme-id=0&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/OJLjqNE/'>Overflowed float element</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

你可以在 `float` 元素的父容器中置一个 `<div style="clear: both">` 来将容器撑大到足够容纳 `float` 元素。参考 [[CSS Reference|https://cssreference.io/property/clear/]]。

另外,清除浮动是一个很大的坑,参考 [[这里|https://stackoverflow.com/questions/211383/what-methods-of-clearfix-can-i-use]]。
元素还可以通过 ''继承'' 获得样式。

并不是全部的属性(property)都会被继承,比如你在外层 `<div>` 设置的 `border` 就不会被内层 `<div>` 继承。你直觉上认为这个属性会被继承,那么它大概念是会被继承的,如:

* 文本相关的属性,如 `color`, `font`, `font-family`, `line-height` 等
* 列表属性,如 `list-style` 等
* 表格的 border 属性,如 `border-collapse` 等

浏览器的 Dev Tool 可以观察到继承的现象。

同时 CSS 又提供了几种机制来控制继承。它们由 `inherit`, `initial`, `unset` 及 `revert` 关键字来控制。

!! `inherit`

你的页面有一个 Footer,里面有个 Terms of use 链接。你希望这个链接的颜色更低调一点,区分于主页面中的链接。那你可以这样做:

<iframe height="265" style="width: 100%;" scrolling="no" title="Illustrated how inherit keyword works" src="//codepen.io/onlyice/embed/KKPVzBr/?height=265&theme-id=0&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/KKPVzBr/'>Illustrated how inherit keyword works</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

如果不加 `color: inherit` 这行,footer 中的链接颜色会由 [[directly targeted|CSS: Concept: Cascade: Specificity]] 的 `a:link` 来定义而变成 `blue`。

!! `initial`

`initial` 关键字可以将属性的值变回 user-agent stylesheet 中的默认值,一般即浏览器的默认值。

比如你给 `.footer a` 置一个 `color: initial`,那么它的颜色会变成浏览器默认的黑色。

注意 `display` 的默认值是 `inline`,因此即使你给一个 block element 置 `display: initial`,它会变为 `inline` 而不是 `block`。我感觉 `initial` 没什么用。

!! `unset`

参考 [[MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/unset]]:

> The `unset` CSS keyword resets a property to its inherited value if it inherits from its parent, and to its initial value if not. In other words, it behaves like the `inherit` keyword in the first case, and like the `initial` keyword in the second case.

即是说,直接应用到元素本身的(即非继承下来的)属性会失效。视有无继承下来的属性而有不同的行为。

!! `revert`

很少见到使用,不去做研究。需要时看 [[MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/revert]]。

!! Resources

* [[CSS Inheritance|https://developer.mozilla.org/en-US/docs/Web/CSS/inheritance]]
Shorthand properties 表示 CSS 中有一些属性,它包含了多个其他属性的信息,比如:

```css
background-color: #000;
background-image: url(images/bg.gif);
background-repeat: no-repeat;
background-position: left top;
```

可以简写成:

```css
background: #000 url(images/bg.gif) no-repeat left top;
```

!! Edge Cases

```css
background-color: red;
background: url(images/bg.gif) no-repeat left top;
```

Shorthand properties 允许它其中有部分信息缺失,比如上面的 `background` 中没有写上颜色。但是这会导致缺失的属性被设成初始值,比如上面的例子中,背景颜色会是初始的 `transparent` 而不是 `red`。

`inherit` 关键字用在 shorthand property 上面时,是整体的继承,而不是对里面的单个元素做继承。

!! 1-to-4-value Syntax

对于 `padding`, `margin`, `border-width` 等有上下左右 4 个方向值的,它的 shorthand property 可以不写全 4 个值,1-3 个值都是可以的。不同情况上对应的数值如下:

|!Value Example |!top |!right |!bottom |!left |
|`border-width: 1em` |`1em` |`1em` |`1em` |`1em` |
|`border-width: 1em 2em` |`1em` |`2em` |`1em` |`2em` |
|`border-width: 1em 2em 3em` |`1em` |`2em` |`3em` |`2em` |
|`border-width: 1em 2em 3em 4em` |`1em` |`2em` |`3em` |`4em` |

对于 `border-radius` 这类看角而不是看边的,顺序变成了 `top-left`, `top-right`, `bottom-right`, `bottom-left`。

对于仅有两个方向的属性,比如 `background-position: 25% 75%`,它的顺序是先水平后垂直。

!! Resources

* [[CSS Shorthand properties - MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/Shorthand_properties]]
这一块的概念,[[CSS 规范|https://www.w3.org/TR/CSS2/cascade.html#value-stages]] 有简明扼要的描述。

简单地说,user agent 从确定某个属性应该用什么值,到最终渲染出来是怎么样,会依次有这些步骤:

# 确定属性的 ''specified value'' 是什么
## 如果 [[cascade|CSS: Concept: Cascade]] 规则下属性有值,使用它
## 否则,如果有继承到父结点及祖先结点的值,则用它的 computed value
## 否则就用该属性的初始值
# 有了 specified value 后,有些情况下还要将值变成 ''computed value'',比如将超链接从相对路径转为绝对路径,将 `em` 等相对单位转为绝对单位。注意这个过程似乎不会转换 unitless value,至少于 `line-height` 不会做转换
# 再然后,有些属性的值必须在文档被渲染出来时才能知道。比如将一个容器宽度设为百分比,那么需要文档在渲染时才能知道具体的值。这个具体的值被称为 ''used value''
# 有了 used value 后,有时候这个值并不一定能被相应的设备渲染出来,比如在一个黑白的屏幕上使用了彩色,或者在一个仅支持整数宽度的 user agent 上渲染小数宽度。此时 user agent 实际做渲染用的值,被称为 ''actual value''
!! Resources

* [[一篇全面的CSS布局学习指南 [译]|https://github.com/alienzhou/blog/issues/13]]

CSS 盒模型的基本理念如下图:

{{ css-box-model }}

基本概念有:

* `margin`
* `padding`
* `border`
* `height`, `line-height`, `max-height`, `min-height`, `width`, `max-width`, `min-width`

!! `box-sizing`

参考 [[CSS Reference|https://cssreference.io/property/box-sizing/]]。

默认的盒模型中,`width` 指定的宽度为 content 的宽度,并不包含 `padding` 及 `border-width` 所占用的宽度。这使得元素具体占用的空间比 `width` 的大。

后来演变出的属性,`box-sizing: border-box` 改变了这个行为,使得 `width` 指定的宽度包含了 `padding` 及 `border-width`。而默认的行为为 `box-sizing: content-box`。

!! Collapsed Margin

对于上下两个元素,它们之间的间隔是取上元素的 `margin-bottom` 与下元素的 `margin-top` 的最大值,比如下面例子中的 `50px`:

<iframe height="265" style="width: 100%;" scrolling="no" title="Collapsing Margins: Vertical" src="//codepen.io/team/css-tricks/embed/pJyxQa/?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/team/css-tricks/pen/pJyxQa/'>Collapsing Margins: Vertical</a> by CSS-Tricks
  (<a href='https://codepen.io/css-tricks'>@css-tricks</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

!! 排版小技巧

* 将 `margin-left` 及 `margin-right` 置为 `auto` 使 content 居中
* 使用 `max-width` 而不是 `width`,在 viewport 的宽度比 `max-width` 还小时,实现更灵活的排版,不会出现水平滚动条
现在(2019)主流的 CSS 框架都使用的 Flexbox。比如 Bulma 的 [[column|https://bulma.io/documentation/columns/]] 系统。

!! Core

Flexbox 是在一个维度上排列项目的排版方式。Grid 提供了在两个维度上的排版方式。

Flexbox 的模型大概如图,由一个 ''容器(box / container)'' 包含着若干个 ''项目(item)'':

{{ flexbox-container }}

它有一个主轴(main axis,在上图中是 `row`),表明它是横向排列项目还是纵向,以及项目默认排列方向,比如从左向右还是从右往左。还有一个交叉轴(cross axis),与主轴成交叉。

Flexbox 有几个核心问题要解决:

* 一个盒子的轴(axis)是什么。轴代表了 box 中项目的排列方向,可横着排也可竖着排(`flex-direction`,`flex-wrap` 以及 `flex-flow` shoutcut)
* 项目占用的空间是多少;如果盒子剩余空间过多或者不够,项目的占用空间应该怎样调整、是否要换行(`flex-basis`,`flex-grow` 以及 `flex-shrink`)
* 项目在主轴上应该怎样分布,是都挤在左边还是往两边散开(`justify-content`);在交叉轴上应该怎样分布(`align-items`,`align-self`)
* 当发生换行并且存在多行时,各行处在容器的什么位置上(`align-content`)

容器的 `display` 需要设置成 `flex`。

上面提到的 CSS 属性中:

* 用在容器上:`flex-direction`,`flex-wrap`,`flex-flow`
* 用在项目上:`flex-basis`,`flex-grow`,`flex-shrink`,`align-self`
* 同时可用:
** `justify-content`:用在容器上表示项目的排列;用在项目上时表示项目内容的排列
** `align-items`:同 `justify-content`,区别在于 `justify-content` 处理 main axis,而 `align-items` 处理 cross axis

`flex` 是这三者的 short hand:`flex-grow`, `flex-shrink`, `flex-basis`。

!! `flex-basis`

这篇 [[文章|https://gedd.ski/post/the-difference-between-width-and-flex-basis/]] 给出了很好的解答。

简单来说,一个 flex item 在 grow / shrink 之前的宽度/高度判定是这样的:

# 如果设置了 `flex-basis`,优先用它,否则:
# 如果设置了 `width` 或者 `height`,优先用它,否则:
# 根据其内容多少来判定

不管用哪个属性,它们都遵循 `max-width` / `min-width`(或其 `height` 版本)所带来的约束。

!! 常见用法

Tailwind CSS 描述了一些 [[常见用法|https://tailwindcss.com/docs/flex]]。

!! Bulma 分栏系统实现

对于未指定宽度的栏,Bulma 默认都使用这样的属性,让它们自动分配大小:

```css
flex-basis: 0;
flex-grow: 1;
flex-shrink: 1;
```

当有一些栏指定了宽度比例(比如 `is-four-fifths`)时,Bulma 采用百分比(如 80%)作为其宽度值并置 `flex: none` (即 `flex: 0 0 auto`)使其不会自动扩缩。

为了让不同栏之间的距离合理,应该:

* 使用 `border-box` 的 `box-sizing` 使宽度计算中包含 `border` 及 `padding`
* 栏之间的空白应该使用 `padding` 而不是 `margin`,因为 `margin` 不包含在 `border-box` 中

!! Resources

* [[A Complete Guide to Flexbox|https://css-tricks.com/snippets/css/a-guide-to-flexbox/]]: 简单易懂地讲解 flexbox
* [[Flexbox - CSS Reference|https://cssreference.io/flexbox/]]: 快速理解 Flexbox 中各属性及其值的作用
Grid system 主要是用来方便切分页面。一般的 CSS 框架提供的 grid system,都是每行 12 栏的模型。

[[CSS in Depth: Ch04]] 中实现了一个非现代化的 grid system:

* 用百分比 `width` 实现了一个均等切分 12 栏
* 用 padding 实现列与列间的 gutter
* 用负边距调整了 `.row` 容器与父容器间的左右边距
<div class="tc-table-of-contents">
  <<toc-selective-expandable 'CSS: Layout: Implement'>>
<div>
对于几个相同的垂直排布的元素,如果想让他们之前有相同的间隔,可以用 `* + *`,比如下面的 `.button-link + .button-link`。它的作用是只选择 ''非第一个子元素'':

<iframe height="265" style="width: 100%;" scrolling="no" title="Evenly Spaced Stacked Items" src="//codepen.io/onlyice/embed/xxKLBgE/?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/xxKLBgE/'>Evenly Spaced Stacked Items</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

扩展出来,还有更通用的 lobotomized owl 模式:

```css
body * + * {
  margin-top: 1.5em;
}
```
在网站设计过程,经常会有这种单个元素向后浮动的情况(比如下图的「打开 App」)。

[img width=500 [css-floating-right-example]]

传统的做法是用 `float: right`,但是有了 [[flexbox|CSS: Layout: Flexbox]] 后,不再需要这么做了。你只需要用 `justify-content: between`。下面的示例使用 [[Tailwind CSS]] 提供的 utility 作演示:

```html
<div class="flex justify-between w-64 border p-2 m-2">
  <div>Left Item</div>
  <div>Right item</div>
</div>
```

看 <<coslink "运行实例" "/files/projects/tailwind-css/flex-layout/item-floating-right.html">>。
行与列混排的一个例子:

<iframe height="365" style="width: 100%;" scrolling="no" title="Flexbox Example: Mix Row and Column" src="https://codepen.io/onlyice/embed/ZEErwLR?height=365&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/ZEErwLR'>Flexbox Example: Mix Row and Column</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>
传统的两栏布局,主体内容区和侧边栏,中间带有间隙(gutter)。

<iframe height="465" style="width: 100%;" scrolling="no" title="xxKLboe" src="//codepen.io/onlyice/embed/xxKLboe/?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/xxKLboe/'>xxKLboe</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

实现要点是:

* 使用 `float: left` 将两个块元素弄成一行
* 使用百分比切割宽度(`width: 70%`)
* 使用 `calc` 函数计算被 gutter 占了部分空间后的侧边栏宽度

当然还有无数种实现方法,比如:

* 左右栏的宽度使用固定值(如 600px)
* 某一栏宽度使用固定值,另外一栏随 viewport 变化
目前看 flexbox 是最优解。其他方法包括:

* `vertical-align`:只对行内元素、表格单元格元素生效:不能用它垂直对齐块级元素
* 在元素中设置相同的 `padding-top` 及 `padding-bottom`
* ……

参考 [[How to Center in CSS|http://howtocenterincss.com/]] 获得更多的方法。
Normal Documentation Flow,是指网页排版的正常布局流。

简单来说,就是:

* Inline element,比如文本,从左到右排,排满时断行
* Block element,每个都新起一行

!! Resources

* [[Normal Flow - MDN|https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Normal_Flow]]
CSS Reference 有非常好的 [[带图示例|https://cssreference.io/positioning/#position]]。MDN 提供了各种值的 [[具体含义|https://developer.mozilla.org/en-US/docs/Web/CSS/position#Values]]。下面是一些重点总结。

每个元素都有默认的 `position` 属性,值为 `static`,这使它 ''不'' positioned。设置任一非 `static` 值使其 positioned。仅当元素 positioned 时,这些属性会对它起作用:

* `top`
* `bottom`
* `left`
* `right`
* `z-index`

`position` 为 `static` 或 `relative` 时,元素在页面上自然排列。

当元素的 `position` 为 `relative` 时,

* 该元素成为 positioned,可以作为子元素使用 `absolute` 时的 closest positioned ancestor。这种是最常见的情况
* 如果同时设置了 `top`, `bottom` 等定位属性,该元素在页面中占用的空间不会变,但是会有所偏移

`position` 为 `fixed` 时,经常用于 navbar 或者 footer 场景中。

未研究 `sticky` 的使用场景,似乎比较少见。


对于使用 SASS 编写的 CSS 库,一般提供了自定义的能力,可以用来修改库作者提供的各种变量,或者增加新的样式。

以 Bulma 为例:

```css
@charset "utf-8"

/* 对 Bulma 定义的变量做修改时,应该放在 import 语句之上,因为 bulma 在定义变量时会使用 SASS 的 !default */
$box-padding: 0.75rem

@import "../node_modules/bulma/bulma.sass"

/* extend 了 Bulma 的 box 类时,应该放在 import 语句之下 */
.compact-box
  @extend .box
  padding: 0
  border: 1px solid $primary
  border-radius: initial
```

`display` 最重要的属性有 3 种,`block`, `inline`, `inline-block`,CSS Reference 有直观的 [[图表展示|https://cssreference.io/property/display/]]。MDN 有详细的 [[文档|https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Display]]。

一个常见的用途是,将 `<li>` 的 `display` 置为 `inline` 用来表示水平菜单。

`display` 跟 [[CSS 布局|CSS: Layout]] 息息相关。
`line-height` 是一个比较特殊的属性,因为大部分情况下它都使用的是 unitless value 而不是其他带单位的值。

比如同样的 HTML,两个不同的看起来类似的 CSS 会有不同结果:

<iframe height="465" style="width: 100%;" scrolling="no" title="Using line-height with relative value and unitless value" src="//codepen.io/onlyice/embed/LYPGZEx/?height=265&theme-id=0&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/LYPGZEx/'>Using line-height with relative value and unitless value</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

第一个例子中,`<p>` 的 `line-height` 是继承自 `<body>` 的。根据 [[CSS: Concept: Specified, Computed, Used, and Actual Values]],它会继承 `<body>` 的 computed value,即是 `19.2px` (`16px` x 1.2)。这会导致实际上 `<p>` 的字体大小是 `32px`,而 `line-height` 只有 `19.2px`,段落内的文本会挤在一起。而第二个例子中,由于 unitless value 是会不作改变被下面所继承,因此 `<p>` 的 `line-height` 会被计算成字体大小的 1.2 倍(`38.4px`),这样它的渲染结果是合乎预期的。
`outline` 属性与 `border` 非常像。但是它跟 `border` 的区别是,它并不会引起它所装饰的元素的大小、位置变化,仅仅在这个元素周围加上视觉效果。我觉得可以应用在 `:hover` 上。

!! Resources

* [[outline - CSS Reference|https://cssreference.io/property/outline/]]
CSS Reset 是指一套样式表,它的目标是将 User Agent 默认的样式表覆盖,用来提供一个 UA 无关的样式表。

CSS Reset 的 idea 最早是 [[Meyer's reset|https://meyerweb.com/eric/tools/css/reset/]] 发扬光大的。现在比较流行的是:

* [[necolas/normalize.css|https://github.com/necolas/normalize.css]]
* [[csstools|https://github.com/csstools]] 提供的两套:
** [[sanitize.css|https://github.com/csstools/sanitize.css]]
** [[normalize.css|https://github.com/csstools/normalize.css]]

necolas 和 csstools 的同名 normalize.css 项目,一开始是共同开发的,后来分开维护了。csstools 的作者 [[讲述|https://github.com/csstools/normalize.css/issues/3#issuecomment-421401639]] 了其中的区别:

* The necolas version includes non-fixes, previously known as opinionated defaults before such documentation was removed, like `body { margin: 0 }`.
* The csstools version is more actively maintained.
* I am blocked from submitting PRs or following any changes or discussions in the necolas version.

csstools 的 normalize.css 和 sanitize.css 区别在于:

> normalize.css and sanitize.css correct browser bugs while carefully testing and documenting changes. normalize.css styles adhere to css specifications. sanitize.css styles adhere to common developer expectations and preferences. [[reset.css|https://meyerweb.com/eric/tools/css/reset/]] unstyles all elements. Both sanitize.css and normalize.css are maintained in sync.

同时 [[csstools|https://github.com/csstools]] 还提供了很多额外的工具帮你写出好的 CSS。

[[A look at CSS Resets in 2018|https://bitsofco.de/a-look-at-css-resets-in-2018/]] 是一篇用于理解 CSS reset 的非常好的文章。它讲述了 CSS reset 三个最主要的功能:

* Correct user agent styling errors
* Undo any "opinionated" user agent styling
* Create a consistent, largely opinionated, style base

有些框架会把一些合理的默认样式覆盖掉,以方便框架自己定义自己的一套,比如 [[Bulma|https://github.com/jgthms/minireset.css/blob/master/minireset.css]]:

* 把 `<h1>` 到 `<h6>` 的 `font-size` 全部重置成了 `100%`,再自己定义的 `font-size` 大小
* 把 `<button>` `<input>` 等控件的 `margin` 全部置成了 0,再自己定义 `margin` 大小

CSS 框架都会做 CSS Reset,如 [[Bootstrap|https://github.com/twbs/bootstrap/blob/v4-dev/scss/_reboot.scss]]、[[Bulma|https://github.com/jgthms/bulma/blob/0.7.5/sass/base/minireset.sass]]。普通的网站项目建议用 normalize.css。

!! Typical reset

典型的 reset 点。

!!! box-sizing reset

CSS Reset 中一般有一项是 `box-sizing` 置为 `border-box`(而不是 `content-box`,原因参考 [[CSS: Layout: Box Model]]):

```css
*,
*::before,
*::after {
  box-sizing: border-box;
}
```

对于为什么需要 `*::before` 及 `*::after`,是因为他们是唯二可以往页面中插入内容的 pseudo-elements,所以需要选中它们所插入进来的元素。参考 [[CSS: Selector]]。

如果你在工程中使用了上述 CSS,而你所使用的一些第三方 CSS 库仍然在使用 `content-box`,那这种写法会引起问题。你可以换成这种写法:

```css
/* :root 在浏览器环境中即 html */
:root {
  box-sizing: border-box;
}

*,
*::before,
*::after {
  box-sizing: inherit;
}

/* 
 * 对于使用了 content-box 的组件,在它的上层 container 中设置 box-sizing。
 * 这样不用对它的每个元素都做设置。
 */
.third-party-component {
  box-sizing: content-box;
}
```

!! Resources

* [[A look at CSS Resets in 2018|https://bitsofco.de/a-look-at-css-resets-in-2018/]]
* [[CSS Pro Tips|https://github.com/AllThingsSmitty/css-protips]]
* [[csstools|https://github.com/csstools]]
Responsive design,中文译为「响应式设计」,是业界用来解决不同大小的屏幕显示同一页面内容的一种手段。

它主要利用 CSS 提供的 media query 能力,来控制不同宽度的屏幕上页面如何显示内容:

```css
@media (max-width: 760px) { ... }
```

[[Tailwind CSS]] 提供了非常好用的 utility,用它。



!! Resources

* [[Google 的响应式设计文档|https://developers.google.com/web/fundamentals/design-and-ux/responsive]]: 写得非常好,复刻下其中提到的 cases
* [[Media Queries|https://mediaqueri.es]]: 好的响应式设计案例

CSS 有 4 类 Selector。

!! Type, class, and ID selectors

```css
h1 { }
.box { }
#unique { }
```

!! Attribute selectors

```css
a[title] { }
a[href="https://example.com"] { }
```

!! Pseudo-classes and pseudo-elements

!!! Pseudo-class

Pseudo-class 是用来选择特定状态下的元素,如 `a:hover` 用来选择鼠标指过去的 `<a>` 元素。有这几类:

* Dynamic pseudo-classes,如 `:hover`、`:visited`
* UI element states pseudo-classes,如 `:enabled`、`:disabled`、`:checked`
* Structural pseudo-classes,如 `:first-child`、`:nth-child(n)`
* Other pseudo-classes,如 `:not(x)`、`:target`

!!! Pseudo-element

Pseudo-element 可以 ''创建'' 新的元素(而无需在 HTML 中指定它),并且可以像正常元素那样操作它。最常见的例子是给链接前后加上小图标:

```css
a.tc-tiddlylink-external::before {
    font-family: FontAwesome;
    padding-right: 2px;
    content: "\f14c";
    color: gray;
}
```

但是对于「创建」这个说法,我觉得不是很全面,比如 `::first-line` 这种 pseudo-element 看起来像 pseudo-class。

参考:

* [[Pseudo-classes vs pseudo-elements - Growing with the Web|https://www.growingwiththeweb.com/2012/08/pseudo-classes-vs-pseudo-elements.html]]

!! Combinators

将上面几类结合起来的 selector:

```css
article > p { }
```

!! Resources

* [[CSS selectors - MDN|https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors]]
Tailwind CSS 提供了非常多实用的 [[示例和用法|https://tailwindcss.com/docs/font-family]],看左边侧栏 typography 段中的一系列内容。

!! 快速使用

''想实现限制单行文本、超长时截断'',用 [[truncate|https://tailwindcss.com/docs/text-overflow]]。

!! Autoprefixer

[[Autoprefixer|https://github.com/postcss/autoprefixer]] 是构建过程中的工具,自动给 CSS 加上 vendor prefix,比如 `-moz`, `-webkit`。

!! 30 seconds of CSS

[[30 seconds of CSS|https://github.com/30-seconds/30-seconds-of-css]] 提供了很多实用有趣的代码片段,帮助你实现好玩的动画或者有用的排版效果。
!! References

* [[CSS Values and Units - MDN|https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Values_and_Units]]
一开始 web 界很倾向于 Pixel perfect 这个理念,各种布局都精确到了像素点,比如很长一段时间网页内容都是居中在一个固定的 800px 左右的容器中。但是后来 PC 的屏幕越来越大,同时手机屏幕也出现了,导致一个固定的布局无法适应多种设备。因此业界的实践也从大量使用绝对的长度单位,转向使用相对单位。

! Absolute length units

|!Unit |!Name |!Equivalent to |
|`cm` |Centimeters |1cm = 96px/2.54 |
|`mm` |Millimeters |1mm = 1/10th of 1cm |
|`Q` |Quarter-millimeters |1Q = 1/40th of 1cm |
|`in` |Inches |1in = 2.54cm = 96px |
|`pc` |Picas |1pc = 1/16th of 1in |
|`pt` |Points |1pt = 1/72th of 1in |
|`px` |Pixels |1px = 1/96th of 1in |

总结:1 in. = 25.4 mm = 2.54 cm = 6 pc = 72 pt = 96 px

CSS 中的像素(px)跟显示器的像素是不一样的。对于一个典型的 23.8 英寸 1080P 分辨率的显示器,显示器的 PPI 是 92,屏幕的物理尺寸为 527.04mm x 296.46mm(20.75" x 11.67")。在系统缩放比例保持 100% 并且浏览器也不做额外缩放的情况下,1 CSS inch 在屏幕上的长度大约是 1.04 英寸(96/92)。填满 1080 个像素点,需要 20(1080 / 96)个 CSS inch,需要 20.86(1080 / 92)个英寸。

CSS 单位到屏幕单位的换算,在 Media query 部分再详谈。

! Relative length units

相对长度的 CSS 单位。这里只关心跟字体大小相关的属性 `em` 及 `rem`:

* `em`: Font size of the element.
* `rem`: Font size of the root element.

使用相对单位会使得整个样式表的维护性增强(比如你不需要修改到处都是的 `px` 值),也会使得应用响应式设计更加简单。

!! em

```css
.padded {
  padding: 1em;    
}
```

`padding` 的数值在运行时才会被计算出来,在该属性应用到的元素上,它的 `padding` 值与其 `font-size` 值一致。比如该元素的 `font-size` 为 `16px`,那么 `padding` 的值也为 `16px`。这种值被称为 [[computed value|CSS: Concept: Specified, Computed, Used, and Actual Values]]。`em` 可以用来实现按不同的字体大小给定不同 `padding`, `height`, `width`, `border-radius` 等功能,比如:

{{ css-relative-size-padding-and-border-radius }}

这是另外一个示例,用来实现不同大小的 box:

<iframe height="265" style="width: 100%;" scrolling="no" title="Illustrate unit em" src="//codepen.io/onlyice/embed/BaBjzEg/?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/BaBjzEg/'>Illustrate unit em</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

对于 `font-size` 本身,也可以使用 `em` 单位,会在它继承的 `font-size` 基础上乘上 `em` 的比例:

<iframe height="200" style="width: 100%;" scrolling="no" title="Using em in font-size" src="//codepen.io/onlyice/embed/pozgNNK/?height=200&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/pozgNNK/'>Using em in font-size</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

如果对不同属性同时使用 `em`,可能会有些没那么直观的效果:

<iframe height="265" style="width: 100%;" scrolling="no" title="Using em in font-size and padding" src="//codepen.io/onlyice/embed/xxKZRpx/?height=265&theme-id=0&default-tab=css,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/xxKZRpx/'>Using em in font-size and padding</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>

在嵌套元素中使用 `em` 时,会造成一个 shrinking font problem,具体看 [[CSS in Depth: Ch02]] 书中示例。

!! rem

相较于 `em`,还有一个 `rem`,它跟 `em` 的区别是它是相对于 root element,对于一个普通的 HTML 来说即是 `<html>` 元素。一般页面不会对这个元素设置 `font-size`,因此 `rem` 单位用在 `font-size` 上时,一般是相对于浏览器预设的字体大小。而这个大小,一般默认为 16px(medium)。

`rem` 的好处在于增强了无障碍性(accessibility)。比如对于视障人士,如果它期望页面的字体更大,他可以用两种方式:

* 使用浏览器提供的缩放功能,一般是 <kbd>Ctrl-=</kbd> 这类快捷键
* 将浏览器默认的字体大小调得更大

如果一个网站在设置 `font-size` 时都用 `rem` 作为单位,那么上述的第二种方式是有效的。但是大多数网站,特别是电商网站,大量用了 `px` 来表示字体大小。考虑到电商网站的 UI 一般比较复杂,使用 `px` 可能对于他们设计网站样式时更有帮助,但是这损伤了无障碍性。现代网站的样式设计应该多用 `rem` 来表示字体大小。

<<.s "最佳实践:">>

对于什么时候用绝对值,什么时候用 `em` 及 `rem`,[[CSS in Depth]] 给出了普适(但不绝对)的经验:

> When in doubt, use rems for font size, pixels for borders, and ems for most other properties.

Bulma 的 [[样式|https://bulma.io/documentation/customize/variables/]],是符合上述规则的。对于线段式的样式(比如 `border` 等),用 `px` 能更精确地控制线的样子。对于诸如 `padding` 等跟间隔相关的,用 `em` 可以跟内容契合。我认为 `border-radius` 这种即可以用 `em` 也可以用 `px`,视你是否想让圆角跟着内容大小变化。

<<.s "应用实例:">>

用相对值方便做不同大小的 panel 设计:

<iframe height="465" style="width: 100%;" scrolling="no" title="Multi-size panels implement" src="//codepen.io/onlyice/embed/MWgKbQZ/?height=465&theme-id=0&default-tab=html,result" frameborder="no" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href='https://codepen.io/onlyice/pen/MWgKbQZ/'>Multi-size panels implement</a> by onlyice
  (<a href='https://codepen.io/onlyice'>@onlyice</a>) on <a href='https://codepen.io'>CodePen</a>.
</iframe>
[[wireservice/csvkit|https://github.com/wireservice/csvkit]] is a comprehensive tool for many typical operation on CSV file.
Custom PyPI server can be achieved by using [[pypiserver/pypiserver|https://github.com/pypiserver/pypiserver]], cooperating with [[ignacysokolowski/pypi-uploader|https://github.com/ignacysokolowski/pypi-uploader]] for uploading packages.

!! pypiserver

Quick start:

```bash
pip install pypiserver

# Create a directory for packages to live in
mkdir ~/packages

# Set a user name and password for authentication when uploading packages
htpasswd -c htpasswd.txt <username> <password>
./pypi-server -p 8080 -P htpasswd.txt ~/packages &
```

!! pypi-uploader

Quick start:

Write a `~/.pypirc` file:

```
[distutils]
index-servers =
  internal

[internal]
repository: <pypi-server>  ; e.g. http://10.123.16.167:8080
username: <username>
password: <password>
```

```bash
pip install pypi-uploader
pypiupload files <python-pacakges> -i internal
```

The [[official documentation|http://docs.cython.org/en/latest/index.html]] of Cython is the best resource to start using Cython.

!! Resources

# This [[official tutorial|http://docs.cython.org/en/latest/src/tutorial/clibraries.html]] gives examples of core mechanism of Cython. Must Read.

!! Official Documentation Index

* Getting Started
** <<task-done>> Cython - an overview
** Installing Cython
** Building Cython code
** Faster code via static typing
* Tutorials
** <<task-done>> Basic Tutorial
** <<task-done>> Calling C functions
** <<task-done>> Using C libraries (Section of callback function is not read)
** Extension types (aka. cdef classes)
** pxd files
** Caveats
** Profiling
** Unicode and passing strings
** Memory Allocation
** Pure Python Mode
** Working with NumPy
** Working with Python arrays
** Further reading
** Related work
** Appendix: Installing MinGW on Windows
* Users Guide
** Language Basics
** Extension Types
** Special Methods of Extension Types
** Sharing Declarations Between Cython Modules
** Interfacing with External C Code
** Source Files and Compilation
** Early Binding for Speed
** Using C++ in Cython
** Fused Types (Templates)
** Porting Cython code to PyPy
** Limitations
** Differences between Cython and Pyrex
** Typed Memoryviews
** Implementing the buffer protocol
** Using Parallelism
** Debugging your Cython program
** Cython for NumPy users
** Indices and tables
* Reference Guide
** Compilation
** Language Basics
** Extension Types
** Interfacing with Other Code
** Special Mention
** Limitations
** Compiler Directives
** Indices and tables
|!Name |大道当然:我与万科(2000~2013) |
|!Author |王石 |
|!Edition |N/A |
|!Release Date |March, 2014 |
|!ISBN-13 |978-7508641089 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

本来看这本书,是想从中理解房地产行业的逻辑和运作方式。但没想到这是本故事书,而且是本一看就停不下来的故事书。

王石的文笔简洁顺畅,字里行间流露出的真诚和他的道德情操让我很敬佩。

目前仅看完第一部分。后面不准备读了,故事虽好,但从功利角度看帮助不大。
Dart [[官网|https://dart.dev/]] 的文档写得非常简练,笔记价值小,直接看就好。
Dart 中有一个实用(但不是那么清晰)的层叠标记功能。

```dart
void main() {
  querySelector('#sample_text_id')
    ..text = 'Click me!'
    ..onClick.listen(reverseText);
}
```

即是说,`querySelector` 返回的对象,可以在一个表达式中被持续使用,比如赋值它的 `text` 属性,使用它的 `onClick` 属性。

它的作用是:**在函数没有实现 fluid 风格时也能使用 fluid 风格**。

复杂的例子:

```dart
final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();
```
Dart 继承模型:''单继承、多 mixin''。

!! 带条件地访问成员变量

```dart
// p 为 null 时 a 为 null;否则 a 为 p.y
var a = p?.y;
```

!! 构建函数

两种构建函数:

```dart
class Point {
  double x;
  double y;

  // this.x 是语法糖
  // 构建函数的函数体为空时,花括号 {} 也可以不写
  Point(this.x, this.y);
  Point.fromJson(Map<String, double> json)
      : x = json['x'],
        y = json['y'];
}

void main() {
  var p1 = Point(1, 2);
  var p2 = Point.fromJson({'x': 1, 'y': 2});
  assert(p1.x == p2.x);
}
```

<<.warning "构建函数都是不会继承给子类的。">>

!!! 默认构建函数

如果你没有定义 constructor,Dart 会默认有一个 constructor,它不接受参数,不做任何事情;如果你定义了 constructor,不管它是带参数还是不带参数,默认的 constructor 都不会再生效。

如果子类没有定义 constructor,Dart 会默认有一个 constructor,它会调用父类的 no-arg constructor,再调用子类的。顺序如下:

# 对类中带默认值的 property 求值
# 对 initializer list 求值
# 调用父类的 no-arg constructor
# 调用子类的 no-arg constructor

写法例子:

```dart
class Person {
  String firstName;

  Person.fromJson(Map data) {
    print('in Person');
  }
}

class Employee extends Person {
  // Person does not have a default constructor;
  // you must call super.fromJson(data).
  Employee.fromJson(Map data) : super.fromJson(data) {
    print('in Employee');
  }
}
```

!!! initializer list 的 N 种写法

```dart
Point.fromJson(Map<String, double> json)
    : x = json['x'],
      y = json['y'] {
  print('In Point.fromJson(): ($x, $y)');
}
```

```dart
class Employee extends Person {
  Employee() : super.fromJson(defaultData);
  // ···
}
```

```dart
Point.withAssert(this.x, this.y) : assert(x >= 0) {
  print('In Point.withAssert(): ($x, $y)');
}
```

设置 `final` 的 pattern:

```dart
import 'dart:math';

class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;

  Point(x, y)
      : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}
```

重定向到别的构建函数:

```dart
class Point {
  double x, y;

  // The main constructor for this class.
  Point(this.x, this.y);

  // Delegates to the main constructor.
  Point.alongXAxis(double x) : this(x, 0);
}
```

!!! Factory constructors

有些情况下,我们希望构建函数执行时:

* ''不一定要构建新的对象'',比如在缓存中取已有的对象
* ''返回一个子类的对象''

此时可以用 `factory` 关键字:

```dart
class Logger {
  final String name;
  bool mute = false;

  // _cache is library-private, thanks to
  // the _ in front of its name.
  static final Map<String, Logger> _cache =
      <String, Logger>{};

  factory Logger(String name) {
    return _cache.putIfAbsent(
        name, () => Logger._internal(name));
  }

  factory Logger.fromJson(Map<String, Object> json) {
    return Logger(json['name'].toString());
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}
```

!! 操作符重载

Dart 提供了一种很像 C++ 的操作符重载能力:

```dart
class Vector {
  final int x, y;

  Vector(this.x, this.y);

  Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
  Vector operator -(Vector v) => Vector(x - v.x, y - v.y);

  // Operator == and hashCode not shown.
  // ···
}

void main() {
  final v = Vector(2, 3);
  final w = Vector(2, 2);

  assert(v + w == Vector(4, 5));
  assert(v - w == Vector(0, 1));
}
```

!! Getters and setters

Getter 和 setter 是把对属性的读写变成(不带参数的)函数:

```dart
class Rectangle {
  double left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  // Define two calculated properties: right and bottom.
  double get right => left + width;
  set right(double value) => left = value - width;
  double get bottom => top + height;
  set bottom(double value) => top = value - height;
}

void main() {
  var rect = Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);
  rect.right = 12;
  assert(rect.left == -8);
}
```

!! 抽象类

```dart
// This class is declared abstract and thus
// can't be instantiated.
abstract class AbstractContainer {
  // Define constructors, fields, methods...

  void updateChildren(); // Abstract method. (methods that has no implementation)
}
```

!! 隐式接口

Dart 没有专门的接口结构(比如 Java 的 Interface)。它通过类和其属性的访问限制,隐式地定义了接口。

```dart
// A person. The implicit interface contains greet().
class Person {
  // In the interface, but visible only in this library.
  final _name;

  // Not in the interface, since this is a constructor.
  Person(this._name);

  // In the interface.
  String greet(String who) => 'Hello, $who. I am $_name.';
}

// An implementation of the Person interface.
class Impostor implements Person {
  get _name => '';

  String greet(String who) => 'Hi $who. Do you know who I am?';
}

String greetBob(Person person) => person.greet('Bob');

void main() {
  print(greetBob(Person('Kathy')));
  print(greetBob(Impostor()));
}
```

!! mixins

mixin 是一种避免了多继承、但又可以共享一部分代码的机制:

```dart
mixin Musical {
  bool canPlayPiano = false;
  bool canCompose = false;
  bool canConduct = false;

  void entertainMe() {
    if (canPlayPiano) {
      print('Playing piano');
    } else if (canConduct) {
      print('Waving hands');
    } else {
      print('Humming to self');
    }
  }
}
```

你也可以用 `class` 关键词取代 `mixin`,但用 `mixin` 关键词时,`Musical` 是无法被实例化的。

在类声明中 `with Musical` 的类,可以用 `mixin` 中的代码,而不需要继承它:

```dart
class Musician extends Performer with Musical {
  // ···
}

class Maestro extends Person
    with Musical, Aggressive, Demented {
  Maestro(String maestroName) {
    name = maestroName;
    canConduct = true;
  }
}
```

另外,如果 `Musical` 中的 `entertainMe()` 是抽象函数(没有实现),`with Musical` 的类都需要实现这个函数。类似的,`canPlayPiano` 这几个值,如果没有默认值,`with Musical` 的类都需要给它设置 getter / setter / override(?)。

!! 类静态方法

```dart
import 'dart:math';

class Point {
  double x, y;
  Point(this.x, this.y);

  static double distanceBetween(Point a, Point b) {
    var dx = a.x - b.x;
    var dy = a.y - b.y;
    return sqrt(dx * dx + dy * dy);
  }
}

void main() {
  var a = Point(2, 2);
  var b = Point(4, 4);
  var distance = Point.distanceBetween(a, b);
  assert(2.8 < distance && distance < 2.9);
  print(distance);
}
```

<<.info "Dart 建议使用 top-level functions 而不是 static methods。">>

!! 可调用的类

通过在类中实现一个 `call` 方法,使它的实例可以像函数一样被调用:

```dart
class WannabeFunction {
  String call(String a, String b, String c) => '$a $b $c!';
}

var wf = WannabeFunction();
var out = wf('Hi', 'there,', 'gang');

main() => print(out);
```
Dart 的集合类型,最重要的是这三个:`List`、`Set` 及 `Map`。

!! 字面值

他们有各自的字面值:

```dart
// List
var l1 = [1, 2, 3];          // 不带类型,编译器推断
var l2 = <int>[1, 2, 3];     // 带类型

// Set
var s1 = {1, 2, 3};          // 不带类型,编译器推断
var s2 = <int>{1, 2, 3};     // 带类型

// Map
var m1 = {1: 'a', 2: 'b'};   // 不带类型,编译器推断
var m2 = <int, String>{1: 'a', 2: 'b'};   // 带类型
```

由于 `Set` 和 `Map` 的字面值很相近,表达一个空 Set 和空 Map,需要额外的注意:

```dart
// 空 Map,m1 及 m2 等价;m3 带类型
var m1 = {};
var m2 = <dynamic, dynamic>{};
var m3 = <int, String>{};

// 空 Set
var s1 = <dynamic>{};
var s2 = <int>{};
```

!! Spread operator

Dart 也有类似 JS 的 spread operator,而且它还有 null-aware spread operator:

```dart
var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);
```

!! Collection if / for

这两个特性是语法糖,简单用可以,不要滥用。

collection if:

```dart
var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];
```

collection for:

```dart
var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1');
```
常量与非常量是针对编译期而言。区别是:

* 常量:用 `const` 指定,声明变量时就必须指定值,无法再被重新赋值,编译器会展开它的值
* 非常量:
** `var`:编译器无法在编译期知道它的值
** `final`:跟 `var` 相同,除了它只能被赋值一次,无法再被重新赋值

!! 对于简单类型的字面值

对于简单的字面值,代码写起来是很类似的:

```dart
const i1 = 3;
const int i2 = 4;

final i3;
i3 = 5;
i3 = 6;    // 错误:i3 只能被设置一次
```

!! 对于类实例

对于类实例,还是有一些区别。`const` 要求类实现 const 构造函数(因为它在编译期要保证值无法改变)。`final` 没有这种要求:

```dart
class Vector {
  int x, y;
  Vector(this.x, this.y);
}

const v1 = Vector(1, 2);    // 错误:Vector 类的构造函数不是 const 构造函数
final v2 = Vector(1, 2);    // 正确:final 不要求 const 构造函数
v2 = Vector(2, 3);          // 错误:final 限制了变量无法被重新赋值
```

如果你要使用 const 构造函数,那么类中的所有属性必须是 `final` 的(不能再被赋值):

```dart
class Vector {
  final int x, y;
  const Vector(this.x, this.y);
}

const v1 = Vector(1, 2);    // 正确:Vector 类有了 const 构造函数及 final 属性
```

但 Dart 在设计 `const` 时有点奇怪,`const` 不仅能用来修饰一个变量(如上面的 `v1`),它还可以修饰对象的创建过程。事实上:

```dart
const v1 = Vector(1, 2);

// 等价于
const v1 = const Vector(1, 2);
// 只是这种 const 编译器可以推断出来,所以可以省略掉

// 你也可以
var v2 = const Vector(1, 3);
// v2 非 const 仅表示它可以被重新赋值
v2 = const Vector(2, 3);
// 但它的值仍然是一个 const 对象,仍然无法修改它的属性
v2.x = 3;         // 错误:Vector.x 是 final 的
```

但是对象的创建过程加不加 `const` 都是没有意义的,因为 const 构建函数决定了创建出来的对象必然是 const 的。

如上所示,一旦构建函数是 const 的,你就只能初始化出常量的 `Vector` 实例。但是实际上经常需要用到非常量的实例。因此实践上最好上写两个 `Vector` 类:

```dart
class Vector {
  int x, y;
  Vector(this.x, this.y);
}

class ImmutableVector {
  final int x, y;
  const Vector(this.x, this.y);
}
```

`const` 从机制上保证了对象各属性值是编译期确定好的,所以你无法再修改 `v1.x` 的值;但是 `final` 没有这种保证:

```
class Vector {
  int x, y;
  Vector(this.x, this.y);
}

final v2 = Vector(1, 2);
v2.x = 3;        // 正确:Vector.x 不是 final 的,可以被修改
```

!! 无法被修改的集合

Dart 为了实现不可变的集合,复用了 `const` 关键字,产生了一些不太直观的代码。比如一个无法被修改的 List,可以这样创建:

```dart
var foo = const [];
final bar = const [];
const baz = []; // 等同于 `const []`

// 下面几种操作都会在运行时报错:
// Unsupported operation: Cannot add to an unmodifiable list
bar.add(1);
foo.add(1);
baz.add(1);
```

同样的,Set 和 Map 也有类似的方法:

```dart
var m = const {};

// 运行时报错:
// Unsupported operation: Cannot set value in unmodifiable Map
m['a'] = 1;
```

```dart
var s = const <dynamic>{};

// 运行时报错:
// Unsupported operation: Cannot change unmodifiable set
s.add('a');
```

Dart 在这块的设计不够优雅。`const` 关键字被滥用了,它可以:

* 修饰一个变量,表示它是编译期确定的常量
* 修饰一个 const object 的创建过程,而且并没有什么用
* 作为不可修改集合(unmodifiable collection)的字面值

这很容易引起混淆。很多人看到 `const [1, 2]` 这种语法应该会一头雾水。对比之下 Python 的做法则没有引入新的语法机制:

* 可变列表用 `[1, 2]`,不可变列表(tuple,元组)用 `(1, 2)`
* 可变集合用 `set({1, 2})` 或者字面值 `{1, 2}`,不可变集合用 `frozenset({1, 2})`
Dart 的错误处理。

Dart 提供了 [[Exception|https://api.dart.dev/stable/dart-core/Exception-class.html]] and [[Error|https://api.dart.dev/stable/dart-core/Error-class.html]] 两种基础类型来表达错误。它们各自有很多预设的子类型。

抛出一个异常:

```dart
throw FormatException("wrong format");
```

箭头(`=>`)形式的函数,也可以使用 `throw` 表达式。

```dart
void distanceTo(Point other) => throw UnimplementedError();
```

''Dart 可以抛出任何类型的异常'',但一般来说会抛出 `Exception` 类或者 `Error` 类及它们的子类。

处理多种异常:

```dart
try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
} on Exception catch (e) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}
```

`on` 指出处理什么类型的异常(不带 `on` 时处理所有类型);`catch` 用来捕捉被 `throw` 的对象。

捕捉 StackTrace:

```dart
try {
  // ···
} on Exception catch (e) {
  print('Exception details:\n $e');
} catch (e, s) {
  print('Exception details:\n $e');
  print('Stack trace:\n $s');
}
```

重新抛出异常:

```dart
void misbehave() {
  try {
    dynamic foo = true;
    print(foo++); // Runtime error
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // Allow callers to see the exception.
  }
}
```
!! 基础语法

命名参数:

```dart
void enableFlags({bool bold, bool hidden}) {...}
enableFlags(bold: true, hidden: false);
```

必填命名参数:

```dart
const Scrollbar({Key key, @required Widget child}) {...}
```

可选位置参数:

```dart
String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}
```

!! 默认值

```dart
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}

String say(String from, String msg,
    [String device = 'carrier pigeon']) {
  var result = '$from says $msg with a $device';
  return result;
}
```

集合类型也可以作为默认值,但是需要是 `const`(防止被修改):

```dart
void doStuff(
    {List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
  print('list:  $list');
  print('gifts: $gifts');
}
```

!! 匿名函数

```dart
([[Type] param1[, …]]) {
  codeBlock;
};
```

```dart
var f1 = (int a, b) => a + b;
var f2 = (int a, b) {
    return a + b;
}
```
!! null 值的处理

<div class="box">

```dart
b ??= val;
```

如果 `b` 的原始值是 `null`,它被赋值为 `val`;否则保留原值。

</div>

<div class="box">

```dart
a = value ?? 0;
```

如果 `value` 为空,`a` 被赋值为 0;否则 `a` 被 `value` 赋值。

</div>

<div class="box">

```dart
a?.b
```

等同于 `a == null ? null : a.b`。

</div>

!! Typedefs

Dart 中 `typedef` 用来作为一个函数类型签名(包含参数类型和返回类型)的别名:

```dart
typedef Compare = int Function(Object a, Object b);
```

比如上面的 `Compare`,表示了一个接受两个 `Object` 作为参数、返回 `int` 类型的函数签名。

`typedefs` 的作用在于使函数类型签名,在编译期和运行期都能被 IDE 和 Dart 理解及使用。



比如这个例子,运行时你只能知道 `coll.compare` 是个函数,但是它是怎样的(什么参数类型、返回类型)函数,无法通过代码表达出来(即使 Dart runtime 是知道的):

```dart
class SortedCollection {
  Function compare;

  SortedCollection(int f(Object a, Object b)) {
    compare = f;
  }
}

// Initial, broken implementation.
int sort(Object a, Object b) => 0;

void main() {
  SortedCollection coll = SortedCollection(sort);

  // All we know is that compare is a function,
  // but what type of function?
  assert(coll.compare is Function);
}
```

使用 `typedef` 后则可以表达:

```dart
typedef Compare = int Function(Object a, Object b);

class SortedCollection {
  Compare compare;

  SortedCollection(this.compare);
}

// Initial, broken implementation.
int sort(Object a, Object b) => 0;

void main() {
  SortedCollection coll = SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}
```

`typedef` 还支持泛型:

```dart
typedef Compare<T> = int Function(T a, T b);

int sort(int a, int b) => a - b;

void main() {
  assert(sort is Compare<int>); // True!
}
```

!! Metadata

比如 `@deprecated` 和 `@override`:

```dart
class Television {
  /// _Deprecated: Use [turnOn] instead._
  @deprecated
  void activate() {
    turnOn();
  }

  /// Turns the TV's power on.
  void turnOn() {...}
}
```

可以自定义自己的 metadata annotation。在运行时可以通过反射机制读取到。

!! Documentation comments

```dart
/// A domesticated South American camelid (Lama glama).
///
/// Andean cultures have used llamas as meat and pack
/// animals since pre-Hispanic times.
class Llama {
  String name;

  /// Feeds your llama [Food].
  ///
  /// The typical llama eats one bale of hay per week.
  void feed(Food food) {
    // ...
  }

  /// Exercises your llama with an [activity] for
  /// [timeLimit] minutes.
  void exercise(Activity activity, int timeLimit) {
    // ...
  }
}
```



Dart 的 generator 分同步和异步。用的是 `sync*` / `async*` 关键字,它们使 generator 和 function 区分开来。

```dart
Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}
```

```dart
Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}
```

这个例子类似于 Python 的 `yield from`,但 Dart 的语法看起来更好(没有滥用同一个 keyword `from`):

```dart
Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}
```
Dart 的软件仓库叫作 [[pub|https://pub.dev/]],国内的镜像在 [[pub.flutter-io.cn|https://pub.flutter-io.cn]]。使用环境变量指定 pub 的镜像(已入 [[dotfiles|Dotfiles Management]]):

```shell
export PUB_HOSTED_URL=https://pub.flutter-io.cn
```

Dart 的包管理用的是 `dart pub` 命令。Flutter 使用了 Dart,`flutter pub` 是 `dart pub` 上的一层包装。

!! 添加包

在 `pubspec.yaml` 中加入相应的包和版本:

```yaml
dependencies:
  flutter_bloc: ^6.0.0
```

!! 安装包

* Dart: `pub get`
* Flutter:`flutter pub get`

!! 参考

* [[Dart 文档|https://dart.dev/guides/packages]]
* [[Flutter 文档|https://flutter.dev/docs/development/packages-and-plugins/using-packages]]
> Only other core issue from my perspective about dart, it has , the fastest object allocations I have ever seen. it is heavily optimized to create objects. It is the text book on how to write an object allocator.
> - [[Reddit|https://www.reddit.com/r/dartlang/comments/em57ry/i_wonder_how_dart_is_fast_like_golang/fdn5s3n/?utm_source=reddit&utm_medium=web2x&context=3]]
Dart 字符串是一串由 UTF-16 code units 组成的序列。

!! 替换

字符串中可以用 `${expression}`。如果 expression 是一个变量,花括号 `{}` 可以省略。Dart 底层会调用该对象的 `toString()` 方法:

```dart
var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, which is very handy.');
```

!! 比较

字符串的 `==` 比较的是里面的 code units 是否相同。

!! 字面值

字符串拼接:

```dart
var s1 = 'hello ' 'world';
var s2 = 'hello '
    'world';
var s3 = 'hello ' + 'world';

assert(s1 == s2);
assert(s2 == s3);
```

多行字符串:

```dart
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";
```

!! Unicode 操作

使用 Characters 库:

```dart
import 'package:characters/characters.dart';
...
var hi = 'Hi 🇩🇰';
print(hi);
print('The end of the string: ${hi.substring(hi.length - 1)}');
print('The last character: ${hi.characters.last}\n');
```

```
$ dart bin/main.dart
Hi 🇩🇰
The end of the string: ???
The last character: 🇩🇰
```
Dart 是纯 OO 型语言,所有类型都是 `Object` 类型的子类型。

!! 变量存储的是引用

变量都是存的引用(而不是值),即使针对数值类型也是如此。可以用 `identical` 来判断两个变量是否指向同个对象(对象可以看作变量在内存中的位置):

```dart
var a = "1";
var b = "1";
print(identical(a, b));    // true
```

即使 `a` 和 `b` 都存的是引用,但是 Dart 做了一个常见的优化,即对于数值类型或者字符串,如果值一样,它在内存中的位置是一样的。所以上面 `identical(a, b)` 返回的是 `true`。

```dart
var a = "ab";
var b = "a" + "b";
var c = "ab";

print(identical(a, b));    // false
print(identical(a, c));    // true
```

这是另外一个例子,可以看出 Dart 在编译时的优化还不够好,不能把 `b` 直接理解成 "ab"。

另外一点是,对于能在编译期就确定好值的 `const` 对象,编译器也会把值相同的变量指向同一个对象。

```dart
class ImmutablePoint {
  final double x, y;
  const ImmutablePoint(this.x, this.y);
}

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);

print(identical(a, b));    // true
```

!! for 循环中的 index 变量作用域

对于这样一段代码:

```dart
var callbacks = [];
for (var i = 0; i < 2; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());
```

如果在 JS 中运行时,会输出 `2` 和 `2`,不合预期;在 Dart 中运行时,会输出 `0` 和 `1`,符合预期。原因是 JS 的 `var` 关键字使得 `i` 是函数作用域,所以闭包中的 `i` 仍然绑定到函数作用域中的同一个 `i` 对象上,而它的值在循环结束后是 `2`。Dart 则不会有这种问题,`i` 的作用域只在 for 循环中,在 for 循环外不可访问,而且 Dart 会 “capture the value of index”,将其传到闭包中。

对于 JS,解决方法是使用 ES6 中引入的 `let` 来替代 `var`。

!! 类型推断

Dart 虽然是个强类型语言,但非常提倡代码上能简略则简略,比如变量的类型如果是编译期能推断出来的,就不用标上类型:

```dart
var name = 'Bob';
String name = 'Bob';
```

上面两种写法的作用是一样的。

如果你想要一个不限定类型的变量,可以用 `dynamic`。这会使 Dart 认为你访问变量的任何方法或属性都是可以的,''它不做编译期的检查'',但运行期如果调用了不存在的方法,还是会抛 `NoSuchMethodError`。

`dynamic` 对比 `Object` 的差别在于,使用 `Object` 时会有编译期检查,使用实际类型的方法或属性时需要做类型转换:

```dart
Object p1 = Point(1, 2);
print((p1 as Point).x);

dynamic p2 = Point(1, 2);
print(p2.x);
```

!! 类型判定及类型推断

```dart
// throws exception if emp is not a Person or is null
(emp as Person).firstName = 'Bob';

if (emp is Person) {
  // Type check
  emp.firstName = 'Bob';
}
```

除了 `is` 关键字,还有一个 `is!`,跟 `is` 作用反过来。

!! 默认值

对于 Dart 如果变量没有被赋值,它的值就是 `null`;对数值类型亦是如此:

```dart
int lineCount;
assert(lineCount == null);
```

!! `null` 的相关操作

为空时赋值:

```dart
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;
```

`null` 条件判断,如果 `expr1` 不为 `null`,返回 `expr1`;否则返回 `expr2`:

```dart
expr1 ?? expr2
```

比如:

```dart
String playerName(String name) => name ?? 'Guest';

// 等同于
String playerName(String name) => (name ?? 'Guest');
// 等同于
String playerName(String name) {
  if (name != null) {
    return name;
  } else {
    return 'Guest';
  }
}
```
这个条目可能分得不好。后续内容多了需要优化下。

! Metabase

[[Metabase|http://www.metabase.com/]] 是一个看起来很赞的数据可视化工具。带 Dashboard 功能。
! 数据备份

目前我使用了两个网盘做备份:

# 重要数据通过 OneDrive 同步
# 照片通过 Google Photos 备份

!! OneDrive

OneDrive 的优势在于 ''翻墙时上传下载都挺快'',不翻墙时稍慢但大部分时间能用,这使得 Enpass 可以免翻墙时就使用,减少一些麻烦。同时搭配 Office 365 家庭版时,OneDrive 的价格 ''非常便宜'',1T 的空间,一年只需要 40 元。

OneDrive 没有官方 Linux 客户端,我用的是社区的 [[abraunegg/onedrive|https://github.com/abraunegg/onedrive]]。通过 [[AUR|https://aur.archlinux.org/packages/onedrive-abraunegg/]] 可以安装。用法在 [[这里|https://github.com/abraunegg/onedrive/blob/master/docs/USAGE.md]],使用 systemd 的 user service:

```shell
$ systemctl --user enable onedrive
```

做一些优化,设置 `HTTP_PROXY` 及 `--min-notify-changes 1000` `--monitor-interval 30` 来减少通知和提升查询频率。配置的结果已经存在 yadm 维护的 dotfiles 中,不需要再次配置。如果是第一次配置,需要运行 `systemctl --user edit onedrive`,写入下面的内容,最终生成的文件在 `~/.config/systemd/user/onedrive.service.d/override.conf`:

```ini
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8001"
Environment="HTTPS_PROXY=http://127.0.0.1:8001"、
ExecStart=
ExecStart=/usr/bin/onedrive --monitor --min-notify-changes 1000 --monitor-interval 30 --check-for-nosync
```

`--check-for-nosync` 使得你可以在一个文件夹中放入 `.nosync` 空文件,指导工具不要去同步此文件夹。

这个客户端有若干问题。比如误删文件,日志中显示:

```ini
Feb 27 15:50:30 onlyice-pc1 onedrive[922]: Downloading file 应用/Enpass/vault.enpassdbsync ... Retry sync count: 1: SSL connect error on handle 55840D053220
Feb 27 15:56:33 onlyice-pc1 onedrive[922]: Downloading file 应用/Enpass/vault.enpassdbsync ... Retry sync count: 2: Timeout was reached on handle 55840D053220
Feb 27 16:01:38 onlyice-pc1 onedrive[922]: ERROR: OneDrive returned an error with the following message:
Feb 27 16:01:38 onlyice-pc1 onedrive[922]:   Error Message: Timeout was reached on handle 55840D053220
Feb 27 16:01:50 onlyice-pc1 onedrive[922]: Downloading file 应用/Enpass/vault.enpassdbsync ... Giving up on sync after three attempts: SSL connect error on handle 55840D053220
Feb 27 16:01:50 onlyice-pc1 onedrive[922]: Persistent connection errors, reinitializing connection
Feb 27 16:01:50 onlyice-pc1 onedrive[922]: Deleting item from OneDrive: 应用/Enpass/vault.enpassdbsync
```

在连接失败后它把我的 Enpass 数据库删了,而且发生不止一次。后来我给整个「应用」文件夹配置了 `.nosync` 来解决。

还有在下载大文件下载一半时,如果机器或者进程重启,会导致它下次不会继续下载,而是 ''把本地未下载好的文件覆盖到云端''。这个问题非常严重。

!! Google Photos

照片使用了 Google Photos,原因有几点:

* 只要接受照片被压缩,可以无限量上传图片
* 压缩对画质的损失很小
* 搜索功能实在太牛逼了,可以根据物品/场景等搜索照片
* 自动对同一脸孔做照片聚合

!! 其他方案

!!! Dropbox

2019 年 08 月以前主力用 Dropbox,原因是:

* 稳定可靠,基本不丢数据
* 同步数据快,对于 Word 文件等也能做增量同步
* 我的主力平台上全部支持,Windows / Linux / Android
* 目前不用太担心产品会死
* 产品又做得即漂亮又简单易用

但是后来 Dropbox 免费版的政策发生了变化,''最多只支持三台设备同步'',导致我的新电脑无法使用。同时 ''付费方案太贵'',我不太愿意付费。因此换成了 OneDrive。OneDrive 不需要翻墙(虽然翻墙的同步速度更快),因此 Enpass 数据同步时不需要先设置好翻墙。同时 Office 365 家庭版的费用也非常 affordable。缺点在于没有官方 Linux 客户端,但是有社区的。

!!! Mega

[[Mega|https://mega.nz/]] 提供了免费的 50G 存储。也有全平台客户端(''包含非常好的 Linux 支持'')。但是天下没有免费的午餐,虽然 Mega 宣称不会对上传下载做限速,但是 ''实测上传速度很慢'',比如过程中可能以接近 1 MB/s 的速度传了 20M,然后上传就停了下来;网上也有人提到 ''下载也会有限速''。

Mega 的 ''付费方案也太贵'',500G 空间一年要 50 欧元,折合人民币五六百。

! 使用 rclone 自动同步 Dropbox 到 Google Drive

<<.warning "由于不想维护,这一块目前已经停止运行了。rclone 的新版本也可能有功能变化,下面内容仅供参考。">>

为了避免鸡蛋全部放在一个篮子里,我使用了 rclone 将 Dropbox 的数据定时同步到 Google Drive。

rclone 应该是目前最好的网盘同步工具了。它的原理是使用各家存储服务提供的 API,遍历文件目录并获取文件 Hash 以判断文件是否相同。它有一个 `sync` 命令可以将一个存储服务中的文件单向同步到另外一个服务。

[[GitHub|https://github.com/ncw/rclone]] | [[官网|http://rclone.org]]

!! 安装

Arch Linux 上已经有现在的 [[rclone 包|https://www.archlinux.org/packages/community/x86_64/rclone/]]。直接 `pacman` 安装即可。

```cmd
$ sudo pacman -S rclone
```

!! 用法

rclone 官网的文档写得很详细,用法可以直接参照它的文档。

首先运行 `rclone config` 配置 Dropbox 与 Google Drive。最终生成一个名为 "Dropbox" 和一个名为 "Google Drive" 的两个 remote 配置。

配置默认放在了个人 home 目录下(`/home/onlyice/.rclone.conf`)。

最终运行这条命令,可以把 Dropbox 内容同步到 Google Drive。

```cmd
$ rclone sync Dropbox:/ "Google Drive":"/Dropbox Backup"
```

!! 定时同步

这里使用 systemd 的 Timer 能力来做定时同步。

新建 `/usr/lib/systemd/system/backup-dropbox.service`:

```ini
[Unit]
Description=Backup Dropbox to Google Drive

[Service]
Type=oneshot
ExecStart=/usr/bin/rclone sync Dropbox:/ "Google Drive":"/Dropbox Backup"
User=onlyice
KillMode=process

[Install]
WantedBy=default.target
```

`Type=oneshot` 是值得关注的点。对于不是 oneshot 类型的服务,Systemd 要求服务启动后需要 signal start-up completion(不知道通过什么方式),告知 Systemd 启动完成。如果没有在 DefaultTimeoutStartSec (90s) 内告知,则会被当作启动失败进行重试。`Type=oneshot` 告诉 Systemd 这不是个服务,只是个一次性任务,所以很多跟服务相关的逻辑不会被启用。

再新建 `/usr/lib/systemd/system/backup-dropbox.timer`:

```ini
[Unit]
Description=Daily backup Dropbox to Google Drive

[Timer]
OnBootSec=5min
OnUnitActiveSec=1d

[Install]
WantedBy=timers.target
```

参数:

* `OnBootSec` 表示启动后 5 分钟开始执行
* `OnUnitActiveSec` 表示上次执行 1 天后再执行

之后再使用 `systemctl` 启用这个定时任务:

```cmd
$ sudo systemctl enable backup-dropbox.timer
$ sudo systemctl start backup-dropbox.timer
```

这样就可以每天定时同步文件了。

!! 加密

因为 rclone 申请的网盘权限比较多,相关的 API 参数放在 `.rclone.conf` 中,如果没有加密可能被坏人盗走,坏人就可以读取你全部的文件内容。

rclone 提供了一种设置密码的手段,会把 `.rclone.conf` 整个文件加密。但是代价是每次运行 rclone 命令行时都需要输入密码。因为我需要脚本每天同步 Dropbox 内容到 Google Drive,所以这里暂时没有加密上。

`.rclone.conf` 默认是 0600 权限的,即是只有你或者 root 用户可以查看它的内容。如果你的 SSH 登录过程不会被攻破,那么这个文件应该是基本安全的。
Data migration 是指数据库数据变化的过程。

!! 数据的哪些变化需要关注?

* A new member is added
* A member is removed
* A member is renamed
* The type of a member is changed
* The representation of a member is changed

!! 数据迁移工具的实现

* 了解下 Django Migration 的机制,看它覆盖了上述哪些数据变化
* 找到脱离框架(比如 Django)的,维护数据变化的工具

!! 参考

* [[How to automate database migrations in MongoDB - freeCodeCamp|https://medium.freecodecamp.org/how-to-automate-database-migrations-in-mongodb-d6b68efe084e]]
[[golang-migrate/migrate|https://github.com/golang-migrate/migrate]] 是一款用 Go 写的 DB migration 工具。虽然它是 Go 语言编写,但它的使用不跟语言和框架绑定。

参考 [[官方文档|https://github.com/golang-migrate/migrate/tree/master/cmd/migrate]] 进行安装。AUR 也有 [[包|https://aur.archlinux.org/packages/migrate/]]。2020 年 12 月 27 日使用的版本是 4.12.2,后面可能用更新的版本。

<<.warning "这个工具不做冲突上的处理。如果多人协作,多个人提交了同一版本号的 migration 文件,工具无法进行处理。">>

!! 常用工作流

在初始化本地开发环境中,需要做:

# 初始化开发数据库(下面描述)
# 向上执行全部数据变更(下面描述)

新增一套 migration SQL:

```bash
# Format:
#   migrate create -ext sql -dir . <describe_your_change>
# Example:
migrate create -ext sql -dir . create_note_table
```

向上或向下执行数据变更:

```bash
# 向上
## 执行全部
migrate -database `cat database_url` -path . up
## 执行 2 份向上变更(即以当前数据的版本为基准,做更新的变更)
migrate -database `cat database_url` -path . up 2

# 向下
## 执行全部
migrate -database `cat database_url` -path . down
## 执行 2 份向下变更(即以当前数据的版本为基准,回滚两次变更)
migrate -database `cat database_url` -path . up 2
```

!! 初始化开发数据库

migrate 不参与数据库的创建和销毁。用这里的 [[脚本|Snippets: PostgreSQL: Scripts for Create / Drop Database]] 去做。

将数据库的 connection url 写入 `database_url` 文件中,注意下面的命令中密码是要被替换的,而且需要是 URL encode 过的:

```bash
echo "postgres://squirrel_admin:<password_url_encoded>@localhost/squirrel?sslmode=disable&search_path=public" > database_url
```

需要指定 `search_path` 的原因是([[来源|https://github.com/golang-migrate/migrate/blob/master/database/postgres/TUTORIAL.md#fix-issue-where-migrations-run-twice]]):

<<<
When the schema and role names are the same, you might run into issues if you create this schema using migrations. This is caused by the fact that the default search_path is &ldquo;$user&rdquo;, public. In the first run (with an empty database) the migrate table is created in public. When the migrations create the $user schema, the next run will store (a new) migrate table in this schema (due to order of schemas in search_path) and tries to apply all migrations again (most likely failing).
<<<

可以使用 Python 来做 URL encode:

```bash
$ python3 -c 'import urllib.parse; print(urllib.parse.quote(input("String to encode: "), ""))'
# or
$ python2 -c 'import urllib; print urllib.quote(raw_input("String to encode: "), "")' 
```

!! migrate 过程出错时

当 migrate 过程失败时,工具会在数据库中标记某个版本失败(dirty)了。你重试 migrate 时,会报这种错:

```
Dirty database version 1. Fix and force version
```

这种情况下需要你人工确认下数据的状态,有必要的话做一些修复,然后执行:

```bash
migrate -database `cat database_url` -path . force VERSION
```

''注意'':force 后的版本,是你认为数据目前在这个版本(即做过这个版本及之前所有的 up 脚本),意味着:

* 如果从版本 4 up 到 5 过程失败了,即执行第 5 的 up.sql 失败,那么:
** 你修改了数据,使得数据库已经反映出 5 up 的结果了,此时应该 force 5;
** 如果修改是某种回滚,数据回到做完 4 up 之后的状态,那么你应该 force 4,并再执行一次 up
* 如果从版本 5 down 到 4 过程失败了,即执行 5 的 down.sql 失败,那么:
** 你修改了数据,使得数据库已经反映出 5 down 的结果了,此时应该 force 4;
** 如果修改是某种回滚,数据回到做完 5 up 之后的状态,那么你应该 force 5,并再执行一次 down

!! 参考

* [[migrate/cmd/migrate at master · golang-migrate/migrate|https://github.com/golang-migrate/migrate/tree/master/cmd/migrate]]
* [[PostgreSQL tutorial for beginners · golang-migrate/migrate|https://github.com/golang-migrate/migrate/blob/master/database/postgres/TUTORIAL.md]]
* [[Getting started · golang-migrate/migrate|https://github.com/golang-migrate/migrate/blob/master/GETTING_STARTED.md]]

数据库建模。一般分三层:

# Conceptual: This Data Model defines ''WHAT'' the system contains. This model is typically created by Business stakeholders and Data Architects. The purpose is to organize, scope and define business concepts and rules.
# Logical: Defines ''HOW'' the system should be implemented regardless of the DBMS. This model is typically created by Data Architects and Business Analysts. The purpose is to developed technical map of rules and data structures. 
# Physical: This Data Model describes ''HOW'' the system will be implemented using a specific DBMS system. This model is typically created by DBA and developers. The purpose is actual implementation of the database.

这里只关注 physical 这一层,涉及到建表、字段、约束等。

图表一般分为 ER 图和 UML 图两类。ER 图是更合适现代软件开发的。

!! 工具

参考这篇 [[V2EX 帖子|https://www.v2ex.com/t/426928]],大多数人的实践是:

* 大型的、多表的数据建模,用 StarUML / PowerDesigner
* 小型的,有几种方式:
** 直接在 SQL 工具(如 HeidiSQL / MySQL Workbench)中建表
** 用 ORM 写 Model 字段自动建表
** 裸写 SQL 建表

HeidiSQL 很受推荐,可能功能强大且易用。

我调研过的一些选择:

* [[SqlDBM|https://sqldbm.com/]]:网页版,UI 上流,功能不错。除基础功能外提供的能力有:写表格及字段备注、生成 SQL、反向从 SQL 解析。价格很贵。
* Navicat:Navicat Premium 中有 data modelling 能力。看起来不错,但是它在 Linux 上的 UI 不太能用。非常贵

!! 实践

个人觉得不复杂的业务没必要用专门的 data modelling 工具。可以考虑:

* 直接在 ORM(如 Django Models)中写对象,再生成对应图表即可。可能效果不如专业 ER 图软件。合适的工具有 PyCharm 中的 Python Class Diagram,django-extensions 中的 [[graph models|https://django-extensions.readthedocs.io/en/latest/graph_models.html]] 功能
* 直接通过 DB schemas 生成 ER 图,供理解
!! Resource

* [[Cheatsheet from DataCamp|https://www.datacamp.com/community/data-science-cheatsheets]] (Also in Dropbox)

下面的内容摘录自 [[Machine Learning Tribe|http://machinelearningmastery.com/machine-learning-tribe/]],但是我觉得对 Data Science 也适用。

* Business Tribes
** 1) Business Person with a General Interest
** 2) Manager Interested in Delivering a Project
* Academic Tribes
** 3) Machine Learning Student in a Undergraduate or Graduate Class
** 4) Machine Learning Researcher Interested in Impacting the Field
** 5) General Researcher Interested in Modeling Their Problem
* Engineering Tribes
** 6) Programmer Interested in Implementing Algorithms
** 7) Developer Interested in Delivering One-Off Predictions
** 8) Engineer Interested In Developing Smarter Software And Services
* Data Tribes
** 9) Data Scientist interested in Getting Better Answers to Business Questions
** 10) Data Analyst interested in Better Explaining Data
在分类上,数据结构应该跟算法是同一级的;但是为了方便,先这样分。后面如果有更多内容,再重构分类。

Data Structure 下的分类可参考 [[Wikipedia|https://en.wikipedia.org/wiki/Category:Data_structures]]。



!! Resources

* Don Sheehy. A Course in Data Structures and Object-Oriented Design. February 2019 or later revision available from https://donsheehy.github.io/datastructures/. 这书本是首选
* [[Open Data Structures|http://opendatastructures.org/]]


放大因子。这个术语主要出现在两个场景:SSD 写入数据时的写放大(write amplification),以及数据库系统中的各种放大现象。这篇文章只关注数据库系统中的。内容来源自 RocksDB 的 wiki([[网页链接|https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide]],<<coslink "本地存档" "/files/archives/2020/09/rocksdb-tuning-guide.pdf">>)。

!! 写放大(write amplification)

''写放大'' 指写入存储(磁盘、SSD 等)的数据量比写入数据库的数据量。比如写 10MB 到数据库时,磁盘上有 30MB 的写量(但不等同于磁盘一定会增加 30MB 内容),那写放大的比例是 3 倍。

!! 读放大(read amplification)

读放大指每次数据库请求到达时,需要读取的磁盘页数。比如需要读 5 页磁盘才可以处理一个请求,那读放大的比例是 5。

!! 空间放大(space amplification)

指数据库文件大小比数据大小。比如像数据库写入 10MB 时,数据库文件增加了 100MB,那空间放大的比例是 10。

!! 广义的放大现象

放在更广泛的语境下,这几个术语 ''可以指代更广泛的现象''。比如一个多层的后台架构中,逻辑 server 收到一个读请求后,会发出 5 个请求去访问其他后端模块,那这也是一个读放大的现象。
|!数据库类型 |B-Tree |LSM-Trees |
|!写入的数据量 |数据至少要写两次,分别是 WAL 以及数据页<br>修改数据时需要更新整个页带来额外消耗 |压缩合并过程也大量写入 |
|!写入的吞吐量<<footnote "?" "即写入的速率">> |较低 |较高,因为写入时是顺序写 |
|!占用磁盘空间 |大,因为页中会有未使用的空间 |小,而且由于数据有序,可以压缩 |
|!响应的平滑度 |优 |稍差,<br>在压缩合并过程会有大量 I/O 发生,导致有些请求无法被快速处理<br>数据量越多,压缩合并时的 I/O 消耗越大 |
|!需要事务的场景 |优,锁可以直接加在树上 |差 |
关系型数据库的索引被用来加速数据的查找。

!! 使用什么数据结构?

对比:

* [[Hash Table]]:查单个数据时快;不方便落盘;数据多时内存可能不够用;''不支持范围查询''
* 平衡树:支持范围查询;更新和查询性能好 O(log n);不方便落盘
* [[B+Tree|B-Tree]]:支持范围查询;适合落盘;更新和查询性能好;''本质上是以更多的分支来减少层高'',从而使读写性能高

''主流的 RDBMS 都使用 B+Tree。''

''操作的考虑点'':

* 插入数据:页内数据可能被挪动;单页可能满,会有页分裂过程
* 删除数据:页内容稀疏时会合并
* ''使用自增 ID 做插入操作时'',key 的值总是增加,数据不需要挪动、页分裂时性能也好

!! MySQL 的 InnoDB 引擎的实现

见 [[InnoDB: Topic: Index]]。
数据库事务。内容主要来自 [[Designing Data-intensive Applications 第七章|Designing Data-intensive Applications Ch07]]。

数据系统中,有很多种异常情况:

* ''数据库软件或者硬件'' 可能随时会出错(包括正在写操作的过程中)
* ''应用程序'' 可能随时会崩溃(包括正在执行一系列的数据库操作)
* ''网络问题'' 可能会切断应用程序与数据库间的连接,或者切断不同数据库节点中的连接
* ''多个客户端'' 可能同时向数据库写入,覆盖彼此的数据
* 一个客户端可能读到 ''更新了一半的无意义的数据''
* 多个客户端之间的 ''竞争条件''(race condition)可能导致 bug

为了简化对上述情况的处理,''事务''(transaction)的概念被发明出来。''事务表示把一组读写操作组合成一个逻辑单元,它们要么一起成功(被提交),要么一起失败(中断、回滚)。''如果失败了,应用程序可以安全地重试。事务是重点在于 ''没有部分失败''(partial failure)。

事务并不是天然存在的,而是人们为了简化问题提出的概念。事务有好处也有代价(cost)。有些时候数据系统可以不需要事务(比如为了高性能或高可用性),事务提供的安全能力也有其他办法提供。

!! The Slippery Concept of a Transaction

大部分数据库的事务机制,设计上都源泉于 1975 年推出的 IBM System R。2000s 开始,NoSQL 数据库开始流行,但部分 NoSQL 没有或者仅支持较弱的事务机制。

有一种常见的误解是:事务会影响数据库的高性能和高可用性。这并不完全正确,而应该视不同场景做选择。

!!! The Meaning of ACID

事务机制提供的安全保障能力,被称为 ACID,即「atomicity, consistency, isolation and durability」。虽然很多数据库称自己为 ACID-compliant,但不同数据库之间对 ACID 的理解和实现可能不一样。

!!!! Atomicity

原子性(atomicity)表示一个事务中,当客户端发起多个写请求时,如果过程中有失败,数据库应该撤回这过程的任何修改。

!!!! Consistency

一致性(consistency)指数据保持正确。比如一次转账中,转出的金额和收到的金额应该是一致的。一致性是应用程序在原子性、隔离性和持久性的帮助下,达成的一个目标。''它是应用程序本身的目标,而不是数据库系统的''。

!!!! Isolation

隔离性(isolation)表示当数据库执行多个并行的事务时,它们之间是相互隔离的。它被用于并行控制。如果没有隔离,可能导致多个事务同时读写一批数据而出现的各种问题。

!!!! Durability

持久性(durability)表示写入一旦事务成功提交,则写入的数据不会丢失。

对于单节点数据库,持久性一般表示数据已经落盘(或者非常早期的磁带,或者复制到备机)。对于多节点,一般表示数据已经成功复制到若干节点。

但持久性不是无限制的。如果你的硬盘和全部备份都坏了,那数据库系统也无能为力。数据甚至会慢慢损坏,比如 SSD 或者磁盘中的数据都有概率会自然损坏。

!!! Single-Object and Multi-Object Operations

ACID 针对的是 ''写多个 object''(rows, documents, records)的场景。

Multi-object transaction 的场景中,数据库 ''需要一种机制来确定一组读写操作是属于同个事务的''。一般是 ''基于客户端的 TCP 连接'' 来判断,在请求中的 `BEGIN TRANSACTION` 和 `COMMIT` / `ROLLBACK` 之间的语句即属于同个事务。(但实际实现上可能稍微更复杂一点,比如要处理客户端 `COMMIT` 之后还没收到回复网络就断开的情况。)

''很多非关系型数据库不提供写多个 object 的机制''。它们可能支持批量写(multi-put)操作,但并不表示这一组写是原子的,有可能一批 key 成功了,另外一批失败了。

!!!! Single-object writes

对于单个 object 的情况,一般数据库存储引擎保证了写数据时的原子性(比如通过 WAL)。而隔离性则经常通过对单 object 上锁来实现,即同时只允许一个线程写。

为了避免多个 read-modify-write 过程带来的问题,主流的解决方法是:

* 提供一些原子操作的能力,比如 Redis 的 [[INCR|https://redis.io/commands/incr]] 可以原子地增加某一 key 的值
* 提供 compare-and-set 操作,后面详谈

上述的手段都不属于事务的范畴,也跟 ACID 不沾边。

!!!! The need for multi-object transactions

为什么需要事务能力,这是显而易见的。但有一个场景是 denormalization。比如有一个邮件应用,可以显示每个人的邮件列表和未读邮件数。但当邮件列表的数据库表太大时,计算未读邮件数就非常耗时,因此做 denorm,把未读数量单独放到一张表中维护。这种场景对 ACID 能力有依赖。

另外像非关系型数据库,由于缺乏 JOIN 能力,也提倡做 denormalization,因此也需要事务机制来保证数据的一致性。

!!!! Handling errors and aborts

<<.note "这段内容对开发应用程序有帮助,应该仔细理解这其中的细节,考虑到不同场景的错误应该分别如何处理。">>

ACID 意味着当一个事务失败时,你可以安全地重试它。''但有一些场景需要思考'':

* 如果事务实际上成功了,但是网络问题(比如 TCP 断连)导致客户端并不知道最终的 COMMIT 有无成功,那客户端的重试可能会引起重复数据。''这种情况需要应用程序级别的 dedup 逻辑。''好的实践是,在插入数据的地方生成唯一 ID 并加上唯一索引,这样第二次插入数据时会报错,避免重复插入数据
* 如果出错是因为系统过载,那重试可能会加剧问题。可以限制重试次数或者使用指数级增长的重试间隔(exponential backoff)
* 对于暂时性的错误(如系统过载、网络异常等),重试是有意义的;但如果是永久性的错误,比如违反了唯一性约束,那重试没有意义
* 如果数据库事务只是一套连续操作的一部分(存在 side effect),比如提交数据库前发了邮件,那要注意重试时避开 side effect。二阶段提交(two-phase commit, 2PC)对这种场景有所帮助

!! Weak Isolation Levels

''并发问题(竞争条件)出现在两个事务操作同一块数据时'',比如一个事务读取了另外一个事务正在修改的数据,或者两个事务同时修改同一块数据。''并发问题非常难定位'',不是必现,而且在大型应用中可能有很多处代码访问了数据库。因此数据库提供了 ''事务隔离''(transaction isolation)来避免并发问题。隔离的最终目的是实现 ''可串行化隔离''(serializable isolation),即数据库使得每个事务都像是串行做修改。但由于可串行化隔离带来的性能影响,实际上数据库提供了多个相对弱的隔离级别,以应对不同的使用场景。

!!! Read Committed

最基础的隔离级别是 ''读已提交''(read committed),它保证:

* No dirty reads:向数据库读数据时,只会看到已经提交的数据
* No dirty writes:向数据库写数据时,只能覆盖已提交的数据(即两个事务不能同时修改同一个数据)

!!!! No dirty reads

<figure>
[img width=700 [ddia-ch07-dirty-read]]
<figcaption>Dirty reads example</figcaption>
</figure>

<figure>
[img width=700 [ddia-ch07-no-dirty-read]]
<figcaption>No dirty reads example</figcaption>
</figure>

No dirty reads 的中,当 user 1 的事务未提交时,user 2 查询的 x 值就永远是 2。

No dirty reads 存在的意义很明显,比如你并不想看到别人修改一半的数据,因为会导致应用层面的数据不一致(比如转账中一方已扣款,另外一方未收到款);也可能其中修改了数据后又回滚了。

!!!! No dirty writes

No dirty writes 是为了防止数据被多个事务同时覆盖,比如下面这个例子:

<figure>
[img width=700 [ddia-ch07-dirty-write]]
<figcaption>Dirty writes example</figcaption>
</figure>

某商品同时被 Alice 和 Bob 拍下,结果因为 dirty writes 导致收货人是 Alice 但买家却是 Bob,引起了数据不一致。

避免 dirty writes 的方法是,''当有一个事务对数据做出修改但未提交或回滚时,其他事务无法修改该数据的值,需要等待前者完成''。

!!!! Implementing read committed

实现读已提交最简单的做法是使用 ''行锁(row-level locks)''。当一个事务想修改某一行时,它需要先获得这一行的锁,直至事务提交或回滚。它持有这个锁的过程中,其他事务无法获得这个锁,因此也无法修改数据,这就避免了 dirty writes。对于 dirty reads,也可以采用类似的方法获得一个锁,但是在读完后马上释放这个锁。

但实际上 ''这种方式性能很差''。假如有一个执行时间很长的事务存在,把某一行锁了很久,那这个过程中读请求都需要等待,这对于大型在线应用是不可接受的。实际上数据库会纪录被修改的行的原来的值,一旦写操作的事务未提交,读此数据时,会直接返回原值。但主流数据库中也只有 IBM DB2 和 Microsoft SQL Server 还用锁来实现,其他的大多基于下文提到的快照方式。

<<.note "有些数据库(比如 MySQL)还提供 read uncommitted 级别。它的隔离性比 read committed 更弱,只防止 dirty writes,不防止 dirty reads。">>

!!! Snapshot Isolation and Repeatable Read

Read committed 看似一个已经不错的隔离等级了,但实际上它 ''会造成某段时间内应用数据的不一致''。这种情况称为 ''不可重复读''(nonrepeatable read)或 ''读偏''(read skew),比如下面这个例子:

<figure>
[img width=700 [ddia-ch07-read-skew]]
<figcaption>Read skew example</figcaption>
</figure>

Alice 有两个账户,分别有 500 元,帐户 2 向帐户 1 转 100 元。但 Alice 在上面的场景下,可能看到账户 1 有 500 元,账户 2 只有 400 元,而有 100 元消失不见。虽然随后她刷新数据会看到账户 1 已经变为 600 元,但这仍然是不可接受的。

有些场景也 ''无法容忍这种暂时的不一致'',如:

* 备份数据:耗时很长,这个过程可能有很多不一致的数据被读取及纪录
* 分析数据或做数据完整性校验

''快照隔离''(snapshot isolation)是解决这种问题的方法。在读已提交的基础上,当一个事务中读取数据时,只会读到这个事务开始时的数据库的快照;而任何进行中的其他事务做的修改,都不会被读取到。

''快照隔离是主流关系型数据库的默认隔离级别''。

!!!! Implementing snapshot isolation

在快照隔离的实现上,也同读已提交一样使用了写锁来防止 dirty writes。快照隔离暗含着 ''读不会阻塞写,写也不会阻塞读'',所以读的过程中不用锁,而是保存了数据在不同过程中的值。这种技术被称作 ''多版本并发控制''(multi-version concurrency control,MVCC)。对于读已提交,数据库需要纪录某个数据的 ''已提交版本'' 和 ''已覆盖但未提交'' 版本,对比快照隔离仅在于数据的版本数少了;因此 ''很多数据库也在读已提交级别中使用一样的 MVCC 技术''。

快照隔离的重点在于,按时间顺序赋予每一个事务一个增长的 ID,并纪录下对数据的修改:

<figure>
[img width=700 [ddia-ch07-snapshot-isolation-example]]
<figcaption>Snapshot isolation example</figcaption>
</figure>

当事务新增或者删除数据时,会各有一条带着事务 ID 和 created by / delete by 以及具体值的纪录。修改数据时,则会产生一条 created by 和一条 deleted by 共两条纪录。

控制好这些纪录的 ''可见规则'' 后,即可实现快照隔离。即对当前事务而言:

* 在它开始时,数据库判断当前还有哪些事务在被处理,这些事务的修改不可见
* 更迟开始的事务(事务 ID 更大),它的修改不可见

数据库系统可以 ''定期做垃圾回收'',回收被标记为 deleted 的行、不再需要被使用的 created by / deleted by 纪录。

!!!! Indexes and snapshot isolation

索引在有多版本能力的数据库中怎样实现?

一种方法是把索引指向该行的全部版本,再根据当前事务的情况做过滤。

另外一种流行的方法是使用 append-only / copy-on-write 技术。未深究。

!!!! Repeatable read and naming confusion

对于快照隔离,不同的数据库系统中叫法不一样。Oracle 叫作 serializable。PostgreSQL 和 MySQL 叫它 repeatable read。SQL 标准在这块带有岐义。

!!! Preventing Lost Updates

对于写操作引起的冲突,上面只解决了 dirty writes,但两个事务同时写引起的数据丢失还是存在。很多场景下,应用程序采用 read-modify-write 的形式更新数据,会导致前面写的内容被覆盖,比如:

{{ lost-update }}

Alice 想给 x 的值增加 50,Bob 想增加 150。那这个过程中,Alice 增加的 50 就被丢掉了。假如这是一个转账的场景,那么这种问题是致命的。另外一个常见场景是,两个人同时编辑一个 wiki 页面,结果后面编辑的人会把前面的人的内容覆盖掉。

对于这个问题,有一些解决方法。

!!!! Atomic write operations

数据库提供 ''原子操作能力'',避免需要 read-modify-write 过程。比如:

```sql
UPDATE counters SET value = value + 1 WHERE key = 'foo';
```

类似的,MongoDB 和 Redis 也提供了类似能力。但 ''很多修改并不能很容易用原子操作表达'',比如修改一个 wiki 页面。

!!!! Explicit locking

显示地对数据上锁,使得即使其他事务想进行读操作,也要等此事务结束。比如 SQL 中的 `SELECT ... FOR UPDATE` 语句:

```sql
BEGIN TRANSACTION;

SELECT * FROM figures
  WHERE name = 'robot' AND game_id = 222
  FOR UPDATE;

-- Check whether move is valid, then update the position
-- of the piece that was returned by the previous SELECT.
UPDATE figures SET position = 'c4' WHERE id = 1234;

COMMIT;
```

但这种方式对应用程序代码要求比较高。需要仔细地考虑哪些操作应该上锁。

!!!! Automatically detecting lost updates

使用快照隔离中提出的''多版本控制技术'',数据库也可以 ''自动检测 lost updates''。事实上 PG 的 repeatable read 会自动检测 lost update,并在这种情况出现时,将会引起问题的事务 abort,使得应用程序可以重新开始 read-modify-write 过程。但 InnoDB 不做这种检测。

!!!! Compare-and-set

Compare-and-set 是一种技巧,用来保证修改某一数据时,它的值仍与之前读取出来的一致。比如为了防止两个人同时修改同个 wiki 页面:

```sql
UPDATE wiki_pages SET content = 'new content'
  WHERE id = 1234 AND content = 'old content';
```

Hibernate 提供的锁机制中的 [[乐观锁|https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#locking]](optimistic lock)即基于这种机制。

!!!! Conflict resolution and replication

上面提到的锁和 compare-and-set 技术适用于单节点的数据系统,即数据库始终有一份最新的数据。

但分布式的数据系统,可能某一时间点有多份不一样的数据写入了不同结点。常见的处理是允许这种写入,然后再通过应用层去想办法解决或者合并这些多版本的数据(''需要深入了解'')。

原子操作适用于多节点数据系统。

!!! Write Skew and Phantoms

<figure>
[img width=700 [ddia-ch07-write-skew]]
<figcaption>Write skew example</figcaption>
</figure>

上面是一个 ''写偏''(write skew)的例子。Alice 和 Bob 是医院的医生,原先他们都会在某次轮班(swift_id = 1234)中出勤。医院的规定(''暗示一个约束'')是,轮班医生可以请假,但轮班至少要有一名医生。但碰巧 Alice 和 Bob 同时申请了请假,而系统在处理请假时判断到该次轮班有两名医生值班,因此均给两位的请假放行,导致该次轮班没有医生出勤(''违反了约束'')。

总结下写偏的 ''特点'':

* 它的过程不同于 dirty writes 或 lost update,并没有对同一个数据做修改
* 但它可以理解为一种 ''泛化的 lost update''。它是两个事务同时读取一批带有约束条件的数据(值班医生大于 2),但分别修改其中某些数据(分别改各自状态为不出勤),导致约束被违反(violate)的过程。

不太可行的解决方式:

* 之前提到的原子操作(atomic single-object operations)并不适用
* 数据库系统提供的自动检测 lost update 也无法覆盖这种情况
* 数据库提供的约束(constraint)往往只涉及单个对象的(唯一性约束、外键约束等)。多对象的约束可能需要 trigger 或者 materialized view 来实现,但不是广泛被支持

可行的解决方式:

* 隔离级别使用可串行化约束(true serializable isolation)
* 如果无法使用可串行化约束,则使用显式锁是比较好的做法:<div>

```sql
BEGIN TRANSACTION;

SELECT * FROM doctors
  WHERE on_call = true
  AND shift_id = 1234 FOR UPDATE; 

UPDATE doctors
  SET on_call = false
  WHERE name = 'Alice'
  AND shift_id = 1234;

COMMIT;
```

`SELECT ... FOR UPDATE` 会锁住相应的行,使其无法被修改。

</div>

像这个订会议室的场景,如果没有可串行化约束,需要应用程序做特别的考虑:

```sql
BEGIN TRANSACTION;

-- Check for any existing bookings that overlap with the period of noon-1pm
SELECT COUNT(*) FROM bookings
  WHERE room_id = 123 AND
    end_time > '2015-01-01 12:00' AND start_time < '2015-01-01 13:00';

-- If the previous query returned zero:
INSERT INTO bookings
  (room_id, start_time, end_time, user_id)
  VALUES (123, '2015-01-01 12:00', '2015-01-01 13:00', 666);
COMMIT;
```

两个事务同时运行时,可能造成两个人同时订了这个会议室。

这种情况被总结为 ''幻读''(phantom read),即''开始的查询会被后续的写操作(`INSERT`, `UPDATE` 或 `DELETE`)影响到'',导致一致性没有得到保证。

对于上述订会议室的例子,无法使用锁来做并发控制。但有一种技术思路,''实体化冲突''(materializing conflicts)可以部分解决这个问题。做法是专门建一个表,里面存放每个会议室每个时间段的纪录,比如每 15 分钟建一行。当有人需要订这个会议室时,把它要订的时间段,在这个表中使用 `SELECT FOR UPDATE` 锁定起来,这样其他人就无法同时锁定这批时间。这种做法可以解决问题,但是相对复杂,而且不美观,因为需要应用程序去关心这套并发控制。合理的方式还是使用可串行化隔离级别。

!! Serializability

可串行化隔离(serializable isolation)是最强的隔离级别。它实现的效果是:即使有多个数据库事务并发执行,对于数据库使用者来说,它们也像是串行一个个执行的。

但由于性能问题,但它并不会在所有场景被使用。有三种主流的实现方式:

* 按照字面含义,实际地串行执行事务
* 二阶段锁(two-phase locking, 2PL)
* 乐观的并发控制技术,比如可串行快照隔离(serializable snapshot isolation)

!!! Actual Serial Execution

''单线程'' 地执行事务可以实现可串行化隔离。

但从 70 年代人们开发数据库以来,一直追求通过提升并发来提升性能,因此这种单线程模式并不被考虑。直到 2007 年左右,人们才觉得这个想法是可行的:

* 内存成本降低,使得整个数据集放进内存成为可能。在内存中,事务执行的速度可以远远快过磁盘载体
* 对于 OLTP 而言,事务是比较短的
* 单线程的实现有时候比支持并发的实现性能更好,因为它''避免了在并发过程加锁的消耗'';但它只能利用单个 CPU

在早期的关系型数据库设计中,设计者想让整个处理过程能封装在一个事务中,例如用户在订机票时,将查询余票、锁定位置、付款等封装到一个过程中。但当数据库不支持并发时,由于用户操作需要时间,意味着第一个用户在订机票时,它的事务一直存在,导致第二个用户无法做任何操作。这是不可接受的。因此设计者发明了 ''存储过程'',它类似于 SQL 语句组成的函数,意图使用一种类似编程语言的方式,将一系列的查询、修改统一放在数据库中执行:

<figure>
[img width=700 [ddia-ch07-stored-procedure]]
<figcaption>Stored procedure example</figcaption>
</figure>

但这种方式没有流行起来,因为:

* 每个数据库系统都有自己一套语言用来描述存储过程,没有统一的规范。而且这些语言的设计过时、丑陋,也缺乏编程库支持
* 存储过程的代码难以调试,需要额外的部署和维护,也对 CVS 不友好
* 写得差的存储过程可能会耗费数据库机器相当多的 CPU 和内存。如果这些逻辑挪到应用程序的机器上实现,即使占用了大量资源,影响面也比前者小

但现代的内存式数据库克服了这些问题。它们抛弃了前辈们发明的语言,而转向更通用的编程语言,比如 VoltDB 用 Java 或 Groovy,Redis 用 Lua。

如果想使内存数据库能利用多核 CPU 提供效率,可以将数据 ''分区'',仅不同的 CPU 可同时处理不同分区的数据。一旦事务需要处理的数据仅在一个分区,它的处理性能会提高很多。如果跨分区,则会有协作带来的性能损耗。VoltDB 是一个例子。

!!! Two-Phase Locking (2PL)

二阶段锁的重点在于,''写是独占的''。它的规则是:

* 如果事务 A 读了一个 object,
** 事务 B 想读,是可以的
** 事务 B 想写,则要等 A 结束事务
* 如果事务 A 写了一个 object,
** 事务 B 想写或者读,都需要等 A 结束事务

因此 ''2PL 即会阻塞写,也会阻塞读''。

实现上,一般使用两种模式的锁,分别是共享锁(shared mode)和独占锁(exclusive mode)。规则是:

* 如果一个事务想读一个对象,它需要给对象上共享锁。多个事务可以同时给对象加共享锁;但一旦对象被加上独占锁,则其他事务无法加共享锁,需要等待
* 如果一个事务想写一个对象,需要上独占锁;而当一个对象被加上独占锁后,其他事务无法给它加独占锁
* 当一个事务给对象加上锁之后,这些锁直到事务结束才会被释放。这也是 ''二阶段'' 的含义所在:第一阶段为事务执行中,加锁;第二阶段为事务结束,释放锁

但这种方式会出现 ''死锁''。数据库可以自动检测死锁,一旦出现就随机中断其中某些事务,使应用程序再去重试。

''性能上'',一方面 2PL 的性能要比弱隔离差,毕竟有加锁的损耗。但更大的问题是 ''减少了并发'',因为:

* 一旦出现竞争状态或死锁,有一些事务则必须等待或者重试
* 当事务长时间运行时,或者有事务对大量对象加锁时,整个并发会严重下降

但上面的加锁机制解决不了之前描述的会议室预定问题。这种情况下需要 ''predicate lock''。predicate lock 的核心在于,''它针对查询条件来加锁,而不是针对读到的 / 要写的对象来加锁''。比如:

```sql
SELECT * FROM bookings
  WHERE room_id = 123 AND
    end_time > '2018-01-01 12:00' AND
    start_time < '2018-01-01 13:00';
```

这种情况下会针对 `WHERE` 中的条件来加共享锁。之后如果有其他事务修改某一对象时,数据库会检查该对象的 ''新值和旧值'',是否在被事务运行中的事务的 predicate lock 锁定了;如果是,则无法进行加锁。

但这种实现带来了 ''性能问题''。如果数据库中有非常多事务正在运行,去检查每一个 predicate lock 的性能消耗很大。一个折衷的方案是,使用 ''index-range lock''。Index-range lock 的理念是,`WHERE` 查询语句中的字段往往是有建索引的,比如上面的 `room_id`。那么数据库可以在索引上加锁,比如认定 `room_id = 123` 时有锁;虽然这个判定范围更大,不够精确,但是逻辑上是 OK 的。如果其他事务要修改数据时,通过数据查找到相应的索引,即可以比较高性能地判定能否修改<<footnote "备注" "这里的具体实现我没有理得太顺">>。

!!! Serializable Snapshot Isolation (SSI)

''Serializable snapshot isolation (SSI)'' 是一种比较新的算法。PG 9.1 开始使用 SSI。

2PL 是一种 ''悲观的并发控制''(pessimistic concurrency control)机制:如果事情有可能出错(有锁),那就等到情况变得安全(锁被释放)再继续。

SSI 是一种 ''乐观''(optimistic)的并发控制:即使危险状况出现也让事务继续,期望最终是正常的。它在最终事务提交时 ''判断隔离有没有被违反'',如果有,''中断事务并需要应用程序重试''。它的缺点是:如果大量事务都读写同一个 object,那么会有大量事务被中断,而后的重试会消耗性能。但反之也是它的优点:大多数情况下同个 object 并不会被大量读写,因此 ''它会比 2PL 性能更好'';而且它的实现是在 snapshot isolation 之上加上检测算法,因此 ''并不阻塞读的过程''。

SSI 可以使用类似 index-range lock 的技术实现。数据库纪录下有查询的 index-range 及修改的数据,然后做判断:

<figure>
[img width=700 [ddia-ch07-serializable-snapshot-isolation]]
<figcaption>Serializable snapshot isolation example</figcaption>
</figure>

即使修改的数据命中了其他事务之前查询的内容,有些数据库(如 PG)依然能判定这个修改会不会造成影响。如果不造成影响,那么不需要中断事务和回滚。

<div class="box">

根据 [[事务隔离|https://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2]] 的维基条目,''总结下事务隔离的各级别行为'':

|!隔离级别 |!脏读   |!不可重复读 |!幻影读  |
|未提交读 |可能发生 |可能发生 |可能发生 |
|提交读   |不会发生 |可能发生 |可能发生 |
|可重复读 |不会发生 |不会发生 |可能发生 |
|可串行化 |不会发生 |不会发生 |不会发生 |

</div>
Datetime format codes 是指日期 / 时间格式化字符串中的字符,比如 `YYYY-MM-DDTHH:MM:SS` 中的 `Y`, `M`。

不同的语言 / 规范中使用的 datetime format codes 不完全兼容,下面列出一些例子:

|!Language / Spec |!Month code |!Minute code |
|[[C|http://man7.org/linux/man-pages/man3/strftime.3.html]] |`m` |`M` |
|[[Python|https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior]] (use C 1989 stardard) |`m` |`M` |
|[[Java (JDK 10)|https://docs.oracle.com/javase/10/docs/api/java/text/SimpleDateFormat.html]] |`M` |`m` |
|[[.NET|https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings]] |`M` |`m` |
|[[Unicode LOCALE DATA MARKUP LANGUAGE|http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table]] |`M` |`m` |

可以看出这一块,目前还是比较割裂的,没有一个统一的标准。
乐观 / 悲观的并发控制。它们的定义在 [[Designing Data-intensive Applications Ch07]] 中描述得很好:

<<<
2PL 是一种 ''悲观的并发控制''(pessimistic concurrency control)机制:如果事情有可能出错(有锁),那就等到情况变得安全(锁被释放)再继续。

SSI 是一种 ''乐观''(optimistic)的并发控制:即使危险状况出现也让事务继续,期望最终是正常的。它在最终事务提交时 ''判断隔离有没有被违反'',如果有,''中断事务并需要应用程序重试''。
<<<

这套理念并不仅可以运用在数据库中,在 Hibernate 这种 data accessing library 中也有类似的 [[概念|https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#locking]]。它用了 compare-and-set 的机制来表达乐观锁(事实上并没有上锁)
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CCCAAAIIIIAAAggggAACQShAgC0ITwpVQgABBBBAAAEEEEAAAQQQQAABBBAIHQECbKFzrqgpAggggAACCCCAAAIIIIAAAggggEAQChBgC8KTQpUQQAABBBBAAAEEEEAAAQQQQAABBEJHgABb6JwraooAAggggAACCCCAAAIIIIAAAgggEIQCBNiC8KRQJQQQQAABBBBAAAEEEEAAAQQQQACB0BEgwBY654qaIoAAAggggAACCCCAAAIIIIAAAggEoQABtiA8KVQJAQQQQAABBBBAAAEEEEAAAQQQQCB0BAiwhc65oqYIIIAAAggggAACCCCAAAIIIIAAAkEoQIAtCE8KVUIAAQQQQAABBBBAAAEEEEAAAQQQCB0BAmyhc66oKQIIIIAAAggggAACCCCAAAIIIIBAEAoQYAvCk0KVEEAAAQQQQAABBBBAAAEEEEAAAQRCR4AAW+icK2qKAAIIIIAAAggggAACCCCAAAIIIBCEAgTYgvCkUCUEEEAAAQQQQAABBBBAAAEEEEAAgdARIMAWOueKmiKAAAIIIIAAAggggAACCCCAAAIIBKEAAbYgPClUCQEEEEAAAQQQQAABBBBAAAEEEEAgdAQIsIXOuaKmCCCAAAIIIIAAAggggAACCCCAAAJBKECALQhPClVCAAEEEEAAAQQQQAABBBBAAAEEEAgdAQJsoXOuqCkCCCCAAAIIIIAAAggggAACCCCAQBAKEGALwpNClRBAAAEEEEAAAQQQQAABBBBAAAEEQkeAAFvonCtqigACCCCAAAIIIIAAAggggAACCCAQhAIE2ILwpFAlBBBAAAEEEEAAAQQQQAABBBBAAIHQESDAFjrnipoigAACCCCAAAIIIIAAAggggAACCAShAAG2IDwpVAkBBBBAAAEEEEAAAQQQQAABBBBAIHQECLCFzrmipggggAACCCCAAAIIIIAAAggggAACQShAgC0ITwpVQgABBBBAAAEEEEAAAQQQQAABBBAIHYE8oVNVaooAAgggkF0Cy5cvk/Xr10tUVJSMHj3G42F/+eUX2bFjhyxbttRle6dOnaVs2bJSrVo1l/WLFy+STZs2SdeuXaVRo8Yu23iBAAIIIIAAAggggAACCISyAAG2UD571B0BBBAIgMA///wjCxculD17vpJ33lkrQ4cOkwIFCqQ60qFDh6RHj26SJ08eKVq0qGO7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7T/p7W/z8IwAAggggAACCCCAQKQJEGDL4TP+119/mRq493QIVLW0t0XhwoUDVTzlIoAAAmEpMHToEOnff4AMGjRYcufObdoYFzfOBNfefHOVCZrp+n/++VsmTZok2gPtxhsbSIcOd4t+zvfvf58Jak2ePEU6dOggefNeKH/++adMn/6UzJkz2yczW36uXLnk/fe3SIUKFUx5Wn7Xrl1Ee7zdcMONUqNGDXnllZdNPbRH3rhxcSbfuXP/BdBuuukm0Ufr1rEmwDdy5CipVauWo34Z7e/IyAICCCCAAAIIIIAAAhEmQIDNjyd806aNMnv2M6lK7NevvzRp0tSxXvO988475hYevdVI08UXFzS38vTs2cuRz9OC9niYO3eOnDx50mVz8+YtXHoouGwUkYULnze3MGnviVKlSkm9evXNrUdFixZ1z2pea88M/QNx27atLtszOo5LZl4ggAACYSJw2WWXyZgxD7m0RnuZ3XJLM7n22tqO9Ro4u/POu8znZ0JCggmw7d27V7744gvTQ+322+8wwTXdIX/+/KZMvcX0m2++cZSR2QVb/rBhwx3BNVv+HXfcIVu3/p+8885aE2CzPdOcf2ixAUNvjuvr/t4cgzwIIIAAAggggAACCISiAAE2P5y1jRs3ylNPPSm7dn0m58+fl0KFCpnbbXS8nr///luuvvoaR4BN/8jq3r2b5MmTR/QPNpt2794lH330kbz++muyYsWr4t6jTW83mjTpMdm8+X05e/YfufDCC83+P/74o/z666+iPRecbwGy5eo4OjfddKMcPnzY1EvzHjhwwBzrvfc2yLJlL6Xq0aa93Lp06SS7du0y7dD2aNL2bN26VVatWiWrVr1lD8EzAgggEPYCDRrc5NJGHatM0/fff2d6iDlv1B5hxYoVl+PHj5nVOu6aJv0B5eKLL3bOapa1bF8CbJ98stOU8/HHO1LVxQbE9McVTRoM1M/0+Ph4cwvpoEFDpG7dumabN//4ur83xyAPAggggAACCCCAAAKhKECAzcezpj29Hn54jBw5ckQqVKgoffv2lQYNGkjlylVMgOrIkcNSs+Z/t9forTvdu/eQtm3budx2s3r12zJ69Cj59NNPTS+44cNHuNTskUcekQ8/3CJFihQxgTTtEae37Rw4sF+OHTsu58//d4uP844vvbRcChS4SF5+eYWUKlXS5NXBuLVH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YFzr1q27NGjQkJ63gfifgX0iARIgARIIegI0sAXJfwEdt+ivvx4tzwiSrrObJJBoCQwcOEAWLVpo9QRp2jRMeWrpB7lE27EEKI7loPjky5dP1XLhwnnZuXOn8uxDNq2uXbuoa/369Zdy5conoCXeSgIkEBeBuXPnyKRJk+TiRUsICniTdujwnvLYgoE8GAWGRHy6dOmquq89ceHZBw+/AQP6y9SpU6VTp07SvPm7wYiIfSYBEiABEiCBgCXweMD2jB2zIaAfNLUHjM1FHpAACfgdgb59+8j06dPk33//lVatWsu+fftl+PARVo8uv1PYRwplyZJVeYNMmzZdNm3aIlgOf+zYMWnVqqX88MMPPtKKzZJA4BOYMWO69OvXV65duyrly1dQY9SCBQvVGBWsxjWzb1174mKM+v77H9R4DmZgB4YUEiABEiABEiCBwCFAA1vgfJdO9WTFiuVOlWMhEiAB3xE4deqULF78jSDL56xZc6R//wEqaYHvNEocLcOrbfz4CYJ4bn/99ZcMGTIocShOLUkgERKAJ9Y///wjQ4Z8JvPnL1BjFBKnUBwTgPctxnMwAzswpJAACZAACZAACQQOARrYAue7jLUnmTI9pzJZxVqIF0mABPyCAJYUIY5PpUqVVQB/v1AqESnxySefSp48IYlIY6pKAomTAGJANmnSNHEq70OtwYxJWXz4BbBpEiABEiABEvAQARrYPATW36rNmPE5yZgxowpAjExfFBIgAf8nsGnTRvn222/9X1E/07Bfvz5y4kS0n2lFdUgg8Agg2cicObMDr2Me7hGYgR2FBEiABEiABEggsAgEvIFt/fr1gg/FQuDMmTPy22+/BQ2Oc+fOCT4JkStXLqs67t+/n5BqeC8JuEwAXmytW7eUdu3ayMGDB12+P5huAKulS5dKpUoV5auvvgqmrrOvJOBTAv3795OGDRuoLJn8O+n4qwAbZBIFKzCjkAAJkAAJkECgEZgzZ47s378/0LrlUn8C3sC2desWwYciUrHi6x7D8M47bws+/iavvvqy4GOUH37YIRMmjFfefMbzjvZbtmyh6vjll18cFeF5EvAIgTp16kiyZMlUhszatWupDJmRkWs90lZirRQvDRYsmC916rwp3bp1kejoaClcuLCAHYUESMCzBF5//XXJkiWLREXtkubN35HGjRsJxih6yj/iDhZgAjZg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06nBnGwElvAirF+/rsALD9yQ7CBnzlwSGnpWzv4fe2cBbktVNuAFAhcJke5ukJTGQEFaQASRkJKQbgVFQiQEKWlp5SckpLk0Kt0p3YJ0KtLnf97Bb7vO3Jl99j7B3fve93uec2b2zKp5V39rzTf335eafRyhxWjacsYHMlqxhddWoF3meJRXsP3kJ1ulaaedtsuyxeRKQAISkIAEJCABCUhAAhKQgAQGnwBKkJNPPjWhJLv99tsLZRuxoMhaZplvNTao8DVIXoHkWi58fADl18knn1QodlCMLbvssoXSq6xgQxGEIf66L0uimFtppZWLdFx55fAiDYsvvkTab7/9ivOId8MNNypebT3++M8UdsSNu/HGG7+XIgnFHMq8mWaaKbz2OnJvnnnmaVxjQ85++/26UEyhoPrrX/9ShLvVVlsXBvuPOeboxMcVmkmrPAmjWfp4nimnnKqhtMzjLKd7jz1+Xignn332mXTuuX9Kc889TzryyKPSk08+kaaccsr0xhtvNrxXhQsDwiTPB0uwkTe6yxg9PT09A4Hw6quvFgWUoyIBCUgAAtgrWHXVlUcwuikdCUigOwissspnr2IMtvHj7nh6UykBCUhAAhLoXAIzzDBduvTSywfV2H/Y7arafcS9qutVhM4///y00047pM022zzttdfehRN2qCEosvqSduJix1bsuusr3HbuD0a4zXi2k5ZW3MKX+FDcKa0RuOGGG9I+++yTOA62jPI72AYbmOFJQAISkIAEJCABCUhAAhKQgARGFQLNFGjN7uXPj82yc889p7i0xhrfa9xqRbEWjluNC/dDoVwbrHDbeY549v4e4dsO4/7Go7/WCKhga42TriQgAQlIQAISkIAEJCABCUhAAqM9gQ02WL/40AGvhq644opp+PDh6aabbipeNcWeGa+VKhIYHQmoYBsdc91nloAEJCABCUhAAhKQgAQkIAEJ9IMAxv9POunEwucRRxxeHCec8EsJu2XYBlMkMLoSUME2uua8zy2Bz4HA1VdfnV566aXPISajkIAEBpPAyy+/XBjIHcwwDUsCEpCABCQggVGDAPbV+JhgLmOPPVaaeOLPvkSaX/dcAqMTARVso1Nu+6wS+JwJXHfdtYk/RQIS6D4CfIFKkYAEJCABCUhAAlUEpphiiqrLXpPAaE1ABdtonf0+vASGhgB2F+688+6hCdxQ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9ttvVV0e4Rr2xpZYYskRrtddyHeGHX30Z18ELbu98ca/pQcffLB8OWEDji97IieccPwI9/t7YcUVP/swArsC2YlXtq0W8ZKmU089tYgmf46IN65dcMH5tTsR811+4T789/cY4dTFy1dReZVXkcDnSUAF2+dJ27gkIAEJSEACEpCABCQgAQlIoLDjtc8++xQk2N203XbbpLDzleO5664704Yb/ig9/PDDxeVf/GLPEWyA5buq9ttv3/Tmm280guCca3XCVzNnmWXW4nZu4y3c4z8PL67HzqlWbMHlO8bYhVd+Tna1bb/9dgk7a2XBBtxWW21dXOYjC7myKndbl87cTX4eO9T4Mii7CMu21Yh3hRVWKNJ0xRWf7V7Ld7hFWHzF88tfnrgIY//9fx2XG0ee9cgjjyh+/+QnWxX23Ro3B3ASaSHtVfHusstOqe6LpQOIVq8SaEpgrKZ3vSkBCUhAAhKQgAQkIAEJSEACEhgCAksuuVQ6+uhj069//avExwM233yz4muUsbvqiSceL750iQJuqqmmSnvuuVdabbXVKlOC8ub4449L9957b/rqVxdO66+/QcL/bbfdliaYYILiy5js1LrzzjuKexEIX9Wcdtpp0lNPPVns5Hr22WfSbLPNnuaZZ56E8ujPf76wSN/iiy9eXMcf4d566y3FRw+22277CKrp8YADDiq+wvn3v/+913O+8cYbidcveXXyRz/aMB1++GEjhMMzX3jhn9M111ydDjrowPTb3x6S1ltv/Ya7eM4LL7w4TTzxJI3rzU5ih9pDD322aw7FZVlWWmnldNhhh6Zbb701TTPNNGmBBf739dBwu9BCC6VNNtkknXrqKemSSy5Jt99+e6rKv1VX/W7xoYjwN9DjMst8K+24407piCMOL+IdPnx4Ee8kk0yShg+/IvHVVcrWttt+ppwcaHz6l0ArBFSwtUJJNxKQgAQkIAEJSEACEpCABCQw6ARQHi255JLpwAMPSNdcc016+eWX0+mnn9aIh91Ryy23XNpjj58XyrfGjdLJDjvsWHz18ve/PyF9/PHHjTCWW+47ae+992ns/HrsscdKPlM64ojfpbXX/n5iV9pNN91U/B144EGFuwknnCBNMMGEjevheeGFv1qE26pNsSmmmCL98Y//V3x5FIP/+XMuu+xy6eCDD0nxxc7YHRdxcTzqqKMTO9hQInI/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AhKQgAQkIAEJSEACEpCABLqJgAq2bsot0yoBCUhAAhKQgAQkIAEJSEACEpCABCTQcQRUsHVclpggCUhAAhKQgAQkIAEJSEACEpCABCQggW4ioIKtm3LLtEpAAhKQgAQkIAEJSEACEpCABCQgAQl0HAEVbB2XJSZIAhKQgAQkIAEJSEACEpCABCQgAQlIoJsIjDUYiR177LHTDDPMMBhBGYYEJCABCUhAAhKQgAQkIAEJSEACEpCABAadwMcff5ymm266QQ+XAMfo6enpGWjIzz333ECD0L8EJCABCUhAAhKQgAQkIAEJSEACEpCABIaUwLBhw9KUU0456HEMioJt0FNlgBKQgAQkIAEJSEACEpCABCQgAQlIQAIS6BIC2mDrkowymRKQgAQkIAEJSEACEpCABCQgAQlIQAKdSUAFW2fmi6mSgAQkIAEJSEACEpCABCQgAQlIQAIS6BICKti6JKNMpgQkIAEJSEACEpCABCQgAQlIQAISkEBnElDB1pn5YqokIAEJSEACEpCABCQgAQlIQAISkIAEuoSACrYuySiTKQEJSEACEpCABCQgAQlIQAISkIAEJNCZBFSwdWa+mCoJSEACEpCABCQgAQlIQAISkIAEJCCBLiGggq1LMspkSkACEpCABCQgAQlIQAISkIAEJCABCXQmARVsnZkvpkoCEpCABCQgAQlIQAISkIAEJCABCUigSwioYOuSjDKZEpCABCQgAQlIQAISkIAEJCABCUhAAp1JQAVbZ+aLqZKABCQgAQlIQAISkIAEJCABCUhAAhLoEgIq2Loko0ymBCQgAQlIQAISkIAEJCABCUhAAhKQQGcSUMHWmfliqiQgAQlIQAISkIAEJCABCUhAAhKQgAS6hIAKti7JKJMpAQlIQAISkIAEJCABCUhAAhKQgAQk0JkEVLB1Zr6YKglIQAISkIAEJCABCUhAAhKQgAQkIIEuITBWl6TTZEpAAhJoi8B7772X7rvvvnT33Xenv/zlL2mCCSZIp5xySlthfPDBB+n+++9Pd955Z7r88svTMsssk3bZZZe2whgdHH/88cfpwQcfTHfccUfBaemll0677rrr6PDoPmMfBD788MN07LHHphNOOCG9+eabac0110yHH354GjZsWB8+R8/b7777brrnnnvSXXfdlYYPH56WX35525zRsyh0xVO//fbbRVm99dZb0wUXXJDOPvvsNNtss3VF2kf3RL7zzjtFW8MY6frrr0/zzTdf2n///Ud3LD7/SCLQ09OTHn300aI9oTy+9dZb6bzzzhtJqTFaCQyMgAq2gfHTdxcRYCD48MMPp/fffz+NO+64aZ555klf+tKXuugJTGqrBNZdd9107rnnpk8++aThZY899mic93Xy6aefpiWWWCLde++96aOPPmo4X3vttRvnnnxG4Hvf+16hCKBehXz/+9+PU4+jMQGU0ihaJ5100vTcc88llN7HHXdcQgG7/vrrj8ZkRnz0p556Kq288srp8ccfT7Q/IRtttFGcepRAxxB47LHH0ne/+92ivDIxRsYaa6w07bTTdkwaTUg9ga997Wvp5ptvTpF3uFxppZXqPXhHAkNIYKeddioWwFH6hjhGCBIeu5HAGD156zpIT3DmmWemk08+uV+hfetb30p77rnnCH5vuOGG9M9//jMxcVYGRoAdBSgNxh9//IEF1IZvdi5MPPHEbfgYHKfPP/98OvLIIwsFwN///vc0zjjjpLHHHjv961//SmOMMUaad95502abbZZ+/OMfFzucBidWQ/k8CFCmLr744rTYYoulueeeu1eUb7zxRmL32dZbb50uvPDC4t5ll11WTGB7Oaz5wQSXlTSURpQPVngRFLRzzTVXja/R8zL1CsUJigDOESZfs88+e7+B3HjjjenZZ59N6623XlFP+x2QHkcagT/96U9FmbjqqqvS17/+9fTiiy8W+UnZYHfW1FNPPdLS1okR/+c//0nPPPNM0TevtdZaheKCdHJtxhln7MQkm6bRmMC///3v9MQTT6Qnn3wy/eAHPygWsxZeeOGibo/GWLrm0V999dWirWFH8W233Vak+4EHHkhf+cpX+vUM1113XSLMddZZp1/+9TR6E6CfY152zDHHpOOPP76Awdxt++23H73B+PRdS2BIdrAx4UXYKn7JJZc04LDa9Y1vfKPxG90eyp6//e1v6eqrry5Wbeeff/7G/Ti58sori4kxk162jG611VZxy2OLBBgMoaSEJfnCq1xDqWAjb3k9j8kVrw2ssMIKad99920xtQN3xioIOydOO+20IjAULSeddFJafPHFiwk7Csazzjor7bXXXmnHHXcslHB//OMfi50VA4/dEIaaADvT2E127bXXpqmmmqqYhOavnE0yySRFEqaZZpriOOaYY7aV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/KZvZW5Je0R/UdfWs0jGB+twGwtmhEt9Z65Mv5i3A1VxUlbPPvvsov0jbxhfECflKnaplf3FeJsds7Q7igS6msBQveCKfaSxxhqreJd6zjnnrI3mo48+6vnhD39YaePhH//4R8/3v//9Igzaxj/+8Y+14WBjaaqppupZZJFFevbcc8+e5ZdfvuFv7rnn7llwwQV7xh9//J4JJ5yw57rrrivCefnll3vWX3/9hrtmtsnwTxpWWmmlEdKAvbGDDjqoZ5xxxincYIMHwf7Vqquu2gj/S1/6UqWNivvvv7/nW9/6Vs90003X8/Wvf71II3Fh+2L48OEjxNfuBexiEDdhfu1rX2vXe7/c77jjjo3nfvTRR/sVRquerr322kZcPOOzzz7bqtde7vbdd99GOIsuumive/zABtfUU09duMHWW1mOO+64HuyQkAb+5p133rKTEX7/6U9/6pl99tl7vvKVr/QsueSSPWOMMUbhl7L8z3/+cwT3zS58+OGHPWeddVaj3o077rg92CFZYokliroR6eL4ox/9qIdyWyeUmVNPPbVn+umn7/nqV7/as9566/XMNttsjWfDZs/7779f572H54JR1Ani5NmOPvroEfwQ169//eueCSaYoLD5Eun84he/2POXv/xlBPf/93//13ge0lcl2IwJlkceeWTDyb333ls8T8TBEXt92O8ry7/+9a+iDuKG+t1MnnjiiR5sTlE+qMOTTDJJwYo0nHnmmc289nkPO0zrrrtuwYdyMuuss/biRJtXFpj+7ne/64Eh6V9ttdUKJ1ynvY3np4z8+9//LnvveeWVV3poDyeeeOJG2xF+jjrqqF7uc045axzdeuutI/AmXVWC3bV11lmnkbYTTzyxl7NTTjmlcS/SUj5SB6vkmGOOKdpXyjJ/4W+uueZqatvzmmuuKfKT9hN7ROFv8skn73nzzTeLqK688spGOYn75eMee+zRSBa25XbfffdGeMstt1zjXvlk4403LuKkXFXJueee2yhreXtDfHkaHnvssRG8075QFqaYYoriGWlzws8hhxwygvu6C3vvvXfDX/gvHzfbbLNe3ukbyRPaCNo92pcZZpihEQ79bJX9SMYLxBdjC+xiIR988EHRh0a8PEt/BXul1GXGCvPPP3/PTDPN1Ct/f/CDH/Q36Ia/G2+8sRjbUL8WW2yxnnnmmafRXsUztGLL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n+4Hw8GPfvSjRjA33HBD47zVk5///Ofp7bffLpyvu+66Rfkp+73xxhtRRheXN9lkk/Lt4neUJ3587WtfG8FNnvczzTRTGnPMwat+n376abrjjjuKOOvK6v3335/4Q7bffvte6Yvyy8VmZfIvf/lLw98222zTOC+fTD755OnKK69M66+/fnGLOnXssceWnTV+f+UrX0m33XZb+upXv1pce/7554v63HDw35OIn7I14YQTlm8XeRRlMOruCI5SKtqFjz/+uCija665Zi8n5HMzlk8//XSCN8JzVqWjV4At/njwwQfTv//978I1PMpy7bXXpt122y1997vfLW7NPPPM6ctf/nLZWfH7hRdeSC+++GJx3leb9PjjjzfK9njjjVcZXtVFON1+++3FrW984xuNtrjs9qabbiou0f7Usbrzzjsbz17X3hMIZQRZbLHFimPVv7yezTLLLFVOKq899thjjevtcMBTpGveeedN448/fiOcqpMow5T1cl2jTj311FNp7bXXLrzOPvvsaaKJJqoKJlF+77777uJeX3n8xhtvpLfeeqtwS5mZeOKJK8Ps78WHHnqo4TXqcONCSo3+kWvlZ87dBRv69a233jq/VZzfd9996cMPPyzO+3rmETyXLkSecbmqvp1++unpD3/4Q1p66aULnwsttFAphL5/PvPMM+nVV18tHFI2quQnP/lJeuWVVxL9L1IVT19pPeqoo4r2NvrcqjAi7ghrmmmmSdNNN11c7nUMN1ysYrP77runl156Kc0wwwyFv4i3VyBt/lhwwQWLdjfGKdTjiy66qDaUvG6/+eabRZu80047pU033TTV9YER2CSTTJIuu+yytPHGGxeXPvroowTDskT7Rls72WSTlW8Xv/P2ZsYZZ0xf+MIXKt3VXYxxw7TTTpu+/e1vVzq7+eabi+uMG5Zccsmmbrjf37FFPC8RNGtjGZ/HeIjxdpVQpp944oniVtV4qK8yRv374x//2FL9i7C+9KUvFeP2qvT0de3RRx9tOGmn/Y+x07Bhw2r7QMYLkc8rr7xyIh/LEvcZt9TNm6IcUL+Zn1RJuKlijnvqSpTZqGtV4RxyyCHF5dVWW62yPtGv0wchzfrseC7airryHW5ok/J6HemK9FK3qGP9kXHGGScdc8wx6dBDD214P+ywwxrn7Z701YZEmgl3yimn7HNcUBf/pJNOWtyK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Pk/5//nPfxLLvfbaa+6GG25wvXr1cj/72c/cgQMHEuXIhAAEIAABCEAAAhCAAAQgAAEIQAACZUZAQQ7KKr355pvBoEGDgry8vKBWrVoKpuD/atSoESxfvjyx2bfeeivo379/UL9+/WDgwIHBFVdcEVSrVs2Xq169erB48eLEcrt27QoGDx4ctnHvvfdmyK1atSpo2bJluL9KlSrBzp07M2ReffXVoH379qGM+rt27doMGdvYsGFDcNlll4WyX/3qV4MLL7wwOO+884KqVauG+Q0bNgzWrVtnxRKXmzdvDgYMGBDUq1cvccyLFi1KLPfJJ58EQ4cODdu65557MuS2bt0a9O3bN9yv8UyfPj1DJr6xe/fuYNiwYYH63aVLl+C0004Ly//0pz+NiwcvvfRS0KpVq1BGxyGann766UBs7NiffPLJwaFDh6IiwZw5c8L9Jhdf3nfffRllduzYEfTs2TPQOaFjafJt2rQJDh8+nCHLBgQgAAEIQAACEIAABCAAAQhAAAIQKEsCZWbBpmmT7dq1c+eff77bs2eP+/jjj93kyZPdSSed5A4fPuz27dtXQGko31vnnXeet2aSRdjjjz/uFixY4P7xj3+46tWrO1mgffvb33ayroomWcipnPnu0r4qVaqEIk8++aTr1q2b69ixo7vkkkt8vqyxPvroo1BGZb/xjW+4c88911188cVh/qeffhqua+Wdd97xFl35+flu2bJlfp8s4t577z330ksvees8WVvJ6k5JfdX+tPTcc8+5Nm3auO3bt3v/YzZm1S0LLo1Z1nTxMasfbdu2dX/605/CqsXIkqwEL7jgAs9eloOWxD4tyRpMde7YscNH7xT3devW+f6pzP333++t0az8I4884jp37uzeffddy/LH1zYmTZrk+3755Ze7008/3WeLZ9WqmafdOeec42R5qHPG0tixY92qVavc66+/7nQuyALSksZ+0UUXOZWT9Zys8mTFprR+/fqM42plWEIAAhCAAAQgAAEIQAACEIAABCAAgTIjUBbauylTpniLovvvv79A9Y8++mhw1113FcifN29eIMu2M888M/joo48K7L/++utDK6WoFdaePXu8ldVvfvObYM2aNaGMWbo9/PDDQZMmTYLnn3/e16lts3bavn27z1N9jRs3DhYsWOC3VZfJbNy4MaMv3/rWtwJZx8n6rWbNml7u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CXn//fclbceOHXvyySdDQ0OV+25LSkpSUlLi4uLc3Nw6duy4b98+kMVjA6XYvf/++3FWevv27R06dIiNjQWR48ePJyQkNGzYcN26dZIDnPNz5869/PLL7du3x7qGMfbvf/8bOG/cuBEbGyvZYozVr18fT++wErGnT59++umnAwMDxSgqLy9//fXXo6Ki3N3dpZl3dO+HH36AzQDu7u5ms3nTpk2nTp3atWvXggULZsyYgWxK4tSpU0899VRAQMBvv/2GT/Pz85966ik/P7+IiAjobeKjjz/+uF+/fvXr19+4cSMmSoTxgN+8efODDz4oXpDasWNHSZvdmEh6xJ/79++fMmVKVFQUjlubTKarV6+KPEVFRa+99lpUVNTbb78tpn/++eddunRxc3NbuHChmC7RP/7447hx46QdcZMmTZLYtH7CKRQRERG9evVq0qQJYywgICA+Pt7Kgt7r168vWLAgISHBw8MjODj4jTfeEJXbVGVdunTphRdeaNmypclkatKkibIkcs6tm+Oc//TTTyNGjAgLC8OCxjm/dOnS1KlT/f39Q0JC8vLy0MPx48crSw1jbMmSJchz7Nix6dOnBwYG/vTTT5jIOYdZPsaY1iod3YDUqj0453l5eU8//fS0adOUdY7oA9J//vnnfffd5+PjA8vLi4qKxo4d6+XlNWXKFOQBoqqq6v333x80aJC/v7+3t/djjz1248YNiSczM3PYsGH+/v4NGzacPXu2tFYtMzMTQOvTp4/ZbPb09HR3d2/ZsuWUKVOk5e6o1mKxfPPNN8OHDw8NDXVzc4uOjl68eDG05JAHiA0bNsTHxz/44INi+q+//nr//fd7eHj069dPTEd6/fr1iYmJHh4eYWFhH330EaaLhO7rEJk550ZiY+fOnSNHjgwICJCOvy8sLFy8eHF4ePh7772HaquqqpYsWRIZGancQJ+ZmTlq1ChfX1/VQ61Ag27kc86N4ADajh071rRpU9Xg/+yzz9BnzvmRI0emTJkCpbJp06aPP/64VGVxzq9du/b00083bNgwPT0dZF999dWAgICEhASpJhc1S7T1b5zErPyZk5MzadKkiIiIevXq3XfffVeuXFHy6H5JUWT9+vWdOnUaNWoUpnDOt27d2rlzZ3d3d6mWO3fu3NSpU5s1axYTEyNWOyBrU3mpfq0iOizRly5dWrRoUfv27evX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HOns7Ozn5zdy5MjPP//cMFKn02VnZ3fq1KlDhw7BwcGzZs1qch0IT09Pd3f3/Px8wwyqnm3btnl5eckKWbWXN/Py8ry9vV977TXDL2FFRcWYMWPc3Nw8PT2fffbZjz76yPDalzFzvn79er9+/Tw9PYuLi5ucAzohAAEIQAACEIAABH7lApomV0qQVxiUjRs3blhbW/P/41f236v2qVOneB3zU6dOyWW171Vy5GkvgQsXLgQEBLTX0XFcCEAAAhCAAAQgAAEI3HMBC+Mzuru7Gx/chsjDhw/zGgYhISFtGI4hD6cAKqiH83PBrCAAAQhAAAIQgAAE2izQutX52nwYYwbyQzvh4eHm5ubGxCMGAhCAAAQgAAEIQAACEIDAgxd4iIoovhLVs2fPB6+AI0IAAhCAAAQgAAEIQAACEDBS4GEpourq6vjtSWFhYUZOHWEQgAAEIAABCEAAAhCAAAQevMDDUkTt37+/oaGBiDw8PB68Ao4IAQhAAAIQgAAEIAABCEDASIFWLCxhZMY2hPF7UXngqlWrHBwcIiIi5MuU2pAQQyAAAQhAAAIQgAAEIAABCNwngVYscX6fZjB06FB+l5Qy/8yZMxcvXqzsQRsCEIAABCAAAQhAAAIQgMDDIND+RZRWqzWEsLCwwBp9hizogQAEIAABCEAAAhCAAATaXaD9i6h2J8AEIAABCEAAAhCAAAQgAAEIGC/wsCwsYfyMEQkBCEAAAhCAAAQgAAEIQKAdBVBEtSM+Dg0BCEAAAhCAAAQgAAEImJ4AiijT+8wwYwhAAAIQgAAEIAABCECgHQVQRLUjPg4NAQhAAAIQgAAEIAABCJieAIoo0/vMMGMIQAACEIAABCAAAQhAoB0FUES1Iz4ODQEIQAACEIAABCAAAQiYngCKKNP7zDBjCEAAAhCAAAQgAAEIQKAdBVBEtSM+Dg0BCEAAAhCAAAQgAAEImJ4AiijT+8wwYwhAAAIQgAAEIAABCECgHQVQRLUjPg4NAQhAAAIQgAAEIAABCJieAIoo0/vMMGMIQAACEIAABCAAAQhAoB0F/g9M1rXn5pKVhQAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAABIgAAANZCAYAAABk6QXHAAAgAElEQVR4Aey9h7slVZX+//0/5ucYwYCijggYUMBEECUqEgwj4IjQKCoYkGAa0BkDBkaCIKCCBCPNKEI3AtKNqHSDoRtFJDkIKMKAMIb6PW9d3+p1991hVd1zq+qe8+7nOU+dU7XDWp/97lD77FPn/1UKIiACIiACIiACIiACIiACIiACIiACIiACM03g/82093JeBERABERABERABERABERABERABERABESg0gKRRCACIiACIiACIiACIiACIiACIiACIiACM05AC0QzLgC5LwIiIAIiIAIiIAIiIAIiIAIiIAIiIAJaIJIGREAEREAEREAEREAEREAEREAEREAERGDGCWiBaMYFIPdFQAREQAREQAREQAREQAREQAREQAREQAtE0oAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIzDgBLRDNuADkvgiIgAiIgAiIgAiIgAiIgAiIgAiIgAhogUgaEAEREAEREAEREAEREAEREAEREAEREIEZJ6AFohkXgNwXAREQAREQAREQAREQAREQAREQAREQAS0QSQMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMOMEtEA04wKQ+yIgAiIgAiIgAiIgAiIgAiIgAiIgAiKgBSJpQAREQAREQAREQAREQAREQAREQAREQARmnIAWiGZcAHJfBERABERABERABERABERABERABERABLRAJA2IgAiIgAiIgAiIgAiIgAiIgAiIgAiIwIwT0ALRjAtA7ouACIiACIiACIiACIiACIiACIiACIiAFoikAREQAREQAREQAREQAREQAREQAREQARGYcQJaIJpxAch9ERABERABERABERABERABERABERABEZjJBaJzzz23wmvlypVSwDIgcN9999b1hTpbu3bNMrBYJoqACIiACIiACIiACIiACIiACIjA8iIw6ALRHXfcXq1bt646/fTTqqOPPqp+rV69qj6Ha0sVHvOYf6rw2mWXnZaqCOU7QQLQCOsMOlEQAREQAREQAREQAREQAREQAREQARGYLIFBFoiwC+SAA/avnvnMZzQ3/lwA4BHXVqw4fLLe/iM3lqEFoiXBO/FMtUA0caTKUAREQAREQAREQAREQAREQAREQATmEeh1gWj9+nXVXnvtuWBRaLPNnlTv5sGCDd5zAWf//febZ+ykPjB/LRBNiujS5qMFoqXlq9xFQAREQAREQAREQAREQAREQAREoLcFoo0bN87bMbTDDi+uTjzx36t1626oNm7c0NQE3uMcrq1Zc21zfpJvtEA0SZpLn5cWiJaesUoQAREQAREQAREQAREQAREQARGYbQK9LBBh55D9Odlxxx1b3XvvvYOR1wLRYOg7FawFok7YlEgEREAEREAEREAEREAEREAEREAE3AR6WSDae+9NPyvDzqChgxaIhq6BduVrgagdL8UWAREQAREQAREQAREQAREQAREQgbYElnyB6OSTPz3vmUJ///vf29qYjM9/QcMCAl74GZsnDLlABBtL9j788ENNHMTtutsq5ONh00cc+s9jyT/EY531+S9mIT+vvsDQ1jPsR50qiIAIiIAIiIAIiIAIiIAIiIAIiMBYCSz5AhEeBM2b+2uvncwzhdauXVsdeOAB8362hjI23/xJ1a677lJdeunKLG/aE3tI9cqVK+s8kA/e5wLi4HXEESsWRLP54OLNN2+s3v72FbWNLB/24pwNiLfjjts3zBB32223WRDPpvnMZ06eZ8d9990X5QNmYNcmYKEj52eYF20J+dF/nKf/PJb8Ky0Q2TJRTirgGn1BmlQAvxNOOD6qL9SXpwzULf3DEXWaKvPLX/5y63pJ2a7zIiACIiACIiACIiACIiACIiACItCFwJIuEOHZQ7xJxjOIJhGw8MI8ccTDrrHQs802W887/7GPnZQsjuljC0TnnntOkw/e54I3n/AZTEzH4w47bF/vMDn99NOasnnNHlesODxqDnbVIB78WbNmTYX8bLrwfWnhKyxkr732aPKDL6mAHTd81hSOdrcYbKMdeM+X/dc6cgjzLy0Q0X/kj7ipUMoH6cCG/Oy/61n74VuMQ1jP9JFMYv/KhzolF+y2UxABERABERABERABERABERABERCBIQgs6QLRxRdf1Nz8TuKnQZdeemmzA2f77V9cXXDBBdVDD839dAc/U7riisurLbd8elNmascGb8hxAx+GpVgg4jOY8PylG274af2C7bQDRyxoYSGBfjEe0jAedqWAQRi4QLLttltXu+yycx3flgUue+65e5MP4mGXjDecdtqpTdrcwluuvj/96U/V/0wHv2zYsGFD7TN9jOVfWtih/8hjMQtEYAI2yAf1ANtssPpCXYWBC0HQ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QAREQAREQAREQASWkkCvC0RwBLs9rr32h/W/O+288ysq7OqwN93bb/+iCucPP/ywBTfUBMH0iGvTIh0eNrxhwwZGjR4Rj2VEI1RVnQdssPbhPc4xfzyHKJXPJZdcUl/DdbxPBW88lEu7w7xoB67bHSphPFxjHkizmADOzCtc+IjlC2bwwe7QQXrk87e//a3Wxab85vPy2g1dYCeRXYyCRvBPYvfee09tFjnm/Efcc845u/bP1j9sh40oA9dtoH+4bjWJ8hEftoUBbeFTn/pkHR82eziGeeizCIiACIiACIiACIiACIiACIiACEyCQO8LRKHR+Cvwn/70J80Lu1O8AXFtWm+6NvGsfXivsDgCv/zlL5s6W1xO6dS33XZbU0YbPcVytPUP2z3BatJTPuLDZgUREAEREAEREAEREAEREAEREAERGIrA4AtEQzmuckVABERABERABERABERABERABERABERABOYIaIFIShABERABERABERABERABERABERABERCBGSegBaIZF4DcFwEREAEREAEREAEREAEREAEREAEREAEtEEkDIiACIiACIiACIiACIiACIiACIiACIjDjBLRANOMCkPsiIAIiIAIiIAIiIAIiIAIiIAIiIAIioAUiaUAEREAEREAEREAEREAEREAEREAEREAEZpyAFohmXAByXwREQAREQAREQAREQAREQAREQAREQAS0QCQNiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMCME9AC0YwLQO6LgAiIgAiIgAiIgAiIgAiIgAiIgAiIgBaIpAEREAEREAEREAEREAEREAEREAEREAERmHECWiCacQHIfREQAREQAREQAREQAREQAREQAREQARHQApE0IAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIzTkALRDMuALkvAiIgAiIgAiIgAiIgAiIgAiIgAiIgAlogkgZEQAREQAREQAREQAREQAREQAREQAREYMYJaIFoxgUg95cXgV/+4hfVF884Y1m8YGsuTIsf11x99bKoj29+4xu56qiWix/QzT333JP0BdeWi7ZyfsBB1Nly8AXayYXl4gdY58Jy6n9zfuDactAVbJyWcWRa+t+SH9PS/y4nP6al/y35MS3973LyY1r635Ify2X+W+p/S+N+m+taIGpDS3FFYGACv/jFL6ozTj+92rhxY3X33XeP8gXb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6m9oX0r6px/weczBo39POxraR4/+Pfob2g/qJmcH/CjpL5e+j2v0o6T/sfsBVh79e/TXB/dcGX3rXwtEudrQNREYGQEOLF8+99zqq1/5yihfsA2DhmdgGbMf4HvmF79Y9AMDy5fOOmuUdUGNnHP22cUbdPiBemOaMR7hR2lCwonNGO23NpX8QNeDiQ18tunG9h7ah3ZyAX6gLY3NdmsP/ECd5AL6tLH7wf435weuwddp6H/hx9j7X2gGbSAXpmUcmZb+l36Mvf+F/j3979j98Iwj09L/ah7f773LLM3jc2NM22taIGpLTPFFYEACDzzwQHXrrbcuixdszYVp8ePee+9dFvVx11135aqjWi5+QDePPPJI0hdcWy7ayvkBB1Fny8EXaCcXlosfYJ0Ly6n/zfmBa8tBV7BxWsaRael/S35MS/+7nPyYlv635Me09L/LyY9p6X9LfiyX+W+p/y2N+22ua4GoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoimsVLkkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAm0IaIGoDS3FFQEREAEREAEREAEREAEREAEREAEREIEpJKAFoims1Em4dOWVqyeRjfIQAREQAREQAREQAREQ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HUVABERABERABERABERABERABNoQ0AJRG1o9xz3//POqI45YUb9uu+22nktXccuRwDXXXN1oBu8VREAEREAEREAEREAEREAEREAERMBDQAtEHkqKIwIiIAIiIAIiIAIiIAIiIAIiIAIiIAJTTEALRFNcuXJNBERABERABERABERABERABERABERABDwEtEDkoaQ4IiACIiACIiACIiACIiACIiACIiACIjDFBLRANMWVK9dEQAREQAREQAREQAREQAREQAREQAREwENAC0QeSoojAiIgAiIgAiIgAiIgAiIgAiIgAiIgAlNMQAtEU1y5ck0EREAEREAEREAEREAEREAEREAEREAEPAS0QOShpDgiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMMUEtEA0xZUr10RABERABERABERABERABERABERABETAQ0ALRB5KiiMCIiACIiACIiACIiACIiACIiACIiACU0xAC0RTXLlyTQREQAREQAREQAREQAREQAREQAREQAQ8BLRA5KGkOCIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwxQS0QDTFlSvXREAEREAEREAEREAEREAEREAEREAERMBDQAtEHkqKIwIiIAIiIAIiIAIiIAIiIAIiIAIiIAJTTEALRFNcuXJt+gjceuut1be+9a1l8YKtuTAtfqxbt25Z1MeVV16Zq45qufgB3fzxj39M+oJry0VbOT/gIOpsOfgC7eTCcvEDrHNhOfW/OT9wbTnoCjZOyzgyLf1vyY9p6X+Xkx/T0v+W/JiW/nc5+TEt/W/Jj+Uy/y31v6Vxv811LRC1oaW4IjAwgV/84hfVGaefXl133XXVz3/2s1G+YBtshK25MHY/wPe8r3616MfVV11Vffvb3x5lXVAjq664ovrG17+eq44KfqBOmGaMR/gBG++5556kL7g2dj/AtuQHHESdwecx1gVtgvahnVyAH2hLTDPGI/xAneQC+rSx+8H+N+cHrsHXMY8j0Iin/4UfY+9/4Yen/x27H55xZFr6X/ox9v4X+vf0v2P3wzOOTEv/Cz/G3v9yHIGtuTB2P7zjyLTM43N11faaFojaElN8ERiQAAeW3A3ygObVRXNi5RlYxuwHnMGkvuQHBpbSBG3oOoEPnhsUDPZjDh79U39j9gO2gXVJ/x79De2nR//wo6S/MfhR0r+nHQ3th1f/Hv0N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YgMiKgKKIjZU7GCMUZOoyf6ue1/v5TnzzuzOnvbuec8917XX7tmdeeaZz8w8MzszZzZE4MUXXywsjyif55xzduHX20Jx6L4IiIAIiIAIiIAIiIAIiIAIiMBSAhogWsqiq69++umn5NlnpyY33nhDMnTo4JoDnz3Hs3/9619dzUiJby+BRYs+TsvjQQcdUFMeR40amd7HF9P++9//tlcpxSYCIiACIiACIiACIiACIiAC/ZSABoj6acYqWSIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQS0ADRLGk5E8EREAEREAEREAEREAEREAEREAEREAE+ikBDRD104xVskRABERABERABERABERABERABERABEQgloAGiGJJyZ8IiIAIiIAIiIAIiIAIiIAIiIAIiIAI9FMCGiDqpxmrZImACIiACIiACIiACIiACIiACIiACIhALAENEMWSkj8REAEREAEREAEREAEREAEREAEREAER6KcENEDUTzNWyRIBERABERABERABERABERABERABERCBWAIaIIolJX8iIAIiIAIiIAIiIAIiIAIiIAIiIAIi0E8JaICon2askiUCIiACIiACIiACIiACIiACIiACIiACsQQ0QBRLSv5EQAREQAREQAREQAREQAREQAREQAREoJ8S0ABRP81YJUsEREAEREAEREAEREAEREAEREAEREAEYglogCiWlPyJgAiIgAiIgAiIgAiIgAiIgAiIgAiIQD8loAGifpqxSpYIiIAIiIAIiIAIiIAIiIAIiIAIiIAIxBLQAFEsKfkTAREQAREQAREQAREQAREQAREQAREQgX5KQANE/TRjlSwREAEREAEREAEREAEREAEREAEREAERiCWgAaIcUosWLUpOO+3U9MB1tzuymDnzpW5HofSLQNcR+PTTT5M333wz+frrr7su7UqwCIhAcwj88MMPsiPNQSkpIiACIiACItASAhogysE6Z86cZJll/i89cN3tjizuvPOOjkAxYcK9CY533323lL6vvPJyGu6pp54sFa6qnr/+ekmaHrDAtZwI1ENgrbXWSAYN2jT58ssvg8FRZ1DOUIfkREAERMAl8NFHHyWrr75ast1226g9cuHotwiIgAiIgAhUgIAGiHIyoWoDRJh5wyx+X7mqDxCBz8MPP5QMG7ZF8qtfLZ8N7i2//LLpvSeffCIX3a233pKsu+7ayXLLLZOGXXbZ/5fKufTSSxLI7jT3xhtvJKNH75qssMJyGQtc4x6eNcu53LfffttmiZacihA49tijk5VW+nUyefKkXhoh/1FHUOdQZ2AnUIdQl1Cn5JpHAKu3aKfA+9RTxzdPuCQ1lcD777/fVHn9SRjaadiJSy65uD8lS2kRAREQAREQgX5BQANEOdlYpQGiY489Jtlyy82Tk046MUfj1j6q+gAR+FBHrHQAsx133D6795vfrJQ88UTvQaIlS5Yk++23T+YP4XDst9++2b1DDhnXWrhNlv7nP1+dYMUHeIAB0zRgwGrpPTwru7LKpyIG3Sx3xLf11sN9XnWvQwm8++47CerO4Ycf2isFKEPMf5QtljNb71AW5RoncM01f0423njDzCahrvVle9B4ivqnBJT3HXbYTnawIHvRRqMMN6MdKohKj0VABERABERABEoQ0ABRDqwqDRDhpbuvXwgQP46q/sXs/PPPS/bff7/kzTfnJT///HOas//973+Tzz//PNlqq2Gp7ljh4LqbbroxfTZw4HqpXz7/3//+l66MYLo7Ze8l7Je1xhqrp2nC333AgO6tt95MVl991fTZUUcdydt1nd95Z0Gy8sorpitLDj30kGSnnXZM5WqAqC6clQ00btzBab5Onjy5l44oQ6gfyPuffvope44yh7qIZyiL2sMtQ1PXxaOPPpKyRN3FXnCwVWCrAaK6cLY0EPIEeSM7mI/5/vvvSzk12g7lx6KnIiACIiACIiACZQlogCiHmAaIauGg04ujqgNE3333XYLD56ZPn57qDv0ff/yxGi9caXP55ZfV3OePsWP3T8PuvfeevFXp8x//+IdU30GDNvPymDJlSvocq0KwOqQRd/jhh6UbjkKGXowaIVndsKz3roZcWYTnKFOuQ11EGcRzlEm5xgjsv/++ycKFC1MhVZgwaCw1/Te07GBc3n788UcJVh1usMHABKt45URABERABERABKpBoOUDRFdffVVy6qmnZDPI7733Xvob93jgns9h1hl+IAPujTdeT3/vttuumTyGw94Mt9xyc/acsl944QV6CZ7hB/7xNyIcuEZceQNETNfEiQ965WK1CXXwevjlpo8H44cXxsMVIZtvPiSTC3/NmJn/9NNP0r0AqC/OYOl+rYgviu4AEfYgwV4CCHfxxX/MS26fPvPpf9ddd6UvsHhmV9pY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6dTfTH8Me5vGZueDld3odT268UWpLIdGdVX4ahPAyzRWXAwZMqjX3jH11p1WpJhlvtl2rKxcMgnpwQHpqqycKJu+ZuWd5eSzOe3ixPT7dLBptfra+3nXlJ3np1nPGBfOzXRl5cZwwuAf2hsMnhVxb2ZaJEsEREAEREAERKCYQJ8MEBWrJR+xBN55Z0Fy1113lT7sMv7YuOSv/xJ49NGePZUOPHBs/02kUlY3Aczy44UOs/5yjRHQyok4fuIUx6kTffFrbfWuoOvENEtnERABERABEegUAhog6pScCuiJvY7wd6KyB74AJycCJICvyaAMqVyQiM6WAGb5jzzy8LSM2Pu6Lk/gyCOPSDlq5UQ+O3HK59OpT5csWZxgI24MOqsOdGouSm8REAEREIH+TEADRP05d5U2ERABERABERABERABERABERABERABEYgg0PIBIs46Y4WCnAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQPUItHyAqHpJlkYiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAKWgAaILA1di4AIiIAIiIAIiIAIiIAIiIAIiIAIiEAXEtAAURdmupIsAiIgAiIgAiIgAiIgAiIgAiIgAiIgApaABogsDV2LgAiIgAiIgAiIgAiIgAiIgAiIgAiIQBcS0ABRF2a6kiwCIiACIiACIiACIiACIiACIiACIiACloAGiCwNXYuACIiACIiACIiACIiACIiACIiACIhAFxLQAFEXZrqSLAIiIAIiIAIiIAIiIAIiIAIiIAIiIAKWgAaILA1di4AIiIAIiIAIiIAIiIAIiIAIiIAIiEAXEtAAURdmupIsAiIgAiIgAiIgAiIgAiIgAiIgAiIgApaABogsDV2LgAiIgAiIgAiIgAiIgAiIgAiIgAiIQBcS0ABRF2a6kiwCIiACIiACIiACIiACIiACIiACIiACloAGiCwNXYuACIiACIiACIiACIiACIiACIiACIhAFxLQAFEXZrqSLAIiIAIiIAIiIAIiIAIiIAIiIAIiIAKWgAaILA1di4AIiIAIiIAIiIAIiIAIiIAIiIAIiEAXEtAAURdmupIsAiIgAiIgAiIgAiIgAiIgAiIgAiIgApaABogsDef6+++/T157bVZ64LrbHVl89dVX3Y5C6RcBERABERABERABERABERABERCBfkVAA0Q52TlnzpxkmWX+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vPQUyWkkrVi1AR0wm93IyrhGdFDYWgLI7zL5wRdo5KPPtaOc2RUceIm1jvrl1XfWA9o5hGc4PPPZbfs8VH/4VTHIsCtl+EJdZhDcpqmea9o9rMSIdeTiSz9k4O88G2wwMK3DaOOso90IxYd2gfLdFVa8H+JKfoiDjvnhrizi83rPlAudQhxarW+oPaonTXalldvGkmsonSE9GA4cfP0yPkdZCW18jzjJ0ZYHliN3hV9e2hkf8k5OBERABERABESgmEDbBogOPrh27xermt3bhHvv4LntgDz33LM2SHrNr08NGTK418yi9Yy40dmwHUh2NPL0svHj2jqGR+fD52xH0j7HChp2fGbO9O95Y/3zuig++itznjt3bqYLZup++umn3ODU+447bk8uvfSSNGzsyqFcwU1+eOqppyQ8dtttl2yGGauJ3L0q+LnnUD5Ctbxy0GTVWyauqPzYFVF5ShTJyQub98yuaLArPvLC6FlrCSxY8Ha6ggB5HutCdo/h21HO+LdZfMXP/SrhmDG7p3YLAzQ//vij9zjwwANSP/aF0qbLt1KBcvPaE6x+QVsFO2rtDVbL4R5Wazz88MM1K5fIrZlnu4LDrhjJi8O2W770M+yVV/4pTQvSY12M3WD7Yrkz3okxiEwAACAASURBVCFDBnnzCnk4ZUrPwLItp7acoa36+eefrTp1XxeVg3bo26z2CKvY7ApgFwpXSWGvIF9d+fbbb5PBgwel+W37RxyQCfXLKBdlJeRQxnzlge01ZLz55rzgnlVWLvWx5co+17UIiIAIiIAIiEAtgbYNENkOca0KPb98HciijhAbftsx9MmmP/ufdl98bti8+IvC246klRu6b/34rovi84WJuYf/77MjBj5YEfPmm296g9IfX8Dw286EewNV4ObLL7+cbLfdNmk6Bw3atEYj5od733rKKwfWX5WvY8oP89fO2LppipHjhin6/d133yX7779vmj95KzuK5Oh5cwmw3CPPYx3rE8pSyLWynD388EOZPXv33Xd7qcDySx3yzmeddWYWvihdlBvbzll7g1UUtE/QZ8cdt0/30nMHszNlGriATMSNeEIrQ3zii9LPMNaftSMxfJgXkEFn5fF56Nzz9cXFDJoccsi4rCwgzdjfZuHChdnzei6sPr7w9nlIT96vV1/WS8jBdb3uvPN+n/IJreShnjHnBx74a6YG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iECnENAAUafklPQUAREQAREQAREQAREQAREQAREQAREQgRYR0ABRi8BKrAiIgAiIgAiIgAiIgAiIgAiIgAiIgAh0CgENEHVKTklPERABERABERABERABERABERABERABEWgRAQ0QtQisxIqACIiACIiACIiACIiACIiACIiACIhApxDQAFGn5JT0FAEREAEREAEREAEREAEREAEREAEREIEWEdAAUYvASqwIiIAIiIAIiIAIiIAIiIAIiIAIiIAIdAoBDRB1Sk5JTxEQAREQAREQAREQAREQAREQAREQARFoEQENELUIrMSKgAiIgAiIgAiIgAiIgAiIgAiIgAiIQKcQ0ABRTk59+eWXyfXXX5ceuO52RxZvvvlmt6NQ+kWg6wj8+9//Tr777rvkxx9/7Lq0K8EiIAIiIAIiEEsAbSXaTDkREAER6EQCGiDKybU5c+Ykyyzzf+mB6253ZHHnnXdUHsXnn3+eTJ8+PT0qr6wUjCLw3nvvpvnZyrqochPOik022ThZZ521kg8+eD/sSU9EoMMI/POf/8zaClzLtYaAOLeGq6RWkwDaSrSZ6FPIiYAIiECnEdAAUU6OVW2A6Oeff+7TGYmqDxB9+uknyXXXXZsMGrRpstZaa2SDe/g9duz+SczAwvfff59ccMH5qQyEmz9/fk4JqfYj6J93PPTQQ01PAFaXMM4DDzygYfnIM+bHKqv8Ns3TX/96hTSOE044PkGeN+qaUW4a1aHq4S+66MJkueWWSW6//bZeql588R+zPGfe23MzykGvSHUjeeON1zPuyAO5eAKwU2grdtpph2SDDdbP2gpc496UKVPihclnkIA4B9H0iwfIXxxyvQlgghJt5vjxJyfou8uJgAiIQCcR0ABRTm5VaYDowgsvSPbYY0xy0kkn5mjc2kdVHyACG+j429+unOy666j0wIsq9V5ttVWSDz/80Avps88+Sy677NIEfugf55hBJa/ACty06fBdN3slGGaI99prz4zf1lsPb5gCZED3ddddO8tTXDM9m2yyUcNxNFJuGo68AwSgzqBe7LvvPl5tyY954p6bUQ68EXfxTdgrlH2y7st2oROzAbaP7NhWbL31iOwenr3wwgudmLRK6SzOlcqOpipz2GGHJttss3XS7H5EU5XsY2FoM2FLnnrqyT7WRNGLgAiIQDkCGiDK4VWlASK+KPfliwA7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TH2tXFyznIXS5/pv9Hcr6msZPtS/KF/RVuJvyMsvv2yCv6HKiYAIiEAnEeiTAaJOAlR1XdFBwixR2aNdjXnV+Um/HgIoPz0zXaNbhgQdu1VXXSXd4+Obb5bOtDY7Qu4hEtN5b3bc/VUeN+G9+uqr+msS25YuMERdA1O55hA4+OCDUqaTJy/dk6g5kiXFEhBnS6M512qvmsOxalKeeOIJ2fmqZYr0EQERiCagAaJoVNX0iP9Rr7baqqWPefPav09QNQlKKxDAyyrKUStnuno2yV7VuwdGs3IB+9IgHSeccHyzRErOL3t/7LTTDskGGwwUjwYJ7LXXHmkZ1SB9gyB/CY6Z/C222DzZcccdKrEiqzmpqp4UcW5+nqi9aj7TqkiEnUebKTtflRyRHiIgAmUIaICoDC35FQEREAEREAEREAEREAEREAEREAEREIF+SKDlA0S77bZLsvrqqyZnn31WP8SnJImACIiACIiACIiACIiACIiACIiACIhA5xNo+QBR5yNSCkRABERABERABERABERABERABERABESgfxPQAFH/zl+lTgREQAREQAREQAREQAREQAREQAREQAQKCWiAqBCRPIiACIiACIiACIiACIiACIiACIiACIhA/yagAaL+nb9KnQiIgAiIgAiIgAiIgAiIgAiIgAiIgAgUEtAAUSEieRABERABERABERABERABERABERABERCB/k1AA0T9O3+VOhEQAREQAREQAREQAREQAREQAREQAREoJKABokJE8iACIiACIiACIiACIiACIiACIiACIiAC/ZuABoj6d/4qdSIgAiIgAiIgAiIgAiIgAiIgAiIgAiJQSEADRIWI5EEEREAEREAEREAEREAEREAEREAEREAE+jcBDRD17/xV6kRABERABERABERABERABERABERABESgkIAGiAoRyYMIiIAIiIAIiIAIiIAIiIAIiIAIiIAI9G8CGiDq3/mr1ImACIiACIiACIiACIiACIiACIiACIhAIQENEBUikgcREAEREAEREAEREAEREAEREAEREAER6N8ENEDUv/NXqRMBERABERABERABERABERABERABERCBQgIaICpEJA8iIAIiIAIiIAIiIAIiIAIiIAIiIAIi0L8JaIAoJ39//PHH5Msvv0wPXHe7I4sffvih21Eo/SIgAiIgAiIgAiIgAiIgAiIg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bQOAM1rwj4NlLHTapkRCsHZi43BOP/00d94SzpGRa43AL35xg2trYCpXDwH+cyKsLOS6j4DKp/4ywRxu773HuPF09erV9ScgiSIgAiIgAn1LQAtEPV703Jmj9UfZa+hMpR5HIfVbIMC/5G2nZc9dd81zL8bdaKHDf7HRTmy4EmEXG2eU4HwMudYITJhwqGsHKcuA1lLor9j8V7luscjqL/rFuVX5FDNqJgTH09tvv72Z6IojAiIgAiIgAlECWiCKoukNj//930+y9957r/IHv8eXEwES+PDDD10dame9wFkMqKuos93m2I6go1yYAMsv7KunZQmwvy4bXuHSBNBngSn6MLnuI6DyaU+ZqD9uD1dJFQEREAERyDItEKkWiIAIiIAIiIAIiIAIiIAIiIAIiIAIiECfE2j7AtG6devcv0HpzJs+r2nKvgiIgAiIgAiIgAiIgAiIgAiIgAiIQNcSaPsCUdfmXIqJgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAg4AlogUkUQAREQAREQAREQAREQAREQAREQAREQgT4noAWiPq8Ayr4IiIAIiIAIiIAIiIAIiIAIiIAIiIAIaIFIdUAEREAEREAEREAEREAEREAEREAEREAE+pyAFoj6vAIo+yIgAiIgAiIgAiIgAiIgAiIgAiIgAiKgBSLVAREQAREQAREQAREQAREQAREQAREQARHocwJaIOrzCqDsi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAWiFQHREAEREAEREAEREAEREAEREAEREAERKDPCWiBqM8rgLIvAiIgAiIgAiIgAiIgAiIgAiIgAiIgAlogUh0QAREQAREQAREQAREQAREQAREQAREQgT4noAWiPq8Ayr4IiIAIiIAIiIAIiIAIiIAIiIAIiIAIaIFIdUAEREAEREAEREAEREAEREAEREAEREAE+pyAFoj6vAIo+yIgAiIgAiIgAiIgAiIgAiIgAiIgAiKgBSLVAREQAREQAREQAREQAREQAREQAREQARHocwJaIOrzCqDsi4AIiIAIiIAIiIAIiIAIiIAIiIAIiIAWiBJ1YPXq1dlZZ53pPrjvd0cWTzzxRL+jUP5FoO8I/O1vf8teeGF59u677/Zd3pVhERCBegh89NFH6kfqQSkpIiACIiACItAWAlogSmB95plnss997v+4D+773ZHFr371y35H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AAEIQOB8BCg5nS8nRAQBCEAAAhCAAAQgAAEIQAACEIAABC5OgJLTxRNI+BCAAAQgAAEIQAACEIAABCAAAQhA4HwEKDmdLydEBAEIQAACEIAABCAAAQhAAAIQgAAELk6AktPFE0j4EIAABCAAAQhAAAIQgAAEIAABCEDgfAQoOZ0vJ0QEAQhAAAIQgAAEIAABCEAAAhCAAAQuToCS08UTSPgQgAAEIAABCEAAAhCAAAQgAAEIQOB8BCg5nS8nRAQBCEAAAhCAAAQgAAEIQAACEIAABC5OgJLTxRNI+BCAAAQgAAEIQAACEIAABCAAAQhA4HwEKDmdLydEBAEIQAACEIAABCAAAQhAAAIQgAAELk6AktPFE0j4EIAABCAAAQhAAAIQgAAEIAABCEDgfAQoOZ0vJ0QEAQhAAAIQgAAEIAABCEAAAhCAAAQuToCS08UTSPgQgAAEIAABCEAAAhCAAAQgAAEIQOB8BCg5nS8nRAQBCEAAAhCAAAQgAAEIQAACEIAABC5OgJLTxRNI+BCAAAQgAAEIQAACEIAABCAAAQhA4HwEKDmdLydEBAEIQAACEIAABCAAAQhAAAIQgAAELk6AktPFE0j4EIAABCAAAQhAAAIQgAAEIAABCEDgfAQoOZ0vJ0QEAQhAAAIQgAAEIAABCEAAAhCAAAQuToCS08UTSPgQgAAEIAABCEAAAhCAAAQgAAEIQOB8BCg5nS8nRAQBCEAAAhCAAAQgAAEIQAACEIAABC5OgJLTxRNI+BCAAAQgAAEIQAACEIAABCAAAQhA4HwE/j+b26qw5siNKgAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAABDMAAAMFCAYAAABps72FAAAgAElEQVR4Aeydh7vURNuHv//j++yoKGADERVQUWygYsUGVlDA3rChvopYXnvDgg27goooNkRRAUEUEKVIxwKCHXub77rn+IRsNrtnz252T7L7m+vKyZ5kZjJzTzKZ/Gbmmf9xciIgAiIgAiIgAiIgAiIgAiIgAiIgAiKQIQL/k6G0KqkiIAIiIAIiIAIiIAIiIAIiIAIiIAIi4CRm6CYQAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABERAYobuAREQAREQAREQAREQAREQAREQAREQgUwRkJiRqeJSYkVABERABERABERABERABERABERABCRm6B4QAREQAREQAREQAREQAREQAREQARHIFAGJGZkqLiVWBERABERABERABERABERABERABESgrsWMf/75x7GNGfOMe+aZp93atWv9/yp2ERABERABERABERABERABERABERCB7BLItJixbt06d/nll3mh4u+//84rhYceetBtsMH/5mxnnHGa+/PPP/P86oAIiIAIiIAIiIAIiIAIiIAIiIAIiEA2CGRazJg6dYoXKvbeu6f766+/cohPnz7dbbLJRjlChgkbl1xyUY5f/SMCIiACIiACIiACIiACIiACIiACIpAdApkWM6644nIvVtx00415xLt37+rPIWg8++yzbtasD91ppw3xx7bYoo1bsWJ5XhgdEAEREAEREAEREAEREAEREAEREAERSD+BuhAzJk16I4f07Nmzg1EZjz/+WHCO0Rt9+hzoBY1omMCTfoiACIiACIiACIiACIiACIiACIiACKSaQF2IGRj4NIftjGOPPdoLFj167J43/eSiiy7050aMGG5BtBcBERABERABERABERABERABERABEcgQgUyLGU8++YQXJvbeey+3Zs0ab9hz8uS3/DHsY9x44w15RXHbbbdKzMijogNZJ8Coo6lTp7rbb7/N7bPP3m733bv77dBDD3H33z/Kfffdd1nPotIvAiIgAokQ+PHHH90TTzzujj32mKCupM689dZb3BtvTHS///57ItdRJCIgAiKQdQKLFy92t9xyc05d2b9/P/fUU0+6NWu+ynr2lP46IJBpMeOzzz5z7dtv7cWJdu22cgcd1DSFBCGjQ4d27ssvv8gpIpZpHThwgPf/6KOP5pzTPyKQVQIsOdyv37GBiGeGbsP7jh13cI899piWJs5qISvdIiACFROgDfDKKy+7XXbpUrS+7N27l1u5cmXF12uUCOBqW6PkWfkUgXonsHz5cjd06AVus802KVhfYoNw1KhRals6F9SB1IVytSWQaTEDVHPnfuS22aZ9zoO27bYd3CeffJxH8pdffgn8LVy4IO+8DohA1gjMmjXLmbHbXr32c++8805OFhA6Ro9+2LVr1yT6HXVUX8eSxnIiIAIi0EgE/vjjDzd48CDfBth8883c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5eYWb4MHD/JD8rfaaksvYiBk7LvvPn7ZnSqwVJQiIAIiIAIiIAIiIAIiIAIiIAIiIAI1IJAJMQML4ggRlW49e+4pIaMGN5UuIQIiIAIiIAIiIAIiIAIiIAIiIALVJFDXYgbWdI899hh39tlnOdY/lhMBERABERABERABERABERABERABEcg+gUyIGSwTtHbt2hZvWhM++zeociACIiACIiACIiACIiACIiACIiACUQKZEDOiidb/IiACIiACIiACIiACIiACIiACIiACjUtAYkbjlr1yLgIiIAIiIAIiIAIiIAIiIAIiIAKZJCAxI5PFpkSLgAiIgAiIgAiIgAiIgAiIgAiIQOMSkJjRuGWvnIuACIiACIiACIiACIiACIiACIhAJglIzMhksSnRIiACIiACIiACIiACIiACIiACItC4BCRmNG7ZK+ciIAIiIAIiIAIiIAIiIAIiIAIikEkCEjMyWWxKtAiIgAiIgAiIgAiIgAiIgAiIgAg0LgGJGY1b9sq5CIiACIiACIiACIiACIiACIiACGSSgMSMTBabEi0CIiACIiACIiACIiACIiACIiACjUtAYkbjlr1yLgIiIAIiIAIiIAIiIAIiIAIiIAKZJCAxI5PFpkSLQHECf//9l/vll1+Ke9JZERABERAB99NPP4mCCIiACIhACQRUX5YASV5qSkBiRk1x62IiUBsCZ599lnv99ddrczFdRQREQAQySmDp0qXuwAN7ZzT1SrYIiIAI1I5A//793M0331S7C+pKIlACAYkZJUCSFxHIGoH99ttHYkbWCk3pFQERqDmBuXPnum237VDz6+qCIiACIpA1Altv3daNGDE8a8lWeuucgMSMOi9gZa8xCUjMaMxyV65FQARaRkBiRst4ybcIiEDjEpCY0bhln+acS8xIc+kobSJQJgGJGWWCUzAREIGGIiAxo6GKW5kVARGogIDEjArgKWjVCEjMqBpaRSwCrUdAYkbrsdeVRUAEskNAYkZ2ykopFQERaF0CEjNal7+uHk9AYkY8Fx0VgUwTkJiR6eJT4kVABGpEQGJGjUDrMiIgApknIDEj80VYlxmQmFGXxapMNToBiRmNfgco/yIgAqUQkJhRCiX5EQEREAHnJGboLkgjAYkZaSwVpUkEKiQgMaNCgAouAiLQEAQkZjREMSuTIiACCRCQmJEAREWROAGJGYkjVYQi0PoEJGa0fhkoBSIgAuknIDEj/WWkFIqACKSDgMSMdJSDUpFLQGJGLg/9JwJ1QUBiRl0UozIhAiJQZQISM6oMWNGLgAjUDQGJGXVTlHWVEYkZdVWcyowINBGQmKE7QQREQASaJyAxo3lG8iECIiACEJCYofsgjQQkZqSxVJQmEaiQgMSMCgEquAiIQEMQkJjREMWsTIqACCRAQGJGAhAVReIEJGYkjlQRikDrE5CY0fploBSIgAikn4DEjPSXkVIoAiKQDgISM9JRDkpFLgGJGbk89J8I1AUBiRl1UYzKhAiIQJUJSMyoMmBFLwIiUDcEJGbUTVHWVUYkZtRVcSozItBEQGKG7gQREAERaJ6AxIzmGcmHCIiACEBAYobugzQSkJiRxlJRmkSgQgISMyoEqOAiIAINQUBiRkMUszIpAiKQAAGJGQlAVBSJE5CYkThSRSgCrU9AYkbrl4FSIAIikH4CEjPSX0ZKoQiIQDoISMxIRzkoFbkEJGbk8tB/IlAXBCRm1EUxKhMiIAJVJiAxo8qAFb0IiEDdEJCYUTdFWVcZkZhRV8WpzIhAEwGJGboTREAERKB5AhIzmmckHyIgAiIAAYkZug/SSEBiRhpLRWkSgQoJSMyoEKCCi4AINAQBiRkNUczKpAiIQAIEJGYkAFFRJE5AYkbiSBWhCLQ+AYkZrV8GSoEIiED6CUjMSH8ZKYUiIALpICAxIx3loFTkEpCYkctD/4lAXRCQmFEXxahMiIAIVJmAxIwqA1b0IiACdUNAYkbdFGVdZURiRl0VpzIjAk0EJGboThABERCB5glIzGiekXyIgAiIAAQkZug+SCMBiRlpLBWlSQQqJCAxo0KACi4CItAQBCRmNEQxK5MiIAIJEJCYkQBERZE4AYkZiSNVhCLQ+gQkZrR+GSgFIiAC6ScgMSP9ZaQUioAIpIOAxIx0lINSkUtAYkYuD/0nAnVBQGJGXRSjMiECIlBlAhIzqgxY0YuACNQNAYkZdVOUdZURiRl1VZzKjAg0EZCYoTtBBERABJonIDGjeUbyIQIiIAIQkJih+yCNBCRmpLFUlCYRqJCAxIwKASq4CIhAQxCQmNEQxaxMioAIJEBAYkYCEBVF4gQkZiSOVBGKQOsTkJjR+mWgFIiACKSfgMSM9JeRUigCIpAOAhIz0lEOSkUuAYkZuTz0nwjUBQGJGXVRjMqECIhAlQlIzKgyYEUvAiJQNwQkZtRNUdZVRiRm1FVxKjMi0ERAYobuBBEQARFonoDEjOYZyYcIiIAIQEBihu6DNBKQmJHGUlGaRKBCAhIzKgSo4CIgAg1BQGJGQxSzMikCIpAAAYkZCUBUFIkTkJiROFJFKAKtT0BiRuuXgVIgAiKQfgISM9JfRkqhCIhAOghIzEhHOSgVuQQkZuTy0H8iUBcEJGbURTEqEyIgAlUmIDGjyoAVvQiIQN0QkJhRN0VZVxmRmFFXxanMiEATAYkZuhNEQAREoHkCEjOaZyQfIiACIgABiRm6D9JIQGJGGktFaRKBCglIzKgQoIKLgAg0BAGJGQ1RzMqkCIhAAgQkZiQAUVEkTkBiRuJIFaEItD4BiRmtXwZKgQiIQPoJSMxIfxkphSIgAukgIDEjHeWgVOQSkJiRy0P/iUBdEJCYURfFqEyIgAhUmYDEjCoDVvQiIAJ1Q0BiRt0UZV1lRGJGXRWnMtNoBD777DPXr98xbvLkyW7dunVB9sNixl9//eXWrFnj7rnnbnf++ecFfvRDBERABBqJwJVX/seNHHmXW7Fihfvjjz981qNixs8//+zGjBnjTjzxeMc5OREQARFoNAJz5sxxgwad4p59dqz77rvvguyHxQzq0GXLlrk777zDnX76kKBODTzrhwjUiIDEjBqB1mVEoFoEhg271G2wwf+6HXfs6M4771w3adIbDjHj4YcfcqNGjXKHH36oP9+x4/Zu0aJPq5UMxSsCIiACqSawevVq1717V18fHnhgb3f77be5ceOed9tu28FNnTrVUZd27bqLPz9o0KlqnKe6NJU4ERCBahJA+KVtucUWbdzll1/m3ntvmjcAetllw9zzzz/nevfu5c9vvPGGbtasWdVMiuIWgaIEJGYUxaOTIpB+An///bc7+OA+/qXCi4dtww3/z2/h/x95ZHT6M6MUioAIiEAVCbz00kuuTZtNg/qSutLqTKsvd9qps6NelRMBERCBRiVAHXjIIevblnF1JXXmM8883aiIlO+UEJCYkZKCUDJEoBICS5YsyWmgW6Pc9kcccXgl0SusCIiACNQNgbPOOiMQM6yOtP0mm2zkR2nUTWaVEREQAREok8D8+fP9aAyrH6P7AQNOdr/99luZsSuYCCRDQGJGMhwViwi0OoGLLrowtoHetu0WDrFDTgREQAREwLmvv/7a7bDDdrH15XHH9RciERABERCBfwlceOHQ2LqSkRpz534kTiLQ6gQkZrR6ESgBIpAMAYYEduq0Q95Lh15IOREQAREQgfUErrvu2ry6skOHdm7t2jXrPemXCIiACDQ4AYzLd+/eLa++POusMxucjLKfFgISM9JSEkqHCCRA4L777s154Wy55eZu2bKlCcSsKERABESgfgjQQG/Xbuuc+pLVTuREQAREQARyCbDCU3SKycKFC3M96T8RaCUCEjNaCbwuKwLVIEADPTw6Y+jQC6pxGcUpAiIgApkncPPNNwUN9M0228StXbs2vwC++AAAIABJREFU83lSBkRABEQgaQIsw2orQSFqDBw4wP3zzz9JX0bxiUBZBCRmlIVNgUQgvQRYktUU9OXLl6c3oUqZCIiACLQiAWxntG27pa8vr732mlZMiS4tAiIgAukmMHr0w76uZDWo+fPnpTuxSl1DEZCY0VDFrcw2AoEVK5Y7ppdccsnFUs4bocCVRxEQgbIJ3H77bY4VTD788IOy41BAERABEah3Ap9//rnbfPPNHCuYyIlAmghIzEhTaVQxLdOnv+duvPEGbQ3CYIcdtndDhgxWeTdIefNsL1iwoIo1SONE/cUXn+u5aaDnhql4W2zRRmXeQGU+ceLrjVOhVTmnr732qp6dBnp2evTY3R188EEq8wYq81WrVlW5Fqk8eokZlTPMRAx33HG7n+92wQXnOW1ioHugfu6BQYNO9UM/x49/IRN1UdoT+f7773ueLNGp56R+nhOVpcqSe2CffXq6iy++KO3VUGbSB9P99ttHdaXa1roH6vAeYCTOnDmzU18fScxIfRElk0DEDC2jlAxLxSICaSLAajXYSJGYkUypmJgxZcqUZCJULCIgAqkhgG0UiRnJFQdixk033ZhchIpJBEQgNQQ6dtxeYkZqSkMJcRIzdBOIQH0SkJiRbLlKzEiWp2ITgTQRkJiRbGlIzEiWp2ITgTQRkJiRptJQWiRm6B4QgTolIDEj2YKVmJEsT8UmAmkiIDEj2dKQmJEsT8UmAmkiIDEjTaWhtEjM0D0gAnVKQGJGsgUrMSNZnopNBNJEQGJGsqUhMSNZnopNBNJEQGJGmkpDaZGYoXtABOqUgMSMZAtWYkayPBWbCKSJgMSMZEtDYkayPBWbCKSJgMSMNJWG0iIxQ/eACNQpAYkZyRasxIxkeSo2EUgTAYkZyZaGxIxkeSo2EUgTAYkZaSoNpUVihu4BEahTAhIzki1YiRnJ8lRsIpAmAhIzki0NiRnJ8lRsIpAmAhIz0lQaSovEDN0DIlCnBCRmJFuwEjOS5anYRCBNBCRmJFsaEjOS5anYRCBNBCRmpKk0lBaJGboHRKBOCUjMSLZgJWYky1OxiUCaCEjMSLY0JGYky1OxiUCaCEjMSFNpKC0SM3QPiECdEpCYkWzBSsxIlqdiE4E0EZCYkWxpSMxIlqdiE4E0EZCYkabSUFokZugeEIE6JSAxI9mClZiRLE/FJgJpIiAxI9nSkJiRLE/FJgJpIiAxI02lobRIzNA9IAJ1SkBiRrIFKzEjWZ6KTQTSREBiRrKlITEjWZ6KTQTSREBiRppKQ2mRmKF7QATqlIDEjGQLVmJG6Tzvvfced8MN/3ULFiwoPVCMzx9//NHHQ1z8lhOBahGQmJEs2SyIGU899aSvX2bMmJFs5kuI7cEHH/DX/vjjj0vwLS/VJPDQQw/6spg7d241L1NXcUvMqKvizH5m7rjjdnfWWWdmJiPXX3+dO/jgPkW3Rx4ZnZn8KKHJE/j777/djTfe4C6//DL37bffJH+BjMQoMSPZgmpNMWP58uXu9ttvy6v3brvtVrdy5YpkM5pAbDvvvJPbYIP/dePHv1BRbKtWfenjIS5+Z93dffdId9FFF7pVq1ZlPSt1l36JGckWaTlixooVK9yhhx7s67n58+c3myCeJdqDtGPLcUcccZivX0aOvKtFwV955WU3aNCpbv78eS0KF/bco8ce/trPPPN0+LB+twKBvfba05cF4pZcaQQkZpTGqSa+Jk6c6F5//XX33Xff1eR6abxI1sSMU04ZEDRuaeDGbddcMyKNqJWmGhF45523g/vi/vtH5V117dq1jkZTvTuJGcmWcGuJGQgZO+7YKbind9yxY/Cb+m/ChJfyMvrTTz+5BQua/xjIC5jQAYkZ+SBnz57lNtlkI192jDSRSxcBiRnJlkc5YgYp6NKls39GmhMo1qz5ym2++WauTZtN3SeffFJW4ssRM9auXeO23baDT+PJJ59Y1nUJ1Ghixq+//urSOgpFYkbLb2OJGS1n1uIQv/zyi7v55pvc66+/5v7555+88GPHjnHt27cLGoRbbbWlGzbsUvfXX3/l+a33A1kVMy67bJj77rtvYzfKX65xCdBb0rXrLo6PvmjPSf/+/Vzbtlu4++67t+4BScxItohbQ8z4+uu1zoQBRFrqPIQKBHhGZDA89vfff8/J6MUXX+S23rqtu/TSS3KO1/IfS7NGZqynvnz5MrfXXj3c9ttv56ZPn77+hH6lgoDEjGSLoVwx48or/+Pb5vvvv2/RBD355BPeX8+eexb1V+xkOWLGDz/84I455mjHd8OTT5bfk99IYsbVVw937dptldpR4BIzij0l8eckZsRzSfTozJkzfSW3++7d8wQK5kSh5Mb16PMyazSXVTFjxIjhjVZUym8LCKxbt859/fXXeSEOOeRg/+xLzMhDowPNEGgNMeOee+729+vhhx+a9y4rlFymDfJ+k5hRiFDrHUdo/+qrr1ovAbpyQQISMwqiKetEuWIG9is22mgDP4ppyZIlsdemk/K44/r5eu6mm26M9VPKwXLEDOJlKmul0/saSczgXcQ7Ka1T2iVmlPK05PqRmJHLoyr/XXHF5f7BiRMn6BkxIQMDPG++OcnRW8sxerM+++yzqqQprZFKzCheMpVMR6gkbFyqko4v7hrNHWOKxs8//9Sct9Sel5iR2qJJfcJaQ8zARhDvphNOOL5kPi0VM37++We3Zs2akuMvxaNGZpRCqbifltb3fGAl1X5p6bWL5yQbZyVmJFtO5YoZpGKnnXb09d6LL74YmyhGp1k7/tNPP431U8rBQmJGLe7/WosZtNtovxVy1cxzPYgZvCPLGfWNeM0Um5a61atXu99++62lwVrsv9xyl5jRYtQtD2BixqRJb+QEZl7dZptt4itBhAybgvLHH3+4/fffzx9/9913csLU+z+NImYwf3zAgJPcxhtvmLP17t0rp4i5J5577lm39957eX/0EBBm66238gb44l4GTGnCzwsvjHOzZs1yBx7YOwjbvv3W7q677vTXYLQAQ8DDaWCIZNwIgi5ddvLXJCC9sx06tPO9FYTt3Xt/x+gjHB9YvXrtnxPndddd68/F/WH+fd++R+T4J05WH6CBEHZPPPG49zdq1H1u6dKlfi4rPG699ZawN/fee+85GgXhfPH79NOH5PjjRfCf/1yR52/w4EHu888/z/Fb6B96amgkha+1xRZt3OjRDwdBeJ7t/CefNFkKv/DCof6YNYA23PD/Aj99+x4ehOXHrFkfugMOaCpDi4d6A0Ndf/75Z47fNP+jaSbJlk5rihk07ptrSN155x3+nube5j4P3+PUJ2H35Zdfeuvt3Nfc41bPcd+/9tqrYa85v7/44gv33/9e7zbddOPg+SH8dttt4zhnrpCYgRFT/G++eZuSPryLGQBF4CEu6uoom8cff8xPM+O8bUw9mzNntiUxZ0+9fuKJTfGZf/bUpd9++22OX2xtcW7EiKu9CHTbbbf5jhALt/322/r6NM4WF+8D/L377rtBnA8//JA/Nnr0aMeH2WGHHer/tzI5+ugji9aPvF8sXgvDhznppm7s3r1rcK1CP/CLMUVsAZA+i6dHj91j673Fixd5fwMHnuzWrfvR0Z7q3LmTP0Z4bBnQYx41dLpw4ULvB+OJrE7zwAP355QT6eV9SkO+1k5iRrLEKxEzeO6ow0466YTYRPG+5zxtH2vHm0fab7vs0iW4F7kfO3fe0U2bNs28BPuwmEH9bm0j7n/qOOo62hNRd/jhTe0d2kZRx73LPcy9zLVt4xldtmxZ4L2YmLFo0aKgHrDw7JlWGK3rgghDPyZPfstfl/YWUxXpxCX8+eefF/giX0899ZTbY4/d/Dl75qnLMVQcrfcIaO23M888I4gn/KNnz6Z285gxz/jD1GlcN+6dBI+w46O/X79jvP9wnmH5/fffh73G/p437xMflnYnU4Gwl9ap0w5BfFtuubm75Zab3Vdf5dcthUZm0C7mG4H0GB9G9mNgPmqQmjLD3ymnDPR129ChF+SEowzefPPNvLRj6JZwQ4YM8uk+77xzc8LxjTB58uS8cHbg1VdfdcxCCDOjDHlPRR31Lv6oh19+eUJwnQ8//CDqtdn/JWY0i6hyDyZmvPDCekvq//zztzv11FN8BUhFF1XKzjnnbH+u0aYvNIKYQQVM44qX3047dXYXX3yhb7h17bqrn/todxwfqvjF3zbbtPerYVCRoiojJnB8n316Onoyw45GG+eGD7/KNwZ5cV544QW+ccdxNoSBfv2O9fMGaZwee+zRvgHKuf322ydPgcXeAy9DDMWRdio0elyx90AY5l3TIOaFQJ5oiJIfKipeHLyMoo6P227ddnVU6meccbp/4ZJ2KiXi5LkJu8cee8wfZ77jrrvu4n/zQUDD1dyAASe7TTbZODjH83PGGaf5tFCZm+MFjF/SdsQRh/trw/aQQ/r4sHyQNKdCI7YccEDTiwV+hKe8eJ7HjXveLuUbH+SHzQxO0TiCj00xo3z5n+2009aLLnzs0KBnficCCNe46qor3bbbbuPjizMoGlw4ZT8kZiRbIK0hZtDQsXuW+/GbbwqvzsMqTtzPVkcw0tDucZ4zc9hu6Natq7+fEV65x9mol2iwbbjhBv5j3Pzb/vnnnwvqLBpLfMjSqOMau+++W87ojjgxg+HjpA0jmOE6xOKP2xcSM+6//34fD/PWZ858PycoHxhcgzrU8jZkyGBfnyLeRFdJoMeNeh3O5MnCkC/qEMTW8AcTRsM5Tp1LvUX9TAOWcEceeUTQcD/99NNywpFI0kvYd95Z32kCC47xMY3xQxrgrOhAA9s6X2isRsseG1+EIezGG2/kjj32GJ8GRJlNN93EDR58qv8g23XXnXP4xP0zZcq7Ph8nnnhCkP+TTz4puPfIc9jRcOe6J510or8u7x3sCMAAo4iWblaa+OOP9TZdFi5c4MNhyPuoo/r695XV5VzbwiHoxH1EhtOQ9G+JGckSrUTMmDv3I3+f8GzRCRR23E/cV9x/CLhhx2oU3Ps77LC9FyK4H63dRJ3w/vu5S7CamDFo0Cn+XueZP+aYoxziL/Gz8ZxHXaERnq+++orr0KG9D7fNNh2cPU/Ut7S9woJvITFj0aJPvZ0k6krSTh4QVXbYYTsfbykG7t96603vlzbYvvvu7X9Tt1hY7Czx0Uz+qMtpu3Id/NP24TjvhqgdQVaI4xx1W5yL5unZZ8f69wPvIsKRJ3snUeeaQ1znY5/ypixIC5uVw9lnn2VeC+7prOYa1NeUK+VNm5t4EL4RpzhP59Wff+YKVIXEDAxv77ZbtyA92HMx46+0ocP2qhCiiZ927tFHH+XflZQ5v40pbfoPPmjqiLSMYNeNcHyfkjba9AjQRx11ZE44Okqj7pVXXvHMKEPa6U1leL7vCOVdPnFibr1tCygwzZr3HbwpD2snR+Mv9r/EjGJ0EjoXVm0RLRh+OWfOHH/DcNPYAx2+HB9/nJOYEaaSvt/2MNJwevTRR2K3sIqLornlllv4Rjr+o6p2eKQFPWTcA/QwhRV0KFBR2Uc/L5awMzGDsLy8TOyg54nKieNs9Nh9/PH6daz5ODLFety4ceEofUOcMFRIvBDMMQrCGsScpxEdzhPKO8f5WA+LA7yU9tyzaYpVdCkweOGfyj9smM7EDCpKBBCM+fEsmUPVpxHLC2r8+PF5Dfcw2//8p2nqFy+aqDv++ON8mpuz8M+QU/J25JF9c6JAhAr3gtIIxh9btJIu1AghQjjCgTKZMmVKzjUYvk1ZwIFRKllwEjOSLaXWEDPIAXUD9x73Mx/oCAiMNAt/YIdzWmyaCfUAwihx0XCNNlZZ6pVzPAfh1VC++OJzx0cx5xB3o9NSws86aYmKGXxE0KAjH/QuluqiYgZ5RrQhHupB6sOwYyUjziEI0DsXduvbBfsF9Rj1GR/V5Cv6YcSw7N126+7Pvfzyy0FUJmZQL9JYjRoZpnysXscIedhZ3R0nZhDfYYcdkpNuuFnZR4VUej9JNx850fqKjzoLV4qYQRoXLFgQTqr/zagTroExxnDdb2IGIj/vRbiHHe8su/7dd98dnDIxg/uLcOERKnh6+umng3Bxvd5BRFX4ITEjWaiViBm0221KeLRtxH3KPcn9FW6nffjhh/6DlWcsOqqAzg7CICqE6zwTM3he+RA0R9vJpvjxARp958e1IxiRwSgHroNQEB1dFK0jox/+XJu00WFEHOHOWM6RJ9pafJST12LOxAzqFDjRmRbuwLV6nmutXp27TPRHH80JOu8YFRx2LRUzLGyxaSbUK9apFX3mEbLsXRIdaW9x297EDEQk6v+pU6faKb/HYKzVSQ8+mPsOKiRmrFixPKd9TURMy7B4wsK4iRnUiXxDzJu3ftnezz5b6fbcs2kp3uhoIxMzqBPpCA3XwytXrvSjLrgfEEnCjutxb5KW6Ag4RuZwTyO8hEVh+37ivqADIvyOD8ddym+JGaVQqtAPQ+mt0UBh9u9/rK8cuCGa7GKszLuCFTLDHhvJZXVkBmVZaOMhN9enz0HeX7SStPPhPWoocVLRxzlEjKZ7aCtHJWPOxAwqiGgvgn1QEi4uDTZaiCHLYcdHC2F4CUQdYhzn2KJTQ5iuYSp42HiWvdzoSYtzZkE8LDaYmMF1GMoWdlSQVNicizbYw/7sN/54wUQbGZynYc95ntlizsSM5lT6csWMRx991KcjOkLF0mR1RFYET7v3Kl1RwvLf6PvWEjPgTsPWGnU8K2z0joWFWyufYmLG229P9mFpBEUbQIRHAGCkk8VvcVqdE21Q2fno3tLKvUec1sPG9I+WuKiY8emnC33aEEZmzMhfEYQeONJeaFiujXKZNq2poWsNYN4T4Y8cS6MZYGWkgDkTM7gOAnmcQ2znPCM1ws7aJXFiBnn68sv1U3UsHFMTiYvRGmHHiD6OF5pWeMEF5/vzpYoZ4bjtNwIv12BDiDBnYgbHGbkW5+wDhneZORMzCBfXqYQ/RiBxnnuolk5iRrK0KxEzSIm1jeiwCTsbjRRty1i9V+h9Z51R4Wl0JmYwvSHq6CShzcK9GBUS48QMpjDgl5Edpbg4MeOVV172cTCSLM5ZXUBeizlr75GeOPHYRhfQgRfnWN2RsPgLT4OuhpjxwQcf+GuF69hwmpjW3MT16PDhvN9Wl+O3cJ3Y1NnHaISwKyRmhP2Ef/Me5DrhOszEDI6H7zELxxLqnEO0CAtdJmZw7o03ck0jEJZ3P+coC5YFNmczEMJTrO0c+7g8WRuWd020QyIctpTfEjNKoZSAH3oqrOHAjcDGR9577+XPm+OFbUOQwi/sBJKR+iiyKmbQSEQciNusl56yRp3cbLNNHUOriznsJKBwsoWHjoXDhI1OhXv8TcxANIs6+6Dk/ouzYk8vI+eY+xl2JmZQAUadfVgcf3z/2N5Zs/9C3ObOPbdpGhWCzEcffZS3MVqDdMSJGfTkRhv69KDhn2F40eHPdk3bY0sEv8xHjbs2vQxU8M2JGfT+UZ5s9JpYOdt1bF+umEH6SCcv+Lh00nPLeYkZRrqx9q0pZkCaEV+MRDjuuP7+PuRepBeIucJhZ436OCHUhhbzwVjIYYOBuBnKjeN5svcjU01KcSZmIIgeeughfhoEja7oaBLqNxrI0Y2eRFxYzHj77be9YUAaYtGpJfhFNGF0GY0+bF/FPcPGzsQM+zBiKHmcf3oDYRFuaJuYwdQz2MQ5RhwQjvSEez6tTRInZjCsO86ZiIvdFHOIOoyK4xo//pg7AsX8WG90S8QMhl/DgUY1ZXLppRf7a3CdcNsoLGaEP3bs2uzpNWfIP/W1tbvCYkacEEc4RHimzTDdKTotIBx/0r8lZiRLtFIxA1GC+44RreG2k40Qe/759VNLSTl1FG18ntm4ZxmBgPjCH5omZowceVds5i0M01nDLk7MYNQm8T/22KNhrwV/x4kZ2E0gDj7g4/JA3JwvVcygrozWUdaO4t0RPWeJZdoH12ELd9xVQ8ywj/LLLhsWm2dGxZEOBOJiLixmMCo6zi1evDho5yOimIv78Ldz7BmZQ3lQR8DARs8UEjOinYzEQX1nTMMdjWExIzx6xq5P+9rC0VFvDjGBaXkTJkyI5cY7jXCM0jNnYkahDjvzV8peYkYplBLyg6CBoRoqQx5+a8BEo2dYD34wrBgemh/1V4//Z1XMKOWDstQef8rVPlQQMwo5Kn7r2UOFN1eqmPHdd7mG5AhfiZhRqJc0TsygF9cqxGL78DxJG5nBnMuos1EM9A4258aMGVPStWHLcPZijvvVGvGMDGGUBg3rsKOcLI9h0Qk/cY0QC2vzcC1soX20p8jCp21vQlqhnqq0pTft6bE6IjqkvzXSzcgD613jvg0LsMXEjDPPPN0/G5dddmnBZFudxOgNRnoVe54KRWJiBtMTeI54ZsMf8BbOegCjz5r1uobFDIsLQSBuhFe4sRiNL/r/k082NfBsRFr0fPR/bFZYA9XEDNoMhRw9bxYHHwbmkhIzmmsAc72WihlvvDHRHXTQgUG6Ga7NaEPLRyExo9CHA2mwDzwr+7CYEZ4eaXxsb+/ZQm0285fkXmJGkjSdN9RN26hcx/1hNlTsHYahQgRC5vpH7zu7T5vbh5dlT1LMIF1cO27EWByDODHDevyby0PYBlJc3DYyo337dnmnTaClA6mQ+/bbbwIBOzxavRpiho02aS7PCA5xH/uWh7CYUew7Lq6cCokZLL979tlnBvUY9Rn1vt2XrSlmIEY1x4zzdPyZMzGjlO8nC1NoLzGjEJkUHI8bdpuCZFU1CRIzmvDah0oxMYO5fdbYCyv1WRIzMIiEsFFoCxvmS1rMwOBToetyPGxpu9hNj0VojHZaRc7LqTkDoBZfKWIGYkWxdIavZfGmcS8xI9lSsToiDWIGObPef56DcMO+UjEjbF+Ke6gSMYO02YgnGj/hOe7kAWN3NLyj29y5TbaFwmIGQkCvXk2rjjHaI5xn4jIxA5Gn2PPLOa6LMzGDj5piYcIrONWjmEGdRj2KiEDjl/Lgw6GUaSbRcvBg//0jMSNMo7F+VzoyA1rRjy+mqVGnmNgZJspx6ohizzHn6GE3l1YxAztixfIRHnVreQnvKxUzEAMwbgzTsC2RaooZjLYulueoTaNwfvmdtJiBCG0jMHiH0e7EhgbORKfWFjMQVYox41x4FZ/o8xRl2JL/JWa0hJb8Vp2AxIwmxPahUkzMCDfqsbZtLktiRlissPQX2ictZjAtJinHcHV6jc3OCfP8KR9cuJzKGZnBx0o9OIkZyZai1RFpETPCQ/3DH5SVihlM3aMRe/DBB/lpIcWep0KEbWQG9ocYJmujKhAKi/WaReMLixlTp07xDVZ6FEkfy7yGnYkZjCYodT6wiRnh3qtwnHG/SxEzMPRMGhnmHZ6GkcaRGb/99qufCkJ6o9MaKxEzyHebNpv5Xkz7gCxlZAZLSTJlAGHFltaOK4ekj2lkRrJEkxAzWK2B+xLbFThWvuH/sWPXG0W3VHOcaSYYaCzVpVXMsGl2peYj6q9SMYNnF55sYZ7VFDPCo52j+Snl/1LEDIywMkqQeonRbebiRmaYzRaEi+j0yLSIGdSR4XxYfgrtJWYUIqPjmSdQz2IGQ8RoPDJnl3nHxRxLZlkj2dbIjvqfPXuWr9yxHh9uLGdBzGBOKC+mww9fb8gumr/o/8XEDGyMEB+NTrgUc1h1xi98w0uTFQtT6jmWuSJuNhuCWOzjq9jIDDNY15yB0VLT1tr+JGYkWwL1IGaYQUt6VVitI85x//M8mc0N7OXYCig0ZktxJmbY8HBWA2LaCvGGe/qaiyssZvAb9/LLE3ydvtFGG7o335wURIFIwnQQrhFdCSDwFPlhU+AY8o3Bv1KciRlbbFF4ZSMM0JGOlhgAbYnNDBrllCHXiOulpcz69+/nzzdnM8MM8LHalQnCxqEUMcPsYVgY2z/99FP++oUMgPI8xTk+5MgX91AtncSMZGknIWZw/7GCB51M2HHhvqC3/Pfff8tL7D77NC1ByhTYUl2SYgZ2z0jf+eefW9Ll46aZUDcSR5xB0pIi/ddTMTGD0XG2CgZLycY5pjHaMxheFcrEDAwtRz/wqX9Z3Ylw0RXzrG2F0B51ZgeEkSCVuLCYwXSkOIfBZtLXnAFQ6kFbmSZu5Zg0iBm8W8gL33ClOokZpZJKoT9uypkzZ8Yu4Rm3tGcho4IpzFoiSapnMQNAtuwe88usd6gQOJZVpXLo0WP3vFVJ6PWjp5LzYSOZxJUFMWPhwoW+UYAqTWMx+iIiH1Ejn8XEDJ4rGxVB4yJsJCqOL0xhh0Gt6HXwzxSe8NJ/cXEQLppu6wGlsWM9vqSNa7FFR2aYAcQ4i+Ms5UU8DI2Ors9t6YlLu51L215iRrIl0hpiBkIhI5CijvvQDHzx/JmQh7/wsnvRcFhc5+OAZwNDn9Hnifue+5/nILy0nTWymYrAEnfRcNHrRMUMziMCICzTmxQdARANb//HiRmc48OTPDAKI2xM7eqrh/vjLKkax42w4WeY1UO2225bH4ZhzHF1ULTeMTGD6zPaDKOZYcdoAub0c/7ee+8NnwqMkpsNCU4yWg6/LREzCGerayHYs0qNOfLA0GLiZGtOzGDEC/4o9zBL4mH0i8VTyGZG79698oxA046yOd1hY7PhkRkHHnhAnu0TeoTbt9/aXxPjo7V0EjOSpZ2EmEGKBg8+1d8P3C/ci4WMF9KW5TyGcqPT2Sxn4WefY0mKGU0dRk0GyllBpLk6Mk7MoL1C/Ugn0dixYyzZOftoHnJO/vtPMTEDL0zTgxXT9sL2ljhHR92++zatlBR+djnHVAurD6LLej7zTNNS0ZyPihmsBsNx6uuoY+SHdSQyKjCOWyl5DosZffoc6L7//rucS5EvRsqRjqgoHx2ZAZNddmlaipz3ZNjxHWF1W2tOM0HE5n3KtMpCozOi3CRmhEubtQVKAAAgAElEQVQyI7+5GTFcY8vM2QPY3D78ws5IVitKZlbFDBqrp546MHYbOvSCgAkjAawCowLCmA9LibIhQoR74WlIWaXas+defs17/PHxb2tEYwzTPprtIlkQM0irvVB4BlCWn3vu2YDFjTfekNeLWEzMID4+tMyYEg2IYcMuCeJjub5wRc+Lhpc01+ZFc/fdIwO/KPMMH2W0RzF33333uQEDTnLPPjs2CLv33j19nGEbJsXEDMsT9wR5pnxpzJsjHtLIXETuLyyf2/1CngotmWbh07SXmJFsabSGmEH9hLDAvUhjmXtx1KhR7rDDmhqjiJPRlT34UOYe5tlkGgVhJk6cGMCwj2f8UFfa/Y0QYIbN4pbzo+4jDBv1ByubEJZGFelj9IW5ODGDc2eddYYP3717t5zl6SxcdF9IzMAA6AEH9PJxnXTSCTl1MnGTRtJw+eXDgvyRVoToaOPUVk0gDCtSUd8bEwSOAw7onTNiwcQMWLGiCT2y2JwgDCshWZ2IXZ9owzypaSZwoo1jAjw9rfY+PProI/3HEP+Tp+bEDOrLjh2blqCkPrW8cz9w79kIkHDbKDzFiRWtGBFDPU5YpgCYIHHEEYfndAyExQzC0ftJnUw4RkTau5pOCDO4Gr0nqvW/xIxkySYlZrz44nh/H3Mvs82YMaNgQnlW8cNoIAxL2r3MnrqHd37YJSlmEC+GOS2dPJvc01ybe5znkdU0zMWJGZyzVdOIhzCsBmf5YDrcscfmLyNrcdq+OTEDAcHqIqYAhuty66Si8y4q7tKpR1uPtCFMIJyz2gjppN6z9xLHw85G8hIOo8/kJzwqBE7GDXshjOqyPBNXIaE3fI2wmEHdQgea1eWIK0xB4hp0ZLEyWNhFxQzOXXHFZd4/7VY6vkkPbU++I4ifuMJt3PDSrHF1l02DJFxYNG7OmHOh1UxIo63OhaBx7rnnBMxIK0tz8/4PO4kZYRoZ+W3zhu0BKXUffmFnJKsVJTOrYkax8uzUaf269sChMqDBS8MsGi7a0GPu+cCBA/zScGG/KOU0hNetW5fHOytiBiotBrQKCXx8rNhQbjJpH/5xq5kYBJa8NZU/zIvf0aW0pkx5NxgpE/XLnNjwkmkWf3hPjwxKdDgsLxoqcRrk5oqJGQxbPfLIvjlx8MIzR1iM/XEPha9jv3kR/vDD9+Y91XuJGckWT2uIGQzPtcaj3YO2p7EZnmZhueUePuecpqki5pcPNXPUAwh4cfUA9z0N2/DzZOF4dkaMuDpoBFvc7BmJEG6gFRIzEJfNqBof3dGeI7uW7QuJGZxn5IiNMmGUgjlGiVEn2LlwOhl9MHz4VebV72mw88G0++67xT7zpDf8EWJiBlbtmfJiArhdB2EBkSiOoX1AJDEyg8QjaJB3ExyInxWmmGaDwEKaou+4nMz/+w/iBKtDWR7YEycfAdYADreNwmIGHyU2JNvC867FSGO0UR8WM2hw27QgC4c4h2D9yy+5HxtxaU76mMSMZIkmJWbQo87UXu4RPrSj91Q41SzhetFFQ4MPV7uv2NNWiI40SFrMoI6kPWiiXPj6iJ98cJsrJGYw3Q0xuUuXnXKeR4sLETe8VK3FF943J2bgl6lqJ5xwXF6birocY+yFOGN42up3SxNCASP2bCRXdHodeYquXGXTGEkLdTD1lU1TsXhtv9tu3XJsd4Tzar/DYgbivYkyFkdT3XJyzihGCxsnZlB/myBscVCGrJBpAnhrixm0RRllEn0HkV6Wtz7ttME5grrV5VrNxEo+5XssoVsvMC93ehhQv0rZor3uKc9qxcnLmpjB0OHmypGGVpyjIcVcOhqz9957j4+HJfTiHCorbPDLkOjFi+PjJOzatWt8XHFTLWhsWnrjGu70MHI+OiySPHA8bNjP0rlmzVf+XLgn1M6xJy7Cxi1fyHnmQHKeoePkDxGB/8ND1fHHUGGOs8Z2MceLCn8MdSY+BBP+Z3mvqOOlxTkEBPzSq8v/jIopxbGMMiNKCPvqq6+6pUuX5AWjN5Q42aJ5wjOCFEv+EQfDJuOmlpEewlN34O/dd9/x/8eVYV4CUnJAYkayBdEaYgY5sDrCnpm33nrL34txH8uWY95jDIfl3sVeUNjGj/mhHuC+xo+9I0t5DqnneDaoPxA3+B2tI6gvOR6eb23XJS2cY2vueSKP5jcuv/Qwcj4spNh1OEejnvzRo4m/5cubrNGbn/Ce3jr8MGqMMPSI8n9UwA6LGYTH6j29xYRh9Fu0Lg9fg+l+xBn+ULDyLRTO6utC7zXi58OEeMPvIBMz6OksxfEuJAz5mDfvEx8n4eydG24bhcUM3lFWXxIWMZh8xrmwmMGHH+nmWoSjB/bTT+PDxcWV9DGJGckSTUrMIFU839zfPNOlONpGdJ5wX7ERtlAdwblC9R5LxXM+2k6kHuE4HWVxzp4Z7mmuzz2+ZMn6URmEsTzRYx/nOM41GE1CHCydzP/h5zAuHMeos/BbyvNEm2p9W/C1vLo87hqkzdp7vEOsLWr1QFw5WV1OXhDMV69elRc19SLpZnQK/l566UX/f7i+zAv074GwmAEj2uVM+SMe2vK06Qs52pFcN9oWpI5iVAlxvPLKy8E9RJ2Hf9ri5rgmx9iiI1rww7vOzvNdYA4DzHY8Lpy1r/ETDmfh2fMOon1COtlYkSwuv3ZfNieGheMu9Buxe86c2YVOp+b4/6QmJWUkhB5cU9LsISsjmoYIkjUxoyEKRZkUgQQISMxIAGIoitYSM0JJ0M8UEIiKGSlIUmwS6F2lHURPcdIuKmaUGn9UzCg1XC38ScxIlnKSYkayKVNs9UggKmbUYx7TlCeJGTUoDRMzmBYQnbNag8tn6hISMzJVXEqsCJRMQGJGyahK8igxoyRMde8pTWJGoR42VnRAyGD496pV+T2glRaSxIxKCdZ/eIkZ9V/GacqhxIzalobEjBrwNjEjS8b6aoAl9hISM2Kx6KAIZJ6AxIxki1BiRrI8sxpbWsQM5kszV5rVHrCbYRurgGDjCTGDJWKr4SRmVINqfcUpMaO+yjPtuZGYUdsSkphRA97M5cJQIFbG4+Yg1SAJmbmExIzMFJUSKgItIiAxo0W4mvUsMaNZRA3hYdKkN1ybNpu5Ll06t2p+sfGBwTxbgcam1tL2wQAh7/ZqtX8wiAoDtnXrfiyZA/O4LRzz0dPkNM0k2dKQmJEsT8VWnMC8efOCuuX3338r7llnKyYgMaNihKVFYJZz77nnbpe2l2ZpOaiNL4kZteGsq4hArQlIzEiWuMSMZHkqtmQIYIRw/PjxwTZ58uRkIm6wWCRmJFvgEjOS5anYRCBNBCRm1Kg0sAB+wgnH+6GWrH182WXDStoKzUGtUbJrfhmJGTVHrguKQE0ISMxIFrPEjGR5KjYRSBMBiRnJlobEjGR5KjYRSBMBiRk1Kg2GV7KEI+ud2/DLUvZY224kJzGjkUpbeW0kAhIzki1tiRnJ8lRsIpAmAhIzki0NiRnJ8lRsIpAmAhIzalQat912W4tEDBM6JGbUqIB0GREQgaoSkJiRLF6JGcnyVGwikCYCEjOSLQ2JGcnyVGwikCYCEjNqUBpvvjkpEDIwhPXAAw+4Z555xv3111/Nbo22lKtGZtTghtQlRKAVCEjMSBa6xIxkeSo2EUgTAYkZyZaGxIxkeSo2EUgTAYkZNSgNW5q1bdst3PTp79Xgitm9hMSM7JadUi4CxQhIzChGp+XnJGa0nJlCiEBWCEjMSLakJGYky1OxiUCaCEjMqEFpmJgxZMjgGlwt25eQmJHt8lPqRaAQAYkZhciUd1xiRnncFEoEskBAYkaypSQxI1meik0E0kRAYkYNSkNiRumQJWaUzko+RSBLBCRmJFtaEjOS5anYRCBNBCRmJFsaEjOS5anYRCBNBCRm1KA05s+f5zbffDPXvXs3byOjBpfM7CUkZmS26JRwEShKQGJGUTwtPikxo8XIFEAEMkNAYkayRSUxI1meik0E0kRAYkaNSuO88871RkCvv/4699NPP9Xoqtm7jMSM7JWZUiwCpRCQmFEKpdL9SMwonZV8ikDWCEjMSLbEJGYky1OxiUCaCEjMqFFp/P777+7qq4e7DTf8P9e16y7u3nvvcWPHjm12++GHH2qUwnRcRmJGOspBqRCBpAlIzEiWqMSMZHkqNhFIEwGJGcmWhsSMZHkqNhFIEwGJGTUojY8/nus22mgDv22wwf8Gy7SW8nvhwgU1SGF6LoGYccwxR7spU6ZoEwPdA3V0DyDeUueNH/9CeiqcDKfExAyEcdWXel/oHqive+D0009zF198UYZrqHQlHTHj7LPPUl1ZR20K1Xn1VedVUp4dOrRzc+bMTlelE5Oa/4k5lplDc+fObZGAERY5GlHM2GqrLV337l211TmDLl06++eCJYtV3vV/v++8cxeJGQm+tUzM6Ny5k56fOq8r671+3GKLNr5u2GWXLrqX/72X27dvJzEjwfoSMYMPnnp/lpS/prYUo+Dbt99a5d0g78aNN95QYkaC9WVsVD///LOj4VnO9ssvv8TGWa8HNc2kXks2P18YxkW4O/XUU/JP6kjdEdA0k2SL1MQMejPkRCDLBPr1O9a/C1auXJnlbCSadk0zSRSn0zSTZHmmPbatt27rRowYnvZkKn0JEdA0k4RAKppkCNx3371u1Kj7kolMsaSagMSMVBdP4olbvXq1O+GE492MGdMTj7sRI0TM6Nv3CMdzJCcCWSYgMSO/9MaMGeNGjx6df0JHyiIwYsTV7vnnnysrrAJlj4DEjOyVWSUpPvvsMx0dZml3mZ5mkna4aUofhlLlGoOAxIzGKGflsjoE/vzzTy31XR20irXGBCRm1Bh4A15ObcvGKnSJGY1V3lnJbV2JGSzNumrVKnfXXXf6bepUDRPOyo2odCZHQGJGciwVkwiIgAhklYDEjKyWnNItAukkIDEjneXS6KmqCzGD+aBYp9511539/FAz9Dl8+FU55UuPG5b/J02alHNc/4hAPRGQmFFPpam8iIAIiEB5BCRmlMdNoURABOIJSMyI56KjrUsg82LG0qVL3I47dsoRMQqJGRj95Nw227T3IzhaF72uLgLVISAxozpcFasIiIAIZImAxIwslZbSKgLpJyAxI/1l1IgpzLSY8dtvv7n999/XCxTbb7+tu+aaEX4JmaeeetIfi47M+Pvvv13//v38uUZbmrURb+5GzbPEjEYteeVbBERABNYTkJixnoV+iYAIVE5AYkblDBVD8gQyLWa88MI4L0x07bqr++qrrwI6r7/+eqyYgYdTThngz91998jAv36IQD0RkJhRT6WpvIiACIhAeQQkZpTHTaFEQATiCUjMiOeio61LINNixhVXXO6FiUceyV1mqxQxQ+skt+6Np6tXj4DEjOqxVcwiIAIikBUCEjOyUlJKpwhkg4DEjGyUU6Olsi7EjEmT3sgpN4kZOTj0T4MRkJjRYAWu7IqACIhADAGJGTFQdEgERKBsAhIzykangFUkUBdixoQJL+UgKiRm/PPPP+644/r70Rw33XRjThj9IwL1QkBiRr2UpPIhAiIgAuUTkJhRPjuFFAERyCcgMSOfiY60PoFMixkPPHC/FyYOOugAh3FPc4XEjAULFnj/rGjSaAZAx4173o0ceZch0r6OCUjMqOPCjcnaqlWr3NFHH+WmTZsWc1aHWkpg4cKFnucnn3zc0qDyLwKpIiAxI784MBBP21EuGQL33XevGzNmTDKRKZbUE5CYkfoiSjSBgwcPckuWLEk0zmpElmkx49tvv3WdO+/oBYrRo0e7X3/91TOKEzOWL1/uTjzxeO+3V6/9HKM0Gsndccft7qyzzmykLDdsXiVmNFbRL1u21Ndr48e/0FgZr1Ju33//fc9zypQpVbqCohWB2hCQmJHP+dprr3EXX3xR/gkdKYvABRec5zTSuSx0mQwkMSOTxVZ2ojt23N6vElp2BDUKmGkxA0ajRt3nG56MtuDF/fTTTzkMgvL/eeed6xYvXuyuv/46R4FwjO2tt96sEd70XEZiRnrKotopkZhRbcLpil9iRrLlITEjWZ6KrfUISMzIZy8xI59JJUckZlRCL3thJWZkr8wqSbHEjErotSDsH3/84W699Ra36aYbB2KFiRbR/cYbb+iGDr3A/fXXXy24Qn14lZhRH+VYSi4kZpRCqX78SMxItiwlZiTLU7G1HgGJGfnsJWbkM6nkiMSMSuhlL6zEjOyVWSUplphRCb0yws6ZM8edeOIJBQWNo446siFHZBhKiRlGov73EjPqv4zDOZSYEaZR+W+JGZUzVAzpICAxI78cJGbkM6nkiMSMSuhlL6zEjOyVWSUplphRCb0yw2IE9IcffnCvvfaaN/CEkSe277//PsdAaJnRZzrYb7/95n755ZdM50GJL42AxIzSONWLL6v3GKUmVzmBP//8079H2MuJQJYJSMzILz3aQmZfLf+sjrSUAO1KmMo1BgGJGY1RzpbLdet+zMRshkzbzKDxvnr1ai9WGHjtRaDRCUjMaPQ7QPkXAREQAeftiDHdduXKlcIhAiIgAhUTkJhRMUJFUAUCmRYz5s6d66eVDBkyuGQ0t9xys2PKyWeffVZyGHkUgSwRkJiRpdJSWkVABESgOgQ0MqM6XBWrCDQqAYkZjVry6c53w4kZp5wywAsgI0Zcne6SUepEoEwCEjPKBKdgIiACIlBHBCRm1FFhKisikAICEjNSUAhKQh6BhhIzmFt+zDFH/ytmDM+DoQMiUA8EJGbUQykqDyIgAiJQGQGJGZXxU2gREIFcAhIzcnnov3QQyJSYMWPGdDd69MPBhlVq5oP26rVfcCx8Pvr7ssuGef+EefLJJ9JRAkqFCCRMQGJGwkAVnQiIgAhkkIDEjAwWmpIsAikmIDEjxYXTwEnLlJgxffp7gRiBIFHu1q7dVu7zzz9v4GJX1uuZgMSMei5d5U0EREAESiMgMaM0TvIlAiJQGgGJGaVxkq//Z+8s/Jw4/v//h3w/xaW4lhrFXdvitFBairQUt2It7sWhVJAWLe4Up8BhB4XD9Q47ODjcfX6P1/CbbZJNLpvsJll5zeORR5Ldec+85zmbmc1rR+JLwFFiRkbGNVG0aOGoRQyIH2XLfiAOHEiOL2XmRgJxJEAxI46wmRUJkAAJ2JQAxQybVgzdIgGHEqCY4dCKc7nbjhIzUBepqefF6dOn5Gvt2jVS2GjZ8nPtmDoX6v3+/fsur1IWz+sEKGZ4/Qpg+UmABEiAW7PyGiABErCWAMUMa3kyNWsIOE7M8C12NFuz+tp76fOpUydFcvJ+LxXZs2WlmOGtqn/w4IFYtOgvsWfPHm8VPEalvXnzpliyZIm4ceN6jHJgsiQQHwIcmaHnfOzYUbFixXL9CR6JisDBgwfE8ePHo7KlkfMIUMxwXp2Z8Xj+/Pni/PnzZpKIi62jxYy0tFTRtGljMWnSxLjAcnImU6ZMFl26dHZyEei7QQIUMwyCckk0tIOYQrd69SqXlCixxUhOTpY8k5KSEusIcycBkwQoZugBYuH4vn376E/wSFQEevXqIcaN+ykqWxo5jwDFDOfVmRmPS5UqIVJSDptJIi62jhYz4kLIJZlQzHBJRRooBsUMA5BcFIVihrWVSTHDWp5MLXEEKGbo2VPM0DMxc4Rihhl6zrOlmOG8OjPjMcUMM/Qssn39+rV4+PCh3Lb1jz9mi4sXL4oXL15YlLqzkqGY4az6MuMtxQwz9JxnSzHD2jqjmGEtT6aWOAIUM/TsKWbomZg5QjHDDD3n2VLMcF6dmfGYYoYZegZt7927J3r27CEgVLx69Upn9csv03U7n7Rr11Y8f/5cF9ftByhmuL2G/ysfxYz/WHjhE8UMa2uZYoa1PJla4ghQzNCzp5ihZ2LmCMUMM/ScZ0sxw3l1ZsZjihlm6Bm03bHjHylW1KpVQydm7Ny5U2TP/pZOzMDc8u7duxnMwT3RUlJSxM6dO9xTIJYkJAGKGSHRuPIERN1Zs2aK1NRUV5Yv3oW6fv265Hn16tV4Z838SMBSAhQz9DixYOWePbv1J3gkKgJJSbvEoUP/RmVLI+cRoJjhvDoz4/HChQtFZmammSTiYuvoNTMGDvxRihXBFgD94IP35Lm8eXOLDRv+FqdPnxa9e/eUx/LkySXwNJOBBNxIgGKGG2uVZSIBEiCByAhQzIiMF2OTAAlkTYBiRtZ8eDYxBFwhZmzdusWP3sGDB0XOnNmlcIEtC1V4+fKlaNDgE3l848YN6jDfScBVBChmuKo6WRgSIAESiIoAxYyosNGIBEggBAGKGSHA8HBCCbhCzMAwGBWwdkajRg2kYFGtWlWBRUB9Q//+/eS54cOH+h7mZxJwDQGKGa6pShaEBEiABKImQDEjanQ0JAESCEKAYkYQKDyUcAKOFjOWLFkshYlKlSqIS5cuiefPn4n169fJY1gbY+LECTrA2A8b5yhm6NDwgEsIUMxwSUWyGCRAAiRgggDFDBPwaEoCJKAjQDFDh4QHbEDA0WJGenq6KFmyuBQnChTIL6pXr6oJGViB9dq1a36IMUqjdeuvZJyFCxf4neMXEnALAYoZbqlJloMESIAEoidAMSN6drQkARLQE6CYoWfCI4kn4GgxA/hOnjwpSpQopokYGHVRokRxueBnIN7Hjx9r8U6fPhV4mt9JwBUEKGa4ohpZCBIgARIwRYBihil8NCYBEgggQDEjAAi/2oKA48UMUIQwMWbMaFGnTm0xduwYcebMmaBwsaMJ4qCDx2KgDCTgRgIUM9xYqywTCZAACURGgGJGZLwYmwRIIGsCFDOy5sOziSHgCjEjUnT37t2L1ITxScAxBChmOKaq6CgJkAAJxIwAxYyYoWXCJOBJAhQzPFntti+0o8WMtLRU8cUXLcXevXttD5oOkkC8CFDMiBdp++SDkWaXL1+yj0P0hARIIOEEKGYEr4ILFy4EP8GjJEACWRKgmJElHtedvHfvrrh9+5bty+VoMePo0aPaGhhYNwPbrp49e9b20BPh4JQpk0WXLp0TkTXzjDMBihlxBp7g7CDqYq2g1atXJdgTd2SfnJwseSYlJbmjQCyFZwlQzNBX/ciRI0Tfvn30J3gkKgK9evUQ2CWQwRsEKGZ4o55VKbGZRkrKYfXVtu+OFjOwNkbx4kU1QQM39Pny5RH16tUR06dPF5mZmbYFH2/HKGbEm3ji8qOYkTj2iciZYoa11ClmWMuTqSWOAMUMPXuKGXomZo5QzDBDz3m2FDOcV2dmPKaYYYZeBLYZGRlixYoVonr1aiJXrhx+wgYqoUOHb8WxY8fEs2fPIkjVfVEpZrivTkOViGJGKDLuPE4xw9p6pZhhLU+mljgCFDP07Clm6JmYOUIxwww959lSzHBenZnxmGKGGXpR2p45c1pMnTpF1KtX10/UwIiNSpUqiBEjhotr165FmbqzzShmOLv+IvGeYkYktJwfl2KGtXVIMcNankwtcQQoZujZU8zQMzFzhGKGGXrOs6WY4bw6M+MxxQwz9EzavnjxQly6dElMn/6z3IoVYoZ65c2bWzRr1kTs3u2t+dCLFv3FeY0mryunmFPMcEpNWeNnenq6bOd27txhTYIeT+XEiROSZ0pKisdJsPhOJ0AxQ1+Df/wxW0ybNlV/gkeiIjB58iQxb968qGxp5DwCFDOcV2dmPG7Z8nOBJR3sHhy9ZoZRuJhmMmbMaE3QgLCRI0c20apVS3Ho0L9Gk2E8EnAEAYoZjqgmOkkCJEACMSVAMSOmeJk4CXiOAMUMz1W5IwrsajHj9OlTcjRCzZo1/IQMNUoD74ULFxQTJ05wRGXRSRIwQoBihhFKjEMCJEAC7iZAMcPd9cvSkUC8CVDMiDdx5meEgOvEDKyJsXjxIlGxYgWdgFGrVk0xfvw4cfbsGbFy5Qq5joYSNoYMGWyEF+OQgO0JUMywfRXRQRIgARKIOQGKGTFHzAxIwFMEKGZ4qrodU1hXiBn379+Xa2Cg4y5UqICfiFGgQH7Ro0d3sXXrVt2OJo8fPxaNGzeS8bNl+59cIPTVq1eOqTw6SgLBCFDMCEaFx0iABEjAWwQoZnirvllaEog1AYoZsSbM9KMh4Ggx4+bNm6Jfv76ibNkP/AQMjLZ4990yAgs9paWlZckFQkiTJm8EDdgdOnQoy/g8SQJ2J0Axw+41RP9IgARIIPYEKGbEnjFzIAEvEaCY4aXadk5ZHS1mHD16VCdiNGrUUKxbt1Y3CiOrKrl69apcOwNiRrt2bbKKynMkYHsCFDNsX0V0kARIgARiToBiRswRMwMS8BQBihmeqm7HFNYVYkb58uXEwIE/iuvXM8TLly+jgj9p0kQxbNhQceTIkajsaUQCdiFAMcMuNUE/SIAESCBxBChmJI49cyYBNxKgmOHGWnV+mRwtZmRkXBNLly4RDx8+dH5NsAQkEAWBy5cvi6ZNG4vNmzeJu3fvyhQCxYyXL1+I9PR0MWXKZNG9e7cocqEJCZAACZCAnQl06vSdmDZtqrh27apQa38Fihl37twRf/+9XjRr1kRgsXQGEiABEghGICUlRbRp01r89ddCcePGDS1KoJhx7tw5MWHCeNGhw7fi+fPnWjx+IIF4EnC0mBFPUMyLBOxKYNCggXK6ValSJUTnzh0FRhlhylT79u3Er7/+Ij7+uL78Xrp0KXH+/Hm7FoN+kQAJkAAJREngxIkTonjxYrKtb9DgU/Hnn38IJWb88st0+WdDnf/pp7FR5kIzEiABrxCYPn26bE/y5s0t+vT5XuzatUtAzBgwoL/cNRIP0nLnzily5MgmIH4wkECiCLhazHj27JnYuXOn6Nq1i+jSpbPcjjUzMzNRrBOa76ZNm8S8eXMT6gMzjx2Bhg0/lZ0ORIxgL+zWM3/+vNg5wJQTRiAz84bAU9nVq1clzAc3ZZyamir7izNnzripWCyLBwj8/vtvQdt/3z6hZcsWHpo5NSkAACAASURBVCARuohr1qwWY8eOCR2BZyIisHDhQrF+/fqIbBjZOQQgjPq2H8E+L1u2zDkFoqcREcB/55SUwxHZJCKyo8UMTDOpUqWS6NKlk26tjCdPnohOnTrqfoTVqlXxGzKVCOiJyBNTDHBRMriTwIULaSJfvjy66111PM2bN3NnwVkqkZaWKuudYoY1F0NycrLkmZSUZE2CTIUE4kQAa4Y1aPBJyH4gf/68IiMjI07e2DObkSNHiL59+9jTOQd61atXDzFu3E8O9JwuGyFw9uwZUbBggZBtSs2aNSLacMFInoxjHwIY8U0xI8b1sXLlCvkDwx+1169f++W2ePFi7ceXJ08u8fbb+UT27G/JY5991kybU+pn5OIvFDNcXLn/v2gY+qfEC993XPt42szgTgIUM6ytV4oZ1vJkavElcOrUKYF7Ht8+QH0ePnxYfJ2xYW4UM6ytFIoZ1vK0Y2r9+/cL2p5gesnx48ft6DJ9sogAxQyLQGaVDHYwQSc9d+4cXbTChQvJc2XKlBaXLl2S5+fM+VP7QZ4+fUpn4+YDFDPcXLtvyoZF33C9qxtX9Y5pVgzuJUAxw9q6pZhhLU+mFn8Cbdu20fUD5cqVjb8jNsyRYoa1lUIxw1qedkwNmyxUqFBO16Z069bVju7SJwsJUMywEGaopJSYsXXrFr8o2OEEf+Ry5swu9u3bp53D6I3Wrb+S5xYuXKAd98IHihleqGUhZsz43a/DwaiMixcveqPwHi3l1avpom7d2mLnzh0eJWBtsSlmWMuTqcWfAEZnYNE+JWjjfcGC+fF3xIY5YmHUn3+eZkPPnOkSxQxn1lukXq9Y8WYkvG+bcvbs2UiTYXyHEcAaS05YP8zRa2YoMcO3Y3rx4oWoWrWy7MSbNm2iu2wwtw8/xuHDh+rOufnArVu3PD9X1s31q8oGBb1MmXe0m1isQM1AAiRgnMDjx49l5/3o0SPjRoxJAjYj0LHjd1o/gKequK4ZSMBqAtevZ4ibN29anSzTsxkBbLvqOzrj22+/0U3vt5nLdMdDBBwtZmBEBoSJEiWKCXx+8OCBwBBCpRxiWklgUHO/vCZmBHLgd/cS8J1OdekSR2W4t6ZZMhIgARIITgBbtap7oWXLlgaPxKMkQAIkYJAApvSjTcGoL4z+YiABuxBwtJhx+/ZtUadOba3DVh033uvVqyPu3r3rx/nNSt9vthnauHGD3zl+IQG3EMC0Ekwv+eGHAW4pEstBAiRAAiQQIYHu3buKQoUKiBs3rkdoyegkQAIk4E8gPT1dChnt2rXxP8FvJJBgAo4WM8AO0yfq1KnlJ2jUrVtHQOgIDNiSDEIHVvrGonkMJGBXAhjijnlq6rVo0V9ixIjhuhdEu9KlS+leWC+mSJFCuuOI+/33vXXpIO1169Zq+SFfDCtkIAESIAESSAyBp0+f+rXJK1euDNp29+jRLWhbX7hwQZErV46g5z799OOgaWEUh+p38I5t7hlIgATcQQAPeX1/37NmzQzaDlSuXDFou5Et2//kw7Jg951ff906aFrbt2/3y9MdJFkKOxFwvJgBmLdv3xIYadGvX1+xcePGoEIG4mVkXJNx8GeOgQQSTQDru2BqFPZwnj17lhg/fpxcyBGLOVaoUN5PoFOjjiBSYNSFVa98+fIGzQf5Va9eVfrTtu3X0r8FCxZIf+Ezdk5hIAESIAESMEcAbSnaVLwwRRB9wVdffSnbXrX+l2r/fd/z589rWT+A/gTbLPqmrz5XqlRR65cmT54k/Tt27Jj0F6NdGUiABOxFAA+i0J4kJSXJ3+vQoYO13/AHH7wX9HcO0dOq+0qVDoQP1Y74vuMeF69PP/1E+oc279q1q9Jne5GkN04h4Aoxwymw6ScJYE9uPPnCrjqffFI/aEOPJ2Zt2nwtX/Pnzxd//71eex05csRSiBgB4ps+Pg8Y0E/Lv0iRwkF9/OyzZmLYsKFyNAdHcFhaJUyMBEjA5QQw2gEj4QYNGiiaNGkctI3FWmCqH0C8wHb62bNnllI6dOiQXx7Y9UPlX69e3aA+NmzYQPZlq1atEl7b7t5S+EyMBEwSuHr1qmxTOnfuJGrUqBb09/rZZ8213zSESd825dw563cm2bZtm18e2MpVtSnYKtpX4FCfcW/crVsXsWnTJpNEaO4lAhQzvFTbLGtCCGCeIXbRqVy5ktwuWDXaUKabN28mlWmMLFJP5zBiwy4BK+DDr8uXL0s/hwwZJBX10qVLah0RnhBi5Xx0jNj+mIEESIAESMCfAEYxrF69WnzzTTuBNlP1A9h9Cn0Bpvr5PqG00+4jahQh+gKIMPCzceOGolatmlo58GQXo/kmTpzAndP8q57fSCAmBNLS0sQff8wWTZo0ktPnVZtSsWJ50aZNa/k7xZbM6t7STiNqMYUOfp06dVL6OW3aVNkOFi363wM0jPBo3ryp2LFjh3jw4H5MGDJRdxCgmOGOemQpbEgAN6M//viDUI0z1rCAKr18+TKB/bmd/McfW7FhNWvsHoRhi5j+go60UaOGYuvWrcLqp4Y2rF66RAIkQAJhCeCmHWJ1/fr1ZBuJP/3lyn0kRo0aIfuBYOt7hU3UJhHw5wh92eLFi8SXX34hsEYH+oFixYpKcYbrbdikouiGqwhcv35ddO/eTRQokF/+3ooXLya6dOkkfv/9N/l7tJMQGil4rG148OABeW+JNeHy5csjy/j++++KRYsWCU5ti5SoN+JTzPBGPbOUcSZw9+4dgQWUcGOHIX8rV64QmZmZcfYiftkdPHhQ3ryqJwNdu3aJX+bMiQRIgARsSqBdu7ayH4DgO2bMaHH48GGbemrerevXM8TSpUvkKET0BdWqVREQcxhIgASsIYD7yOrV30wjwQjZGTNmyBEO1qRuv1QglmLaibq3nDBhvP2cpEcJJ0AxI+FVEB8HNm3aKObNmxufzJiLnAuNxhc3r1iXwisBTwywYBwWk8PCpgyxJ3Djxg2BebL//vtv7DPzQA6pqamSJ1Z8ZyABMwT27dsnb8Jr1qwhd14zk5aTbO/duyuGDh0iy/7TT2Nt5fqaNavlSBJbOeVgZxYuXCDWr1/n4BI4y3VsYIB7y2+/be8sx016e/78OVGiRHFZdixAzBAfAgMG9BcXL16MT2YmcqGYYQKek0ynTJksunTp7CSXHe0rFvFEh+PkIcTRVkC/fn1k2TG3miH2BLDNNK611atXxT4zD+SQnJwseWIleAYSMEMA0y/w2xw+fJiZZBxpi3WWUPYWLT63lf+YGtm3bx9b+eRkZ3r16iHXBHNyGZzkO8QMTL3AVAyvhdGjR8k2hWJG/Gq+VKkSjngwSTEjftdEQnNKlJiBuXv379/XXlaMUtizZ7eoU6e2+OKLlgllmlXmP/88TTa6mCe9f/8+T8zzQ92is8Gc8Lx5c4s7d+5khYjnLCJAMcMikP8/GTuJGVhzAO0n1x6wto7jldqtW7dkP5AnTy4xadJE4eS57EaZYbHQ3buTRM2a1WXZsd2snQLFDGtrw0liBqY8+d6P4rOdFlw3UjNqZEbx4kXFunXrPLE+Gept8uTJAuvOQSClmGHkSrEmDsUMazgyFYsIxFvMwB/b3r17iXfeKSUbHzRAeGExzD59vjdVKuyagbRKly5lKp1YGkPMKFOmtFb2Bg0+Fb/99qtw4zam2G4W8xjRuaJe3n33Hblafyz5Mu3/CFDM+I+FFZ/sJGZgNB1+U3ySbEXNJiYN1SbiHTeG6IvduI0pBDf0ex9//GbLcawRgvJSzEjMdRevXJ0gZuzdu0duIfzRRx9q92T4PeKFUbTLli2NFy7T+SgxQ/mPtdnmz58nMMXXbeHAgWQ5Xa1ChfJ+9UYxI341TTEjhqxPnz4tO03c4OG1du1aVy+uaAXKeIoZ2G4JW46isUXngRWJv/uug3zHH17sWW8mOEXMwHal2DqrV6+eAltMgUe+fHklB1y3GCZ47do1MygSYvvvvwfFP/9sl2IVthhUO5lgO7DBgwcJLAaK4wzxIUAxw1rOFDOs5WkkNbSDaDdmzPjdSHRHxUG7f+zYUfHDDwNEuXJlZT+A0Wv58+eT9y9JSbscuSjolStXxL59e2UZsCaI2nWgYMG35bErVy6LL79sRTHDUVdr5M7aWczAXP+WLVuI7Nnfkr+7d98tI++/cE+KFxZnx+8Ta045JUDMwIMy/KHv0OFb7f4Lo7+aNWsq//yjLcXCmU4LZ86clls/4/4YdYW111A/eCg6btxPciTKm/aUa2bEq24pZsSANLZ77NGjuxzCjgva91WyZHH5xINbQgYHf+jQobjt/d637/eybj799BM5pM/XI6jHGHprJjhJzFDlxPzhOXPmiGbNmsinVeraLVasiKhQoZzcS3vy5Elya62rV68KvLCwYyIChkIrH3CjDb/wgggFX5XveEcnM2TIYPlHRE0hQidKMSN+Nff8+TN54wIRkcE8AfwJO3ToX/H4ceIX7vXKyAyI7WhPmjZtbL4CbZYCynXt2lXpFX6jWBQUW3b7jlrEny20rQ0afKK1t3v37tXa4URNM8I2iaovwKgL9AONGzeUvqoh3ygfdlVo0eIzsWDBfJGefkWrATuKGdhWPFF9qwbGRR+Sk/ebvqeLBY4jR47IkcC4PnHvsnXrFt0aZhgpiz/QGF3qlAAxA6NfVcCC1dOnT5fiDLZERnnxwj0Y2pQ2bVprbcrZs2e03zO2VY53wLaqqj05deqU5hdGl8DXvHnfbMOKB2RoH7Hd7MaNG8WtWzelq6hDlI0jM+JXc3hYlqj+J5JSOmrNjI4dO2g/VPWDDXzH03CGxBLInTunrCc8tYlFcKKY4csBgtvOnTvF+PHj5KKsanpG4LWMJ124uVevL7/8Qq7CjkXlgr32798vXr9+rXvhBjpYfHUM61yoPPCutpQN9AffofzjD9bGjRvkvGjfcqnPFDMUCb6TgDkCFDPM8bODNdpNJWb4+oO2Gv0ARpainhs1ahjy/gZbnPq20XhKqdrvYO+4+QzWF2C9qWDx1TEIEr75qL48sC/A0zr4DHEDZcCflGDBjmJGMD95zF0EcI+lRl1g3TI3rd8VKGb41ty9e/fk73HYsKHy95nVvRymPqvfOkZOqzYg2Dt2qwnWnkDsDBZfHcNIO5UH3j/55M3C+IHtCb6jjUObgikzGP0bLFDMCEaFx0DAMWIGhk2poWJY/HHXrp2yBrEwzJIli8U777xZnwBxuEVhYi9udQMUqZiB6UM7duwQc+fOke94OhosGBEzMNcOaanXuXPngiUlj0GdV/Hwrq6tkAYGTuApVqTCGsqLaxkvrDeCURx4Va1aJeRNbrBOIdpjmAqj8sQ7RlwofyIZ8UQxw8AFwigkYIBAKDEDN5Foqy5duiRTyczMlN9V23n9eoZf6rjJRXz88QwV8KROtYOBo3wwDUSdU+/BnuxhBBrOwz8EPIXDd+VX4O5OeEqO8xhxiXYLf0BU+ngP9icZ7aRvmug3ggX8oUc8TPFAwLQIfF+16s2uP9g6Gt9xPFTAn3/ECfQ7VPxgx1GuYGJGsLg4hhFuqt3F1BTfNhkLK0fbvkdiV6NGdS3ffv36av4cPXoklNtBj1PMCIqFB2NMYMSI4fJ3gmnOWOTTTMBIYrQBvq9wT6oD2z3YQgywImQlZoRKH/2EalMgXKg2pWHDT+PSnqDtwYgulS+2a1b+pKenh3Jbd5xihg4JD/x/Ao4RM9q2bSN/dFWrVg66eu/du3dF5cqVZJz27duxghNIQI00wI24kfDw4UNRq1ZN3fQhDDXD2hsYRucbshIzcBPevHlTba6duoErXLig+PPPP0TgDfiWLVtEpUoVdA06buDMhGjEjFD5oePMyLime82bN09MnTolqtfhw5h25J8m/lhYEShmWEGRaZCAkE+q0IZhDrFvwJMvHMf0DIySQvum2jq8FypUQKxcuUIzwc01Fl/GOayAHyysWLFcnkd76LtQ8aJFf4mCBQv4pY900CcrMUWlh3YP5/76a6GccoD1E/BdvTA1wVcsVm25Oh/4jr5BBYgP6A/UGj0qLv7gf/NNeymcqLh4h2+Ig61B0Sa9//678jumPyJAKMB5LFgZLMAG89Axbxuj3qINyCMSMSOrfCBaBbbbWOMl2n4AdRuYHr7jIZEVgWKGFRSZRiQEcO2qEQm//vpLJKa6uNu2bdN20FDtDd4/+6yZOH5cv24DhMihQ4eIwHYPNtjdB+2d2RCNmBEqT9wPB/v9//rrr1G3KZs3bwqaZuC9dyifsjpOMSMrOt4+5wgx4969u1rj4HuDFlh1y5cvkzcnuJEzq8YGps3vxgn8/vtvIlu2/8kXnu6He6oFAQLz5bAjBp664bVu3VpRq1YN7WbUV9VWN8CBu5mgI2nSpJEcwYMGX6X1559/yp1P0KH4jtrBE7kPPnhPYCTJ9Ok/y/i7du2SfxzWrFljvMBBYlopZgRJ3taHKGbYunronIMIhBqZocSM7t27yrnRX331pVwgbdSokaJ8+Y9ku4k/+SdO/DcXfODAH+RxTNcMFtq2/VqeHzt2jHZ6yZIlsn2sXr2qHNGANhVrOWBbbLSnHTp84zd6QokZGFkGIQAiA/5oDxo0UNvdqUCB/JrwAP/69+8n6tevK9PDCEt8Vy/1p/rEiRNSjMHISzBRbTvWaHj//fekLZ4y+o7kUGIGpsahf8Gim19//ZXcVQoFRDlQBkznS009r5VZfUCfgPNI10xAGlaJGWb8SIQtxYxEUPd2ntgpCL85vLIadRWOEoQMjFbF6A6IfqrNQZuG+1tM0/AVffG5VasvZL4YYbZmzWppg9FdLVt+Lo+jTTx69M1IsXD5hzpvpZgRKg+7HqeYYdeaSbxfjhAz1F7taJwuXLgQkhoWl1RPn+7cuR0yHk/EngDWg1AdClRqdADoDCIJ2AkEN75I5/LlN8OpYR9KzIAijrjIKzD8/fff8hxu9NXTvu3bt8ljuIm3OlDM4G4mVl9TTM97BMKJGWjvBgzo7wcGwi8WiMO5H3747xxGF+AYRs5hJKNvwBN/1XeqEVoY/otREPizf+bMGd/o8nPZsh/I9PAQQQUlZiCfSZMmqsPy/e7dO9r2zVhrwTdktQAoFiSuUqWyzAsiR2BQogXy/OWX6dpp3+PogyBe+AY8KcQoDdhBgPcNEEU+/riePDdr1kzfUxF/RvoUMyLGRgMSiIqAr5iBtiOagP8cJUoUkw/Ggo3KUtMzIHiqgDYNv3UshhtsjQ48aMN57PpmJlDM4AKgZq4ft9o6SszAzUW4oUpqgRkoeAyJI4B6wtxkbH+ltlfCe6dOHbWncka8q1SpouwA8CRShWBiBqZiqOkigTfqsMPoDzUU+/z5N0/hlJhRu3Yt3c29yivad4oZFDOivXZoRwKKQDgxA7t4QYgIDPgDjhtn7JakwsOHD7StQX/77Vd1WL6rG3HMp1aj4FQaWCA4WBg+fJjMo3fvntppJWZgC1LkFxiQFvyqUqWS36msxAyseQEbCBJ4YBEY4C+mBSIOhBoVfMUMjOAIFsABdljQ0jdAyMHxMmXeCTuy0Ncu2GekQzEjGBkeIwHrCWB0Gn5zeAUTMyA0YKePwNfMmTM0ZzAVD/bdunXVjvl+QFycb9WqpTyMURl169aRx0KJnwcOHJCjw2CHqYHRBooZFDOivXbcbOcoMQNzXoP9UfWtICVmBD5p8Y3Dz/ElgJWJW7f+Sg47RkOOVYuDLSiJTgarH2O6CYYFq6HBsAknZuDJIeLhieTEiRO0LZ9wk65eUMQRRy0Ih6HFuNnHMVw32IbUqulJFDMoZsT3V8bc3EggnJgR6infjh3/yHYNUy59A/pF1d75Hq9Z882Uvg0b/tYOq6HRvXr11NpQ1ZbivVevHjIt34WOlZiBxd6CBUxbQf5o231DVmIG8oINpouECkqYRnnV4ny+YoYabRJoj1F6sMH0Fd+RG0rkAH+zAb5TzDBLkfYkYIwAFn/Hbw6vYGIG/kNg20/1UgvW+47qUm3bt9+2D9r2DR48SKbftGkT+YAVW/2qPLOa2qK2Y166dImxwgSJRTGDYkaQy8LzhxwlZqCxyGqaCZ7QKDEj1Arnnq/xBAJYv369nGuIevSdl416w2r3eDqmOgRsU4cbSdxo4phRMUPZZ/W+Z88ejQIWwlTDq2GDNTQwdFA9ndQiRviBYgbFjAgvGUYnAR0Bq8UMLASKdg5PJdXCyidPnpSLL2NKiW9QYkZWbSnOYctoFRIlZqAMmI8OfzZt2iTdMSJmIGKHDt9Ku4EDf9S2H1T3ERs3blRFi/odPlHMiBofDUkgIgK+00zQLoQLDRs2kL//YGJGuLYPI48xKsOomKHywsO9aAPFDIoZ0V47brZznJiBBbw6d+4Y9IUGQjU+WDchVDwcx02dl8KlSxfFqVOnEl5ktQWf79BkNZwZ00B851/DWaPTTNTIjNq1awo8/cvqFTj6AqNEEB8dk7p+7LSbScIrLUIHuABohMBMRsfTJzyJxw0Vg3kCb7Yx/SfovGfzqUeWgtViBkRatRaEGlaNBTrR7gVOJ1FiBm7ys2pPsW26CokTM05IMQOCjPLHqJiBBflUu48/JmlpqfJ79erVgo4gVGU1+o60KWYYpRX7eKjfs2f1a8DEPmd35nDmzOksHzLGu9Rov/FQCr8734dmofxQAkMwMQNtYlZtH0bzIhgVM7BoKPzq0+f7UO6EPU4xg2JG2IvEwgh79+6xbMS6hW7pknKEmIFhYXiSpG44rHiHeuulgGG8VgyZNcssmJihFndbtmypLvlIxQw8ncOuJtEEiBrdu3eT1xmGHobbhSWrPDgygyMzsro+rDyn/nytXr3KymQ9mxa2ukQfk5SUlHAGVosZKBBGyKF8uLFGwLbYEAEOHz7sV14lZkybNtXveFZfYilm1K9fT7x48SJo9mqaSeHChbTzRsUMCBhIG0ywPa2a8mLkj5CWWRYfkC7FjCwAxfnUyJEjdFsdx9kFV2WHKRnjxv1kqzJhahx+d5jWgcU8swpZiRnYvtlI8BUzsPNSqKCmmWC3vmgDxQyKGdFeO9HYYcQ8tkW3e3CEmAGI7dq1lQuAYREwK15eU+btImZ07txJdjJqZAae4mMLQXQ8aq6z+tFgRfkKFd6scxFumsmbBUDfLBa6dKleFFFphns3egMcLh2KGRQzwl0jVp2nmGEVyTfpuF3MuH//nihSpJDcpQQjeiBkfP75ZzqIs2fPku0ytsgOJSIEGpkVM/DHInCR7+PHj0k/0EcEE5gw2gRPOnEeC0yrEElbrhb0a9Pma7klOBarNruFovIDflHMUDQS/04xw9o6sKOYgenoaNfw24OwEWztDEUhmJihBN9SpUr6bb+qbALfIYjWq/dme+lOnb4LPC2/JyfvlwuA4n4XOztFGyhmUMyI9tqJxo5iRjTUaBMzAvEUM/r27RN0Kz+IDNifG6Ns/vnnH1lWDAl8770ystMJVPfVCvXokMKJGUhs9uzZMh1MV8EfkmDhypXL2mGo6U+fPtW+4wPW00B+JUoUNzW0imIGxQy/CyuGXyhmWAvX7WIGaH377TeynWvU6M188WC7feAPuNp+FSPqggXf9hTnoxUzMDUE7S5egX/8IVS3avWFPIcpMoF/BBYuXCDPYRtv3/WQIhEzMPUQbT7WT8KfjRYtPg9W3KiOBStTVAk50OjLL1uJOXP+tJXnFDOsrQ47ihkoIUYqYmFf/P5wj7l27Vrd/R7iBRMzMCq3Tp3a0varr74MOt0ssO3DFGnkhfvb7du3+0HGoqBqu2yzU5gpZlDM8Lu4YvyFYkaMATP5yAjES8zAcCR0IFDF3347v3xihqdm77xTWutYsNCab8DNBToB2GHkBuLj5jV//nwCq+LjnBExA9NEmjVrIuMj/6pVK2v542Y8X748fjdW48ePkzeuWF8FeeKFJ5bIb9asWb4uRvyZYgbFjIgvmigNKGZECS6EmRfEDN91IiBYQFQOFvCHQK32j/YT0/BUW1mtWlURuJtKtGIGdhvBiEu0vSVLlpB5DBs2VHPp3LmzomLFCvJ8gQJvaz588kl92W8ULFjAr4+AYSRiBuKrUYPwYcGCBVreZj8gvUCBxmyaTrGnmOGUmoreT7uKGSjRypUr5PbK+A3iBaESD7vQhkH8RJumBA/fNTNgi1FguId9Y5dHCsCq7cO0NLRDgQFtSK5cOQRGdrVs2ULm07VrF60Nxbp+GHFsJlDMoJhh5vqJ1JZiRqTEsoiPJzHly38kX9j/nSFyAn/9tVCsXbsmcsMILR48eCDGjBktb3IhYKAjgLBQpkxp0aDBJ2Lz5k26YXsYwjxkyGBRvHhRGR/v6CwwD/qPP/6QtmvWrNY8wXGkV7t2Le2Y+oD8Fy9eLCpXrqgJEyp/rFC/YsUKFVUq9+XKldV2TEEnh2ktixb9pcWJ9gPFDIoZ0V47kdrhKdKoUSOFkZXbI03bi/FTUlLEgAH9xcWLFxJefAi/aOtQv74B7SGON27cyPew9hnbjOI82sFgASPSmjRpJOMMHTo4WBTt2IkTx0X79u1kXIysQ5uOLa2RPmwzMzO1uHgKj+MQiIMFzBXHeexWFRh2794tz+HPBZ5uYni4b8BaSOgn1Lxz+FGyZHEpePtuq6pscK+AvPAysv4R1stAmhBoshqWrtI3+o40KWYYpRX7eP/8s11s3Lgh9hl5JAeIALt27bRtafHbxzSyhg0/1doD1S7gvWfP7uKPP2YHXfAZgijECMTDfSR+y7hPxPfevXuJy5cv6cqNESA1a1bXpk9DEEH8mTNnGp6up0vU5wDFDIoZPpdDzD9igXAn9F+OWDMDC/igEcErq61ZY16rzCAiApj7vHPnTnHo0L+G7O7cuSPjh3pKaCgRn0jXr2fI9NTq9j6n/D6mp1+R8a5du+Z33MwXihkUM8xcP7QlATsSwMrmaNNv3856Tg2D6AAAIABJREFUUT0zvu/fv0+cO3cuZBIQv+EDXlaJDlh3o1u3rvIeI9hC1CGdMXCCYoa9ppkYqDJGIQEdgX///Ve2ORkZxu4TT548IeOnpaXp0jJzgGIGxQwz149bbSlmuLVmWa6EEqCYQTEjoRcgMycBEjBMAE9mITpUqFBOPHz40LCdkYgUMyhmGLlOGIcEjBCgmEExw8h14rU4FDO8VuMsb1wIUMygmBGXC42ZkAAJmCIwY8bv2hDyUAtHm8mAYgbFDDPXD21JwJcAxQyKGb7XAz+/IUAxg1cCCcSAAMUMihkxuKyYJAmQgEUEsBBf+/Zt5WJ9WAtk8OBBAtNNrA4UMyhmWH1NMT3vEqCYQTHDu1d/6JJTzAjNhmdIIGoCFDMoZkR98dCQBEgg5gSwCCqEhkKFCojly5fHLD+KGRQzYnZxMWHPEaCYQTHDcxe9gQI7TszA1krYTsns68yZMwbwMAoJREeAYgbFjOiuHFqRAAnEgwBGYWzdulXcvXs3ptlRzKCYEdMLjIl7igDFDIoZnrrgDRbWcWIGbgyseJ0+fcogIkYjgcgJUMygmBH5VUMLEiABtxGgmEExw23XNMuTOAIUMyhmJO7qs2/OjhMz2rZtI/d9xt7PZl5WbsNp3+qlZ4kiQDGDYkairj3mSwIkYB8CFDMoZtjnaqQnTidAMYNihtOv4Vj47zgx48KFC7HgwDRJwFICFDMoZlh6QTExEiABRxKgmEExw5EXLp22JQGKGRQzbHlhJtgpihkJroB4ZT9z5gzxww8D4pWd5/OhmEExI14/gkuXLolSpUqIjRs3xCtLV+dz+PBhyTM5eb+ry8nCxYcAxQx7iRlTpkwWI0YMj0/leyCXIUMGi19+me6BktqjiBQzKGbE80qsVq2qOH78eDyzjCovihlRYXOeETrwLl06O89xh3pMMYNiRrwu3bS0VLmO0OrVq+KVpavzSU5OljyTkpJcXU4WLj4EKGbYS8wYOXKE6Nu3T3wq3wO59OrVQ4wb95MHSmqPIlLMoJgRzysRD8pSUg7HM8uo8qKYERU25xlRzIhvnVHMoJgRryuOYoa1pClmWMvT66lRzKCY4ebfAMWM+NYuxQyKGfG84ihmWEj71q1b2g4mZtbMePz4sbalq9e2ZnWTmHHu3Dlx4MABv9exY8cMX3HPnj3zs1VpvXr1ynAa4SJSzKCYEe4aseo8xQyrSL5Jh2KGtTxjldqDBw+CtuN3794xlCXae9X2+74/ffrUkL3RSBQzKGYYvVacGM9NYkZGRkbQNuHFixeGqub+/fs6+5SUFEO2RiNRzKCYYfRasSIexQwrKP7/NO7cuSPKlCktX1euXIk6ZYgZuLHAy2tbs06bNlUMHPhj1OzsYHjx4gVRvvxH4u2382n1qOozV64c8lzz5k3Fzp07xPPnz4O6fPToUfHhh+/r7JFOuXJlxcSJEwSuN7OBYgbFDLPXkFF7rJmB9nHTpk1GTRgvCwIQM0qWLC4OHEjOIhZPJZJAnz7fi3fffSdoO/7OO6VkX5BVW56eni7be9V/+L6jfxg0aKC4efOmJUVE2teuXbUkLacl8uWXrcScOfYSM3AvNGrUSKehtK2//fv3E7/++ott/TPqWP36dUXx4kWDtilly34oqlWrIpYvXyYePXoUNMmNGzfKfti3LcHnHDmyyfZowYIFAmKH2UAxg2KG2WsoEvtatWqIEye4ZkYkzGIe18tixvXr12PON9YZnD17VutoOnbsoNua17cjatKkkcjIuKZzST11feut/+ns0emg88HN8MWLF3W2kRygmEExI5LrhXHtQ+DevXsCfQWDfQngTzLaavzBCNyivVGjhiJbtv/J83iqNG/eXPH69Wu/wmCEp/rT0aHDt35pKLG8aNHC4tixo3520XxBPhQzoiFHGycQcMO9JTgXK1ZEtgnNmjXxaw/QvlSuXFFrLypUKC/279+nq5ply5bKOAUK5Pez/+ab9lp7VKNGNdMiKcUMihm6i48HhCPWzLCqnrwsZljFMJHp+IoZoRTuJUsWa+o4nrBh2KBvUGJG9uxv+R6WnzMzM0WJEsVkh9SvX1/d+UgOUMygmBHJ9cK4JEACxgkoMWP06FFBjdCWt2zZQvsDMnv2LL94vmLG7du3/c5h+kq5ch9J27Zt2/idi+YLxQx7jcyIpg5p434CSszYsmVL0MJiVG/VqpVluwDBc/du/wWilZiBEb6BAQ/HlHg6ffrPgacj+k4xg2JGRBeMRyJTzPBIRbuhmEbEDJQTN6roUNB59OzZQ/jOd8xKzIAttmyDXYsWn5tCRjGDYoapC4jGJEACIQmEEzNg+PLlSwGxA+05Ru2dPn1aSy8rMQORZsz4XdrVrFlds4n2A/LnyIxo6dGOBOJDIJyYAS+ePHkiPvusudY2YBSfClmJGYjzzTftpJ3ZnXQoZlDMUNcc3/8jQDHjPxb8ZHMCRsUMFGPdunWy48CN5OXLl7WShRMzxo8fJ+0oZmjIIv6Aesqfn2JGxOBoQAIkYIiAETEDCUHQUKMsMLdfhXBixty5c7U/LMom2neKGRyZEe21Q7v4ETAiZsCbtLQ0gakk+F0vXbpUczCcmNGlS2dpQzFDQxbxh61bt0iGkSz4H3EmNHAkAYoZjqw2bzodiZgBBR3zqdHhTJ06VQMWTsxo3LihtMHICjOBIzMoZpi5fmhLAiQQmoBRMQMpYM0M9ANYA0OFcGJGhw7fSJvBgwcpk6jfKWZQzIj64qFh3AgYFTPgULduXWX70KpVS82/cGKGWrB4zZrVmk00HzgygyMzorlu3G5DMcPtNeyi8kUiZqDYTZs2lh3OkCGDNQrBxAxMQ8Hxdu3ayoWa2rRp7Tc1RTOO4APFDIoZEVwujEoCJBABgUjEDPU0r2DBt8Xdu3dlLqHEDGzR2rt3L4E1lZo0aRxy54IIXJV9EKeZREKMcUkg/gQiETPGjh0jf9cff1xfu1cMJmY8fPhQ7Ny5UzRv3uz/34sOEtgS2kygmEExw8z141ZbR4gZGCqKLVnNvs6dOycbFDwp8drWrG64gKMVMypVqqgVX4kZuAawrgZeZct+oF0XEyaMt2QnA4oZFDO0i44fSIAELCUQjZiBNl8t7ucrZqD9V30B4uD1ww8DBBYCtSIgPYoZVpBkGiQQOwLRiBn4bd+582YBYSVm5MyZQ2tP1GgMxFu0aJEmfJgpBcUMihlmrh+32jpCzLh165b2ZxONghUvihnOu6SjFTOwrZYK/4kZ/luzqk4nT55cAp1F4FZ+yt7oO8UMihlGrxXGIwESiIxAtGIGRmkg+IoZvluzqvU1sLVr586dxNOnTyNzLEhs3K9QzAgChodIwEYEohcz7shSKDEjcGvWwoULyv8seMeabGbvLSlmUMyw0c/GNq5QzLBNVdCRcASiFTOMrpnx778HBfYBx80n9gZ/9uxZOJdCnqeYQTEj5MXBEyRAAqYIRCNmGF0z4/jx46JRozdrJ2F4OIaKmwkUM7hmhpnrh7bxIRCNmGF0zQxMNSlduqS8txw0aKCpAlHMoJhh6gJyqbEjxIzHjx+LadOmWvrCaA8vhaSkXWLVqpWOLnIkYsbz589F3bp1ZOcxd+4crdxqZAbmRAcLZ86ckTa4AU1NPR8siqFjFDMoZhi6UCyIhLYMCxVu3LjBgtSYBHY/GjZsqLhwIY0wbEogEjFjxYrlsk0vW/ZDrTS+IzNu334zTFw7KYRcWwN9AF779u31PRXxZ4oZ9hIztm3bKn75ZXrE9UiD4ATWrl0jduz4J/hJBx2NRMwYMKC/bBs6deqolVCNzMCUtWBh8+ZN0iZv3tzi/v37waIYOkYxg2KGoQvFokhYcxACv92DI8QMu0N0gn9TpkwW2BrKySESMWPHjh2y48iRI5u4ceOGVuxwYgZGY9SsWV3amrnhoZhBMUO76GL8IS0tVV6vq1evinFO3khetRFJSUneKLADS2lUzMBiezVr1pC/j+HDh2klDSdmwK5Zs6bSbujQIZpdNB8oZthLzBg5coQwuz1mNNeBW2169eohxo37yfHFMypmYMpYkSKFZNuwfv16rdzhxAwIGMWLF5V269at1ewi/UAxg2JGpNeMmfilSpUQKSmHzSQRF1uKGXHBnPhMvCRm4ElbvXpvRmX07NndD776oxJqZMajR49EpUoVZIdDMcMPneEvEJ3y56eYYRiYyYgUM0wCDDBXbQTFjAAwNvpqVMxQ27JiJ5NLly5pJQgnZmDR8Y8/rkcxQyMW3QfU05w5FDOio+cMK6+JGWpb1vLlP/KroHBiRmZmpiaCUMzwQ2f4i9qZ6tixY4ZtGNEcAYoZ5vhFZI1h1rgB9X1lZGRElIbbI3tFzICQMWLEcHkTChX8/Hn/qSLqj0ooMePQoUPSFk/Trl+/HvVlwZEZFDOivngiNKSYESGwMNFVG0ExIwyoBJ42Imbs3btX4EYMbfno0aP8vA0nZqSnX9H6gWPHjvrZRvqFIzMoZkR6zTgpvlfEDExdXrZsmcDiwFgofs2a1X7VFE7MWLlyhWxT8KAHYmm0gSMzODIj2msnGjuKGdFQi8AGAgb+MGJdhJIl39yw4KZBvYoVKyqqVasiJk6c4DfNIIIsXBXVbWLG6dOnBToXBLVl78yZM0SpUm8WWSpZsrgIdhOq/qj4ihkYUow0sKbI+++/K6+hFi0+N9XhUMygmBGvBoRihrWkVRtBMcNarlampsQMzF1Xa17cvXtXtuMQMb74oqXImTO7bMux/kngn4dQYgZEDKw9U6VKJWlbp04tUwtBo8wUMyhmWHnt2y0tt4kZ2EJVLfqLKcq4N8RIitq1a8rfcu7cOaWoEVgPwcQMTFuG/YIFCwR2OUFb0Lt3r0DTiL5TzKCYEdEFYzIyxQyTAEOZ44/n77//ps09U+JFVu+FChUQP/00VsDWqwGL2mFxSycH3zUzUN9169YWjRu/WXVe1T9UcwwPPno0+NM09UcF8WGL16effiw7GRyDPW6EMzP/W2cjGmYUMyhmRHPdRGODBZLxxxvDWBnME7h3757kiT/HDPYkoMQMtNkQrtGOq+21VV+AqSWTJ08KWgBfMQPtv+oL0P6rfqBx40aWLAKL9Lg1a9BqSMhB1H3giM2EOOKSTM+dO+s3hcupxVJrZuD3Wr58OdkmoA1R7QnahrJlPxCh1qZSYgYW+FTtSa1ab9brUW1Kr149TS3+CbYUMyhmxPM3lpy8Xzx48CCeWUaVl6PWzMDN5ccf19caFzQQuXLlENg+Da+2bduITp2+k5/r1avrFw9xK1Ysz1EaUV0m9jBKT0/X6lrVue87RC7EySpgRIevje/nsWPHWLZqL8UMihlZXYc8RwIkED0BtNW+bbfvZ/xh2L59e5aJX7+eEdIeC35im26rAu49KGZYRZPpkEBsCLRv3zZkmzBq1Ehx5EhKlhnv2rUrpD3uByGiWREoZlDMsOI6clsajhIzOnfupAkUb7+dT8yePSvk00hMQcCaB0uXLhUffPC+Zte/fz/dkFO3VSrLk3gCFDMoZiT+KqQHJEACiSZAMcNe00wSfT0wfxIwQ4BiBsUMM9ePW20dI2Zs2rRJTgHAjUGtWjVFamqq4TrBEBk8uYEtXosW/WXYlhFJIBoCFDMoZkRz3dCGBEjAXQQoZlDMcNcVzdIkkgDFDIoZibz+7Jq3Y8SMli0/l0JEiRLFtQW/IoGKBX0+/7y5TKN27VqRmDIuCURMgGIGxYyILxoakAAJuI4AxQyKGa67qFmghBGgmEExI2EXn40zdoSYcfv2LYHdJ3BTsHnzpqhxYm9ipIGFfJy+GGbUEGgYFwIQMz77rJl4/fp1XPKzUybYTQDbjzGQAAmQgNcJ4J4j2M5abufy4sULubj2nDkUM9xe1yxf/AhQzKCYEb+rzTk5OULMwE4cuCHAauV37tyJmi52M1GjMyZNmhh1OjQkgXAE+vT5Xl6z+/btCxfVVeefPHkiWrT4TIqPXiu7qyqShSEBEjBN4J9/tst+oF27Nqa3eDXtTJwT2Lp1iyw7FlRlIAESsIYAxIwcObKJDRs2WJOgQ1LBg0Es/PxGHD7mEK/pZrwIOELM+PXXX+QF/Omnn5jmgpsK/BiGDx9qOi0mQAKhCKxfv05eZ2pb4JcvX4aK6orjEApTU8+Ltm2/luWuUaOaK8rFQpAACZCAGQIffVRWtokdO3aQW1i6eYt4/OFAXzds2BCBRdpxr7Vjxw4z+GhLAiTgQ2D//n1CbRk7Zsxo8ejRI5+z7vuINuXo0aPim2/ay/akbNkPBZYNYCABXwIUM3xp8DMJWEhgwYL5onTpkrIBhpI+fPgwsX37Nlc1xJmZmWL58mWievVqspy4ef3yy1bi1q1bFpJkUiRAAiTgTALYVa1586Za+1inTi2xevWqqNb+siuBe/fuyb5t8OBBWjnffbeMWL58uV1dpl8k4FgC2Dq6cOFC8reGB2bdu3eVvz83CaUYkT937hy/zRtatPicSwQ49qqNreOOEDPS09PljzZnzuwCF3i0AT90dVMxZcrkaJNxpN3NmzfF1avpjvTdyU7fv39fTJ06RVSuXFG7yStSpLDo2PE7geG36JROnz7liCJiDvTJkyfEjh3/SN+rVKkk0JFCwIBY89VXX4rk5GRufRzn2nz27JnAekDHjx+Pc87uzA5PunCd8+mPO+s3EaVC27lnzx7RsmULbVe2QoUKShEY/cDu3UnymnPKnxH8PjCNEL7jian6Y4W+oEqVymLGjN8FdpGzY7hx44bYt2+vHV1zpE9Xr14VmZk3HOm7k52+ffu2wNpsVatW1u4tixcvKv/jDBs2VLYnkez6mEgWqs9dv369bFPee+9dbWRXvnx5RP36dQXOYRozQ3wJHDx4wBH/HR0hZuCm8v3335U/WAzfjzYcOZKi/eid8gcy2rIG2kG86dKlc+Bhfo8TAdykpqSkiCFDBov3339PoIHGjR9eWNy2Vq0a8jV+/Dh5I7hq1Sq5PgzWiMHr6dOnMff03r27Wp5nz56VfuCmFDes8K9q1Sp+PhcuXFC0bv2VWLZsqThx4kTM/WMGwQmkpaXKesHTXgbzBCDI4XeZlJRkPjGmQAIBBLAYKLaHb9WqpUAbigXJVV+A6Xloa0eMGK61v2lpaVq7jBEQsQ5Pnz7R8kPfg5F36AcwpF31U8pfvGOx53LlyoqRI0cI3GPZPcDPvn372N1Nx/jXq1cPMW7cT47x122O4g/+gQPJ4ocfBoi6dWtrU1Dw28ybN7f2m8V0ffyOZ82a6ff7fv78ecyR4D+cupfFO/zAC2vLoU0pX76c1gbioTXaxU6dOgr4fO7cuZj7xwxCEyhVqoRISTkcOoJNzjhCzAArtaBiiRLFxK1bNyPGh6cETZs2lj8YzGG161ODiAtm0IBihkFQcYqGpxmbNm0UEC/at28rPv64vtaY+94oqs942tWq1Rd+L6xPsXr16ohfyDMwLXzPlStHSB8wAgN+4rVx4waRlLQrTqSYTTgCFDPCEYrsPMWMyHgxtjkC//zzj1i7dq3Wvqq1JlTb7/uOPyfB2u7JkydF3A+g78CUwMD0KlYsH7IfgC8NG34qfUWe6MMwjcZJgWKGtbVFMcNanmZTe/z4sfxdYhch3K9Vq/bfQyjftkR9rlu3jq4NQJswb97ciNsUPKwLbE/wvWTJ4lm2KW3atBZdu3aRfh88eNAsAtpbSIBihoUwkRSeTmAoO36A+HGePn3acA54mtGoUUPtx7Rs2TLDtm6JSDHD3jWJRdOePHksX1ilGnMF8Ro06EfxySf1tVc40UN1UEbfsUOQb/r4jBWjVf6Y1gW/4jEyxN41ZF/vKGZYWzcUM6zlydQiI4C2Fm3uhQtpWjuMP+CB7bRaj8loW59VPIwODEwfQ9VVP4CdSVT/5PTFrClmRHY9hotNMSMcocSexxQ39dvFKCv1m+7Zs4ffb75mzRraf6Ss2gqj57BIaWCbgmkxKv/Dhw9rfmGRTwZ7EqCYEYN6+eWX6ZqggWH6o0ePknPFQ82jysjIEFiEsUyZ0tqPtEaN6p78Y0YxIwYXZAKSRKOPeZBZvTZv3iSvdyyWlFU8nMO8SwZnE6CYYW39UcywlidTiw0BjFAN175jFAX+fGBNjqzi4mGRVwLFDGtrmmKGtTwTlRqmm2TVRqhzGDnWq1fPsHEx+pjB+QQoZsSoDiFoBCqDWAAHIy8CX/ny5fWLi6H6WAjTi2HLls1S2PFi2b1WZizOht9I+/btvFZ0T5YXO8p0795NHD58yJPlt7rQ+GMHnlg3hoEEnEwAgjb6gsuXLzm5GJb6jik9S5cusTRNLyeG9V82bPjbywg8VXaMuBg+fKinyuzlwg4aNFBuKW53Bo5ZM8MX5LZtW8POwfIVPLDSNrbF9KqQ4cuOn91PgGKG++uYJSQBEiCBcAQgZjRs2CBcNJ4nARIgAUMEKGYYwsRIcSbgSDEDjLAOBobTN2jwqShT5h2/ERgQMjA0BiMxBg78kUPp43xRMbvEEqCYkVj+zJ0ESIAE7ECAYoYdaoE+kIB7CFDMcE9duqkkjhUzfCsBW/0cOXLE74Wh1wwk4EUCFDO8WOssMwmQAAn4E6CY4c+D30iABMwRoJhhjh+tY0PAFWJGbNAwVRJwJgGKGc6sN3pNAiRAAlYSoJhhJU2mRQIkQDGD14AdCVDMsGOt0CcSMEGAYoYJeDQlARIgARcQwO4E9erV5ZoZLqhLFoEE7EKAYoZdaoJ++BKgmOFLg59JwAUEKGa4oBJZBBIgARIwQQALnmP9MC4AagIiTUmABPwIUMzww8EvNiFAMcMmFUE3SMAqAhQzrCLJdEiABEjAmQSUmIEt6xlIgARIwAoCFDOsoMg0rCZAMcNqokyPBBJMgGJGgiuA2ZMACZBAggkoMWPBgvkJ9oTZkwAJuIUAxQy31KS7ykExw131ydKQgKCY4b2L4NWrV3K7au+VnCUmARIIRuD8+fNymgnFDD2du3fv6g/yCAmQQFgCFDPCInJVhKdPn4rHjx/bvkwUM2xfRdY4+NdfC8XYsWOsSYyp2JoAxQxbV4/lzqWnp4vq1auJ1atXWZ62FxM8fvy4qFmzujh8+LAXi88yu4TAL79Mp5gRpC5nzZophg4dEuQMD0VDYMKE8WLu3DnRmNLGgQQoZjiw0ky43KDBJyIlxf73QhQzTFSyk0ynTJksunTp7CSX6WuUBChmRAnOoWZpaanyTwvFDGsqMDk5WfJMSkqyJkGmQgIJIKDEjJ07dyQgd/tmOXLkCNG3bx/7Ougwz3r16iHGjfvJYV7T3WgJUMyIlpwz7UqVKkExw5lV506vKWa4s16DlYpiRjAq7j1GMcPauqWYYS1PppYYAsOHD5WiHLZoZfiPAMWM/1hY8YlihhUUnZMGxQzn1JUVnlLMsIIi07CMAMUMy1DaPiGKGbavIksdpJhhKU5BMcNankwtMQSqVatCMSMIeooZQaCYOEQxwwQ8B5pSzHBgpZlwmWKGCXg0tZ7A1KlTRPfuXa1PmCnajsCjRw9FuXJlRfv27WznGx2ynkBaWprIkSObWLNmtfWJezDFAwcOSJ67d+/2YOlZZLcQgJjRpEljgcWBGf4jMHr0KNG/f7//DvCTKQLff99bjB8/zlQaNHYOAYoZzqkrKzwtU6a0SElJsSKpmKbBNTNiipeJk0BiCGABQ4oZiWHPXEmABEggkQQuXbokChUqIDp0+DaRbjBvEiABlxGgmOGyCnVJcShmuKQiWQwS8CVAMcOXBj+TAAmQgHcIHD16VE4x4UKX3qlzlpQE4kGAYkY8KDOPSAlQzIiUGOOTgAMIUMxwQCXRRRIgARKIAYHly5dJMWPr1i0xSJ1JkgAJeJUAxQyv1ry9y00xw971Q+9IICoCFDOiwkYjEiABEnA8gYEDfxS5c+cUx44ddXxZWAASIAH7EKCYYZ+6oCf/EaCY8R8LfiIB1xCgmOGaqmRBSIAESCAiAvXq1RXFihWJyIaRSYAESCAcAYoZ4QjxfCIIUMxIBHXmSQIxJkAxI8aAmTwJkAAJ2JRAkSKFRNOmjW3qHd0iARJwKgGKGU6tOXf7TTHD3fXL0nmUAMUMj1Y8i00CJOBpAgcPHhQ5c2YXgwcP8jQHFp4ESMB6AhQzrGfKFM0ToJhhniFTIAHbEaCYYbsqoUMkQAIkEHMC8+fPk4t//v33+pjnxQxIgAS8RYBihrfq2ymlpZjhlJqinyQQAQGKGRHAYlQSIAEScAmBb7/9RuTJk0ucO3fOJSViMUiABOxCgGKGXWqCfvgSoJjhS8PFnxcuXCDGjh3j4hKyaL4EKGb40nD35/T0dFGjRjXxzz//uLugcSrd8ePHJc/Dhw/HKUdmQwLWEHj58qW8dtEeMAQnMGvWTDF58qTgJ3k0YgITJowXc+b8GbEdDZxJgGKGM+stWq+bN28qTp8+Ha153OwoZsQNdWIzmjJlsujSpXNinWDucSNAMSNuqBOeUVpaqhxWvnr1qoT74gYHkpOTJc+kpCQ3FIdl8BCBp0+fymv3669be6jUkRV15MgRom/fPpEZMXZIAr169RDjxv0U8jxPuIsAxQx31We40pQqVUKkpNj/wQ7FjHA16ZLzEDPKlSsrevfuKbZu3WqoVP3795PxYaNeV65cCWubmpqqxVd2a9asDmuHCH///bfO9syZM2Ftr1+/rrP766+FYe0QYefOHTrbQ4cOhbV98OCBzg5PfYwELNKm2Kh3I3+eXr9+rbObOnWKLstgYsapUyd1tps2bdTZBjswcOCPOtsLF9KCRfU7dunSJZ3dihXL/eKE+jJmzGid7YkTJ0JF147fvHlTZ4d55EbCnj17dLYHDhwIa/rkyROd3W+//RrWDhHQUahrQL0bHWXRp8/3AsPK33rr/wTFDEO4w0ZSYkarVi1lvdy/fz+szeHDh3R1uGPHjrDUzGozAAAgAElEQVR2iLBo0V8624yMa2Ftz549q7Nbv97YOglr167R2Z4/fz5snmj/1TWq3vv16xvWDhG2bdumsz169GhY27t37+jskPezZ8/C2u7fv09nu2/f3rB2iDB37hyd7Z07t8PaHjt2TGdntM9dtmypzjaSPrdx44ayLahfv67wSp+La+HRo0dh60X1udWrV6OYEZaW8QgQM2rVqiGv25kzZxgy/P3333TX+ZMnj8Paoi9W7Y56x72tkbBgwXydbWZmphFTMWjQQD/b0aNHGbJbsWKFnx18vnjxgiFbjKRWZcT7jz/+YMhu8+ZNfnawPXnypCHbadOm6mxfvXrlZxtMzNi9e7fOzsh9ExKePXuWzjbaPnfixAl+vob6YmWfO2zY0FDZ+B2Pts9FIhj95HstxLrPRZ6//vqLzDNv3twUM/xqkl8SSmDv3r1ymgkaSPyQjQT8gBDf95WRkRHW9PLly342sP/jj9lh7RBh586dOlsjf5rxB9bXT3yePv1nQ3mi0Q20PXky/J9m3EAF2kFYMHKTffz4MZ3tv//+G9ZfiBmBeWLIbGDjH0zMSE09r7NFB28k4IYhMF8jN9lXr17V2Rm94Zkx43edrZF54Hfu3NHZ/fzzNBHYKQcrN/6UBpYTf07CBTwRDbQDs8ePw9+gnTp1SmebnLw/XJbyPJ6IqXyRDoN5AriuFVO8P3z4MGyiuFn0tcHnpUuXhrVDBAgQgbZGbrIvXLigs8MfcCNh+/btOttdu3aGNb1+PUNnN378uLB2iLBv3z6d7aZNm8Laom0L5IPvz58/D2t75MgRna1R0W/VqlU623v37oXN8+zZMzo7o33uxo0bdbaR9LnvvvuOFDOGDBnsmT4X14KRdta3zzVy3YWtaEaQBDZs+Fu7ZpcuXWKIypIlizUb9ds2MpQdfbGKr97nzZtrKE/8mVQ26h39vZEQeP8DMcZI2LJlsy7PPXt2GzEVuE9SfuLd6NQoCAu+dvi8bZuxB5i4Hwy09b1vOn/+nMidO6cYPtz/Dzwe/gXarV271lA5ly9fprM9ceJ4WNtgfe6ff/4R1g4RgvW5Bw+Gf2gVrM81+j8j2j4X/uL/ky/fWPe5yBN9lsrz2rXwD1cMgY9hJI7MiCFcJk0CiSIQTMxIlC/MlwRIgARIILYEMFIQoy/r1atjSOiJrTdMnQRIwG0ENm7cIMXSQDHDbeVkeZxHgGKG8+qMHpNAWAIUM8IiYgQSIAEScA0BTJ/BdLOePXu4pkwsCAmQgH0IUMywT13QE38CFDP8efAbCbiCAMUMV1QjC0ECJEAChghgylm2bP+Ta5MYMmAkEiABEoiAAMWMCGAxalwJUMyIK25mRgLxIUAxIz6cmQsJkAAJ2IFArVo1RYEC+e3gCn0gARJwIQGKGS6sVJcUiWKGSyqSxSABXwIUM3xp8DMJkAAJuJcAFv/FqvPYWYKBBEiABGJBgGJGLKgyTSsIUMywgiLTIAGbEYCY0bhxI0M7eNjMdbpDAiRAAiQQAQFsqYj1MrCTAQMJkAAJxIIAxYxYUGWaVhCgmGEFRaZBAjYjADEDN7dPnjyxmWd0hwRIgARIwEoCderUFmXKvMP23kqoTIsESMCPAMUMPxz8YiMCFDNsVBl0hQSsIkAxwyqSTIcESIAE7EvgwoULIkeObKJPn+/t6yQ9IwEScDwBJWaMGDHc8WVhAdxFgGKGu+qTpSEBSYBiBi8EEiABEnA/gX79+spReLt27XR/YVlCEiCBhBFQYsbp06cS5gMzJoFgBChmBKPCYyTgcAIUMxxegXSfBEiABMIQePTokfjgg/fk6969e2Fi8zQJkAAJRE+AYkb07GgZWwIUM2LLl6mTQEIIUMxICHZmSgIkQAJxI7B37x45KqN3715xy5MZkQAJeJMAxQxv1rsTSk0xwwm1RB9JIEICFDMiBMboJEACJOAwAl980VKKGVg3g4EESIAEYkmAYkYs6TJtMwQoZpihR1sSsCkBNY+au5nYtILoFgmQAAmYIJCeni6KFCkk6tSpJV6+fGkiJZqSAAmQQHgCFDPCM2KMxBCgmJEY7syVBGJK4Pfff+PWrDElzMRJgARIIHEElixZLNv4yZMnJc4J5kwCJOAZAhQzPFPVjisoxQzHVRkdJoHwBChmhGfEGCRAAiTgRAKvXr0SlStXFAULvi3u3LnjxCLQZxIgAYcRoJjhsArzkLsUMzxU2SyqdwhQzPBOXbOkJEAC3iKwdesWOSrj669be6vgLC0JkEDCCFDMSBh6ZhyGAMWMMIB4mgScSIBihhNrjT6TAAmQQNYEXr9+LVq3/krkyZNLHD9+POvIPEsCJEACFhHo2PE7KaKePn3KohSZDAlYQ4BihjUcmQoJ2IoAxQxbVQedIQESIAFLCEDAeOut/xN16tS2JD0mQgIkQAJGCLRr14ZihhFQjBN3AhQz4o6cGZJA7AlQzIg9Y+ZAAiRAAvEmMGbMaPmHYt26tfHOmvmRAAl4mADFDA9Xvs2LTjHD5hVE90ggGgJKzEhKSorGnDYkQAIkQAI2I3Dr1i1RsmQJUaVKJcFtt21WOXSHBFxOgGKGyyvYwcWjmOHgyqPrJBCKgBIz5s6dGyoKj5MACZAACTiIwPjx4+SojHnz2K47qNroKgm4ggDEjNy5c4rU1POuKA8L4R4CFDPcU5csCQloBChmaCj4gQRIgAQcT+DGjRuiePGiIleuHCIzM9Px5WEBSIAEnEUAYkbt2rWc5TS99QQBihmeqGYW0msEKGZ4rcZZXhIgATcTmDx5khyVMXbsGDcXk2UjARKwKQGKGTatGLolKGbwIiABFxLYv3+fvPHlNBMXVi6LRAIk4DkCNWtWF4ULFxRXr171XNlZYBIggcQToJiR+DqgB8EJUMwIzoVHScDRBO7cuU0xw9E1SOdJgARI4A2BjRs3imzZ/ieGDBlMJCRAAiSQEAIUMxKCnZkaIEAxwwAkRiEBpxGgmOG0GqO/JEACJKAn8OzZM4FRGcWKFRE3blzXR+AREiABEogDAYoZcYDMLKIiQDEjKmw0IgF7E6CYYe/6oXckQAIkYITA5s2b5Ci7oUOHGInOOCRAAiRgOYHHjx/L0WFcANRytEzQAgIUMyyAyCRIwG4EKGbYrUboDwmQAAlERgCjMurVqyPy588rbt26FZkxY5MACZCARQQgZrz11v9xNxOLeDIZawlQzLCWJ1MjAVsQUGJGmzZf28IfOkECJEACJBAZgalTp8g/EKNGjYzMkLFJgARIwEICFDMshMmkLCdAMcNypEyQBBJPQIkZn3zyceKdoQckQAIkQAIREbh586YoVKiAHJVx7dq1iGwZmQRIgASsJKDEjMGDB1mZLNMiAUsIUMywBCMTIQF7EaCYYa/6oDckQAIkEAmBSZMmylEZI0eOiMSMcUmABEjAcgJKzJg5c4blaTNBEjBLgGKGWYK0JwEbEkDH8+GH7wuOzLBh5dAlEiABEsiCwOPHj+SojKJFi4irV69mEZOnSIAESCD2BChmxJ4xc4ieAMWM6NnRkgRsTaBVq5YUM2xdQ3SOBEiABPQExo4dI0dlDBz4g/4kj5AACZBAnAlQzIgzcGYXEQGKGRHhYmQScA4BihnOqSt6SgIkQAIgcObMGVGqVAlRuXJF8ejRI0IhARIggYQT2LlzpxRYOc0k4VVBB4IQoJgRBAoPkYAbCFDMcEMtsgwkQAJeItCuXVv5p2HZsmVeKjbLSgIkYGMCc+b8STHDxvXjddcoZnj9CmD5XUsAYkaBAvk559q1NcyCkQAJuInA8ePHRZ48uUWFCuXcVCyWhQRIwOEEKGY4vAJd7j7FDJdXMIvnXQIQM9566/9EWlqqdyGw5CRAAiTgEAKtWn0h8uTJJTZu3OAQj+kmCZCAFwgoMQOCKwMJ2I0AxQy71Qj9IQGLCFDMsAgkkyEBEiCBGBNYvHiRFJ/btPk6xjkxeRIgARKIjIASM+7duxeZIWOTQBwIUMyIA2RmQQKJIDBnzhyOzEgEeOZJAiRAAhEQePr0qahUqaLImTO7OHz4cASWjEoCJEACsSdAMSP2jJlD9AQoZkTPjpYkYGsCq1evophh6xqicyRAAiQgxNq1a2Rb3bFjB+IgARIgAdsRGD58mGyjODLDdlVDh4QQFDN4GZCASwlQzHBpxbJYJEACriFw7do1Ubx4UVGsWBHx+PFj15SLBSEBEnAPgY8/rkcxwz3V6bqSUMxwXZWyQCTwhoASM6ZNm0YkJEACJEACNiQwbNhQ+SdhwoTxNvSOLpEACZCAEBAz8uXLIx48eEAcJGA7AhQzbFcldIgErCGgxIyxY8dYkyBTIQESIAESsIzAv/8eFLly5RA1alQTt2/ftixdJkQCJEACVhKAmPHll62sTJJpkYBlBChmWIaSCZGAvQikp1+RC8pRzLBXvdAbEiABEnj9+rVo0qSRHJWxZs0aAiEBEiAB2xKgmGHbqqFjXDOD1wAJuJtAnjy5BMUMd9cxS0cCJOA8Atu2bZNCRqdOHcWLFy+cVwB6TAIk4AkC2G2pWrUqHJnhidp2ZiE5MsOZ9UavScAQAYgZmJPNQAIkQAIkYA8CmHf+0Ucfipw5c4izZ8/awyl6QQIkQAJBCJw/f14Kr5xmEgQOD9mCAMUMW1QDnSCB2BCAmPH+++/GJnGmSgIkQAIkEDGBceN+kn8OevXqGbEtDUiABEggngQoZsSTNvOKhgDFjGio0YYEHEKAYoZDKopukgAJeILAhQsXRMGCb4uSJYuLV69eeaLMLCQJkIBzCSgxA4vKM5CAHQlQzLBjrdAnErCIwHffdeDIDItYMhkSIAESMEugefNmIkeObGLOnD/NJkV7EiABEog5ASVmcKHimKNmBlESoJgRJTiakYATCPTu3ZNihhMqij6SAAm4nsCuXbtE9uxvicaNG7m+rCwgCZCAOwjMmDGDuy65oypdWwqKGa6tWhaMBISAmFG8eDFx+/Zt4iABEiABEkgQAexYUq9eXVGoUAGxb9++BHnBbEmABEggMgKjR4+imBEZMsaOMwGKGXEGzuxIIJ4EIGa89db/iT17dsczW+ZFAiRAAiTgQ2Dq1KmyLe7fv5/PUX4kARIgAXsTgJiRM2d2kZp63t6O0jvPEqCY4dmqZ8G9QOD333+jmOGFimYZSYAEbEvg2rVr4t133xG5c+cUV69eta2fdIwESIAEAglAzMibN3fgYX4nAdsQoJhhm6qgIyRgPYH9+/dRzLAeK1MkARIgAcMEvv32G9kO//HHbMM2jEgCJEACdiDQseN3FDPsUBH0ISQBihkh0fAECTifgBIzpkyZ7PzCsAQkQAIk4DACu3cniXz58oiPPvqQW7E6rO7oLgmQgJCjyjgyg1eCnQlQzLBz7dA3EjBJQIkZPXp0N5kSzUmABEiABCIlUK1aFZErVw6RnJwcqSnjkwAJkEDCCWCKXP369RLuBx0ggVAEKGaEIsPjJOACAmlpqaJAgfyCYoYLKpNFIAEScBSBzZs3yeklX3/d2lF+01kSIAESUAQgZnz/fW/1le8kYDsCFDNsVyV0iASsJVC27IcUM6xFytRIgARIIEsCd+7ckdtiFy1amFtjZ0mKJ0mABOxK4NSpU3K9DIoZdq0h+gUCFDN4HZCAywlAzMifP6/LS8nikQAJkIB9CIwaNVKOyhg+fJh9nKInJEACJBABgaSkJNmOUcyIABqjxp0AxYy4I2eGJBBfApUrV5J7hMc3V+ZGAiRAAt4kcPjwYbkNa+XKFQVGaDCQAAmQgBMJKDFj8+bNTnSfPnuEAMUMj1Q0i+ldAuPHj6OY4d3qZ8lJgATiTOCLL1rIp5lLliyOc87MjgRIgASsI7Bw4QLZlnEBY+uYMiXrCVDMsJ4pUyQBWxGAmJEjRzaRmZlpK7/oDAmQAAm4jcDWrVuleNyuXVvx+vVrtxWP5SEBEvAQgW7dulLM8FB9O7WoFDOcWnP0mwQMEoCY8dZb/ydWrFhu0ILRSIAESIAEIiXw7NkzUaFCOTnF5Pjx45GaMz4JkAAJ2IoAxAwsYpyenm4rv+gMCfgSoJjhS4OfScCFBA4d+pdihgvrlUUiARKwF4FVq1bKtrZLl872cozekAAJkEAUBLp06STKlSsbhSVNSCB+BChmxI81cyKBhBC4dOmSvMH++edpCcmfmZIACZCA2wlcu3ZNFClSSJQoUVw8fvzY7cVl+UiABDxAIHv2tyhmeKCenV5EihlOr0H6TwJhCCgxo0WLz8PE5GkSIAESIIFoCPzwwwApGk+aNDEac9qQAAmQgO0IQMzo2LGD7fyiQyTgS4Bihi8NfiYBFxJ4/vyZqFWrpqCY4cLKZZFIgAQSTuDy5cuiYMG35ciM+/fvJ9wfOkACJEACZgk8efJEQMyYOHGC2aRoTwIxJUAxI6Z4mTgJ2INAw4YNRLVqVcXTp08tcejEieNi+fJl8rVt2zZDaR48eECzUbZ//73ekO3Ro0d1tv/+e9CQ7dmzZ3S2e/bsNmR76dJFne327cbKe/36dZ3t33//bSjfu3fv6mxXrlxpyBY3IIqv7/vz588N2fvaqM9G/6CtW7dOl7eRXXTu3Lmjs0PeV65cCeuzmfJitwlVRt/3Bw8ehM0XEdatW6uzv3nT2K5BW7Zs1tkaKS/y3bVrp842NfW8IZ+xxZ5vWfH5xIkThmyPHDmis8WaPEbC5s368u7du8eIaYjyphqyTU7er/P55Emj5U3R2R46dEiXb4cO38hRGbgeVDh9+rTOdu/evep0lu8XLlzQ2e7Y8U+WNupkRsY1ne3GjRvV6Szfb9++rbNdvXpVljbqJKbWBF5X+P7ixQsVJeR7sPLC9uHDhyFt1AlM7wnMd9MmM+VdrZLO8v3Ro0e6fOHHy5cvs7TDScQJ9BnfHz0KX17Yr1mzWmd/69atsPkiwqZNm3S2V69eNWS7c+cOnW1aWlpY21DlPXXqVFhbRFi9Wl9eXKtGAq6FQNa4ZowE/OYCbXGtGgn79u3T2Z4+bay8hw8f1tmmpKQYyVacPHlSs926dYshm1CRli1bKts1ihmhCPG4XQhQzLBLTdAPEoghAYgZ2NHk5s2bluQyevQoqdg3atRQfP99b0NppqQcFojv+2rfvq0hW9ww+drhs9E1QPBHOdB2xIjhhvJ99eqVaNzY3+c+fb43ZBusvN98096QbbDyNm/e1JBtsPKi/EZvlANZ4bvRP9lff91ax/r48WNh/Yao0L17N53t7t1JhmwHDx6ks8WfjXAB+eJGLbDMRldunz17ls7WqDAQrLxGRbZBgwbq8jUqlAUr78KFC8OhkueDlfeXX6Ybsl22bJnOZ7QjRgK2Ow2so40bNxgxFRBRA20XLfrLkO25c+d0tr/++ouf7YEDybJtbdjwU7+tWCHiBeY7ZsxoP9tQX4KVd8CA/qGi+x2HyBuYb8eO3/nFCfXl7NmzOlujI/rQtwTmi+9GBHQIrcFsMzIyQrmqHUcb/eWXX/jZd+rUUTuf1Qf8/rHAoW/eLVu2yMpEOwfbH3/8wc8W6WBHm3AhVHkhgBsJX3zRUpcvxDMjoXNn//LCZwh+RkKw8m7evCmsKVj99NNYnc9LliwJa4sIv/32q84WDymMhMWLF+lsDxw4YMRUQAT0vTbwGSK0kbB//z6dLcQBIyFYeWfOnGHEVKjyFi9eVFSrVsWQTahISszYtWtXqCg8TgK2IEAxwxbVQCdIILYEZsz43XIxI2/e3LF1mqmTAAmQgI0JYNTBZ581k23rli3mnoLauJh0jQRIwGEEOnT41rSY8eeff8i2zejDDIchorsuIkAxw0WVyaKQQCgCCxbMl52S0ScwodJRx/F00uiTQmXDdxIgARJwE4E9e/bIdrVu3dqGnsi7qewsCwmQgH0JzJ8/X0yYMN6Ug5991pxihimCNI4XAYoZ8SLNfEgggQSUmGF0SHgCXWXWJEACJOAIApiSgOl7WFuHgQRIgATcRABiRuXKFbnVtJsq1aVloZjh0oplsUjAlwAWUsNNN8UMXyr8TAIkQALREcBiiFjpH2voYE0ABhIgARJwCwEsgv3ee2XkmmFuKRPL4V4CFDPcW7csGQloBLDgGMSMRo0aaMf4gQRIgARIIDoCTZo0Evnz5xXnzxvbRSa6XGhFAiRAAvEncOPGDXnPaHQB4Ph7yBxJ4D8CFDP+Y8FPJOBaAljxHStxm13d2rWAWDASIAESMEgAO6TkyJFNdO5sbNcMg8kyGgmQAAnYggDaODwA++svYztd2cJpOuFZAhQzPFv1LLjXCGB168KFCxneZtNrfFheEiABEghH4OXLl1IYfvvtfOLixQvhovM8CZAACTiOwM8/T6OY4bha867DFDO8W/csuccI9O7dS3ZOx44d81jJWVwSIAESsIZAcnKybEd79eppTYJMhQRIgARsRkCJGffv37eZZ3SHBPQEKGbomfAICbiSwNatW+RNeEpKiivLx0KRAAmQQCwJYLrel1+2kgt/pqWlxjIrpk0CJEACCSPQpEljeb+IkWgMJGB3AhQz7F5D9I8ELCKgxIxBgwZalCKTIQESIAHvENi1a6e8we/bt493Cs2SkgAJeI5AlSqVxaeffsKdmjxX884sMMUMZ9YbvSaBiAlgR5OiRQsLihkRo6MBCZAACYjPPmsucuXKIVJTOSqDlwMJkIA7CaSnp8t7xY4dv3NnAVkq1xGgmOG6KmWBSCA0gWLFioiPPvowdASDZx4+fCgyMzMNxmY0EiABEnA2gb1794icObOL2rVrObsg9J4ESMD1BO7duydu374dVTmPHDkiR6BNnjwpKnsakUC8CVDMiDdx5kcCCSSAHU0wOsNsGD16lMibN7fZZGhPAiRAAo4g0K1bV3mDv2bNGkf4SydJgAS8SwD3etWqVYkKwNq1a2Rbt337tqjsaUQC8SZAMSPexJkfCSSQwODBg2QnhfUzzASKGWbo0ZYESMBJBG7cuCEX/WzQgHPInVRv9JUEvErAjJjx448/yOl0hw8f8io+ltthBChmOKzC6C4JmCGwZMkSKWZs2UIxwwxH2pIACXiHwNChQ2S7uWnTJu8UmiUlARJwLAEzYkajRg1EiRLFHFt2Ou49AhQzvFfnLLGHCRw/flzelA8Y0N8UBY7MMIWPxiRAAg4hcOfOHVGoUAFRunRJgc8MJEACJGB3AmbEjMKFC8n2zu5lpH8koAhQzFAk+E4CHiCARaHef/9d8e2335gqLcUMU/hoTAIk4BACq1evkgLwTz+NdYjHdJMESMDrBKIVMzCl7u238wmMRmMgAacQoJjhlJqinzElgCduN2/ejGkeZhK/cuWyePLkiZkkNNvq1avKVfmfPXumHYv0A3yBMMJAAiRAAm4mULNmDSlmWNX+2oEVtum+ePGiHVwJ6oPd++OgTvMgCdiIwKNHj8SDBw8i9ghT6d566//E1KlTIra1gwHEGDvfm2Jb71evXtkBlat8oJjhqupkYaIh0L59O1GmzDti7ty50ZjH1AZboFauXEkUKVJInD171pK8xo4dIzure/fuWpIeEyEBEiABNxLAFoW5c+cU7dq1Ea9fv3ZFEfEnpUKFcqJjx+9sWZ62bduIMmVKi3nz5tnSPzpFAm4mgPYBYsbJkyccV8xPPvlYlCxZXJhd4D4WBU9NPS/v5THqxU3CeCxYRZMmxYxoqNHGVQRq1qwuG287ihn379+XvqFzsUrM+PXXX2SavFl01WXMwpAACVhMAKv6o+110xaFqkx2FTMwchDM2T9ZfDEzORIwQAAP97BmRnp6uoHY9oqCh35oO+woZkAcgm94Ucyw/rqhmGE9U6boMALRiBnXr18PWspbt24JDOG1KsRCzMB0GjSoEyaMt8pNpkMCJEACriNQpEhhuaq/W0ZloIKiETNu3bopXrx4EbR+Q/WFQSMbOEgxwwAkRiGBGBDAvev7778ncE/sxBCpmPHy5cuQ08utbtcoZsT2iqKYEVu+TN0iAn/9tVAOjX333XeEerVr11b4NjgnT54UFStWkOfXrl2jy/nAgWTxwQfviapVK0u7H34YIOPmypVD/rmHGq3S7tKls7TH3F0cwzBjNPTYBQTfGzT4VEt/8eJFolWrlvJ4sWJFxDvvlBLlyn0kFixYICBGhAp79uwRX3zRQstT5T1r1ixpUqdOLTncVqm5pUqV0OL++ecfoZINexxlypcvj/j000/CxmUEEiABEvAigfXr14ls2f4nhg8fFvfi7969WzRs2EBr79E31KpVU2A3KhXQjjdr1lTGGTZsqDqsvV+/niHq168rz6OvWb58mfyMYc7oU9AHqD6nfPmPNDv0LTi+Zs0aceHCBYE1Q9CvoQ9GQJ+GBaAxVQXx8AcC7+jLkE+ocOXKFdG9ezctT5V3p04dpUn//v3kuZw53/THKl3E69r1TX8cKm0eJwESME8gMzNTtg34ncYiQBDF/a367av3fv36CjwIVGHgwB9lnAYNPtGJqE+fPhU9e3aX5ydOnCBNcH+OtNBeo20rVqyolodqv0+dOimP4b7/8ePH4ptv2sv7ayyUigDfZs+eLRo3bijjqfanRo3qYuXKldJG+ef7DrutW7eKRo3e2Kky4X3durUCggk+lyxZQvoG/zCNTsXbsGGDb3L8HCUBihlRgqNZfAjgidhvv/0qG4ESJYqL77/vLV9oYNBwFS9e1K+xGzlyhIxbrlxZcfXqVc3Jx48fiapVq4js2d8SmGaB0L17V5E3b26tAYSoge94tW79lYyDBhaND/74//jjAPkZ8XCTqEKePLmkH8o3DNPLmTO7jIubzMDFfuAL5gUjXZShQIH8WpmQ1qRJE2XSZct+KH1BPLxwTvmnyqB8iPS9ZcvPBdLPSmyJNE3GJwESIAE3EEC/06bN17J9PnXqVFyLlJSUJAoWfFugn+natYvsGz7//DORI0c2uX7H4cOHNU7df/8AACAASURBVH82b94s+zT0Ibt3J2nH0ef06tVD9hvffddB4A/AwoULZP+BdNCf4F31J0WLFtZsp06dKs9PnjxJoB9FXMSbM+dPGWfZsqUyT8xPV31ejRrVtH70zJkzWlrqA/pllEmlhT4SZUK6n3/eXEZDWfFd/SHx7Y+//rq1SorvJEACMSKAqdb4jc6aNdPyHNAmDRkySKZftuwHWtsBIRV5YjQI/vgjXLt2Ta59gePTpk3182XFiuUyfvny5URGRoY8B1EXbQfi44V1jvAdL4ikCFj/COcwvQ739yoeHooi4MEo/h98+OH7mm8tW7aQ7STizpypZ4LFRps0aSzTgi0eOKJNRJngw5Ili2WZ4Afu35EOXso3vGO3LAbzBChmmGfIFGJIYOXKFfLHX6VKZZ0yikYDDUOgilyhQnl5vFu3rppn2GYKcaHGBoasppkoMQM3e3iS1a1bF91cwpSUFIGVo33DoUOHZH7IE0+kfMPPP0+T5/C0C0//fAPm0kEdVyEW00yQdu/evaQPePLGQAIkQAIk8B8BtMNou+M93PrcuXNyW0T8oQ/sN5YtWyZ9wh8B36Da8rp1a4vbt2/LUxs3bpBxS5cu5Sf242S4aSZKzHjvvTIif/68Yv58/UKce/fqR2B8//2bPgV/LHzDzp07ZJnAE30fhBXfcPnyZd+vgtNM/HDwCwnEjcCYMaNlu3Hnzpt25P+xdxZuUtz+H/9Dfv3izuFQ9NDjcIq7lWJFixQvXqy4FYfi7m7FSnEpzhV3DpcWz+9555phdm/2bmV2d+Sd59nbvZkkk7wyM8m855NPzDywciwKCwbv0LRpE3lc/fLXsK7GPQNj79OnT8kkGBtnz54k9GLc7R1SmmaixAxYRCBfPBOo+6XK5/Dhw8kcPW/atFHGRxrvAKEE27GAANLqA/LWrybDaSZ6Oub/pphhPlPmaCIBvPHBzeL8+XPJcsXSctiHN0xKoUUk3LSUCvr773vE0aNHpeIaE5PD0BLBHzEDx8HbJF/zhr0LBxVaKbZ6ZRkDVHXDNaqTdz7hEjOUSIS3bwwkQAIkQAJfCKxYsVz2LdOmTfuyMQK/MI0Rfc3s2bOSHQ19T7FiReV+/TRKTH/EG0GkgwUEliWEUI5+UW+toTL0V8xAfrt371LJUv2+efOGLAOOizeWKqj+1ahOKo7+m2KGngZ/k0DkCMDaChZU4bDYxfg7Z87scuqad40wrQ73G4zbVfj8+ZOAVRm2169fV5apRYvm8n+96KHi41uNrY0cgCoxA/kNGTI4mcW0Ph/9748fP8hp40gHqxAVMOUPFti+6qTiqW+KGYpEeL4pZoSHK3M1gQDmuMFUC2ZfMAHz/sDbshI77t//MqUEh4YfC9x8YmNLyLlseNO1YcN6w1KpwZbRaibKMgN54WaYUoASizJi0AYBA34zkE7N60NapXyXLVsmmQJslHe4xAwMeGHGq0zsjI7NbSRAAiTgRgLwgYR7d6Qt1woWzC8tACHAe/d3+L9nzx9lufSDarTP2bNn5UMIhARYKqLs/fv3NWw6f8WMatWqpujMGuIKynTq1EnZ340aNVIeF8dWLxf27dunTaW8ceO6YXm8N1LM8CbC/0kg/ATwog3Wx7j3mR1gnYUxOMQSo/sahFD4msNUDX3AOFWNz9W9D/cHX6uB+CtmPH36xT+H/njq9+PHidICG+N4fDCdHfc1PFeogGlx2Na4cdI0ObXd1zfFDF9kzNlOMcMcjswlDARgWoabhT8fbxMvmLJizrNKa+QgTRVZ3SxTEzN8DWwTEx+JoUOHSIVWHU//rRcz1Ju3Ll2SnJ6pMvj6DpeYgeOVKVNKCkW+js3tJEACJOA2ApivjbdtqT3Mh4ML5lDr+w5fv/V9iiqHMuNGmkaNGniYOKs4+PZXzGjQoJ4+mcfvY8eOSeejvsqnxAw4EUUcmHb7Gyhm+EuK8UjAPAL79u2V16q/FlSBHBmOMH3dK/TbIXjA4lofYF2mnBZD7MVUPF/BXzFD+ebwzgfH7tOnt3yJqi+X+q0XM5TfDVjD+RMoZvhDKfg4FDOCZ8eUYSagxIz8+fNKMzOYmvn66D0hq2KpucS4EY0YMVxtTvYdipgBc1p4dccxsPoIzJPhMA7TTBo3bii36weeVhIz4CAOncTVq1eTMUltAzon8GUgARIgAScRUFZ9kydPjni1IGbAGtFXP6e2Hzx4MFnZVq9epT0wwKnm69evk8XBhlDFDDWXHW9x+/btI/u8d+/eSR8fatBPMcMQPTeSQMQILFiwQHTq1MHv440Z84u0nsCUD7ODEjOKFCmc4r2tYcP6yQ6N8Wm2bFnlvQ3WG9eu+R6vhiJmJCQkCIgluIfBhwfG8rdu3ZJjeeWHj2JGsuaxzAaKGZZpChbEm4ASM+D8E97lAwmYM4dBIVY9wQM7fsMc1iiEImZgSSjc/KDSejs2g/kZ9llVzIA/EZQPHvEDDViaDwNvBhIgARJwEgE87GO6xpUrlyNeLdxTsTKJ99vJ1Apy+/YtaaaNeelYehz39blz5xgmC0XMgIk4+lLkr/fbgQNh9TBsx4dihiF6biSBiBHAkqPx8XF+Hw9Tn/U+K/xO6EdEJWZAJAg0wGEofFPUqFFd3lvgu857rK3yDEXMqFq1iswf0/O8LTdgxYz7GsUMRdp63xQzrNcmLNF/BDBAw+AMN5GUTMu8gcFMGAII0p08eUJMmTJF/oZoYXQTDFbMwLy9cuXKyLyxeol3MBIzsLwTygUHbf44Ew3nNJPr16/JgbN+1RfvOvj6n2KGLzLcTgIkYFcCGMSqVTyiUQc1xWLhwoV+Hx79iBLVsVrIH38clIIDRHwjUSQUMQN5o/+qXLmSgDWGPhiJGfAzBWEopZcJ+jzwWzFYvDj5Kirecfk/CZCAMYFAxAyIjxACWrVqaZxZiFvPnTurOcvEfcKfgBeY8+bNk9YijRo1lL42SpQoLu8/a9euMcwiWDEDq6QoJ8r61QTVQYzEDExdx70Q9ytv8UOl039zmomehvm/KWaYz5Q5mkgA5rK4YXz7bXOfTn+8D4e4SNO5c5JfCggCdevWltvgpMw7tGz5rdxnZJKndwDq7TPj5csXmmOgFSu+OAZC/nBemi9fHpmv3jLj2rVr2vw/f+r0zz//aOttBzLA9a6jr//hXBUDzUADxYxAiTE+CZCA1Qn8+WeSV/1evX6MSlEnTZoo+4xixYpISwd/CjF9+q8yTeXKFYWabjlgwE9yW+3atZJ57Z8xY7rcBz8WmA7pHdTSrEY+M9RUFjjE817WUO+zQ1lmIO9SpZIcYftbJ7ViQefOHb2Lxv9JgAT8JBCImKHuexMmjPcz98Cjqaka/r48w2ohGMdDoDhx4oQ84JYtW6TjelivwVedd1BC6PDhP3vvkg78kR8+3uKDflzuvQLUH3988dmht8w4fvy4FGqRnz91whLUWCkG8ffu/T1Z+bghNAIUM0Ljx9RhJoBBEW5cuAFAkJg/f544c+a0/GCt+wED+nssl6SW1CtevJj0RqyKd+LEcZkH3hKdPOk53QQOj5A/lNklS5YIWFn89VfSGtYpiRnIG4IJ0ubJk1vs3r1blmvv3r0yr1y5YuQ+vZiBNL/9Nl9uN6oTVjtZvXq1Krb8Vo6GqlSpJHbu3CF27Nhh2tJZcF4ED9KprdTiUSAhBMUMbyL8nwRIwO4ElDBg5JMiEnWDlUW1aknmzrGxxQXmsav+Dt8Q4/X9CeaTwwQ7a9YsAisGqPD48WNt/vesWZ7LvOqXKIR4gnxhcaFCSmIGvPyr/hgvAVTZxo0bK03U1T69mIE4amqKd53mzZsrkFYfZs6cIftHzF9funSJ7K8D7Z/0+fE3CbiRQCBiBpxeYjx69OiRsKHCNYxpLDhO8+bNpE8Kdf/AtPAePbqLI0cOy+PjJZ6aLod7lD40a9ZU5oFVV7zF2EGDBsp9WElw/fp18r6mXkLq73veYgbyh/CLsuEFH54tULatW7eIrFkzCzWW14sZSAPRBGmM6jR48CCxa9dOfdG1lVng+wj33I0bN3js5z/BE6CYETw7powQgYMHD4gaNb6RD93qxqG+cXOcMiXJURsGcBhMYXDnvQwrbl79+/eTN52iRQtLZ2Wq+A8e3BflypXVbkrIWy19l5qYgaWjqlev5pEWx8fNGpYUyEs/+MQxMWDdsWO7iInJ6ZFO1al3716qaPL7yJEj2gBSxdEPFj0iB/jPpk0bZRmWL18WUEqo0pcvR35OeUCFZGQSIAESCIBAx44d5EomcPwWrYBjYyUuNfBX93x8Q3iGiICAfgRLHWI7BvHeAYN57IOjTqxUoAKmR+JBR5+vvs9JScxAHgcOHEhWNvS7ixYtFLDmQL7e/RPMzNVbU/1x8Rsm3PqAaaKYv6+Ph7owkAAJ+E/g7t274vp1/5ZDrl69qlxx6M2bN/4fIIiYsKyoUCHe49pW1zlEg1WrVspc8bIM2xEX9zl9uHLlimYRPXbsGP0uOSYtXPhrj/yVQJOamIGlaZX1iCoTRFgsdY3jYJu3mAHRBYKrsrhQ6dS3txADP0NK2EUcPCswmEOAYoY5HJlLBAj8+eef0qkZzE8x7xcDNEznUAE3I2zztrxQ+7HyCPbj8+zZM7VZfmMfLCKQ96pVq+T8POx4//69lgY3LqOAvHCTQtrFixcJWIEgPHz4QKbFGtpGAWa6KAsctSEtvvG/t/ku0uIGDvNgWIIgjpHvD6NjpLYNqjVuqs2aBe6YKbW8uZ8ESIAE7EQAg0vMy7ZCwBxriPLoG/DZs2eP0C9B/urVK9kXoD/wfkOJ8sOnBfbho95OqnqpfVgiHP2K3tkpxBSkwZtJXwH9LqaVwLwacfHghIA0+N+of8IceOxTdcIDC/43euCCo1FMaUG98Y3/GUiABMwngOsdIin8UkQiqPsAXkLi+oa1WdJ94Jp2eKyogm14QWkU8DIN+4181cHXHoRV5A3x5Pnz5zILTDdHGnx8LSgAERaCBdLCL8e5c+dkWvgeQjq8+DQK2I79qk5Lly6V/xuJQ2fPnhXjx48TEJD3799nlB23BUGAYkYQ0JiEBJxCADf1WrWS3u4ZiShOqSfrQQIkQAIpEcC87DRpvpIDzZTicR8JkAAJOIUArJDxQgsv4hhIwK4EKGbYteVYbhIwiYDyGaKfc21S1syGBEiABGxBQA3q4ZOIgQRIgATcQKBNm9ZSzIjm1Do3cGYdw0uAYkZ4+TJ3ErA8AUzfgTIPJ1AMJEACJOBGAl26dOag3o0NzzqTgEsJYApGzpzZRcWK8YZTw1yKhdW2IQGKGTZsNBaZBMwkAL8g8BwPL86YV8hAAiRAAm4j0LRpE1G2bGlhNM/ZbSxYXxIgAecT2LRpkxRwsWoSAwnYmQDFDDu3HstOAiYR6Nevr+zUsLY3AwmQAAm4iQBWrcKy3XXq1HZTtVlXEiABFxMYOXKEHPfB2TADCdiZAMUMO7cey04CJhHA8rdwfjdhwniTcmQ2JEACJGAPAvCaj6l2WNmDgQRIgAScTgAWubBEw9LIHz9+dHp1WT+HE6CY4fAGZvVIwF8CuXLlFOXLx/kbnfFIgARIwBEE1q5N8ui/dOkSR9SHlSABEiCBlAhgiVAIuFgalYEE7E6AYobdW5DlJwGTCAwaNEBkzJhBXLhAk0OTkDIbEiABGxCARQYG9gkJCTYoLYtIAiRAAqERGDx4kEifPq04depkaBkxNQlYgADFDAs0AotAAlYgcPToETmg79Gje6rF2b9/nxg3bmyq8RiBBEiABKxOoHPnTvLeB9NrBhIgARKwO4ENG9aLefPmGlbjzZvX0ul7iRLFDPdzIwnYjQDFDLu1GMtLAmEiAC/+sbHFRe7cMeLDhw8pHmX06FEic+aMKcbhThIgARKwA4H4+DjpAJRihh1ai2UkARJIjUCHDu0F7mtGYceO7VK8HT78Z6Pd3EYCtiNAMcN2TcYCk0D4CAwY8JPs5GB5kVKgmJESHe4jARKwIoFbt26Jdu3aiK1bt3gUD4N+DP69w8WLF7lctTcU/k8CJGB5AimJGe3bfy/HeVy9zvLNyAL6SYBihp+gGI0E3EDgyJHDspPr1atnitWlmJEiHu4kARKwKIH58+fLlZsqV64kpk6dIm7evCliY0tIMePVq1fi9OlTclUnCBzVqlURT58+sWhNWCwSIAESMCbgS8x49+6d9JUBZ+9cxcSYHbfajwDFDPu1GUtMAmEjgOkltWrVFFmyZBL379/3eRyKGT7RcAcJkICFCWA6XcmSJaRoC6efOXJkl79z5MgmihYtrG2PiysrHjx4YOGasGgkQAIkYEzAl5ixcuUKeY+DkMtAAk4hQDHDKS3JepCASQRmzpwhO7slSxb7zHHTpk3CH0ehPjPgDhIgARKIEoGjR49qogUEDe9PhgzpxKNHj6JUOh6WBEiABEIj8Ntv8w2XXcXLKtzvnj59GtoBmJoELESAYoaFGoNFIQErEPj8+bM0Q4QzUAYSIAEScBoB3OPatWubTMRQosaKFSucVmXWhwRIwOUEjh1LEnG7d+8mcA9kIAGnEKCY4ZSWZD1IwEQC8JmRLl0aceDAfhNzZVYkQAIkYA0Cp0+fNhQzWrVqKd6+fWuNQrIUJEACJGASgZYtv5X3vN27d5mUI7MhAWsQoJhhjXZgKUjAUgSOHDkineTVrVvbUuViYUiABEjADAKfPn0SDRvW9xA00qb9nzhz5owZ2TMPEiABErAMAfj/yZ07RpQvX84yZWJBSMAsAhQzzCLJfEjAYQQwtzJ9+rQpOgJ1WJVZHRIgARcRWLDgNw8xY8yYX1xUe1aVBEjALQQmTpwg73Vr1qx2S5VZTxcRoJjhosZmVUkgEAI7d+6Und/QoUMCSca4JEACJGALAli9KSYmh7zP5cqVU/zzzz+2KDcLSQIkQAL+EoCzT6xQB8uMBw98r1Lnb36MRwJWI0Axw2otwvKQgEUIYD3ymjVriGzZsoiHDx9apFQsBgmQAAmYR6Bfv75SzJg0aaJ5mTInEiABErAIgdGjR8l73MiRIyxSIhaDBMwlQDHDXJ7MjQQcRWDRokWyE/zpp/6Wqtfr16/FqlWr+CEDU84Bp76RT0hIMIWPk681mF9nzJhezJo1k6xSuJ/s2bPbUn2AmYW5ceMG2z6Ftnfy9W923bZv32bmqRlyXi9fvpAWGXnz5haJiYkh58cMSMCKBChmWLFVWCYSsAgBWGfkzZtHwAT73r27FimVELdu3ZIii1pKkd//Rx7/C54BnKM5McyZM4fnRQjnBe8rX66pqlWrOPESkXVauXIFrxNeJ6acAyVLlrDUdTJs2FBZrxEjfrZUuVgYEjCTAMUMM2kyLxJwIIG5c+cIePkfNGigZWoHMQNLx967d48fMgj6HMDbeDywOl3MuHbtWtCMeI3xHrN06RLhdDEDUyp5rvNcD+Uc2Lhxg7CSmIHpwfny5RHZs2cVz58/t8z4jQUhAbMJUMwwmyjzIwEHEvjmm2oiW7as4ubNG7J2sNjAVI9oBYgZWGmFgQRCIaDeyDpdzHDqNJpQ2p5p/SewbdtWx4sZDRrU8x8IY5KAAYE//vjDMmLG27dvxfjx46RYP3bsGIPSchMJOIcAxQzntCVrQgJhI7B161bZKdapU1t8/vxZwKFU5swZw3a81DKmmJEaIe73hwDFDH8oMY7bCVDMcPsZwPr7Q8BKYkaHDu3lmA0voejA3Z/WYxw7E6CYYefWY9lJIEIEPn78KOrUqSU7x+PHj1HMiBB3Hia8BChmhJcvc3cGAYoZzmhH1iK8BKwiZuCFU6NGDeV4bfXqVeGtNHMnAQsQoJhhgUZgEUjADgT27t0rvf5XqlRBDBjQn5YZdmg0ljFFAhQzUsTDnSQgCVDM4IlAAqkTsIqYcezYUSlklCoVK96+/Tf1gjMGCdicAMUMmzcgi08CkSTQt29v2UkWKJCPYkYkwfNYYSFAMSMsWJmpwwhQzHBYg7I6YSFgBTEDvsxKly4px2nx8XFhqSczJQGrEaCYYbUWYXlIwMIEYL5YqFAB2VHSZ4aFG4pF84sAxQy/MDGSywlQzHD5CcDq+0XACmLG9Om/yvEZVumimOFXszGSAwhQzHBAI7IKJBBJAlimDyuJlC1bRrx69SqSh9aORQegGgr+CIEAxYwQ4DGpawhQzHBNU7OiIRCItphx4cJ5EROTQ+TKFSOXGX706FEItWFSErAPAYoZ9mkrlpQELEOgadMmUv3H0l+w1oh0oJgRaeLOPB7FDGe2K2tlLgGKGebyZG7OJBBNMePDhw+iUKGCIk2arwRWn2MgATcRoJjhptZmXUnAJAKYl1mqVNK8zIsXL5qUq//ZUMzwnxVj+iZAMcM3G+4hAUWAYoYiwW8S8E0gWmLG+/fvROvWreQLpl9+Ge27gNxDAg4lQDHDoQ3LapFAuAmcPHlSdp7woRFpQYNiRrhb1x35U8xwRzuzlqERoJgRGj+mdgeBaIkZWH4VPjKqVasiXrx44Q7YrCUJ6AhQzNDB4E8SIAH/CXz69EmMHDlCmjU2adJYvH371v/EIcakmBEiQCaXBChm8EQggdQJUMxInRFjkEA0xIzz58+JTJkyyE9iIn1k8Cx0JwGKGe5sd9aaBEwj0LZta/lWoE2b1hHzn0Exw7Tmc3VGFDNc3fysvJ8EKGb4CYrRXE0g0mLG/fv35XTfDBnSiT17druaPSvvbgIUM9zd/qw9CYRM4MmTJ6Jy5YpS0Gjbtk1ELDQoZoTcbMxACEExg6cBCaROgGJG6owYgwQiKWZAyChWrKgcd02dOoXwScDVBChmuLr5WXkSMIdAYmKiqFQpSdBYvXq1OZmmkAvFjBTgcJffBChm+I2KEV1MgGKGixufVfebQKTEjDt3bosyZUpJIaN3717i/fv3fpeREUnAiQQoZjixVVknEogCAVhoxMWVlXM3J02aKLBUWLgCxYzgyWLgc/XqVTF//jyxaNHCsLZT8KWMTEqKGZHhbMej4P51+/ZteZ3gWnn37p0dq2FKmSlmmILRkZl8/PhRPHjwQLtOXr165ch6+lOpSIgZd+/eFWXLlpZCRo8e3Slk+NMwjON4AhQzHN/ErCAJRI7A48eJokKFeNnRtmvXJmwPyhQzgmvTCxfOiypVKsn2gfdzfLZs2RxcZg5IRTHDAY0YhircuHFdfPNNdY/rZPnyZWE4kj2ypJhhj3aKdCnv3bsn6tWr43GdzJo1M9LFsMzxwi1mYGpJbGxxybtr1x8sU28WhASiTYBiRrRbgMcnARsSmDBhvMibN49hySFoVKlSWXa433/fTvz777+G8ULZSDEjcHqvX78WpUrFynapWfMb+SZt9uxZ4tChPwLPzCEpKGY4pCFNrAZWZapcOUnwq1gxXnvjvGvXLhOPYq+sKGbYq70iUVpYLtWpU0v2J6VLl9Suky1btkTi8JY8RjjFjLNn/xKxsSUkb0wtgUVMSqF7965SkE0pDveRgFMIUMxwSkuyHiQQQQKjR48SmTNn9HlECBrffFNNLtuKqSdXrlz2GTeYHZEQM06cOC6mTJksMChwQli2bJkcCJUrV5Zr0f/XoBQzQj+zz507J6+Tjh3bh56ZBXLYunWrvE5KlCgmHj58aIESRb8IFDNCb4ONGzeIQYMGyof+0HOLfg4QwWHZ9/XXBcXNmzejXyALlCAcYgbE1VWrVmnLr/766zS/prx16NBexMfHWYAKi0AC4SdAMSP8jHkEEnAcgdTEDFXhn38eJgc8+fPnEwsW/KY2p/iNvC9fTln8iISYMXXqVFn2Bg3qpVheu+z86af+sj5dunSyS5HDXk6KGaEjXrRokTyvKlWqEHpmFshhzJhfZH1atGhmgdJYowgUM0Jvh2bNmsjzaty4saFnZoEcZs6cIetTq1ZNC5TGGkXwV8xYtWqlwDWVWvj8+bPAkvcQjbD86u7d/i+/SjEjNbrc7yQCjhYz4LDrwIEDAnPLfvihi1i/fp3AqgsMJEACoRHwV8zAUdauXStiYnLIDrlevbri77//TvHg06ZNFXnz5hbnzp31GY9ihk80PncoMWPhwgU+47htB8WM0FvcqWIGrLIYkghQzAj9THCqmDFixM+hw3FIDv6IGStWLJdjoZcvX6ZY68WLFwm8BIKQUblyRQEH64EEihmB0GJcuxOwtZjx4MF9uXrCDz90TjZ/DPP0O3fuJG8EuBmoD8yuHj16ZPd2Y/lJIKoEAhEzUFB0xM2bNxPp0qURWbNmFp06dRSYimIU9u7dK6en5M+fV5w9ayxohFPMuHLlihgxYrjm2KxIkcLyf2zDB2afCH/99Zf8/9ChQ+LTp0/it9/mix9/7CFgTozw5s0bcfz4cS0t/IcgvS8fFQcPHpD7z58/L4+xefNm+b9Kd/jwnzJfoz/Pnz8XEClUGfG9c+cO6en85MmTcjsGRLgPdujwvRbvzp07Htnhf6Tt27eP6NnzR/kbDzJGKzlcvHhR7t+3b5/AGyQMvvr06S1Wrlyp5Tl9+q8C5wpCYuIjARNZHB8WOxCX//nnH7kPTDdv3qSVC2UAh3AHihnBE4ZpOdqpadPG8rzKly+vR/u9ePFcZr5mzRq5Hf3uixcvxMiRIwTOaXXuoa/+668zWlp1vuM+gOvKOxw7dkzGxXmNlXlwnqMcKt3+/fsM0yEfrASA8xHx1SchIUEeAucbttWsWUPW57vvWmpxsPqPPsDxISw4Bg4cIF+WIB2ueyP/QNevX5f57NixXWaB62PAgJ/E3LlztCyxWgryQH1wr5w9e7Z8AYNpCXiLC383CNi/Y0dSfVX5T506qeUTrh8UM4Inu3v3Ltm2xYsXk+dVrVo1tPNKfw6o+/3t27dke48dO0ae0+rcwz1Y3XPR9up837Vrp6Gj7aVLl8jj4KH52bNnsn9S6XANquvPqGZwNDl+/DitnEin+uKrV/+Whv5bdgAAIABJREFU22GxiP6kadMmWjw4mNYHrHKClc1wv8fDNfLB0u3qfNbHxTWF/ar/xPfQoUNkesRDPbAf9UIAF/yvOPzxx0EtO319EQf1TU080BKH8CMlMQPjAVinwsICq5EY9am43+3d+7uoX7+uHCvlyJFN3meCWSGGYkYIDcmktiNgazEDg2HcTBs1aigH03r6GDAoASNTpgwiW7YsIm3a/8ltjRs39DnY0efB3yRAAsYE/vzzT3H69CnjnSlsXbp0qShatLC8DvE9efIkOSjxTgJ/HLh+8+TJJWDO6v1QE04xAw8d6t5h9K0GRepBGIM1ZZqO+Bg4IeBBBP9nyZJJ3n9wD0qT5iu5rV+/vsnqhMEj4q9evUo+yOA3xB9844O0cNgJ4UAf8FBZrFgRGQdCEY6DdAULFpCDWIgcKg/v7xMnTsis4Exs+PCfRfbsWWVa5KHyQRr4P7l1y3Ne9KZNm2S+o0aNFFOnTtGOgQc8FUqUKC7Sp08r8ECn2h33Y1WO1q2/kwNxTH3BNtXu+I23UgkJV1RWYflWbYhBtxPDnDlzJFclGplZxz//PKS1o2pP/bd6WGrbNslMGiIEHuRUHHXuwewe29D26rxTfXWXLp2TXSeqThAAIAogLc53dW3h/4kTJyRLhzFBzpzZ5ThAHQdx27f/XmJZt26tVjZs13/wgIGA+xDyjonJ6ZEPznHEj48vn8zyDNah2Idrft68edo4BNaiKiiHo7BaU8su6q8FjFnw8KOsq/TXUK5cOQWcA4YzUMwInu6QIYM9ziX9eQUHsypgmU3s279/v0B7q3jq3MO9H9vUeFZ/f27ZskWyF3pKbIAIoYRsdZ4iHzwoQ4j3Dlu3bhG5c8d4nN+I37hxIxl1z57dWtlUGdU3xuQI6KOwqgn6b1yX6nrDgzziwmGot/CB8QT2oS/AykEqLkRFhPv378n9qNfOnTvlSxFc9/o64ZgQTTHlDXnpr6HatWuGXdDwJWbg/ouXOYpT27ZtZJ3UHzhTxZiqSZNGMg7ufw0b1hc3btxQUQL+Rp8L8YuBBNxAwNZihnpYWLRoYbK2wmADNw44J8KDD4J+UH/58qVkabiBBEgg/ATQcePNo3oAx3UKS4ADB/ZrB2/WrKnW8WN/x44dhHrTi0jhFDPg9A8DOjxI4djly5eT/2MbPig/gnoQrls3aWm66tWryrdKyt8H3hhj1RdYTaiAhwIM8JDv+vXr1Wb5rcQM5IeBJoQfDPC2b98m2rRppfFQb8hUYgzSkB/eYqm3PceOHZXlQxyIHSi3Yoo3fqoueIOF0L9/P5lH4cKFxNGjR1TWAg+cJUsmeVDHFCF9UGKGqj+WfMUD4YULF7RoEDMwmC1UqKCoXbuWwFtKvIHr0aObPB72YQlM1HfZsqVyILpt2zZt8I2HPFUnLVMTf6g2pJgROFRYEOA8gjUOzr/ixYtq5xW2KwFFiRnqPEF87FfnHiySfvlltHj8+LFWCFhXFCiQZGK9YIHntCglZiA/PKzgbSfOd8wnV9csynPw4Jc3tbhf4BxL2n5AHgfCBMoBCxCEe/fuyv+//76tjIfrCfvxgVURAqw6kAesxvbtS0qH7bAswYMp9lWrVkW7R2CfEjNU/SF4wNQcaVRQYgauPzyI4T6BYyrxAvliBaLMmTPJcQzKimtJrSZRpkxpaQmm8jP7m2JG8ETxQIlzqFKlJMu49u3baeeV3ppAiRnqPMG5rD/3cC+G4AyrCRWOHj0qChf+Wp533tOilJiB/EqVKinzOnPmjFizZrVWlq+/LuTRP+EaVP2Tfsnu7du3C1iAIEAsQLm6desqj4u+G//jg3s7wowZ0+U+iCLYrgL6BiVowjG4ukdgvxIz6tatLdNC1IO1nxI9lZiB8kHQwYoeJ0+eEOfPn5NiO64RTE9Ff1W6dCl5XFh/whJE1QnXUziDkZiBcQDKhfKpj2ILKxdYLyprMOzHOEI/FgpneZk3CTiFgCPEDCjF+oA3m7gpQLE9cuTLwBxqMVRe7MPAmYEESCB6BDC1AEIkBv+4JvFgi7eMeINZrlwZrePHPnzgdwPTFPAQEk4xQxFJzQGoehBG2fB2V4kcKr2vbwxIkcb77YwSM7APgyJ9gDUIVlfAPlhC6AMsHjJmTJ/q8dWDER4U9QHm9XgLhs/x48f0u+RviCfqTfC8eXO1/UrMQJm+/baFNIHXdv73A2IG9mNg+urVlznCsASBeTD24YO3/PqAgbPa9+zZU/0uU3+rNqSYETzW1HxmKDED/TH6XW/LIl9HhtUWzgE8lOmDEjOwTz0UqP24p+AhCfvwkKUCznFsgzO91I6vrKyUubvKA2bteMOM+5QSQNQ+fF+/fk2+LcZxYK2lghIzsL1Bg/oeD3AqjhIzihUr6iHq4Drp1etH7VqAqKAPeJhFvviE8hZXn6fRb4oZRlQC25aazwwlZuD8mjNndqrnqTo6pjei/WF9oQ9KzIDwpkQGtR9Tq9R58/vve9RmOfUE23GeeltDapH++6EcgC5evNhjF6ZyQcRAPpg66B0ghihhEYKhCkrMQDoId/qXAIijxAzsh9CjX5oUcdWy4xBB9YIP0qo+Ny6unDpcWL71YgbKBCsTtCfKrD6wJunVq6eA+I9+G9thEQmRF/cKf8cRYakAMyUBmxJwhJiBBxwVcCPAm1TcIHBD9g7KpHX48GHeu/g/CZBAFAjg4QJ+KvAwX758nPbgrDp/729YIsDKCg9H4Qz+ihkYuGEAl1rA4AYDMjUI9B5YKTED9dMP1FS+eIMDFnrTZOyDmIEBE6xAUhqA+hIzYDaPfGHi6itAeEGchg0baFGUmIGBmK8HKSVmoL28g7oXYy65/g0d4sEaQ5kKw+Q4XEGJGRBs4M/BaUE9+HvzNbOe/ooZjRp9OXdSOj6EO1wnS5YsludcoUIFPKKrOuE6MLLawdtcnKu4LlRQYgbOVf0LDrVf/+1LzIB/A+QL8dVXgM8cxKla9UscJWZALFRWW97plZiB6VreQU0vgJXp06eewh7uE7B4wjFhYh+u4GQxAw/XYOwtmpnN0l8xAw+5/gT4UcB1smHDetn+mGKoD0rMwIO8d0CfCwEa582AAV+sFTA1DNuQV2orZ6h+zFvMgI8X5AEB26gfQ1nU1BtYUaigFzP0Vktqv17MMLqOVH1h+eIdIIijTBAPjNJ6xw/2f4gZsFBDf4frFcf09YGggz4X9zk1JS/Y4zIdCbidgK3FDDV3L1++PAK/cXPHfHV18zAaQCtzaooZbj/1WX+rEsCDB8ym1XXs69sqYkaZMqV8ooSAAQdkGGjhoUxfF19iBhyqGQUMGpHeW8zQ+6to1aqlHNwapfclZrRunTSFBeX0FdRbcljMqAdjJWbANN5XUGIGpp94ByVmYJBvFJTpLR40whWUmAGuGHyinWD5gro5IagHf9Vm4aiTv2JGSn0uygcRAfzhcFd/nfgSM2rUqG5YHVhUIL1ezIDDQeWHAH4zBg8eZGiFhAx9iRnKrB7m7b6CeksOCwsljikxA0KKr6DEDKMxixIzcD0YhdQeko3SBLrNSWIG2gXXPdoT5xt8GuF8we9whtTaSVlmwBLHV8DLOojPKKuy1FPXii8xw3v6icpb+SnSixmwbFJTGpEfxsveVnMqvS8xQ03/hgNKXwFTXVBuWI2oFQb1YoaR9ZRezMBv7wAmyBMvIbwDRBXFCY67wxUgZqjjpPQNyxJMFWMgARIwh4CtxQy8pcAbEKObBuad4UFCH/RvMZRncf1+/iYBEog+AQxqYIrpfV1jfi98LezZs8dS00x8iRlw5KYckGEVJUxFwSBavb01S8xAi8EsOW/ePBozPEx5m8mHImbonT2qKRlOEjMwjxuDYTW3Wp17sJKBIJDSSjLRv2J8l8AOYgb8XSizc7zNhbiG60Sdr2aIGSCEBzWsfKY3+4bPiWvXrnkADEXMUBYgOH9gbYZAMcMDb8T/gaUPHEbC4aq3AICpCbjuW7RobnkxA0uVK98LJUvGihYtmsnrBCuF4HwzQ8xA40BIQB+lHHAibziAhm8KfQhFzLh584Z2HcIxMIJTxAxYm8CRL+5hWOkpS5bMWr+s+hW8ADBa+UjPl79JgAT8J2BrMQPVhBOyqlUre9wsqlWrmswcE3ExCMfNBPO/Mb+VgQRIwFoEIDjqvX7jIQeDTTjbU286UWIr+cwwEjPw9gdCBsxalyxZ4jFwwbQJ3IfMFDPABA4V8QZVzR3Gsa9cuaw1sHo49PaZ4Y9lhno7HBtbXFtWz0lihhJoIJDjoQFvM+vVqyMw6ERb4QEYq8Ngqg+8xNslWF3MgMk3LCUgXkKQ01uQwB8G2JslZqg2w3x6tK8SGuFrAEKHCqGIGXDsiTLDygdjEwSKGYps5L4x/QiOkzt37iTy5PnifBH3ajiTxnWMt/tqiVA8eKKfCWcIxTID0/hgxYD7EPyxqHKjvOr8MkvMUAzgCBtTq5Avzmnc+/XXZyhiBpyCIk9M0VT+PJwkZiiG+MZSu7jfFCmS5KgV9cYnnNPC9MfnbxJwAwHbixlopKdPnwhYWsBxINZg955XqhrywYP7Mk5KZqIqLr9JgAQiTwDeydHR40Ec16kvXwxWFzMgYKAeEAq8Q7jEDHUcrF6iHsJhkqyCLzFDOeLEMqm+gvLnoZ8S4kQxw7v+ENB+//13+aYSzh/VudmpU0cpHBn5bPDOI5r/W13M2LRpo2Rav37yB8lwiRmqPbZsSXqgQpvCokIFX2JGz55JjjghcvkKEGSQX40a32hR1MMmp5loSML2Q01XgiUc2gEiGaYbwdHkyZMnfTrVtLqYATEf9fGeYgiQ6vwyW8xQjQRnt2qpZP2UE19ixrBhQ2VZMXXKlw8nJfqVLVtGHcZRlhlapXQ/YCGEdsSSqzgvIW6oFZ100fiTBEggCAKOEDOCqDeTkAAJWJBAq1bfyekYECtSCpEUM+BQ2MgkFANgDDCNLDPwlg/7ILB6B+UrwmzLDP1xGjdOWq/eHzED1hwoKyzWLlz48lCn8sOAS/n7WLVqldos/UognRN8ZijLDK1yPn4sXbpEOm1DvfEpV66sgMM7q4ZIihlwfIcBu3dQq5kY+cxQVkGdOnXwTiadMoKx2ZYZ6kCwxlDt6I+YoebD48HOaNUf+OxSyxjrV/1RD5sUMxR5879x3+rW7QdtGgYe7OEDSC3rmdoRIylmdO/ezbA4KfnMUP5a9GKyykSJ4+ESM3ActZqVP2IGnCmr60q/fLEqL667ChXKyzj6/smplhmq3vpvrPKC+yV87DCQAAmEToBiRugMmQMJkIAJBF68eC4OHTrk19JkkRAzlGd3DMzg/wJBmY7jd0pihrLMiInJKfQOx+DgT73lMkvMwBtsWGOooLfM2LfvyzKsviwz4FQOb4tQTyxrmZCQNNcf+WE5SjWND9N/3r9/rw7jSjEDlcfbRgzY4QMlf/58khsELywJrp+uoIGK4o9IiBl4iFcPL8pPi/46SUnMUJYZmFeOZUZVWL9+neY3xwwxA6bs8LWj96OlLDP0U0JwfF+WGZgCh6VdUdfY2BLyHFDlhQVZ/fp15T5Ymbx580bt0t6cU8zQkJj24+HDB6Jly281/w6lS5cUOKf0/P05WCTEDNwfcO4ULJhfu1/rr5OUxAxlmYE3+vppgrt375KreiFfM8QMCNeYnqMvl7LMwLLp+iVPfVlm4DpRdYH1gf66vn37tvjuu28lBzjw1VsmuEnMwDmJvkL51fHnHGUcEiAB3wQcJWaoJd0wFzK1j35Q7hsP95AACRgR+PPPP+W8Y6N9kdgWCTEDD2lwSIiBIpyhwQIDHuBVSEnMwPQEJQLExOSQaZEe8/TVlA0zxAwMALGqC/wOIH98lJM4iBf6+5wvMQP1uXTpklBzuuHdX+WlplZgmWtvXxFumGai2trXd2LiI7kkLtoY5wneOOKtm1VCJMQMiGGVKlWU9cfDFs4drKqjQkpiBq4xJQLAP4467zJnziRXJsP1YoaYoa45CBdfjpHk0waihj74EjMQ58aN6wLTsdDWeFut8lIOTLHiCK4lfaBlhp6GOb8hSsF3BPxIoC2wytLq1as9fEkEcqRIiBmwHlH3U3W/xvWpghIAjFYzgTijRADkoc473KsHDPhJYEU/M8QMtfwwBBd1DOSL/s97iWxfYgbqA9EDYq++70R+6j5ZpUplcebMGVV1+e02McOj8mH4B6IUVuZiIAE3EHCEmIE3kZhfX6xYEXnzxA00tc/ly54DDjc0NutIAmYRGD16lHwwNyu/QPOJhJiBMsEJWteuXeTyfaVKlZROClVZjx49Ij3k+1rSFGvb474EJ2d4QwVv+lhCGm/28dt7oIHBB7bPmDFdHcLjG1Yr2I+HLRUwqEf8zp07ynse3p4hDqaDeC9vhzeD2Of9sKXywpuixYsXiUaNGsq8IJIgPkxhjd50YvCJ/Vjm0lfA/GnEMTL33rp1q9w3Y8YMw+R4WEFavBkMV1CClL/TTHyV49GjR6J586aSG5z0YdUMOLeMdoiEmIE64k0ufErgIQ0r6UyZMkWrOqZcoB03bNigbdP/wEsIPJDBygUfxFWCUK9ePQWWetQHWBshjt5EXb//1KmTcv+QIYO1zVixBPlg9RKMDeLjy4vu3buKc+c8V2hAAogbyB/5GAW8ecacf72jYsSHk9yXL18kS4LzAPtT8tU1duwYGeePPw4mS4/zH+lxPRgFXD/Yj+spXMFKS7MeOLBfm/aGaT1Lly71EG2DYRAJMQPlwjQNNbUK5+Levb9rxUU90I7eooGKAH8g8P2BvgR9CuLino77PM5tXCv6MG3aVBkHK7kYhUWLFv6Xx2ptN/pVrI7SsGEDeZ1giXQcx+hagC8h7EO/5CtgSW4l/uG6g8CBchn5tcM4Hvnh4913If/nz59p+/HbO6j67tq1y3uX1ucibzjkDFfAVDSck1YIWBoXvmMYSMANBGwvZvz222/yppuaeOG9n2KGG05v1jFcBNwiZoSLH/O1BgGzxAxVG/heqFu3tuyTMMUIby+jGSIlZkSzjjx2+AlYQcyAFQ8EIYzlIJrhwT4xMdGUykdKzDClsMzEsgQoZli2aVgwhxOwtZiB1UmUSTU6uEqVKoipU6f49dHPCXR4G7N6JGA6AYoZpiNlhlEgYLaYgSrAigXWMrCSgZUGVraAlU40AsWMaFB33jGjKWbAkg3WOMoJMSwajCy9QqFOMSMUekyrCFDMUCT4TQKRJWBrMQNml8riAuZ27959WSs+shh5NBJwFwGKGe5qb6fWNhxihmKFKQxYxhN9FKZAGnn2V3HD9U0xI1xk3ZVvtMQMTH3DdCJcQ1iuG2M++CMyO1DMMJuoO/OjmOHOdmeto0/A1mIG5gmqgSLmsTKQAAlEhgDFjMhw5lHCSyCcYgZKjtVgatf+4qfh+PHj4a2QV+4UM7yA8N+gCERLzIB/IEwpwThv+vTpQTv4TK3SFDNSI8T9/hCgmOEPJcYhAfMJOELMgKMbBhIgAfcQiJQDUPcQdWdNwy1mKKp9+/aRq19gWd5t27apzWH/ppgRdsSuOECkxQw41O3fv58UMb7+upA4ePBAWDlTzAgrXtdkbiUxwzXQWVESEELYWswYN26s7OwoZvBcJgF3EaCY4a72DldtIyVmoPxYoQNLjcJcvlu3rgIm9OEOFDPCTdgd+UdSzIAvtLi4snJsV7FivLRuCjdlihnhJuyO/ClmuKOdWUvrEbC1mHHv3l1RoEA+6WgNy1YxkAAJuIMAxQx3tHO4axlJMQN1wbK4ZcuWlg9qWCbww4cPYa0ixYyw4nVN5pESM7BEMpaTxLSSLl06R0TwQyNSzHDNqRzWilLMCCteZk4CPgnYWsxArTZt2ig7vgoV4sXp06d9VpQ7SIAEnEOAYoZz2jKaNYm0mIG6woS+bNkyst/q2LGD+Pz5c9gQUMwIG1pXZRwJMWPr1i2iRIliIkOGdGLIkMECq5hEKlDMiBRpZx+HYoaz25e1sy4B24sZGAhu375dYC5y+vRpRZYsmfz6XLlyxbqtwpKRAAmkSIBiRop4uNNPAtEQM1C0hw8fivj48v+9ge4k3r1752eJA4tGMSMwXoxtTCDcYgaEjHTp0sixG44V6UAxI9LEnXk8ihnObFfWyvoEbC9mPH78WFv+DqaJ/n4uX75k/dZhCUmABAwJUMwwxMKNARKIlpiBYj579kwMHTpE9lldu/4QFpN6ihkBnhCMbkggnGKG8iWTKVMGAVEjGoFiRjSoO++YFDOc16askT0I2FrMePr0qahSpbImYMA6AyaKcK6W2uf+/fv2aCGWkgRIIBkBihnJkHBDEASiKWao4v70U3/Zh3Xu3Mn0KScUMxRlfodCIFxiBvKFU1yM3bZvj9wqP94sKGZ4E+H/wRCgmBEMNaYhgdAJ2FrMmDt3jiZk1K9fL2xrkIeOmTmQAAmYSYBihpk03ZuXFcQM0IfvDFgVduzY3lSnoBQz3Htum1nzcIgZmGpVqlSsXLI4mkIGOFHMMPNscW9eFDPc2/aseXQJ2FrMGDRooBwAwvnnmzdvokuSRycBEogYAYoZEUPt6ANZRczAKg4VKiT50MAqJ2Yt20oxw9Gnb8QqZ7aYAcvYcuXKSB8Z0ZpaoodHMUNPg7+DJUAxI1hyTEcCoRFwhJjRoUP70CgwNQmQQEAEsBQy5vxHK1DMiBZ5Zx3XKmIGqOJNNR7wYKExYcJ4U0BTzDAFo+szMVPMgJChll/t37+vJdhSzLBEM9i+EFYSM16/fi1evnxhe6asAAn4Q8DWYsbs2bPkwI9ihj9NzTgkYB6B0aNHybnO5uUYWE4UMwLjxdjGBKwkZqCEScu2lhYZM6YXeIAMNVDMCJUg04OAmWJGu3Zt5bitc+eO4uPHj5YATDHDEs1g+0JYSczAcxFEQwYScAMBW4sZT548EYUKFZTOo+jQ0w2nK+toFQIUM6zSEixHKASsJmagLpcuXdKcIh4/fiyU6gmKGSHhY+L/CJghZnz+/FkoZ7dYvccqQgaqSDGDp7oZBChmmEGReZBA4ARsLWagutu2bZMDv7i4cmL79u2mzTUOHCVTkIB7CFDMcE9bO7mmVhQzwHvz5s3SMWJ8fHkBfxrBBooZwZJjOj0BM8SMFSuWS4uMYsWKhnRO68tl1m+KGWaRdHc+FDPc3f6sffQI2FrMePr0iViyZLEYOHCASJPmK9lRYvBXu3atVD+3bt2MHnUemQRsToBihs0bkMWXBKwqZqBwM2fOkH0a+rNPnz4F1WIUM4LCxkReBEIVM44ePSpy5MguChUqIK5du+aVe/T/pZgR/TZwQgkoZjihFVkHOxKwtZhx9uxZOdiDw7RAP5cvX7Jje7HMJGAJAhQzLNEMLESIBKwsZqBqmPeMvg2CfTCBYkYw1JjGm0AoYsbz589FzZo15Hm8bNlS76wt8T/FDEs0g+0LQTHD9k3ICtiUgK3FjISEBLmcHZa0C/Rz48Z1mzYZi00C0Sdw8eJFAcuoaAU4AIU11uDBg/ghg6DPgSZNGsmHrFCmcoTzGrhz544oVqyISJ8+rfjzz0MBH0qJGfBVwGuF94pgz4GWLVuIqlWrBHz+IUGXLp3lNdavnzVWLjGqBMSMwoUL8RphXxLSOdCuXRtRsmQJo1Ms4ttevXolICQykIAbCNhazHBDA7GOJEACyQlgWdghQwbzQwamnAMvX75MfpJZZMupUyelmJE9e7aABcQjR46YwsfJ11qXLp2k3y0n19GMumH1uEDDnDmzpehcv349gaUirRpOnz7N64R9iSnnwNSpU6x6mrNcJOBYAhQzHNu0rBgJkAAJkIATCMA3FKabtGrV0gnVsVQdMF01T55cliqTEwpz6dJFkTdvbpE7d4w4c+aME6rEOpAACZAACViQAMUMCzYKi0QCJEACJEACisD79+9F06ZNpKAxZcpktZnfJhCgmGECRK8s3rx5I5o3bybPV6zMw0ACJEACJEAC4SLgGDEjMTFRbN68SYwaNVIULVpYfiZPnhQubsyXBEiABEiABCJG4O+/E0Tu3LlEtmxZxPnz5yJ2XKcfiGKG+S28cOECKWR8/327oFfiMb9UzJEESIAESMCJBGwvZnz+/FnMmzdX5MuXR3ae+lVNhg0b6tFmb9++lV61e/Tozg7Wgwz/IQESIAESsDqBuXPnSh8E33xTTXz8+NHqxbVF+ShmmNtMd+7cFjlyZJOfp0+fmps5cyMBEiABEiABLwK2FzPglEovYNSoUV1UrVpZbjMSMwoUyCf3cWlWrzOB/5IACZAACVieQMOGDWQfNmnSRMuX1Q4FpJhhXivh5VK9enXl+QlLWQYSIAESIAESCDcBW4sZ9+7dk2a3EDP69+8r7t69Kz58+CB27txpKGYAZtu2reW+w4cPh5st8ycBEiABEiABUwmg38NUk6+/Lihu3Lhhat5uzIxihnmtPn/+PDm+wnKsGIsxkAAJkAAJkEC4CdhazBg/fpzsOFu3/k7gjYAK/ogZw4cPU9H5TQIkQAIkQAK2IbBo0ULZ93Xo8L2Ac1CG4AlQzAienT7l7du3RNasmUWRIoXFnTt39Lv4mwRIgARIgATCRsDWYsagQQPlgG7Pnt0egChmeODgPyRAAiRAAg4joKabrF+/zmE1i2x1KGaYw/vHH3vI8di0aVPNyZC5kAAJkAAJkIAfBChm+AGJUUiABDwJbNmyWfTu3dNzI/8jARKIGIEzZ86IjBnTi/Ll48STJ48jdlynHYhiRugtun37Nilk1Kz5jYeVbOg5MwcSIIFgCGBFoU6dOgaTlGlIwHYEHCFmeC/B6ssyA+a4pUuXlJ0u32bZ7lxlgS1EYPToUSJz5owWKhGLQgLuI/DLL6NlfzZ27Bj3Vd6kGlPMCA3kq1evRLVqVUX27FkFHauHxpKpScAsAh06tBfx8XFmZcd8SMDSBGy+G8UiAAAgAElEQVQtZhw4sF8uU5c7d4x4+/ZfDbQvMWPDhvVy4Jc3b27x4MEDLT5/kAAJBEaAYkZgvBibBMJB4OHDh6JgwfwiV66c4ty5c+E4hOPzpJgRWhNPmTJZjqv69OkdWkZMTQIkYBoBihmmoWRGNiBgazEDfFu0aCY70kqVKoq//jojkRuJGZjHiQEfVj5p3bqVDZqGRSQB6xKgmGHdtmHJ3EVAmfh//307d1XcpNpSzAge5NWrf4sCBfKLmJgcAqvsMJAACViDAMUMa7QDSxEZArYXM06cOC5y5MgmRQrMH65cuaImcFSsGC/69+8n96dJ85WMkzNndvH8+bPI0OVRSMChBChmOLRhWS3bEXj37p2oX7+uSJv2f+L48WO2K3+0C0wxI/gWwBKseEG0Zs3q4DNhShIgAdMJUMwwHSkztDAB24sZYItlwOrWrSMHc+hYfX1q1Kgujhw5YuHmYNFIwB4E9u3bKzBfn4EESCD6BC5duiTSp08nSpcuJd6+fRv9AtmoBBQzgmusS5cuikyZMoiSJWMFBDUGEiAB6xBYt26tmD17tnUKxJKQQBgJOELMUHz27Nkj8KYA65zrBY0uXToJmOK+ePFCReU3CZAACZAACTiGQKtW38l+b/HiRY6pUyQqQjEjOMqY1pQ+fVqxa9fO4DJgKhIgARIgARIwgYCjxAwTeDALEiABEiABErAdgStXrogsWTKJEiWK2a7s0SwwxYzA6WNaCV4YNW3aJPDETEECJEACJEACJhKwtZgBc1oM4O7fv28iEmZFAiRAAiRAAvYj8Ouv0+RD5rJlS+1X+CiVmGJG4ODj4sqKDBnSiZMnTwSemClIgARIgARIwEQCthYzMAjB2wE4uvE3jBgxXFStWkX8/fff/iZhPBIgARIgARKwPIHnz5+LQoUKitKlS3JapZ+tRTHDT1D/Rdu2bascd7Vq1TKwhIxNAiRAAiRAAmEg4Doxo23b1rIjHj58WBhwMksSIAESIAESiB6BiRMnyD6uX78+0SuEjY5MMcP/xvr3339FXFw5kTdvbnH+/Dn/EzImCZAACZAACYSJgKvEjE+fPol69epSzAjTycRsSYAESIAEokvg/fv3InfuXCImJoe4c+d2dAtjg6NTzPC/kbZs2SzHTyNHjvA/EWOSAAmQAAmQQBgJ2ErMOHTokJg0aaL26devr+xYy5eP07bp93v/VmuiY2rK6tVcFz2M5xWzJgESIAESiBKBadOSfGcMHjwoSiWwz2EpZvjXVlh+tVKlitLJ7MuXL/1LxFgkQAIkQAIkEGYCthIzjhw5LMUL/bKrwfzOkycXnYaG+cRi9iRAAiRAAtEh8OzZM5E7d4zInDmjuHv3TnQKYZOjUszwr6HWrVsrx1/jx4/3LwFjkQAJkAAJkEAECNhKzEhMTJRzNYMRMFSa+Pg4cfHixQig5SFIgARIgARIIDoEZs+eJR8+hw0bGp0C2OSoFDP8a6gKFcrLqUsPHz70LwFjkQAJkAAJkEAECNhKzACPx48fC3Sm+Ozfv18O1uBVW21L7fvt238jgJWHIAFnE9i793cxatRIZ1eStSMBGxN48uSJKFSogMiYMYN48OCBjWsS3qJTzEid77p160SaNF+JcePGph6ZMUiABKJOYO3aNWLWrJlRLwcLQAKRIGA7MUMPBYMQWFwEsjSrPj1/kwAJBEdg9OhR0oQ9uNRMRQIkEAkC8BuFPnLgwAGROJwtj0ExI+Vmg0NZWLTmy5dHPHr0KOXI3EsCJGAJAnguwnXLQAJuIGBrMePWrZuiXbs2Aua0DCRAApEjQDEjcqx5JBIIlsCbN29EgQL55fSA+/fvB5uNo9NRzEi5eXfs2C4FseHDf045IveSAAlYhgDFDMs0BQsSAQK2FjMiwIeHIAESMCBAMcMACjeRgAUJTJ48ST6M9u3bx4Kli36RKGb4boN//vlHYLW4XLlyCq5g4psT95CA1QhQzLBai7A84SRgezEDb5vQ4RoFmESOHz9OxMaWECVKFBf9+/cTp0+fMorKbSRAAgEQoJgRACxGtQWBU6dOyv5i2bJllizvxo0bZPkOHjwQUPlev34tcufOJQoWzC/+/Zc+o7zh+RIzNm/eJHnDN5cVw/Tpv8ryXbt2LWzF27BhgxTCxoz5JeBjwD8Zxl/4PH36NOD04U7w998Jsmz0KxBu0sw/GgQoZkSDOo8ZLQK2FjPQiWfNmlnOC/vw4YMHQzg/w5roahUT9Z0rV4w4e/Yvj7j8hwRIIDACM2ZMF3369A4sEWOTgIUJzJkzR/YXNWpUt2QpW7duJcs3YsTwgMs3ffp0mXbx4kUBp3V6Al9iRrt2bSUzq64GgyXmMa7ZvXt3WJro06dPcgyVPn1a8ddfgY+Znj9/LsuHMl69ejUsZQwl023btsryFSxYIJRsmJYELElg0aKFYuzYMZYsGwtFAmYTsLWYMWfObNkZQYH0Dj//PFTrSMuXLyeaNm0icubMLreVLFlC4G0VAwmQAAmQAAmAgJPFDIj7+fPnEyVKFGNjexGgmOEF5L9/V61aKcdLGDsFEyhmBEONaUiABEiABAIlYGsxY9CggbKz3bp1q0e9Mbcze/Zscl+DBvXFv/8mTUM5duyYyJEjafvly5c80vAfEiABEiAB9xJwspiBVsXUMLwlX7JksXsb2aDmFDMMoAghypUrIzJmTC9OnQpuai7FDGOu3EoCJEACJGAuAUeIGXv2eJpZTps2TQ7asmTJJDAvUh/atm0t902dOkW/mb9JgARIgARcTMDpYsbFixcEpgyUKlVSYJUThiQCFDOSnwlXrlyR46TWrb9LvtPPLRQz/ATFaCRAAiRAAiERcISYMXToEA3Cu3fvpDkt3kB17NhB265+LFjwm+ykhw8fpjbxmwRIgARIwOUEAhEzbt26FRCtxMTEgAUEHOPz58/acULxmaEy6datq+z/1q5doza5/tsMMSPQ8wFOy+GgPJDgfYxw+szo2vUHeZ6cPHkikCJ6xA1EzPCum0dGPv4JNQ19ZvgAy80kQAIkYDMCthYzzpw5IzvcNGm+EiNHjhC7du0SderUktsgZmzZsiVZc3z/fZJTL4oZydBwAwmQAAm4lkBKYgYcTMOHAEzvM2RIJ9KlSyO/8+XLI2bOnCGePXuWjBvygzPRpPhppVVEpkwZpFO2+/fvJYuPDVj1AY4n9cfAQ+u2bduEGWJGQkKC7B9DeeNuWHAbbwxGzEA7YTWRvHlze7RVXFw5sXr1KvHxo6dDcuBZt26daNSooYwPCxl1DvXr10dcv37dkCAcb9ao8Y3XMcqKixcvinCJGefPnxMYU9WrV9dDTDMsYAobUxMzLl26JFq1+s6jbjjvO3ZsLxISriTL+fTp06Jz504yvv76aNiwvjhx4niy+GoDVivxbqeffx4mlixZIq8FOgBVpPhNAiRAAvYkYGsxA1YYPXv+qIkXEDDUp3fvXgL79eH9+/eiTJnSMk4obxz0efI3CZAACZCA/Qn4EjP0/QweIGEJOG7cWNGrV0+RI0eSU+nq1asK7xW1ihYtLGJji8u4iI906gEUD2ze/RMEkapVK8v+Cc6q0YchXenSJeXDJaZNon8LZjUT1Tqw9FAPhCk9AKr4bvgOVMzQt1PJkrFa+373XUvpYwJtBH9e3qFBg3oif/680ncJ2hWfAgXyyTatVatGMsudc+fOCohlyA/psDwqVlbJkye3yJw5o0ib9n9yn9mrmeDcxDFXrlzpXYWA/k9JzNi5c6esA8Q9CBqKB64XHBur1Hn76kD9cb3hulPxcd0l8cmXTBDCaixYFhbCDISjRo0ayHSqnXAMpKWYEVCzMjIJkAAJWI6ArcUM0IRAAZNIKPXomPDdvXu3ZANLxMXbDMTBgPLBg/uWawwWiARIgARIIDoEfIkZ8K+EfqN48aLi/n3PfgNvzrHcN/bjTb0+3Lx5M9kD6p07d7SH0HPnzmnR8eDVsmULmc+337YQehN6TElo0ybJ1xOOE4qYgQPu379PHqdZs6ba8d38IxAxw7ud0Db6gOk7aKNs2bJIzvp9Dx48kJY3+m144IfVANJs3frFkhTjGiV8jRo10sPyB/lAREEafMwUMx4/fiwKFMgvYmNLhGSVgTr6EjOwTKsSEjZsWK/HIa8XnJeoFyxSXr16qe3HCnS4pvQB7dGwYQMZf/DgQfpdYtOmjXI7OO7bt9djH9pJiUEUMzzQ8B8SIAESsB0B24sZivjjx4kCHSM6Y18Bb84QZ+HCBb6icDsJkAAJkIALCfgSM9Tb8Xnz5hpSGTDgJ+2hCb4xUguYRoKHNbxlV+GPPw7Kbdh+/vx5tVn7/vfff+XbeewPVcxAppUqVZTCP8QYt4dAxAw8iKMNfLUTxhhVq1aR+2vW/MYvtJjyivzgnFyFiRMnyG2FCxfyEDLUfkyxVS9wzBQzZsyYLo+7eHHoK974EjNw3qO+33xTTXz8+FFVSfs+c+a03I84K1Ys17b7+gErD8TFdaoCHNyWKVNKbh8yZLDa7PH900/95X6KGR5Y+A8JkAAJ2I6ArcUMvBW5cOGC7aCzwCRAAiRAAtYiYCRmHDx4UJqpY9oH3pYbBVhr4GEKnxs3biSLAn8IEA2wNOrAgQNEyZIlZFy9mKGWTW3atLHPN+Jm+MxQhduwYYMsw9ixY9Qm134HImZMmDBeckupnfDCBOeCr4fku3fvyPMBFj84HypXriTj68WMevXqyG0QNXwFZblhlpjx4sULkStXTikK+DrXfZXFaLsvMQMCDfhs2bLZKJnQW1tgOol3wDQfXE/Lli2V/Fq2/Fbmpxcz9KKTL4GRDkC9yfJ/EiABErAnAVuLGRiEYC4kOjM43YJTLgYSIIHwE4DJb0pWUOEvAY9AAuYSMBIz9u79XT4oxcTk9Hkw9DvqLfns2bO1eJhSgimPmHKAhzf4vMCUgowZ08v/jcQMTDHxFcwUM2DpgTfXOXJkEy9fvvB1SFdsD0TMUKJTSu2EpeLhpwFOPk+ePKkxfPnypRgwoL8UDHA+wF8EzgflC8VIzPj112laeu8fZosZGzcmCVywNDIj+BIzlKUTLCp8BXWuw4JIBVi9/PbbfKHEEEwTAT+cw+DpS8yASGMUKGYYUeE2pxDA/QZOcxlIwA0EbC9moBNTHzjF6t+/nzh06JAb2o51JIGoEcCgHtcbAwk4hUCwYsbbt29FhQrlZT+k3iTDWkP5NcBb9j179ogbN5JWrDCaZuLPQ7J6wDNjmgnaDCs6oO80Kz+7ngdmixl3794VmTJllGwPHDggseDBolatmnIbnLxCOIAPLwSjaSbKMiNSYoaaHgPLjHv3jFfaCbR9QxEzJk+eJFnBT40Kffv2kduKFCks5s+fJ44cOSx3GU0z0VtmUMxQBPntJgIdOrQX8fFxbqoy6+piArYWM/BGDG+3ypZNWqFEiRr4hsdvOGS7cuWyi5uXVSeB8BCgmBEersw1egSCFTOePHkiH7LQ7yjBAgNJ/A+rQawgog9WETPwgJ07d4yIiysrvB1Z6svr9N9mixlf3vjn19oeS8fjfIClwfv3nqusWUHM2L9/vywfpr2YFUIRM5o1ayLLo6ZBwdoF/GDlBLFIHyhm6GnwNwkkEaCYwTPBTQRsLWaohoKzp/Xr14m2bdtoS5mh48MHJpwdOnwvNm/eJBITH6kk/CYBEgiBAMWMEOAxqSUJGIkZ8IGBlRcwbUC/2oS+AupBEG+M8QCHt9xKYD927Jg+qvxtJGagf0J/BWsnozfjWMYVS7QijpmWFMoiBCs/uDUEImak1k5giAdwtFPz5s00pPCxgW1r1qzWtqkfRmIGVuZA/IoV4wUsf7wDLA8yZ05aqtcMnxlqRZAjR454Hyro/32JGU2aNJJ1w3gN/jG8A8ZzJUoUk3G2bdsmd0+aNFH+j+WKvYORmIEXXWo6yuzZs7yTyP9VO/nybWKYiBtJwCYEKGbYpKFYTFMIOELM0JN49OiRNOHEgBEDQwwI1AdzKjEQhPMoo05Unw9/kwAJ+CZAMcM3G+6xJwEjMQM1USb/lStXTPZgif6mYsUKso/p1aunrDjEDPUwhocwfcByrLCGQJ+k95kBoV35EujXr69H/4S+SjmeRDozxQysigHfA3BCabSyhL7sTv0diJiBdipUqIBsP+92Ah/wxFQNiF8rVqzQkNWrV1em+fHHHpq1Bnbevn1LlChRXO7T+8w4duyo3Ib2Xr3aUwCBsKWWL8X+UMUMLHcKi4e6desYLmmvVSLAH77EjKVLl0g+KLv3ajo417EULfZ9/XVBAasnhDFjfpHb4OdFf55C6GnSJEko0vvMQJquXX+QaSAyevt3Uu2E41DMCLBhGd0WBChm2KKZWEiTCDhOzNBzQUe3adMmaeqrPMij88IH5r9nz3JZOj0v/iYBfwlQzPCXFOPZhYAvMeP27duak0FME8Db9R07tosFC37TVibBMpz6h6yhQ4fIfgbOPhEP8ZEOQgYe0tAH6cUMMIJzQ9U/NWrUUC4hjnStWn0nHV23b/+93G+mmIHjNm6c9Kb8zz/d6WsqEDEDvHbtSloKVI0j0Eb4wF8KhIzU2nbKlMky/vbt20Xhwl9r54NezMDUpI4dk6Yqwbks9sEyaO3atQKiGhxfNmrUQB4rVDGja9cuUtCCgGJm8CVm4BhqBRJcDxDqFMMWLZpp1wCsT1TQL0XbuXMnLT4sXiBiwNmqt5iB9AUK5JP5lSoVK33E6NsJPmjwwotihqLMbycRoJjhpNZkXVIj4GgxA5WHueHOnTtE+/bttE5SDRjRAfbo0U08ePAgNU7cTwIkoCMAoRBz7hlIwCkEfIkZqB/6EYgKeOOu+g9842EIFhnePidgndGpU0ePuBA2unTpLB9KjR548QALx4Z58+bxSAdLgLVr1wjli6Fnzx9NRX769Cm5wkq7dm1MzdcumQUqZqCdLl26JOLjk5y+6s8HiAxz584RsJ7QBwhdakqPPn7Lli3E0aNJVhh6MQNpcQ716dNLW+1EpStTprQ8/pAhg+V5smrVSv2hAvp97dpVaZWBKRlmh5TEDPCZNWumUCuyqLrhu1KlCuLy5cseFiwoG6ZCeVvblitXRsbFakPeYgbS/P3338naCavIdOv2g1xqOXv2rNK/Gvsys1uf+UWbAPokrDrHQAJuIOBIMQMPWlDgf/ihs2YSqjrLnDmz/2epEasNGGNjS4jr15M8zbuh0VlHEiABEiABTwIQLC5fviRgdu8rwKH0xIkT5AoUeEOvHH4axcfyp3/9dUbGxdz/a9euyWivXr2Sx8EUFaPw8OFDsWHDepkO/ZgykVfprl792yhZSNvi4srJt/NXrlwJKR87JvYlZsDRJM4HX+2E9sXSh/B5gc+pU6dSfDECQQP5YRoFlpLHbwSMV/Db27GlYgm/LRBIcIwTJ44L+JRAePTooUx3756nQ0yVzp/vefPmynEQvs0Oqr6om7e4o4714MF9sW7dWlm3OXNmy/qAq6+A6w3xZs6cIeMqETEhIUEKF0bp9O0EAUVdh4ibkHBF5vPmDR/6jNhxGwmQAAnYgYCjxAzMR8bbD7VMnhIw8F2hQrzsNBMTE2W7oHNdtGiRJmgULVpE3Llzxw5txjKSAAmQAAmQgGkEMAUG/SSEGrcFX2KGGzjA6gcfX8uXuoEB60gCJEACJGBvArYXMyBAwKGUcgKlFzCKFPlawOEWlHjv5fFUs8F0Eea/SAdTy5TeCqg0/CYBEiABEiABpxCAOXKpUiWl/wBYgLgpuFXMWLNmjRz3dOvW1U3NzbqSAAmQAAk4jICtxYxLly5qjtmUiIE5zfB4DbPMly9f+NVcK1eu0Cw0YIbIQAIkQAIkQAJuIjBo0EDZD8JhqZuCG8UM+OOAA1EsXZ/SVCk3nQesKwmQAAmQgD0J2FrMwCBEiRhw6gSv3JjHHGiANQbWc0cecAjKQAIkQAIkQAJuIgBH2OnSpZVL0epXZnE6AzeKGYcP/ynHTnAwykACJEACJEACdiZgezEjNra49ACP5fNCCXD6xlVNQiHItCRAAiRAAnYmMHz4z/IhF45H3RLcKGY0a9ZUtvOBAwfc0sysJwmQAAmQgEMJ2FrMwNsjeAJnIAESIAESIAESCI3A8ePHpHVGzZrfhJaRjVK7TczAqim5cuUUVapUFp8+fbJRS7GoJEACJEACJJCcgK3FjOTVMd5y7949gY+v5cGMU3ErCZAACZAACbiLQP36daUvBbcsV+42MWPo0CHSKmPjxg3uOrFZWxIgARIgAUcSsLWYgRVKYA4LocJotRKsAd+gQT3ZccO3RuXKlcTy5csM4zqydVkpEiABEiABEgiAwO+//y77zEGDBriir3STmIFxUkxMDvl5+vRpAGcFo5IACdiNgNFzkd3qwPKSgD8EbC1mYBACkSJ//rwC3rn14datWyJnzuyakKEcheJ7yZLF+qj8TQIkECCBTZs2iR49ugeYitFJgASsTuDZs2eicOGvZd/phmmcbhIzFi9eJNt15swZVj8NWT4SIIEQCPz223zRoUP7EHJgUhKwDwFbixkjR46QHXOfPr2TEW/cuJEmZPTs2UNMnTpVxMfHyW0QPx49epQsDTeQAAn4R2D06FEic+aM/kVmLBIgAVsRmD9/nuwr8e304BYxAy98SpcuKVdtu3r1qtOblfUjAVcTgJCBZx4GEnADAVuLGYMGDZQDrj17dnu01a1bN+WcX1hhII4ytXr48IEoUaK4TIMBDAMJkEBwBChmBMeNqUjADgRev34tihYtLIoXLypevnxhhyIHXUa3iBmbN2+WY5+OHTsEzYoJSYAE7EGAYoY92omlNIeAI8WMIUMGy04b00wSExM9SLVt21ruGz58mMd2/kMCJOA/AYoZ/rNiTBKwIwFYPOKFwNKlS+xYfL/L7BYxo0OH72V7nj9/3m82jEgCJGBPAhQz7NluLHVwBGwtZkyePEl2zk2bNtaWGMOyY2nT/k9uHzx4YDIqixYtlPsoZiRDww0k4DcBihl+o2JEErAlAaxmki5dGtGkSWNblt/fQrtBzDhx4oQcFzVt2kSzVPWXD+ORAAnYjwDFDPu1GUscPAFbixmXLl0SGTKkk+JEzZrfiGHDhoq8eXPL/7H99OlTycgoy4wJE8Yn28cNJEAC/hE4deqUcMvSjf4RYSwScB6BHj26ifTp04pDhw45r3L/1cgNYoayVl23bq1j25EVIwES+ELg4cOH4s6dO1828BcJOJiArcUMtAssLdKk+UoKGGrFEvxvZBoLz+x58uSScS9fvuTgZmXVSIAESIAESCA0AkeOHJH9Zb16dULLyMKpnS5m4KEmd+4YUa5cWQu3AotGAiRAAiRAAsERsL2YgWovX75MVK1aRQ66qlWrKlauXGFI4+LFizIOnJq9eOFsp2aGALiRBEiABEiABAIgUKtWDWmdAQfaTgxOFzMmTpwgxz2rVq1yYvOxTiRAAiRAAi4n4AgxA234/v176ewT374CVjWBQ9AzZ077isLtJEACJEACJEAC/xHYuXOHfBgeOnSII5k4Wcx4/vy5yJo1s7TMuHfvniPbj5UiARIgARJwNwHHiBnubkbWngRIgARIgATMJ/Du3TtRsWK8yJ49a7LVwcw/WuRzdLKYsWLFcilE0eF55M8rHpEESIAESCAyBChmRIYzj0ICJEACJEACtiQwduwY+VA8cOBPtix/SoV2qpgBH2EVKpQXefLkFo8fP04JAfeRAAmQAAmQgG0JUMywbdOx4CRAAiRAAiQQfgJv3/4rnWfHxpYQb968Cf8BI3gEp4oZO3Zs/88q4+cI0uShSIAESIAESCCyBChmRJY3j0YCJEACJEACtiMwefIk+XC8atVK25VdFfjRo0fi1atX6l/57UvMgH+tly9fesS1yz+YGlS1amXZXqdP00eYXdqN5SQBEiABEgicAMWMwJkxBQmQAAmQAAm4isCzZ8+k34yyZcuIT58+2bLugwcPErAumTlzhrh79474+PGj0IsZHz58ECdPnhRt2rQSefPmEQkJCbas55kzZ6SQ0bhxQ9u2lS3Bs9AkQAIkQAIRJ0AxI+LIeUASIAESIAESsB+BVq1ayofkJUsW26/w/5W4YcMGsg7/+9//iW++qS769u0jcuTIJoYMGSywbDu2p037P2FnC5R27dqKDBnSceU2256lLDgJkAAJkIC/BChm+EuK8UiABDQCu3fvFj//PEz7nz9IgAScT+D8+fMiU6aMolSpWGnVYMca37x5Q+TKlVMTNCBeeH9atmxhx6rJMl+5ckVkypRBNG3axLZ1YMFJgARCIwAx9tdffw0tE6YmAZsQsK2YgbmsmNOKD+aHMpAACUSOwOjRo0TmzBkjd0AeiQRIwBIEOnZsLx/+z507Z4nyBFOIRYsWJhMwlKCRP39ecevWzWCyjXqaz58/i27dusq6HTp0KOrlYQFIgASiQ6BDh/YiPj4uOgfnUUkgwgRsJ2ZcvHhB/PBDF5E/fz5tMFK5ckUxfvw48ebN6wjj4+FIwJ0EKGa4s91ZaxI4f/6c7HsxWLZr+Oeff0S5cmW1MYQSMvC9atUqu1ZL+vhAHUqUKJbM0altK8WCkwAJBEyAYkbAyJjAxgRsJWYcOXJYOiDTDzz0v3PmzC6OHDli4+Zg0UnAHgQoZtijnVhKEjCbAN7+d+3aRQoBcJbpHbZt2yauXbvmvdly/2/fvi2ZmIHpM69fW/+lCCxLjBgrq4w1a1ZbjjcLRAIkEDkCFDMix5pHij4B24gZWE4tJiaHNvioW7eOmDBhvBg1aqSIjS2ubcdc2NevPZdeiz5mloAEnEWAYoaz2pO1IYFACFy6dEk6yWzd+juPZFu2bJH+GrBKiNUDVi6JiyunjR3wYmT58mVWL7Ys36ZNG6Wz0qtXr2rlRZtkzJhelCxZQsDyhIEESMC9BChmuLft3Vhz2xu1qGYAACAASURBVIgZmEaCwUb27FnFtm1bk7XVjBnTRbZsWWSciRMnJNvPDSRAAuYRwFvNn37qb16GzIkESMBWBL79trkULs6e/UuWGxYZWbJkki8X7LJ0K6aUKOtOTM2wgwgD2Hv27JblLlOmlFbmjh07yG3z58+31XnEwpIACZhPYMmSJfKFr/k5M0cSsB4BW4gZcPBZuXIl2VHDjNJXgC8NDEyqVKks3r9/7ysat5MACZAACZAACYRAYOXKlbK/bdasiYC4iaVA0f926tQxhFwjnzQ+vrws98KFCyJ/8CCP+PDhQ23KbefOncTly5dEliyZpa+MILNkMhIgARIgARKwJQFbiBlPnjyRgw0MlBISEnyCvnLlshbv2bOnPuNxBwmQAAmQAAmQQPAEME2jYsV42eemT59W63utJmZgKdYzZ077/GDKHKZnbN68yWccpMc4xEohT55cGvOsWTPL34sXL7JSEVkWEiABEiABEgg7AVuJGYUKFRRPn/oWKWDBUbFiBdmp379/P+zweAASIAESIAEScAOBHTt2iGnTpoquXX+QK4FgNZC8eXNrD9RqukY4xIxnz54JWCPgc+fOHVkOlEV9MOUF5TH65MiRLVkZVVkD+S5UqIBh/jhm7949tbKgTMuWLdXKizKHw6moXsxQ9ShWrIgsY+3atbTyXLhwwQ2nJ+tIAiRAAiTgUgK2EjNq1aqZajPVrFlDDlxmz56ValxGIAESIAESIAESSJ0AlkVv3bpVqsLAL7+MTj0zHzHw4A8/Fvh0795NNGzYQH5iYnKmelw80GOqS5cunfz6wA/X/v37kn369OntV3pMr1EiQmrfcFKu6gJLENRv9erQloA1EjP05ShTprRYsWK54IsdHycbN5MACZAACTiCgK3EDHTUMBlNKSgxY/36dSlF4z4SIAESIAESIIEACGBZ1osXLwr4aUiT5ivDh/m9e39PNcc3b96IgwcPijFjfpGWHpUrV5T5eecJh9/169fVPgsW/CYf0PGQvnv3LgFHo96fVA9uUgSw8D42rENRNvWBsKPKX6dOrWS8UF98WrRoLjns27dXHDt2zK8S+hIzsKLb1KlTBMrHQAIkQAIkQAJOJ2A7MQNvUuA3w+hz+vQp8fXXBeWA4eTJE4ZxVDoMOhhIgARIgARIgAQCJ7Bx40ZRpMjXyR7QjcSMR48eSZ8UI0eOkH10vnx5tXSZMmUQpUuXFM2bNxWTJ0+Sn3Pnzol79+6JxMTEwAtm0RQQPlAnfPbs2SPr2b9/P1l3LKeqrCrSpv2fwJSWqlWrCPCCuGE0TcVIzGjQoL44ffq0RQmwWCRAAiRAAiRgPgHbiRmqww/1G96/GUiABEiABEiABIIjcPfuXaGWBFV98pw5c2RmmDIyd+4cUb16VZE/f5J4kS5dGgFnlfC7MWDAT+LEiRPS0iO4ozsnFZypggX8kvTt20euSqKceoJrqVIlxaBBA8XRo0fE27dvZcX1YgYcmGJ5+levXjkHCmtCAiRAAiRAAn4QsIWYASuKSpWSHHuqAVOo3xQz/Dg7GIUESIAESIAEUiDw8eNHAQEjffqkpVkxnaJNm9Yic+aMmrVB8+bNpFNMWg2kANJgF6bSwHcIlptXY54iRQqLWbNmakuzworjxo3rBqm5iQRIgARIgAScT8AWYgaaYefOnWL+/Hmmfbh0q/NPbtaQBEiABEggMgRmzpyhPXDjwRuixsKFC6S1AP03hNYGsNyAYNGrV09RrFhRjTMsMs6cORNa5kxNAiRAAiRAAjYmYBsxw8aMWXQScByBly9figcPuPyx4xqWFSKBIAhg+U9MJYG/h1q1aoidO3eI9+/fB5ETk6RG4MWL52LRooWicOFCUtSoXbsmp5ekBo37ScBlBLCc9YkTx11Wa1bXrQQoZri15VlvEgiBAJYXhBk5AwmQgLsJXLlyReTNm0dgFQ0uiR65cwFOQRs3bigFjXbt2kbuwDwSCZCA5Ql06NBexMfHWb6cLCAJmEHAdWLG48ePxfr166VHcTMAMg8ScCMBihlubHXWmQSSE1i0aJF8oMZKJAyRJQBnoHhgwbSeGzdSXrY+siXj0UiABKJJgGJGNOnz2JEm4Aox4/79+2Lt2jWidevvRExMTtnx0wFopE81Hs9JBChmOKk1WRcSCJ7A8OE/yz715s2bwWfClEETwPKuFDOCxseEJOBIAhQzHNmsrJQPAo4VMzCnf/XqVaJly29F7twxsrNX3sDxTTHDxxnBzSTgBwGKGX5AYhQScAEBZZlRoUJ5geVYGSJH4PDhwyJHjmwUMyKHnEciAVsQoJhhi2ZiIU0i4Dgx48CBA+Lbb1uI9OnTJhMwIGJUr15NTJs2lQ6zTDqBmI07CUydOkV06tTBnZVnrUmABDQCSsxA/1qiRDGxbdtWbR9/hIcARKMRI4aL7NmThAyw5zST8LBmriRgRwKzZs0SQ4cOtmPRWWYSCJiA7cUMeEw/fvy46Nevr8iXL4/0po6OXf+BgDF9+q/i1q1bAkucMZAACYRGgNdRaPyYmgScQgBiRtOmjUWfPr2lU+B06dKIRo0aiP379/OlgcmNfO/ePTFu3FhRunQpOcYpWrSI6NGjOy0zTObM7EiABEiABOxDwJZiBrx4Q8AYPHiQKF68mIdwAREjS5ZMchuml1y9elVwjXv7nJAsKQmQAAmQgH0IQMxo0aKZLHBCQoLo2LGDyJo1s+yDv/66kOjZ80exb99e8fz5c/tUyiIlxcuaO3fuiBUrlovmzZtpU2Yxtpk0aaJIcmi+jmKGRdqLxSABEiABEog8AduIGZ8+fRJHjx4RAwcOEKVKlUwmYGB9+3bt2ogNG9aLZcuWyv2w1GAgARIgARIgARIIDwG9mKGOAFEDjinz58+r9dWFCxcS9erVEcuXLxPnzp0THz9+5IsGBey/b4xz4O8LjCBWVK1aWeOXJs1XomLFeLF+/TqRmPhIS4n/Oc1Ew8EfJEACJEACLiNgCzHj1atXomDB/FqnrqaQZMuWVTr4XLNmtcAgQIWdO3fKuBQzFBF+kwAJkAAJkID5BIzEDP1Rjhw5LAYO/EnUrVsnWR9eu3Yt0alTR7Fx4waxd+/vAiuPuSlcvHhB1nv27FmSQ2xscQ9G2bJlkT7AMMa5du2aIRqKGYZYuJEESIAESMAlBGwhZjx58kTr4PPmzSOGDh0il1p9+vSpYTNRzDDEwo0kQAIkQAIkYCqB1MQMdbBPnz6KR48eiS1bNotff50m6tWrK+Liynn4ucqePav0fVWnTi0xbNhQ+Vm5cqXAQz8+mDZql4ApIqrc+IbTZNSpW7cfZB3xsiVTpgza2AarkoAHpumAz4kTx4WvMY6eAcUMPQ3+JgESIAEScBsB24kZBQrkE1WqVBJ4k/HgwQNpqurdaBQzvInwfxIgARIgARIwn4C/YoavI58/f06bQopppBAyYmJyyo+ywlTfePivVKmC9qlVq6YcC2A8oP+cPHlCPHv2NCyfxMREj2Op444fP04rF8oYF1dWEypU+TNkSKfVrX37dnLa7KpVK8Vff/0lbt686QtRitspZqSIhztJgARIgAQcTsAWYsa7d+/EoEEDRbFiRZMNDmCmOmvWTI+BAMUMh5+1rB4JkAAJkIAlCIQqZqRUid9/3yPQn+/cuUO0a9dW+9SoUT3ZWEAJBtH+xpRYfVkHDPjpvzrsFGfOnE6pukHto5gRFDYmIgESIAEScAgBW4gZijXMNk+ePClat24l8uTJ5TGYSZ8+rahevapcgnXatKlyH31mKHL8JgESIAESIAHzCYRTzPBVWjgP/ffffz0+Dx8+FChLSp/vv28natas4fcHL1FSym/16lUeZUCZME6JZKCYEUnaPBYJkAAJkIDVCNhKzNDDw9zb9evXi7Zt24i8eXN7CBvqzQyWhzt69CjXuteD428SIAESIAESMIlANMQMk4ruiGwoZjiiGVkJEiABEiCBIAnYVszQ1xdzWDdu3Cjw1gVzUpWYob5LlowVMPU8fPhPgSkrnz9/1ifnbxKIGIH379/JcxDn4YcPHyJ2XLMPhDejqAMDCZCAuwlQzIhu+1PMiC5/Hp0ErEgA48tIW4lZkQPL5A4CjhAz9E2Fhyx07q1atRRY1kwJGvrvNm1aiXv37uqT8TcJhI3AmzdvxI4d20X79t8LTIdS5yKmQfXq1VNcunQpbMcOV8ajR48SmTNnDFf2zJcESMAmBChmRLehKGZElz+PTgJWJNChQ3sRHx9nxaKxTCRgOgHHiRl6Qs+fP5fCRps2reVSaOohEt+XL9vvAVJfN/62B4FTp06JQoUKSAEje/ZsokKF8h4fiBvw0N+2bWu5Oo89aiUExQy7tBTLSQLhJUAxI7x8U8udYkZqhLifBNxHgGKG+9rczTV2tJihb1g4B0uaitJW5MyZ3bZixrNnz8S6dWvFjBnTPT6HDx8Wb9681lc5Yr9fvnwp1q5dI16/js7xI1bRAA907txZkStXTpE27f9Et25dxa1byZfeO3HiuGjevKkUO6Ci379/P8CjRCc6xYzocOdRScBqBChmRLdFKGZElz+PTgJWJEAxw4qtwjKFi4BrxAw9wBcvXtj2wTsurpw2TUFvaYLfWLp25swZEfUJ8unTJ6GWyWvV6js9Zlf/Pnv2rMidO5fImzePmDdvXoosMLexU6eOsl2rVq2cYlyr7KSYYZWWMC7H7du3pOg5ceIE+Q1/QQhXrlyR/9+86Smsbdq0SW6HY2Xv8OTJE7lv3bp13ru0/w8ePPBfnLXyG46XjQKW2oQYi+mAED/xG2WE/5WEhAT5/4EDB4ySym0nT56QcU6fPuUzDndElgDFjMjy9j4axQxvIvyfBEiAYgbPATcRcJWYgQFzjx7d5ccub8C9T0YlZnTv3lUsXbpE+/Tu3UtkyZJJPhD36dPbO1nY/seDuFpN5ttvW4TtOHbLGMIOBKY5c2b7VXSIQj/80EWmwQOe1QPFDOu20MKFC6Q1kF7sTJPmKzFmzC9i6tSkZatXrlzhUYHs2bPKc89ISDhx4oTch/y8A6yyGjSoL5C/9/F+/nmYXLZSnwbTrBAPTpvr1q2tpXn69Kk4fvyY/B953b59W59M+12qVEkZZ+zYMdo2/oguAYoZ0eVPMSO6/Hl0ErAiAYoZVmwVlilcBFwlZvzzzz/a4NmuPjOUmLF8+bJk58Svv06T9YMPBkyriVR4/PixWLx4scAUGAYhHXqmT59OlC8fJyBS+BsgsOXJk8sWTpvgj8bXA6e/9WU88wksWPCbwLkH58cQx3Cfu379uujZ80fpm6Vy5YryHmGGmAHLivr164l06dKIfv36ilu3bsnPnj27ReXKleRxvO9TSszo3LmTdIbbtGkTMX78OIF7MxzlxsaWkOlgYeYdLlw4L0WT3LljxN27dODszSda/1PMiBb5pONSzIgufx6dBKxIAONyu760tSJPlsnaBChmWLt9kpUuJTHjwYMH8kEAbz7v3buXLK1VNsDE3MlBDS5Xr14VcDVbtvxWtqHTGQUMhglSJXDnzm3NOgs+bLwDrBmUBYUZYsbkyZPkudq4cSPvQ4kzZ85I65BcuWI8HNsqMQPlMLJawjbcv6pX///2zsNbiirt13/IvZ9XZUAxEwSUIKOIgARFJCsmlKQYQBQVMAsqOiMqfqKiYwZFARkUCYIHBEmC5Ax6ABEQMWAY9l2/fWaXVd3VfarP6e7q8Oy1alV31Y7P7lD1q/2+b6ckIVD917l+/a5Oao8D8RFAzIiPvVp2/zc7d+6MtyO0DgEIQAACEIiBAGJGDNBr02RNxAw9mR0w4Ca7hbX973/Psudku56Ytm/fbu67716vvOrRMnb/zbZuQHR8ypQpgeJa1q7jR48eNbrQGjNmtH3fqdOlRkvgFOkjVZLtvivv+j58+DCjFQFhSfb2I0feHejnm2++kZR1w4b1RvW4OrXPtlnH6NGj7E3XggXzk9qv7sCECc/Ysok3m9WV4zwE9L3UzX779u1Swrjwwr+Hfr4yNTNR/Hp9j9Xetm3bQttr0eJ8e37JksXeeSdm6Psflr755hvPRGbZsqVelmPHjpn27S+x9cnZMalwCCBmxDsXiBnx8qd1CEAAAhCIlwBiRrz8M249nZghPwa6uZC/Br95w6pVK+1xnQtL7glrr149A6fnzZtnl6arnJana6tbt45p166tka8Ml3Rjojz33z/GHbL7rl0vt8crKj43jRs3tK8V3UN5tSksaZiQIBOZCy9sbfNor3Zbtapafn7GGaeZdevWBdqRGCPTGkUNcf3U+44dLw3k05L3OnVOMieffKKXT30Ie7IcKJjhG4kZp59+mpEfgEwTYkamxMjvCEiY0/fqoYcedIeS9tkSMyQqqi2ZRd177z1m1Kj7krY2bS60eWbNmuX1w4kZMktLlWSCorpVr0ubN2+yx1q2bG7FUXecffwEEDPinQPEjHj50zoEIAABCMRLADEjXv4Zt+7EjEmTXjRavaBt+vTpdqWBhIYuXTol+a6oqZghAUICgd9cYseO7Wbx4opAv6sTMyQwSCjRqgjZun/55ZemT59e9uakceNGRrZ9Lsnvhrvhee+994yeyCrJPv/FF//Xlrn88sts9ANXRqF2Zbc/a9ZH7pB9WrxkSVUEBx3U6hA9fZZ4sWjRQi+fojv4nwB7J2rxIhsrM6ZP/7AWPaBoORKIQ8yQ6FDdNnv2bG863Hc7nZgxd+5c+7vTsOE53vf/6aefsu34BQ6vUl7ESgAxI1b8mJnEi5/WIQABCEAgZgKIGTFPQKbNOzEj7AZCy8v379+XVGVNxQyJI02bnptUX+KB6sQMLTeXmOBPu3bt9G6CPv74r5udV1+dbI8PGTI4sPpDZeUgsHXrC+x5v3AhFn//+wX+6pNeuyfJCiOb6/Tpp3NsH+WMMdMkh4oaDwkCmRKIQ8zQyqnPPluQdvM7Bo4iZmjc553X1H4PZsyYbjG43z0cf2b6qch9fsSM3DNO1wIrM9LR4RwEIAABCJQ6AcSMIpthd1GvELPvvvuO3fTU8tJLq6IHyLHezJkzA6OqjZihG+vqnoZWJ2aERSY4fvy4GTDgRnvD4l8W3737lfaprH9VhX8wDzxwvy3zyisve4edsPPIIw97xxJfODFDeWXKkcu0ffs2c8opdU3z5ucFzH2qa1MCz2mnnWouv7xLdVk5D4EkAk7MkJlGqpRtMxN9n1L5zAjrQ1QxY/LkKlHzmmv6mbVr19jvvFadHT8ePTpQWPscyz4BxIzsM82kRsSMTGiRFwIQgAAESo0AYkaRzagTMxJDHv72229Gtun16v3N+oXQUm2XaipmaGWB/EvohqVTp45m4sTnzYEDB1y13r46MUPmIWHJ3Xz5xQytBJEg06RJ49BNPjPUH79/DtUvMxOVkxCg937TFbUtHyISfZRHebt372YmT34lySQnrJ81OTZ06C22n48++kik4jKj6dmzh+2b3wwmUmEyQcAYI9MkfTcUulSrmBKTHGfKzEp5Eh3M6vum4/qOJyb9DuicNpf0ferdu6c9FvUzrrJRxQxFZtHKMPm+UdjXVH1z/WEfHwHEjPjYq2XEjHj50zoEIAABCMRLoCjEjCNHjlhfEHoyV5vNed/XhfGmTRvjJV/D1lOJGa66q67qay/8b7vtVnfI1FTMUAWKUNK8+fn2JlvcGjVqYN5443WjlRUuZVvMUDsSZdJtitzgT4pc0qxZE6+f8sWReMOm/Iq8ojHIF4jaURk5EM12UvSW889vZv106GLfH/0lsa1ff/3VuzHUDSIJAjUh8MMPh80ZZ1Q52L366qvML7/8YqvRd3Xr1i3WZEyfeW2J3w3n50UOPdevX2/FP0UskU+Zpk2beCFd/f1asGCB/b5J8Jw6dYrR59ifJKgoypA/RRUzVGbYsNttX9UniZhHjoRHMvLXz+v8E0DMyD9zf4uIGX4avIYABCAAgXIjUBRixsGDB+1FrbsQz8a+VMWMqVOnWlatW7fyPsu1ETNcJQqj6qITiL9CtrqUbTFDEUf27dvrqs9ov3z5ctOyZVXkE/UzlY29wkWee27V0+hTTqlnHalm1FCEzAozKbFE/dCqi5UrVyaVmjFjhrnkkrY2j0xsEn2LJBXgAATSEKioqLACmj5zEgFuvPEGc/311/3389XNrnbSuUQxQ6ZRp55az+bTeYkhTniQOZh+T3Q80fxrxIg7vTINGpxt21Ob2iQYKryyP7k60zkAdfnnzZvr1T1w4AB3mH2BEUDMiHdCEDPi5U/rEIAABCAQL4GiEDP0RE5hNrO5yT9BMabqVmbIv4VuOhTxw6VsiBmqSyFT3XJ0XcC6lE0xo127S2z/E1deuLai7CVg6MZKHCTupEo7d+7wbuDmzJmTKlutju/evcuuJlJfZN6iiCoSL7TXJrMX3fQ9/PCDoaYBtWo8h4XFy2/qk8OmqDpDAhLNJGBIzHAhimXKJVOmVD4z1MSKFcvNdddda81UXDmZYsmETSZh+v2VwOBPWnGkaEDXXnuNueCClvY7p8+58l5zzdVJoZdvuWWIPeePcOKvz/9aKz30vdEKrS1bNvtP8bqACCBmxDsZiBnx8i+V1seMGW2vSRQdjlT8BN555x0zfPiw4h8II4BABAJFIWZEGEfZZEknZshPRMuWze0NgN9PhW7uzzzzDHv8gw+mBVjpRkWhU3XToPCp1aX27avEhlyJGf/85z9sXxSdRE47a5rck+R0YobqdqJHrsQMtSHGWrovB6XNmjW1oob8ASj6zDPP/DNpKX5Nx5zPcuPGjbU+DfLZJm1lRmDv3r1mx44dgULpxAyXMaycO5duL7Fk06ZNZuvWremyRT4nB8f6Xbr11lsilyFj/gkgZuSfub/FbIsZ+h4/++wEI+e7ilYUtinqlvLofy3RvMzfN14XD4G77hphf2/1cIVU/AT0kLFt2zbFPxBGAIEIBBAzIkAqpCxhYsbixYuNIoYoBKou/hs2bJDk2LJfv6vtOdmeT5tWJWhUVHxubr55iPWJESZmPPXUeLN27Vpv+AsXLvRWMmjFgUvZXJkhO393w6Uwqi40o2tr7txPzZtvvune2r2Wsm/YsME7JmFCT3M1Jq0mUdIF2j/+8XTgRuvDDz+0Dk61vF6mTPlKGt/QoakjTuSrH7VpBzGjNvTiK+u+W4lmJvH1KLxlOStVZB99hyWQkAqXAGJGvHOTbTFj37599nun716U7eKL2xh/ePVc0dBKSlLuCCBm5I5tHDUjZsRBnTbjIoCYERf5GrbrxIywiww54rvzzuFJT2PVlJaeu0gg/rJaGv7ee1V+NnRcFzJKCu/qz+deKxrC+++/F+h9NsUMVaybFynKrs3EvSKW/PHHH7YPuilLPK/38rsxc+YMr58vvfRSaD6FUJ0/f76XLx8vEDPyQZk2wggUg5ixeHGFDW2s73GuwyiHMeJYZgQQMzLjle3cuRQzbrrpRutfR/+zcgg8e/a/7XutyujcuVPgP1UPC7Kdvv/+gOnSpbNtx7/aNNvtUJ8xiBml9SlAzCit+WQ06QkUtZih5czPPfesGTRogGnUqGFgk+33+PFP2htjf+SN9DgK/+xbb71pl3fqYsK/yaHed999l3YAhw4dtGU6dGhv+ve/3r5WpBg5nXR1aQWDkpaOKtTr44+Ps8tMe/XqYfOEPSX9+OOP7bnPP18UaF+ih+pdvXpV4Lh7I7t5ndcKkcR07Niv9sJJqy7cMlf1ZeLEidY5qEJDKmklh5xoKjyk8vXt28fWuW3btkCViqyg/jzwwP02n2z81bacdOY7IWbkmzjtOQKFLmbo+y4TLAkZV13VhyXsbuIKeI+YEe/k5FLMkBlkqqQHCgsWzPf8aMk8QeHPs5kUFcw9rEDMyCbZ5LoQM5KZFPMRxIxinj36nimBohQzvv76azNw4E1eGE73Z5dqf+21/czy5V9myob8EMgJgVIQM3AAmpOPRs4rlU8aOQkOi6yT88YjNCCRUc5HJ016kcg+EXgVQhbEjHhnIS4xw4368OHDpn79KpMwXYP5TT5dnpruETNqSi7zcogZmTMr5BJyAMrKxkKeIfqWTQJFJ2Y8++yz5swzT/fUer+AIZOBs86qcnTpP67XOqen9yQIxE2gFMSMuBnSfmkSqKysNN98s6c0B1dko3r33XfN558nr5pLHAZiRiKR/L6PW8zQaLU60l1zpXMkrhDvH330kbft2vWX760wapmKGVpp6a+/kB9iSVD293X37t1hCNIeW7p0qa1DK1TD0urVqwNtiGeqFCZmyHm5v49yMp9JWrPmq0D57du3Z1K8Vnn1X+Lve5RVuOqfv8yaNWtq1QcKQwAC+SFQVGKGlhkqlKX70+zdu5d5++23rHNHmUfIlEA/6nqtC+JXX51s+ve/wcuvcm+++UZ+yNIKBFIQQMxIAYbDEIBAwRBYuPAzu/rxhRcmpl0lg5gR75QVgpihEM2XXdbFXmvJ3MQ53hYZmbHed9+99oGSwja76zft5dtK13GJN9m6btMDKOfIW3nlE0zH3OYXPV977VVr7qL6/PWrPUUQSzSBTTdjV155hW3j0ks7pDRz69y5o83Trl3blFXJ5FV97dKlk5dHLEaOvNseD2Mh07pdu8IFh9atL7Dl5Lfkq6++Mt26dbVh3TVe3bj7k27K+/TpnbR6WXzkV+3HH4/4s9vXiWKGvtdNm54b4Kn50Oo++U9Jl/SZlD82+Vjzz8fJJ59kOnW61HzxxZLQ4nJk7+ZXUbVSpVatWth8Q4YMTsqiewD5etEKP3/bGrtML8KSIufdfvut9jPmL6P+X311X7NnT+ZCU1g7HIMABHJDoGjEDPlqcA4s69c/xQoV+gONkpYsWWIaNWpgf9j0Q/nll5icROFGntwQQMzIDVdqhQAEskvA/eeed15TowgzzleRvxXEDD+N/L8uBDFDo5Z/DXcjQIoA6gAAIABJREFUKHHBJd1468b9nHPOMkOGDDJjxz5mN93ku/wdO3awD6JcmVtvHWrFCXfdpnynn17fHmvSpLHdK+S8SzqmqGS6wXf164bW+d/RuY0b/4p45sqF7f3j2LJlS1IW3Sy7G2U9XNu4cWNSnr17K7225QfIpVWrVnosbr55sNdXiSOOhV6HrbRwwoIctp97biMvv8r5xYz333/fnH32mfa8uDoeiqCm61/lv/LKbvbhn+uX9n4xY+LE520/Fbre8faLL6NG3ecvGnj9zjtvW5FK7ej3Y/ToUbYPXbte5kXD0zV82HW4Vl47Dv4xBRowxjRuXDV+iV7+dOzYMTNgwI22Ds29PgMav/zqiUmY+KGIfY5ns2ZNPF4ao/v9a926laluFZG/H7yGAATyS6BoxIw77rjd/kDpT0niRKZJfjbOOedsW4d8aJAgEBcBxIy4yNMuBCCQCQE5SXY3F9rLsbZMBfwJMcNPI/+vC0XMkEmD+6zoptSfdIOtp9+J6f77x3hlwqKhRDUzUUSyHTuSQ7fOmzfXe9quUO9RnMHPmzfP69PLL7+U2GUbJc2NU3uFsE9MixYt8urYsGF94LQckR85ksxCN8+u3meeeSZQRm+cmOFWwGiVgczAtOkmXkmmFOef38zWoxUgiWnZsmVeyOsnn3wicNqJGa4Peq+VJC4tXLjQNGhwjq1bokiYyci0ae97qzG0AsRFx3N1rFy5whMIJE4lmgHVVsz47LMFHsM33njdNWv3hw4dSnL4rlXcWomjMWuF0E8//TVeFZJg5nhef/11gfp4AwEIFA6BohAz9IPauHFD+4PzyCMP15ieom7oR0s+N9KpvjVugIJlSUAO0PQnGnWT+t+zZ4/I+SXEkSAAAQjkm4CcObqn2+4mR8u1b7lliOdEFjEj37MSbK9QxAxdU7nPSKKYEexx8F2LFs1tuauu6hs8YYw1P3F11jSaiUxcXB1RxIxffvnZriJRGZkeJCY5KdY5XYtqL3OOxHT33SPsOYWYd0JDYp6w91oBpTqvuebqpNNOzND5MWNGJ53XgQcffMCW1wMTv6mPP/Pw4cNsnoYNGwQEJr+Ycfvtt/mLeK+1ykHta5MQ5U+KbiOTHp2TiUkqM5Hly5d7dfTtG2RXWzFDq0/UvoSSKEmrXJRfvva0QiMsvfLKKzaPfvfWrVsXloVjEIBAzASKQsw4ePCg/TGRvV5l5V9LCzNlJzu/Nm0usnVNnTol0+Lkh0AoATnJkjhx0UUXRtr0p6g/26j5tUwz0zRp0iTz8MMPscGAzwCfgVp9Bk477a9IFbrwd5t8GOhmZOTIu0JvvjL9zSJ/zQiUipihJ+A//1wVGt6RiLoyw+UP2/vFjK++Wh2WJenYbbfdaj/nMj/wpx9//NGaUEjgk9mVvgv6HiQ6xnQCzbhxY/3Fq33txIzmzc9PMjXxixlhQoV8xunaQn167rngyhh/wwqn677Dmzdv9k45MUOmMzLrDksavyubKGY4YUDntUIjVZKpmsxclE9mHHv2/OXwubZihgQv1asxTJ/+YaoueMfbtLnQ5k/lS0MZ9Rl0vls++GCaV5YXEIBA4RAoCjFDXtX1A9W16+W1JnfTTf1tXY888lCt66ICCNSEQD7MTLR0UhcKbDDgM8BnoDafgRNO+B/7n6n/4MRNzh51oR/2JLkmv42UyZxAoYgZchjrPh9hKzMk+su/xEsvTbL+GTp0aGe0uRtwlU0UBTIRM3STrFWSL730knn66ads3apfvjpcv6ZMeTcS4DlzPrFl5ADSb1YlExHVpZtxjadDh/b2vRzRu6SVlBqTbqhTRcOoYrHBshgx4k6vrxJGXF8PHz7kqrR7J2bIL0iYvzi/mY/MOcQibNMcuDb88+TEDH2nUyU9EHRlE8UMv8lQdSsYZL7j6vH7zqitmLF169aAGcs994y0YolWjSSmffv2er5FFBggjJU7pt9P9Ted6JFYP+8hAIH8ESgKMUMejvVDgpiRvw8GLeWOQD7EjNz1npohAIFyIXDw4PdGTgDdjYd/L5t82etjZhLvp6FQxAy/40y/ACA6utG+5JKLQz9H/s9UTcUM+eMYOHBAtfVHFTPUZ+cs0y9UyG+C+vuvf71mJ12iid77TWTcMQkhYUkhWWV+4h932OtUYobMXMKSoveF1ZPuWDbFDF2fq63mzc8zWsGRLjlRSPn9vlJqK2aoTZmxOPHBjV1+RrSSxp+WLVuaMS/EDD9BXkOgcAgUhZgh5VY/Sg0bnmN0cVWbxMqM2tCjbDYIIGZkgyJ1QAACuSYwa9ZHgQv+evXq2tCOcrbo/A8gZuR6FtLXXyhihvMlIRPKQ4cOep1esWK59VOmaziF1Jw06UUbmvPXX38x2h5/fJz3GauJmKGn5wr3qfoVseKhhx40Mgdw9S9d+tdNayZiRq9ePWydTqiQM0sXJcQ5xvz00zk2zxlnnO45l3SCh0xVEpOuZU8/veopv/xKaBXJ0qVfeH197LFHPRa1ETPatbvEXH55l2o3iQou1XZlhhMz0oWrdW35xQzNv0vZEDNU17p1X5tBgwbaewYnaGjFiVZguOQXM1q1alktK/FMdJrq6mIPAQjES6AoxAz9WTknZOvXBz1DZ4JPQohT2/UHS4JAHARKQcyoqKgwEyYke1yPgydtQgACuSGgJ5HuZkAX8zt2bE9qCDEjCUleDxSCmKEbw5NOqjKRuOGGv6I+yI+DM/PQTa4TAfyAFA3EfcYyFTMkqA0ePNCWl9AW5sRx9epVXv2ZiBlafeH6pf5qRYXe9+3bxwtRLHMPd03pnvy7sK1z5szxD9OGQpWjSdVx6aXtkyJnKLPCuLo2ayNm+H1hBDqR5k1txYyrrupj+y4Tm7CQtv6m/WJGNs1M/G3o9fffHzDjxz/phdKVGc+mTVWhdP1iRin6wpAQ/frr/0pEwnsIlCSBohAzRL5fv6vtD2Xnzp28P5JMZkR/eg88UBUGTOp6Kk/LmdRJ3uwQUOiyt95608ydOzc7FRZ4LaUgZsixmQRGEgQgUJoE5K/gxBNPsM6KP/poZspBImakRJOXE3GLGfJV0bt3T+8mXMv8XZo5c6Z3XP0MS7rZdDfwmYoZv/76q1d26NBbwqr3RAi1kYmYoc+/c36rSGVa8aE6EkN+3nJLVQQNhVaVyC9fGVpFfOTIkUB/3DypDnEJS/pfdSwyFTO0WsqV1eqXTFNtxYw33njDaz/d74X6deutt3h5/Z8X/8oMhZkNS/J1odU/Gmv//jeEZUk6pv44Nu4hjOanceNG9njYKpqkSorsgIRomTORIFAOBIpGzFiyZLH9k9APkpz6ZJr86n+i46JM6yJ/dgk8//xz9g+le/du2a24QGtDzCjQiaFbEICAR+CFFyaaHj26m59+CkaY8DL89wViRiKR/L53N8m6+c5GkjmFu/GTH4x0SY4VhwwZ7OVP9CngFzN0ox+WXOQPtVkbMUNiQ1jyRzPJRMxQXa1bt7Jjmzp1qmnUqIF1drt3b2WgGRcdRKYmLppGmLDi5knjlGlJWHLRTJQnUzFDc9GxYwfbXzkm9Zv6hLWVeKy2YoZWY7jPjfqRKm3evMkz/0i85vOLGak+e4pE6NqJKmZoBY0r448OpxC0Oq653bLlr8guqfpeTMcRM4pptuhrbQkUjZihgcpjuvtBkjOpVatWGinz6dKuXTuNlHPZy6ls/fqnGIV6JRUOgTjEDJkuyWlYHAkxIw7qtAkBCGRCYNasWXZpfHVlEDOqI5Tb8+4mOZ9ihgSud95527vZ17XVrbcONYp24U+KcKKVCjovfxCJSc4f3bWZ8qQTM26+eUhicRtR5LTTqp7Sy2dDohmL/GXomk91a8tUzHBmH/JvITMWhWBPTIpMotW+Mi+R80u18/HHHydmM/Pnz/dYqN7EpAdufhaZihmqb/LkV7w62re/xEboSGwn1fvaihla/XzHHbfb8WvOH330Ec+vjmvzl19+Mdddd63NI/Oczz9f5E7ZfWXlt+bUU+vZ8xIYFBnGnz777LNA9JtEMUPzf+DAAX8R+9qZCGluFELWpYULF3pmQk2aNLbRdty5Yt8jZhT7DNL/TAgUlZihP9Brrulnf+jcn5P+ZB544H6jiCeJm8JnuR9G5deP5+LF4U8HMoFG3uwSyLeYoT9ThTnzO7/K7ojS14aYkZ4PZyEAgeIhgJgR71zlUszQDaVECHdtJfFBD5JatDjfuw6THwIt0z927FgoCH9kiXvvvcdole27775jZJahm950oVkPHTrkmQLIrFGrQNSXGTOme21pFYS7HpTTzmnT3je6SdV1hYQOf/2Zihny0ebq1t5FMfEa/++LYcPu8PI1btww5QMzJ6xo3FoxIj8bEoXc6hF/X2siZqg73bpd4fVF1zmaMzd/2rs5lPNSf6qtmKG6FMVEqy0cs969e9m2Z8+ebfdt2lzknUu1QlqfC1dePka0kkL9vuOO2+z1fMuWLbwVKIlihsrqMzt27GNeu4ou48LanntuI1NZGVxZM2bMKK+9s88+K/R+Qg5mtVKtmBJiRjHNFn2tLYGiEjM0WCm7+kN0P3ZR9xdffJGpqPi8trwonwMC+RYz5FFdnxvEjJpP5nPPPWufxNW8BkpCAAKlQAAxI95ZzKWYke76SjfmQ4febNasWZMWgK67/A+V/HXKZNjvaDNxZYYqlvDhL6PXumF3SU/i/TfJ/rxyWqsVEc73RaZihlb+upCyqiPV6pf58+d5fdRK4FRp0aJF3koAfz/1WoKGVla44zUVM+QLwu+HxNWXuJfpjD9lQ8xQfRI0evS40htHYrt16pxso4q4aEj+Pui1/Nmdf36z0PLnndfMihFa9aF6/WKG6lMI1sT23Hv5Mdm0aVNic9YHn6Kc+IUkV8a/10PTYkovv/ySefjhh4qpy/QVAjUmUHRihkaqH61FixYa/fg6T9L+Hx3/6zZtLjSffPKJkc0cKUjgu+++Cx6I+E4XHHL6FTVV1w5iRlSShZMvk/kvnF7TEwhAINsEEDOyTTSz+rItZuiBkW7u0m2KlpFoUpKu1zLp1A3oFVd0tZvEcJkA61pOpgGurTCzYf/1niuvazp/+vPPP8x7773n1a8n9F98scS7TpEDSLWxffs2f7FIr+WYXGXTObWU2aobQ3WRPJRXN5luLLr+2b17l2UhIcDVk7jSRfOsczK1qC6JmcxflH/kyLu9tuRXRMf27NnjsXF1LVu2zJ6TM/ZUSf/7rn8rV65Ilc1eb2/dutX885//8NrWqhqZrkX53Mj/x7Rp06xYIU79+19vV9zouNLq1attP7QCx590/v333zcPPni/164EM43JlfXn979WvxQBRE5Y3dxoxY3Gq1Cv3EP4afEaAoVFoCjFDD9CqbhS/qVE+7e5cz81u3btsis5/PnL+bUuGhQnW2YOUr5l56m94sPrjywx6YmLzusPUBc4+gPWe4Vak6MqmWts2LAhsZi1O1TkGOXV5toZPnyYkU1kYkoUM/QnLhFKZWfOnJGY3b5XWC1Xv8ugCwI5dHLHtb/sss5GeZXuvHOYPXfSSf/PqveuX8qn1T75SqVgZpIvVrQDAQgUNgHEjHjnJ9tiRryjoXUIQAACEIBAZgSKXszIbLjlnVtPLmSr2aVLZzNixHC7KXSTjmk1S+ITBcX/1nHZw8pXicL01a9/qrWXdY6qZJ+okGD+pBUzynv99dd67WiJn+qSiUdiyLJEMUN1DRw4wOa/4Ybr/VV7r++++y57XiF7leTUVQKL+qUlqBpfz57djex5161bZ/PceGN/66TLjVeihpx2aQtzLuY1lsUXGzdutCFNJQhV96Qgi81SFQQgAIGcEEDMyAnWyJUiZkRGRUYIQAACEChBAogZJTip6YYU5gBVN/4SGnr16hko6sQMiQRaxeD3LK1lfg0aVAkUEhb8SWYoumn3J622cLan8trtT2FihpYwShCR87CDB7/3Z7evnSMt2aAqORtK2Z36k0xcEpeuxukzQ+KRWGvTEkYSBCAAgWImgJgR7+whZsTLn9YhAAEIQCBeAogZ8fIviNbl1Eo311qp4Pdv4cQMnZs9+99JfZWHaZ2T2KFIM9Ul58jrwgtbB7KGiRnKIPMP1Z8Yb1wmRDp+0UV/9+wvnZjx9ttvBeoOexOHmCFbU3nvVr8HDLjRdOnSyfL++OPZYV3kGAQgAIGiIICYEe80IWbEy5/WIQABCEAgXgKIGfHyj6V1mTdItFi9epUNXyaHR7rJ1rZv3z6vT07MkOlGWNq9e7dXLswLufxsqB2FAJNgcfPNg23+Fi2aB6pLJWY4L+eKly6HVi65WOb+FR56rf5rxYZil6cz4YhDzFAINvVP3rjFRP5IZN7SqlXLAHM3RvYQgAAEioEAYka8s4SYES9/WocABCAAgXgJIGbEyz/vrS9fvtz07t3TEyGciOH22RIzFPZUji5dvf59VDFDK0ZcSDUXEk0mIw0anG3rlUd1l7QypG/fPl57l19+Wcq44PkWM44e/dH6ChEDf2x3Fz5t2LDb3TDYQwACECgqAogZ8U4XYka8/GkdAhCAAATiJYCYES//vLb+0Ucf2Zv9evX+ZuTn4p133jbyZaEwXU5syIaY4cwp5Bz0iSceNzKlUFgrCRxqJ6qYITh33lnlz2PEiDstqwULFtg6rr22X2C1hk4qFJkEgvbt23njadKksdm6dUuAc77FDDcGRVPxrzDR6w4d2llzk08//TTQR95AAAIQKAYCiBnxzhJiRrz8aR0CEIAABOIlgJgRL/+8tb5//35Tp85J9iY/MV56ZWWld/NfWzHjk08+tnXJceeWLX+tnNBAP/hgmj2XiZjhxAv55VAMdicMTJkyJSU7iRozZsywUUMkngwePDCQN59ixoIF860jU60mkdlNYtqwYb01N7nggpYmzFQnMT/vIQABCBQSAcSMeGcDMSNe/rQOAQhAAALxEkDMiJd/3lqvqPjcCgkdOrS3Kxj8DWdTzHC+K+65Z6S/Cfu6JmKGhImOHTvYvs+a9ZF1CiofHkePHk2qP/HAxInP23Iyd/GnfIkZ8tuhkLQKBfvJJ5/4uxB4/Y9/PG37ee+9I40chRZD+v3330PFmWLoO32EAASyRwAxI3ssa1ITYkZNqFEGAqVNQNfOmzYFowqW9ogZXTkTQMwok9l/772p9ob5nHPOMocOHQqM+tlnJ9hzWsVQ25UZMgdRPd27dwu0oR/W/v2vt+cyWZmhStzNfvfuV9ry9957T6DuVG+mTHnX5k8UM3r06G6Pa5VHLpNbReJ3VBrWnkSPTp062j599tmCsCwFd0xOY+vWrVNw/aJDEIBAfgkgZuSXd2JriBmJRHgPAQgMHjzItG3bBhAQKAsCiBllMc3GfP/9ARvpQ0LDtddeYyOZKJrJk08+Yc0cFAUkG2KGbsa1EkGbbnjVhrYbb7zBnHnm6baNTMUMrQJQ37RpVUZFRUXSrKkt+epw7S1Zstg0b36eLfPaa68G8jtxpGnTc43CxS5bttRs3JhdBVuOPk888QQbgjXKKhL59VB0k8aNG1pzmkCHC/ANYkYBTgpdgkAMBBAzYoDuaxIxwweDlxCAgCWAmMEHoZwIIGaU0WwrZKmepjthQPv69U81r7/+L9OzZ9VqhdquzBDOCROesaKDv51zz21sVq5caZ1dZipmqM7rrrvW9rtz546hM3bxxRcFxqW2NdZRo+5LCtOqkLIXXNAqkH/OnDmh9dbkoEKvtm7dyooTEleipgkTqlbI5HrFSNT+pMuHmJGODucgUD4EEDPinWvEjHj50zoECpEAYkYhzgp9yhUBxIxckS3QemVD9/zzz5lhw+4wCxcuNJWV39qerlmzxr6XOYhLR44csccWLVrkDgX2CpOqOrRp9YQ/LVu2zDz44APm0Ucfsefd6gQJKl9+ucyf1UZTUR1r1nwVOO5/07XrZVZ8+Pe/Z/kPe69//vln287YsY+ZoUNvMfKvkc5eUKKNnIgq7/Tp083Bgwe9umr7wpnaPP74uIyqkoNTmedIiCl0cxPEjIymlswQKFkCiBnxTi1iRrz8aR0ChUgAMaMQZ4U+5YoAYkauyFJv1ggo+opu8K+8slsgtGnWGshiRfPnzzMnn3yiadv24hr1VatXFAlGYW1/+OFwFnuW3aoQM7LLk9ogUKwEEDPinTnEjHj50zoECpEAYkYhzgp9yhUBxIxckaXerBCYPv1DG1K2Xr2/mUWLFmalzlxVotUdrVtfYM1Lvv766xo343x63Hbb0BrXkeuCWkWyb9/eXDdD/RCAQIETQMyId4IQM+LlT+sQKEQChw8fNgcOHCjErtEnCGSdAGJG1pFSYTYIKMKHfG84Hx+jR9+XjWpzVodCqo4ePcquIBk//slat9OmzYVWFJk1K9ysptYNUAEEIACBLBBAzMgCxFpUgZhRC3gUhQAEIACBoieAmFH0U1iaA/jkk4+tMKAIH/K9cfz48YIe6P79+027dm3NpZe2N7///pffkZp2ev369VbMuOuuETWtgnIQgAAEck4AMSPniNM2gJiRFg8nIQABCECgxAkgZpT4BBfr8BRx5IYbrjdLl35RNEOQE1Q5Rc1WklPTP//8M1vVUQ8EIACBrBNAzMg60owqRMzICBeZIQABCECgxAggZpTYhDIcCEAAAhCAQL4IIGbki3R4O4gZ4Vw4CgEIQAAC5UEAMaM85plRQgACEIAABLJOADEj60gzqhAxIyNcZIYABCAAgRIjgJhRYhPKcCAAAQhAAAL5IoCYkS/S4e0gZoRz4SgEIAABCJQHAcSM8phnRgkBCEAAAhDIOgHEjKwjzahCxIyMcJEZAhCAAARKjABiRolNKMOBAAQgAAEI5IsAYka+SIe3g5gRzoWjEIAABCBQHgQQM8pjnhklBCAAAQhAIOsEEDOyjjSjChEzMsJFZghAAAIQKDECiBklNqEMBwL5IPDUU+PNWWedkY+maAMCEChgAogZ8U4OYka8/GkdAoVI4LbbbjWdOnUsxK7RJwhknQBiRtaRUiEESp/AuHFjTd26dUp/oIwQAhBISwAxIy2enJ9EzMg5YhqAQNERGDx4kGnbtk3R9ZsOQ6AmBBAzakKNMhAocwKIGWX+AWD4EPgvAcSMeD8KiBnx8qd1CBQiAcSMQpwV+pQrAogZuSJLvRAoYQKIGSU8uQwNAhkQQMzIAFYOsiJm5AAqVUKgyAkgZhT5BNL9jAggZmSEi8wQgIAIIGbwOYAABEQAMSPezwFiRrz8aR0ChUgAMaMQZ4U+5YoAYkauyFIvBEqYwLJlS826detKeIQMDQIQiEJAYkafPr3Mf/7znyjZyZNlAogZWQZKdRAoAQK7d+82W7ZsKYGRMAQIVE8AMaN6RuSAAAQgAAEIQCCEgMSM//mf/2PWrFkTcpZDuSZw553DLf+dO3fmuinqhwAEIAABCBQcAcSMgpsSOgQBCEAAAhAoDgKzZ8+2N9P9+l1lfv755+LodIn0cvHiCnPCCf/XtGzZ3Bw9erRERsUwIAABCEAAAtEJIGZEZ0VOCEAAAhCAAAR8BI4fP24GDhxgBQ3dVC9dutToGCl3BA4cOGAefvghc/LJJ5pTTqlrKio+z11j1AwBCEAAAhAoYAKIGQU8OXQNAhCAAAQgUOgEDh8+ZJ0Cn3jiCVbUuOmm/mb69A/NH3/8UehdL5r+ySfJoUOHrIhx9tlnWs6nnlrPLFq0qGjGQEchAAEIQAAC2SaAmJFtotQHAQhAAAIQKEMCcjjnfDjIj0aLFuebBx+83yxbtqwMaWRnyLt37zKTJ082PXp0twKGuJ599lnmiSceNz/88EN2GqEWCEAAAhCAQJESQMwo0omj2xCAAAQgAIFCJLBp0yYzfvyTpkmTxvYGXCs2zjzzdDNo0EDz3HPPmrVr1+JfI8XEbd68yTpTHTNmtLniiq6mXr2/WYYyJ+na9XIzadKL5ujRH1OU5jAEIAABCECgvAggZpTXfDNaCEAAAhCAQF4IyCxi/fr15rHHHjWtWrUw9euf4q0uaNGiubn44ovMhAnPmIkTn7ehnuULolyciGpVhcY7f/48O/6rr77K8qhT5ySP0VlnnWG6dbvCvPLKy2bHjh15mTMagQAEIAABCBQTAcSMYpot+goBCEAAAhAoUgJ79+61N+/Dhw8zAwbc5N20y3TCbRI9+vbtY7cpU94106a9b6ZNm1akIzZmxYrl/x3D+2bChAne2LRSxY3Z7eULY8iQwebdd9+xnH777beiHTcdhwAEIAABCOSDAGJGPijTBgQgAAEIQAACHgFFPJGD0P3795u3337Lblde2c1oU1QUd4Pv9jJVcVvz5uebO+64PbBNnvyKWbx4ccrtp59+8trO5MW3336Tsk61N3bsY4F+9OrV0+un+qvQqW4Mbt+x46V2nOPGjbXjXr78S8vizz//zKRr5IUABCAAAQiUPQHEjLL/CAAAApkTWLRooXnqqfGZF6QEBCAAgWoIHD161OzZs8dun346xzz99FN2e+CB+63QIbFD23nnNUsSCpxgkLhv1KiBadasScbb6afXj9SGTEJcv7Rv27aN12/1f82ar7wx/f7779UQ4DQEIACBmhOYMWO60e8lCQLlQAAxoxxmmTFCIMsE9ESxbt06Wa6V6iAAAQhEJ3Ds2DHz5Zdfhm4PPfSgueuuEVnf/vd/Xwhtr7KyMnrHyQkBCEAghwQGDx5kBdUcNkHVECgYAogZBTMVdAQCxUMAMaN45oqeQgACEIAABCBQPgQQM8pnrhmpMYgZfAogAIGMCSBmZIyMAhCAAAQgAAEIQCDnBBAzco6YBgqIAGJGAU0GXYFAsRBAzCiWmaKfEIAABCAAAQiUEwHEjHKabcaKmMFnAAIQyJjAzJkzzbBhd2RcjgIQgAAEIAABCEAAArkj8Oqrk22kpdy1QM0QKBwCiBmFMxf0BAIQgABOY8ZYAAAInklEQVQEIAABCEAAAhCAAAQgAIEIBBAzIkAiCwQgAAEIQAACEIAABCAAAQhAAAKFQwAxo3Dmgp5AAAIQgAAEIAABCEAAAhCAAAQgEIEAYkYESGSBAAQgAAEIQAACEIAABCAAAQhAoHAIIGYUzlzQEwhAAAIQgAAEIAABCEAAAhCAAAQiEEDMiACJLBCAAAQgAAEIQAACEIAABCAAAQgUDgHEjMKZC3oCAQhAAAIQgAAEIAABCEAAAhCAQAQCiBkRIJEFAhCAAAQgAAEIQAACEIAABCAAgcIhgJhROHNBTyAAAQhAAAIQgAAEIAABCEAAAhCIQAAxIwIkskAAAkECK1YsN6+99mrwIO8gAAEIQAACEIAABGIlsGDBfPPBB9Ni7QONQyBfBBAz8kWadiBQQgTGjRtr6tatU0IjYigQgAAEIAABCECg+AkMHjzItG3bpvgHwgggEIEAYkYESGSBAASCBCRm1Klzklm+fLnZsGF98GSKd0eOHLH5VcZt33zzTYrcwcO//PKLV8aV3blzRzBTine///57UtktW7akyB08/P333yeVrc1416xZE2wgxbuff/45qd2VK1ekyB08HDZeMfvzzz+DGVO8c3z9+19//TVF7uDhr75andTvH3/8MZgpxbt169YFykYdr6rbvHlToGwm492+fXtS2ajjXb06ebxHj9ZsvOrzoUOHUtAJHt60KXm83323P5gpxbuw8X777bcpcgcP7969O4nVzp07g5lSvNu7d29S2ajjDfsefvfddylaCh7+4YcfktqtzXh37ar5eLdu3RrsXIp3Bw4cSOrzxo0bU+QOHg4b79q1a4OZUrz76aefktpdtWplitzBw7/99ltSWX2m//Of/wQzhrw7fvx4Utmo41V1q1evCpT/+uto41XZr7/+OlB21apVIT1MPlSb8YqJ//fVvT527FhyQyFH1EdXxu2PHj0akjP5UOJ4Vf7w4cPJGUOObNq0MandAweifQ+3bduWVFYMo6Rdu3YlldVnNUqqrKxMKvvDD9HGq7E5vm6v72aUtG3b1qSye/dWRilqwsar394oyY23d++eiBlRgJGnJAggZpTENDIICOSXwMSJz5umTc+12zXX9IvU+LJly7wyruxdd90ZqazEB1fG7W+88YZIZXXD5Mq4vf7oo1xIzZr1UVLZyy7rbCTMVJeWLv0iqWznzp2qK2bPb968OalsixbNI5U9ePD7pLIad9SLXcfIv9+xI5pw1L79JUltr1gRTYTp27d3oGzz5ueZPXuiXcDdfPPgQFn1XeJIlDR69KiksgsXLoxS1FxySduksh988EGksr1790oqO3fup5HK6qmbf370eurUKZHKjhp1X1LZF16YGKnsU0+NTyr7yCMPRyors7TEPk+e/EqksjNnzkwqq75ESYsXVySVvffee6IUNePHP5lUdtCgAZHKamyJ4+3bt4/5448/qi0/Y8b0pLJRf+8qKj5PKnvFFV2rbVMZ9J1J7HPr1hdEKrt//76ksqorijAoJontXnHF5ZF/sy6++KJA+XbtLjESwKKkHj2uDJRt2bKF+fbb6kV2iXOJfdZ7CavVJf33hJWtrIwmKl500d+Tyq9dG00o7949OF71Y+HCz6rrsj0/YMBNSe1GNWUYOfLupLL6j4ySHn98XFJZ/TdHSS+//FJS2TfeeD1KUWumkThPzzzzz0hl77prRFK7998/JlJZPSxKbPfJJ5+IVHbSpBe9svpPJUGgHAggZpTDLDNGCEAAAhCAAAQgAAEIQAACEIBACRFAzCihyWQoEIAABCAAAQhAAAIQgAAEIACBciCAmFEOs8wYIQABCEAAAhCAAAQgAAEIQAACJUQAMaOEJpOhQAACEIAABCAAAQhAAAIQgAAE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wC23GOe+m5lu3d6QYxs2bJR0+OCD4WIGNWTIO+aBBx5wU405c+aMc989TebMmU379h3cVC/Lly8zixcvdveMuf32281bb/UUf8xhw4aaHTu2y+c8efI4x+4wuXLlMi+/3MI9O3Ls3btXfD8s//vfLaZHj57mmWeeEf/f4sWLmhdeyGkmTZrsnmHE5xaT3ypVqppy5cq5qRGzd+8eU7duHTNixEhTqFAhNzX2uHz5shk8eKA5e/acm2JM9eo1RImDpk2bmJ9//sl89dXXQe9o3bq1Zu7cuSZ16tSma9c3zNGjR8077wwxefPmlXftCyO969evd95je+d9ZnFTY4/Dhw87z1PVDB06zJQsWcpNjTx//PG7mTJlijly5IjsP/bYY6ZIkSLm9de7mBIlSjplbrikWyg7xDs4ePCgeeihh8y9997rlJ235Hu+DB36vpxjobw2a9bc3fOCqSvX8oUR2TRp0phvv/3GqWdTnXc3ROr3xo0bTb169eXePvxwuHMf++TYgw8+KN/r1KmDc7+lnHakssxsHz9+XNKha9euzrtMI593795lPv74Y3nnlI38+fM75f9W6YwaN24ibcPq1V+YV1991Tz/fDb5Dpw6dUrqPc9k24j06dObJk2amkcffdQ9y+tXNWHCeNOnT185l3bFnh/VugN//vmn01YVMVu2bDV33HGHmxo70L5WrlzRqbeFnTwdLPlK28PzpEyZStrH559/3j2b2dPvZMapf/8BkodffvmlqVWrlpSj3377zcm/yebYsV+C8iNr1qyS57benTx5Uix8aM+wdKBs0HZTtmjnWrRoKef5QlvKe9m/f7/sUx4qVaps2rZ91eTOnceMHx93gTELFSroPMNUkzZtOjfl5mLbIst9990ndZN6Sjkin2jDbf6nSsU7bGqefPIpOZ8+gTqJCelTTz3l1MO0kt6799uyD7TntBcHDx5wrvuw8xv3mu7dQ9d/+hHK/p49u53fOyXX4rcwLb148aK0q75g8j5nzhzn2AVz2223m3vuuds5v5m0uZZDhw46/fj7Tl3v5JSjkP049Z/nHTBgkHt2MB07dnCueZtznz1C3WdMQ+BK+o5589T0ObI0atTQ6btKmqpVq7kpkWP+/Hnmiy++cPeMU46flPK+fv06Ca66adNGc9ddd8mgKtSpU8cpL8XlMyxevMiRt5Y7ssEZaTfu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0C4piqIowUicKeAnTpywS4qiKIqiKNGnSJEipmLFilLesmWL2bnzcyknRb777ju7pCiKogQjcaaAO4Ml6387sVyKoiiKoijRoWrV6nbJmKlTp9ilpEGePHntkqIoihLsxLkLet68ec1DDz1s7ymKoiiKokQN+WMyZswo5c8//9x88cVOKScFsmTJYpcURVGUYCdeYsAVRVEURVFiQooUKUyrVq2lfOPGDbNkyRIpK4qiKEowEScK+F9//WWuXLli7ymKoiiKosQcFPD06dNLeenSJeb06dNSVhRFUZRgIU4U8P3792sSNkVRFEVRbplq1dyx4CxvOn36VCkriqIoSrAQ5y7oZcqUtUuKoiiKoigxo2nTZubee++V8gcffGAuXLgg5aQCkxqKoihK8BLnCviDDz5olxRFURRFUWIGLujVq9eQMiFuH3+8Q8pJhR9++N4uKYqiKMGIJmFTFEVRFMWv6NGjpyxrCuPGjTOXL1+WcrBy9913m6xZs9p7iqIoSjATJwr4r7/+YpcURVEURVFujccee8wUKlRYyocOHTRr166RcrBCBvgnnnjC3lMURVGCmThRwPfs2WOXIJn9qiiKoiiKEjs6depsl4ylgK+1S4qiKIoS2MS5C3q9evXskqIoiqIoSuwoVKiQefbZZ6X86aefmN27f5KyoiiKogQyGgOuKIqiKIrfkSxZMlO1ajUpX79+3bz77rtSVhRFUZRARhVwRVEURVH8koYNG5n//S+NlLds2Wz++uuSlIOZ//67aW7cuGHvKYqiKMGGKuCKoiiKovgl99xzj6lbt66UL126ZCZNmiTlYOb334+bb7752t5TFEVRgo04UcDPnj1rlxRFURRFUeKOJk2amLvvTiXlbdu2mn///UfKwcbDDz9slxRFUZRgJk4U8B07ttslRVEURVGUuCNjxkymRo3qUv7tt9/M1q1bpRxslCpV2i4piqIowUycuqBnypTJLimKoiiKosQNVau6FXCYOnWKXVIURVGUwCNOFfD8+QvYJUVRFEVRlLihePHiJmfOXFLet2+f2bv3NykriqIoSqChSdgURVEURfFr7rjjDlOxYkUp//PPP2bWrFlSVhRFUZRAQxVwRVEURVH8ntat25h7771XyuvWrTVXr16VsqIoiqIEEqqAK4qiKIri96B816hRU8oXLlwQJVxRFEVRAg1VwBVF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AeT169eyZctmLeW+dOmSXLt2zVziCu26ixYtKiVKlJR8+fKbqURERBQUMQAnIiLyRyjl3rp1i5w+fVpLut+9e2cucZUgQQIdNqxkyVKSLVt2Dh9GRET0lWAATkRE5Idu375lBNrbNeDes2e33Lt3T96+fWsudRUnThwpXLiIlCpVStKkSSuRIkUylxAREdHXggE4ERGRL0FHaSjR3rFjh5w5c1r2798vp06d1Krm7oUKFUpSp04tadOm1c7UMmbMJGHChDGXEhER0deIATgREdEXePr0qRw5ckT27t2j1csPHjxgLvkUhgzLnTu3dqSWNm06SZQokbmEiIiIggMG4ERERN6E4cBu3ryppdsItleuXCkfPryX58+fm2u49cMPP0icOHG1WvmPP/5oBNyJ5bvvvjOXEhERUXDDAJyIiMiJFy9eyMuXL7VE295h2nZ5+vQ/uXPnjrnGp9BjeZo0abR0G0OFxYwZS6JEiWIuJSIiouCOATgREZHhr7/+ksuXL8nevXu1o7SrV6/I9evXzaUeK1WqtAbd6dKlk7x580mIECHMJURERERuMQAnIqJg5cSJE1qyffToER13+/Lly3L8+J+C26Fnt0QMBYZq5N9//73kyZNX8ucvINGiRZOQIUMy6CYiIiJvYQBORERflTdvXsvNm7d0+tixo3L16lX58OGDrFy5QtP+/fdfef/+vU57JEaMGDoMmBVkly1bTsKGDSuxYsUy1yAiIiL6fAzAiYgoSEEw/ebNG51GFfEjRw7r9M6dO+Thw4daun327FlN80q4cOG09DpHjpw6DneKFCm0/XbChAmMwDu6uRYRERGR72AATkREgRKC6OvXr+k0Sq13796l0/fv35djx47p9OdAqTbG2kbQjXbbUKBAAQkfPrxOExEREfk1BuBERORvUGL96NFDc87e8dnFixfNOZENG9ZrCTaglPvdu3c67V0JEiSUyJEjG0F2WJcgGx2kpUyZSr755hsG20RERBSgGIATEdFnu3v3rvGv29vH+fMX5NSpk+acvaq41e7agt7Fnz17Zs59nlChQkn06DF0OkqUyFKwYCGdjhHje8mbN69Oo4022m4TERERBUYMwImIgrn161Hq/MKcc2vDhg1Ol+3fv9/THsO/hNXxGSRPnlzSpUuv0+HDh5MsWX7UaSIiIqKgiAE4EXnbqVOn5MmTJ+ac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3p+JghsG4ESm1KnTmFMUlJ0+fVratWsre/fuNVPs/vvvP33dvXvHTCEiIsuWLVukVauWcv36dTOFyHchg2fQoAEydOhgM4UoeGIATsHavXt3zSn6Wpw4cVxOnvzLnHOVO3ce4wFzmwwYMMhMISIiy8GD++X8+fPmHJHve/PmjWzdulUePHhophAFTwzAKVizSklDhAgh330XSae/Vnfv3pVbt27pNNq+X758yeX14sULTXd07do1l+r5V65c0XlHKE3G3+7du0f/v3//vrnEFapDYplV3QzvYX3mx4/2KtWoLu74Ps6+C3z8+EGX//nnMW06gGn38D0fPbJ3qofvg3WuXr2i89Z38ex7Wt/h5s0b5hJX1ve02pGjJP3YsWNy+vQp+fffT9/zczx8+FDf23pZv8Ej1nfBCw805PdwLljnAI5nbHvreMGx6R6Obyw7fvxPOXnypE5jvzly9p544Vy1WOcqPgvHt0esz/PsfKTA799//3WzHz3rt+Lhwwe6Dl63b9uv7T6BUkm8x/Pn9mvvzZs3zfe87bLMWc0haxleHz580O+KaRznjsvwwjXOI9bfWb8Z1+Og5v37925+r7Nz1f11w7ofO7Luq/jfvVu37PvFuncC5p88eazTuG5g3np5xLp/IKP6+PHjOu34noBmDEi37sc3blz31jHpGRwD1v34zRv7PRcvXOOse6Cz+7+17N69ezqPGhrWPdf9vRPHnUfwd9ZvcHaPJ/JPIYwT0e0TAVEw8ttv7WTJksU6/Nj58xfN1MAPpby//PKzLF681EzxWq9ePfWBv2nTpjJp0iS5cOG8hAoVSm+06AG+UaMmbtrBV61aRXLlyiVx4sQx1p8o0aJFk0WLluiyPXt2y7hx4/TGj57jEQSGCRNGqlSpKjVq1JSQIe15e3///bf8+msLGThwkGzYsEEOHjygD2q42deqVcv4jOoyffofsmrVSl0fMmTIKAMGDJTw4cObKfZABdXWTpw4IZEiRdIHiOfPn0v27NmlS5euRtp3ul7JksU/CUi//fZbWb16rZw5c1patfpVihUrLh07djKXImi/LH379jEeMG7oe+NBCq8CBQpK27btXDrmw/cuWrSwNGzYSD979epV8vLlS1323Xf/k+HDR0iSJEl0/nPgwaZjxw76UIPjEA9p+fLl198FEydOkKVLl2jJfY4cOXTbzZkzW2bPnqXrderUWcKGDavremXdurUycuQIWb58pfzvf/8zU8k70HfA7t27jONwiPTp09tNwFO9eg2pX7+Bnk+AB0qsg34HcH5gn+GYyZYtm/To0ctltIXffx+jD4Q4P7A+gi88QOKYxf7GsTdu3O/yzz//6PrIKGzatJlUqlRZpy14CMX5gYwpx/OxXbv2kjdvXnMt8i5c7zZu3CArV642U/wHzvN58+bq8YJrKK4vkSNHNq6hrSV37tzmWvYACtdMXAewDo47pGXMmEmvsbguDhzo/Sq+CATr1q1tzrlKnz6DXivr1asjcePGNbbLFD2uLAimGjSoL+nSpZMRI0bp958yZbLMnDnLeM2UnTt36HUc17Tvv48pLVu2lJ9+yuXm2N22bZtMnjxR1/nmm2/03MH3b9ashX6mf8I5jmtp48ZNzBTvOXz4sMydO0fvMdgXVjA7bNhwyZQps05fvHhBz3EEyREjRtTzHOsVKVLU2L+t9LcD9iuuC61atZZy5cprmqV582Zy7txZWbt2vcv9sVChAnrtiRo1qt4rcJ/CPR3vXb58eWPf/WLcn+z3R0BgP3jwQP3O+B7YF9jmmTNn1ntO1KjRdD1r3/bs2Uv27dun1z4ruE2QIIFeB2PGjKnz3oVjY9Giheacqy5duhnB8TU99hs1aqzXU0fjxo2VFSuWG8diZ+P+XUyPVRxzOJas5xD8Xvt9u4DxbNRAn1ss+N5Dhgw2fsdevcda9/jatesYzyGfHvceOXz4kN53N23aYqYQ+RxLwImCkadP/5N+/fpJokSJZMyYscYNcao+bPz111/GA1v/T3KfkYuPmzpuip07d9E0BAwDBvQ3goQIxgPLeOPGuEqmTv3DeFhLr8E0bqLuIehDB0FDhw43HkpGSPTo0Y315sno0aPk0KGDGoDglSXLj8Z3OaEPlhaUBnfq1EGDCwTEy5at0IyHFi1aGn97yLh5dzZ+11Ndt0+fvvpAA1WrVtX37Nmzt847g+C7ffvfjBv4f8bf9tPfMmfOPH3w2bRpo/E7++kDjSN8Jr5z9+499P1xE8d27dDhNw2yPgceGoYNG6rbHQ9r+PwJEyYZD1WFzTU+hX2FhwAEVnhg8m7wTV8OD7Z4eK1YsaLu+379+kuMGDFk4cIFxoPzKnMt0YfpXLlyG+fHON2nS5Ys03k89O7Zs8dcyw7HbocO7Y33rCTjx0/U8xHHA9pI4kE8YcKE+lndunU3Hpgj6fnoWLpmnR8PHz5yOR+nTbOfj6NGjTAe2M+Za1Jgh2MJAS8yOrEfcT1DwDRr1kxzDTtk/iFYxHUcQfGsWbM1iEPGrE8gcxXHWLp06XUewR/mcd3/4YcfNKhBTY2rV6/qcsvOnTv1fzTvsTKfYMSIEVpCOXjwEL2edu7c1TimnxvX4h5aqm7ZsWOHERgNkoIFC+l61m9Gxu2kSRM8Lc0MLP7++4xxbnY1gtin8ttvHfS+ims5MpETJEio6+AcxDmOTAZkrOF3zp49V0qUKGEE02t0G3yJI0eOGOf6SN1f06fPlOHDR2rm+cqVK+WPP6aZa9mD786dO+l1CMcLrktLly6X1q3bauZ2p04dP6l9tWLFCr1GYb/gmChevLgeC126uGZie1fx4iU0AxLix4+v74dXxowZpXTp0np9w/OF+3sujhNkOCAD03Lr1m09nkqWLGkcK5ONa+U4KVOmrK6L5w0LjqHevXtpzbkePXrqtsexVrZsOb2PWscwkX9jAE4UjODhJ3Xq1NKu3W9a2h0vXnwjUK1m3MRK6TLkcjtCCR5u6ljHyslHLjZKnHGTT548uaYht7lx46ZaWrNhw3qXkmELbqi9evXRoAA3WzyQIef96NEjRhA+RrJnz6Ev3CABn2vBAwoe/PBgWrp0GX3QQ9BZoUJF+emnn7R0EA9skDVrNpdSkyRJkup7/vjjjzrvzNy5c7XkGQ9MeGAB/AaUzqdIkUKDJZRKOkLNAQT11nf++edfjGA4nz7cIPPgcyAAP3PmjJYOpU2bTtMSJ07s5kHDETIhevXqoSXfeJDhsHn+CxksmTNnkfLlK+i+RwlM167dtLTS8dzBw2KFChWM8yOFzqPUsHfvPjq9aNEC/d+CB8SiRYvp8YwaFDjXSpUqrefj999/r6XY+CwEKfXq1dO/cTw/1q9fp+uipMo6H2PHtp+PeHDeupWlNUEFzuucOX/SUjrIkSOnBhWoMougCXC9QgYlgu/+/RHkJTAC6Oga3OAY8Al8Ho6xaNGi6jxKFzGPewXg+gbuj10cW7gGIfPI0ePHj7WEFNfjKFGiSJEiRaR585a6zHoPHPfTpk3R86lJE/u9A5BRhVpKBw4ccNMUIzBChtzAgQOM+1EYDawRDOK+inslth9KpWHOnFl6Lo4cOdrl2o5lderU1XN++/btxjbzvNmRZ3A96NChox4rKJVGjTbcb7FNUQsBw9PBli2b5fz5c5rBgmsYrkvILCxbtqxmsly+fFmrpDu6du2qXrvwe/BCJkPixEm01sTFi59XaxBBt3U/RrBtvScy5HEPxPGG+7ljHy5Hjx7VEm4E/jiWLPjN2H7IAEdGB+7X+F3oTBf3YavW0LFjR7VWSNu2v+n1Guz3+Nq6D9asWa33YSL/xgCcgjUrcAtOUL3LqiIOCITxgIX/3bdJQyCBG7VVZRA3XKyDG7z1cGFB4IsHLrTTQnUyR1mzZnXzmZkyZdIgGg9+MWJ8b6baq4vjgez+/X81oEW1yt27d8v//hdZq1c6wneyqughkP9ceEjEjR4PsChldIQMBqsUGqULjlAihAcJC76H9VDlrE2fZ7BN8CCNauio9upZ22+UnvTo0U0fjlEbwXF7kv9B9VjrfABU08V5gvaZ7mF/bt++TWbOnKGlLeDsYS9btuzmlHU82edxTjnuZysQunTJ9cF3165dWoKJIADV4q1XyJD27+iTc4MCDpoP4DqLYwYvK5BADSJAJhyuXQjOrUDdEi9ePHPKd+GzEOSgLwPrGoV7J/oZQOaR+2tRuXLl9FruKGfOnHrNv3nTfo1ERiYCbAROd+7cdnPsWn975Ig90yGwQjCL4BbNlWLHjm2muoUMXGwrBK2O9w2IHDmK5M9fQKcPH/b5eYoMcGTeOEJGNa4XyDT87z97m21kEqKJiuP1xlKuXAX9/+hRt9sc93rH4wz7GvdzVOG+f9/eJtu3VK9eXf/HNc2yZ88uzSRwXysM36NatepursVIy5cvnz434DgCPD9A/Pjx3Bxjz58/0+s2ao3gtxD5Nz7BUbD2zz/BLwDHTcc93FBxk3X/wIObm+PN99Ile8cuPmnr7B24gYYLF1YePPhXq3XjRopq4sixRi65b8JDLB4m8WBptb/zb/i9qEqPIBztJzFO+eTJk7RNnntoC4yqybdv33G6nAIPHLcLFsyXBg1+kaFDh2iTBc8yV7zLOncvXbqs/wNKR1ECXr/+L5+8UDrJWhJBB/qh+PXXltKsWRNZvHiRHjOvX7sdLxn7G/zqGuwMgjm0Qcf3QaeTgPa0qNmENrnuObvHoM8JZB6iLTTexzqGcZ64P27RjAnHrWO19sDIO/dDdJSHzGS/3F+4fzm2zbegaQBYwT2+LzI3kIkcGKVIkVJr/aDUGvc6ZFaiFhoyyVOlstfGcOTsOLN+s5Vxbu2jJk0af3Kc4brJ6yMFFAbgRGQ8ED3Uhyn3OfTk91BdEe040Z4YDx948EaHee6hJALV5lC7wCpNpcAJ1cKnTZuqpYPoMGnixMna7MOv4LzduHGz09eUKa5tQCnwQrOddu3aaLXmqVOnGcfQRj1m0C9GYIBSbWTGor8DQGkqSn3TpEmr817B70JfG9Gjx3DphBDQqaCz4xYv952Q0edBRjYElfs6jq/y5StqYLxr107t7wSZF571ieKe1WTM/W9GR6zOjjG8nGVeEPk1BuBEBrSdCi7QWYx7Bw4c1AekmDFjmSnOFSxYUP9HRyfuodQP7dxwMwsb1m3VSJ9CCTyqlKGK9oULF8xUV0+f2kuC0Xv550KuOkol9u/f90nP6YDfAv41PB3afqITLTzQomr86dOnzSV2RYsW1/Zu2B5oF48ezSlwQpCCh0n0mO/XtStQhRe1Oe7dC9ztZclzmzdv0pJh9FydMGEiM/VT2N/g7Brsl9DOPG3atNofB3r7RvVxdGTljLMaOqiqjdJv1GbCuWH9DvTqHVSh6jlghA9n9xBIliy5NiXZsWO7meKWta28us/g2PCoyvebN28/GboN92OrKnesWPbeyvF9MaKIYxtri/VcYI0oElDQFwtqPiCDB80UkFlTuHARc6lb1j3akdUXh9VD+9dwnNHXiQE4kSE45YDOnz/fTe+yqOq1fPlSl2qGnkF1LbQ1Qyksegl3hN5EUdUW7QVRpdo3IAAvWLCwPkyg4yFkEljwwIFe1DEEGDq/sVj7Eg8lnsHvRcdWaP+F93bseRWd0aAkGg9O6BTIr+B3Of4mbF9UD8TvdmzbZkEw17BhYy1FQm/YaA9KgY91fmH/WtBe1C+gdAjtPDEcj+OxBPge7GAoaHB2zCANTXAcoZMpNMdBr87Hjh0zU+3rOhuB4nOECWMfUcGja2e1ajU00Bw7dqzZ3tZtu2MLemlHppAF11jru+XPb/8bdDaJdtFoo4t+EtzzKKANTDCMF4aGRMYCOjuz9qEj3GcQ+GIboOaS4/l49uw/guG10AcJMmDB6jkdQ31a9yS8L6pUO25TRxijHRk4jnC9wf0Y72dl6CADHfeVOXPmuNm+uG6g53BU6UZNB7+Ez8d9DtvD8Z5rwT0X1cjR9wE6SEPfL+jjwj1sx/nz57nZnuiDBR0DIoMHnbsBjjd8HoYyw3CNjvC37955/pxA5FcYgBMZ9u51OzTQ1wxDiLRq1VIfBjBMScuWzbVUo02bdpIypes44B5Bz6O4iQ4fPkxfuOFNnTpZxowZpR2z1av3s7mm70CmAHpHRZvDli1baOC/Zs0aadGimQ5tU6dOHTcduVkPhehhd/TokdpruEdQxREPs2iH2LVrF/0tKL3s3r2r3pwxFq1flmDiAQRju6K6Mj4bY8lu27ZVq5unSZPGXMstVPts1KiRdsqG8XPZHjzwQUeCyCDq06eXeX5M0bHeY8Xy/baXGBMctSZQkwPn8owZ0/UzBw8epO2J0byEAr8sWbLo/+h4bfXq1RpQ4XqH4ZYcYUxn1KzA+Y9rG65VyEBs3fpXuXHjpqel516xrp39+vXRayc6hnSE0sRYsWJpyWThwoW1yYwzyEPAPQbD6OFYxBCNuK6VKFHSpbYZrqsY2QLXWYzRjPMDvXRjHGxMo8+LwA6ZEO3bd9QAGn094HzDfRWZo/gNVnt5nKO4N2I4uZ49u+s2QfCI4bHwHs2bt9D1AO3kkcmC3sjbtm2t+wHvi/M6blznneyhXTc+F5+5ceNGvR9jSDF8JnrGR0AKuC6hSQMyb3DfQS0qjHffokVzDU7RqVmcOH479jq+K74DMgi6du2s16njx/80l9qhlhcyFVEVHd/JGTyDIJOifft2snz5Mr13Wk04+vUboJkjgN+MIc7QsSHOkTFjRuv2nzBhvA5BeuyY288m8i+hehvMaaJgByWoKHFAbjDGxQwqUP0PDypVqlQ1U7yGHPrr16/rWNw3b97U0lMM14ESV7Q1zJMnj5tSV+RAR48e7ZP2VxgKBIErthsCd9zwP360afXEESNGuRkq5OXLF0bAf107UMGDhSNUsbb33mrv2dmCYU9ChgylD4NWb7gYYgclJhj/GCXtd+/e1mrn+C3ogdzxe+Nv0OEPejrF70UJOUq68V0wj2DeGvILOeN4OMLfYBl+CwInbJORI0dJ0qRJdT3A78U2Q+m+NZyJBUPI4AEmc+bMn/UAjN5/UTXT2o54eEApBY5FqyQf6+D4RC/CGCcYEiVKrNsI1QnxvdB5jXfgwRnD++ChxnooI+/B8fT27Tsd+g7VcR3hWP7hh9gupXsZMmTUYxLj/+Lh8sOHj8Y+bW2cG5F1v1o1TRBcoXQLx5NjKQ86IMQ5jowYVGG1IMPG3qNyYi15s2CIHjSnuHz5inEsXdHPxbH0ww+xjPOogJ9Xg//aYOgjPLBjxAj/gh6xcQ29c+euBggo7cSQTb/8Ul+vTSghtc5/7H8cYxhrG+ujnSyCYQzjiKYIOPbQ0/XndmKG6zHaoqNHfwx3hiZJGNnCgmMXPZ/jGKxfv4GWVjpC1XSUyqNdNzI2z58/L5s3bzYCwWi6LTFko+O1Gsc8AnIE4biWYag1vD+uaSjBTJYsmbmm/zh8+JCeK5/T7h6lxrhX4TsjMxT3TWSOILBG1WkEguj9vXLlKlrDwLrP4JqOXutxz3S8Z+DvcB/BdQEdiOGelzIlhthqo+8fPry9SrZ1TiPwRqZs37799fvv3r1T18PxgcwB922hcT/HPRDHNzK1kSGP79i//wCX0VDg9es3WhMsZcqUOnSoIxxzuE/inuRRJoxn8Pm4z587d17vQ3g2wPXTgmMH5wCqn6OTUvdQawAB+tSpf2jNAHQei2caXCvxm3EeOcIxjH2KEnK0Ecf6r1691uMZQz5azxlewd+jXToKIYi+VAjjouFa34komEmXLo0+vOAmcP78541pGZAwdMYvv/wsixcvNVO8ho69UNI/ffpMbf+MB3Tc5L178/EIHtSsMVz9g/0hJLyXQQV+H6q5OXb44xX//i2O/OOzUeKBqobLl6/UTAryW3jIRtD8Ocfgl8I5jYdoBt0+h5JflAyuXLnaTPFfn3MtQCDk25lpCMIRvCNwdIQguUmTRlqyOnnyVA0WHS1atFCmTJlsBEEdtLQbj5fITMIwkt7hF7/lc4wd+7v+5saNm5gpn887v8G7+xfNw3D9QK0HjxQqVEDv57ivg3fvj4AgFr8XGdEBwaPtsHLlCt0XCL7djzEPdevW1ozrLVvsTRc8Ol6dwTGJ67JPjjNkcCDDY9OmLWYKkc8xAKdg7bff2smSJYuDZQBOfgOd7Sxb5vV+QalQ3779zDn/wQCcyGsBHYD7lkGDBmpptldQCoiA2TPI0BwxYrh2cjV48FCtneGe+wA8qPGNANy/uQ/A/RtKyUeOHG7OeW7gwMGeZiYgHEHJOKrSoyo8SuWdFRC4D8D9CwNw8k1sA05E5IuSJ0+hVby9epUpU8b8CyIi31esWHGn1x73L4/6m7CcOHFC6tSppdWC0UmXs+CbgidUF3d2TDl7eVbqjNJ+9GXQoEF9zexp1KjxF9fOIwrMGIATBRNor4dO1sKG5ZiXfgntKPPkyevly7FtJRGRb0NbYmfXHvev+PE9rxF14MB+rVqNTtMaN25qpn4KbbpxjwmoZjzBEbY3+gQJKCjRdnZMOXtZ/Zo48+HDe1m/fr12Rjh8+EhtJ+4R9HfhnQ5jiQIzBuBEBlR9wgPG1ww5yuPHT/CTnpiJiOjrVLt2He3wCiXq7tt9O0LnYLjHWENqkd/D9kbne0EdOksdNWq09O7d103np8706tVHxo4dZ84RBU0MwIkM6JRj69at5hwREREBRpzwSW/XRJ8Do4/4Z4eVRAGJATgFaxiCioiIiIiIyD8wACcyPXv21JwiIiIiIiLyfQzAKVj75ptQOmYubN68Wf8nIiIiIiLyCwzAKVjLli27tjsiIiIiIiLyawzAiUw7dmyXp09ZDZ2IiIiIiPwGA3AK9jC0Cnz8+FGHIyMiIiIiIvILIYyAgxEHBWsjRgyXMWNG6zTG1CxTpqxOB2YnThyXihUrSOrUacwUIq89evRQbt68qcfNN998Y6YSkaM7d24b58ojSZMmrZlCwcGtW7ckZMgQ8sMPsc0UIlfoqDdcuHCyadMWM4XI5xiAU7B3+fJlyZ8/r043a9ZcunTpqtOBGQLwypUryU8/5TJTiLyGwOLcuXOSK1cuCR06jJlKRI4uXbponCt3JHfuPGYKBQcXLpw3AvBQkiRJEjOFyBUysN+9e8cAnHwFA3AK9lAiWKhQAXn16pWkS5de1q1bby4JvBCAN2zYUI4ePWamEHlt/vz50rlzR+P4OSlRo0Y1U4nIUf/+/WTRokVy6tRpM4WCg549e0j48OGkS5duZgqRK/QTNHjwIAbg5CvYBpyCvbhx40rq1Kl1GjngV69e1WkiIiIiIiLfxACcyJArV279//Xr13Lx4gWdJiIiIiIi8k0MwIkMadO6drZz+PBhc4qIiIiIiMj3MAAnMuTPX0AiRIig0xs2BP424EREREREFPQwACcyYGiJAgUK6DSGIjlx4oROExERERER+RYG4ESm7Nlz6P/v37+XzZs36TQREREREZFvYQBOZCpYsJCWhMP69evl48ePOk1EREREROQbGIATmeLHj+/SGdvly5fk3LmzOk1EREREROQbGIATOWjWrIU5JTJhwgRzioiIiIiI6MsxACdykCVLFokVK5ZO79+/Tx4/fqzTRERkd/XqVdm7d688fPjQTCEiIiLvYgBO5CBq1Kjy00+5dPrff/+VpUuX6DQFbXfu3JGLFy/K27dvzRQKKg4dOiRDhgyWBQvmmymfWr9+nUydOsWc8384vuzfcYHYbDYz1a0DBw7oOqdPnzZTgq4FC+ZJzZrV5dixo2YK+YdXr17pdeyPP6bpsYTX8uXLNc2j446Chz//PKbHw5w5s82UT23evFkmTnRbs2/27Fn6dx7dG8+dO6fLd+/eZaaI7Ny5U9MuXLhgpjg3cuSITz6PiOwYgBO507x5cwkVKpROr127Vj58+KDTFHjgYQE39rJlS8uvv7o2G3Dv4MGDUq9eHSlSpJAULJhfypQpJSNGDJd3796Za1Bgd/z4nzJ+/Djp16+v3L5920x1a9u2bTJ37hxzzv999913smHDeunUqYNcunTJTHV17949adCgvixbtlTixYtnphJ9npMn/9Lr2IAB/WXmzBn66tixvabVr/+Ln9bYev36tZw9+485R4HNyZMn9TqJY+Pq1Stmqlu7du3UY8bR4sWL9e8w+oszuJ5hOe6llgMH9mmaR59jmTRposyaNdOcIyJHDMCJ3EmePIVLKTge/tetW6vTFDggJ7548aIyaNBAHa/9n3+cd5Z35swZqV27pty4ccMIukfK1KnTpECBgjJmzGjp1q2ruRYFFQhy27Vra84FLt9++620bdtOpydOHK//O/r99zHy/Pkz43isI//73//MVCKfqVKlinHdO6evrVu3yc8//yzbt2+TJk0am2v4LmRY5smTK9Cef+QqcuTI0qZNG3OOiAIrBuBETvzyS31zCg/UrEIVmCCwzpo1m+zcudtMcW769Gn6MLJgwUIpVqy4vjp27CTZsmWXxYsXyYMHD8w1KSjIkSOnHDiwX6vfBkZlypSV0qVLy7Jly/QYtdy8eUNWr14lGTNmkmbNmpupRL4jYcJE0rdvf/nxx6xy6NBBOXrU95sFoBYYanFQ4IfrJAoO+NxCFLgxACdyonDhwpI6dWqd/vvvv2Xjxg06TQEPQcyQIUONB8+EZsqnMIY72qlFjhxFYsa0d6oHIUOGlFChQupytpkMWjJlyiQJEiTQqo9oC+sdWG/NmjVaW6JPn94ybtxYefLkiblUZOvWrZqGNtyOMAQh0o8ePWKm2L148ULTV65cYaa4wrHVokVLPbYmTHAtBf/jjz/k2bNn0rp1awkdOrSmYR20n8Z7dejQXv//888/dZmj69ev67KePXvIsGFDtUrn48ePzKV2W7dukXnz5up7Ll++TNd/9MjtOo727Nmj61ivjRs3mkvsgdbBgwc03fpeK1Ys19/tHW/evNF2pqNGjZSuXbvo33vUbIB8V5IkSfSa9vGja5Op58+fy5IlS9zszyNHDuux4h6OdSy3XqtWrdT3Q1CP4w7QL4q1HPdFC6qn4x45fPgw6dGjuy53H7Dj+EY6PnvHjh06ffGi522I6fPhuSVZsuS6fV++fGmmElFgwwCcyANWaRUeQlBtmR14BR0IhnLnzqOlj6iaaUEgcf/+v5IhQwZWBQ5iwocPL7/+2kprLvTq1dPLDBQE3w0a/CItWzY3AtlrGpQiiC1XrowGtoBq4UOHDpGFCxfovGX9+vVm+kIzxQ4l20j3KKhMkyat5MuXT7Zs2Sznz5+XW7duadv0SpUqSaFChXUdfO8pUyZLhQrljfW2aNA7a9Ys7asAwa4FHWsVLVpYa2sgkML7DRw4QAoUyO/mwXrdunVaK2Dy5EnSpk1r/Y2PHjnvnRzBesOG9fU9L1++LKtXr5aVK10/E23Uq1WrKjt37tDvhe/XunUrfXm1vbH8119b6vujPSqCMnTCVKlSRTl9+pS5FvkXtAevUaOa/PZbW+MauF3354wZ03V/IDhz3J8IsuvVq6sdeOG42LRpo54TWGffvn2aoQIIqnF84WXtU7Qdbt68mTRu3FjbiOMai0C8YsUKxrxr86DDhw/puYMmXY0bN9T3QAdf5LvChQunmX3I9OvcuZOX5y0RBQwG4EQeKFeuvJa6AR68d+/2vMozBS5du3aT2LFjS6NGDfXBD23HEeS8ePFcJkyYKGHChDHXpKCiRImSkiNHDg0OUHrtmRYtmmvQumvXbpk4cbKMGfO7HDx4WO7evWs8oP6q6+TKlUtrSTgGiCjFReCZNWtW2bNntzx9+tRcYu9tHUqVKq3/O9O5cxd96MUxhw6PcJy1a/ebuVT0uw8ePMgIakbLqlWrjSB1lBw5clT7nkDfBBjiC5ImTSqbN28xjtu9ug76MOjevYdmJCCAcoTACL3Ajx79u1y7dsP422TmErfwnfB9li5dru+J98d5YkE1+iNHjrksX7p0mRQqVMhYb5P24u6ZTp06aun52rXrjEBvpvm7jsm7d2+lWbOm5lrkF+7fv69BdLRo0SRx4iSaVrdubS2lHj9+gixfvkL3x+HDR/WehgDZsbdsBNjIsFq2zL7emjXrtJYRMjJx7J47Zy+pTps2rR5feFWtWk3T2rf/TXvg3rhxk0ybNt1lvyNzC+ege4MHDzauyY31PTw7j8jnChcuohnQqKmDjmSJKPBhAE7kCcc2m3hIwcM5BQ0xY8bUIOfbbyNqwFK7di05deqU1K/fQP73v8jmWhSURIwYUXr06Gn8H0l69eqhgYczCDx27NguTZo00zaylh9++EHKl6+gy1HSFyPG95I9ezatlm1BFXUE5GnTptOq6Y5DbWE9BCHx48c3Uz6FUvCWLX/VqtgocaxTp67EiRPXXGrvUwLBfaVKlc0UO4y+gJJu9FRsiR8/gTllV7NmLf1/717X7wso7cLvqlixopniHEr+UQ0encZZHD8DtQy+//57c0503SpV7IGW+890hEwNlJ7XqFFT0qfPYKaKBoTVqlU3gq1rLAX3Reh8ErUh8EJtkAIF8uk+GDx4qESPHl2PU9RCqF69hmaqWDC6x9Chw3U/o+aEBcdFiBAhtKNDi/tjz5kbN65rLQoc41aTLYgRI4Zx3FQ1zrFL8s8/bntOT5Ysqfz2W3tzjvwC9m+vXr10f3o2egQRBRwG4ESeQK/ZpUuX0elTp066tIWjwA/VbH/55WctSVy7dr3Mnj1Hq57jofXnn+t6ux0xBS7p0qWXBg0ayM2bN2X+/HlmqluoQosqt1evXpbp0/9w80JQgH2P5gmAgBkZa3v37tV5NFlA4IkgAcEMSsMBpemoyl6yZCkNVjxTq1ZtIwiJLrFixZI2bVx7jkbghO+NdrDuvxfaxQI+x4Jq3GvXrtES5FKlSkjlypXMJZ9yDLQ8Urx4Ca3CX7JkcX1fvL97yATA96lUqYJ+5sCB/c0lHsM2Qk/ZCALd/y6rQ7rz59ne17egeQLGxccL7f7z5Mmj17hixYrpcrTHRi0MHKvupUiRQsKGDWvsD9fq3zgusP9KlCim7+ndayMymd6/f2cEeLc+2e+ofo5z0P2wfPhO1jCf5HdSpEgpTZs2N87JOzrWNxEFLgzAiTyBB5X27TuYc6LVPNERDQVuCHBQzRL7b+bMWZI+fXrJn7+A8SAyVzvYQ0/BqFZLQVPduvUkeXJ7R0Oo1eDekyf28ZARzB45csTNK3r0GFr1Ff9D2bLlNFjBON6AkkH0Zo7So3z58sv+/fs0He2nwWrL7RkE7nHjxtWHYLTJtCC4RZtZlNy7/14PHz7U75UuXTpdF214q1atou1rAYELSta/RJ8+faVTp87y9OkzfV8EXI5Na1BqmitXTt2u338fU37++RdvBfbW9r5y5fInvwulcfhdcePG0XXoy1WuXNk47s+4vCZNmiLJkrk2O7DGA48SJYr+7xXc41Cz5P37D9qUoEiRQi7ng2esDg0RZLvf75EiRdL9Hjv2D7oO+b+aNWtqjR30D+Gsk0ciCjgMwIm8kChRIi3RArQH/e23duzYJJBbvny5lsZh3GXHapUIhmrVqqPT7nu+pqADVVzR1holacOGDTFSnJ+P6LRt4sRJTl9WlVn0pp8pU2atKov213/9dULKl7dX5S5VqpRWn0aQf/r0aUmcOLGkSpVKl32JvHnzOf1OeKHaMKA36TNnThvH8kpNRw/r+fPn12U+hY4H8T6HDh3WcctR9bhp08YasCFzoFmzJrpN0VYen4lqxKhx4F316v3i5rc4vjD8H/kPZADBw4feG2oxQoQI2i5779590rNnL81kRq0LXEO9o2HDRk73OV6ZM2cx1yL/FjVqVOM62VXve+j/wbGHfEvmzJn1f7Tjd8ZKt9YjIt/BAJzIC6huitIBq20keghGe0cKvKwHDWdVbN+8+TSNgh50NISx3THcnOO424B0QEaMV5ll6GiqRIkSOgwThh8LFeob7egNEDwg2EdtCbTN/tIAOEsW+/tt2LDByyGCUBU+atRo8uOPP5opvgcdsSEAR5ttBN7ooRq1BW7cuKGl/p/bQaG1vTF0FaodU8AqXry4HtdWp4GOkKmD66KzjCQ0vUAw3bhxE61FhHudZ6z9js6+nAV3FPDy5s2rtVhQk+f48eNmqiuUkANGfnAPTXO2bduqTWmYkULkuxiAE3kDSgiGDRtuzon07t3rk3FOKfBAEIGMEwz3hHaKFnRWhY6xsOxLgykKeAgi8XDoOCYxoCOwPHnyavtYDNGF9q2AoALDCaIDNkfocA0mTpwoBQsW1GrTgBKkn37KJRhWDO+RN++XHTN43wYNGsqDB/9KkyaNNAi3MgjwvS5duqjTgADq1auXLh0oIbBFr+pfAm2HrQAZ2wJV4b/55hvtJM5q13716hVdBmgL7FE7e0cYn71MmTIasKHpB3o+B9ft7bYdMPktHLMZM2aURYsWydKlS132OQKqTp066f/Nm7fQNMBxgaYRgH1mNbNC7S9ArYh48eLJo0ePtQ8BrIv3RP8aaD+Oa+yYMWO8PM8oYLRq1do4x+N8cp0EBOfYt8hEwZCJ1nGAfYmq62hegB7VcS10D+tiP7t/WdcPwOXN2TrWsUIUXDEAJ/ImdMiG3l4BVdFRXfO///7TeQpc0AP6pEmT9SERVWwxHA5e6Fjq0KFDmpmSMuWXVyWmgIUAwbGPBgt6S+/SpaukSpVa+vbtYwTkaXX/V61a2QgaEn8y7jd6JUfJNKpbotq5I5Ra48EVNWCs9tlfAtcQ9Fi+a9cu4xhMruMv47vhezVs2MBcyz4CA64zlStX1OVFihQ2AqqF2pGgT/z7731t842xxfF+GCManXVhOCmUgmF4KgzLduzYMalQoZyukz17VokQIbyECRPWfBfn0NdCp05djO+WUcaPHycpUiTXv69du6b+rnHjxplrkn/p0KGjJEiQUNq1a2Mcb67789atm1qjC0EV2PsaqCz58+fTderWraOZLugHIWvWbLoOSsaLFi2mna3lyJFNRw5YunSJVm1GUxA0U8AoIalSpdT3qFmzuu53ZIBSwEN/FB07dnLa+R0yBZcsWaYBdteuXSRv3jy6D1OnTqmZaahNMXToMHNtt5o0aaz72f3LccSDO3duO10HxxxRcBbCxsasRN6GzobwMGPl7KMEDi//duLEceNhvaEcPeq83VZwgEvXtGlTtaOhypWrmKluof0uqg+j5+mLFy9oR2xof4uegIOj+fPnGw/MHY3j56TTEo3A6OTJvzTTxLP9huMAbf2tsYktKOlDoHvt2lU9FlBSCyj1Qcm5I3SyduXKFe3gKkoU123z4sULDUgQoCNw9i5Ux8bDLQIX93Dsotr8gQP73XwvlNxnz25vK43SpSNHDrsMF4Ug2apK+uLFS+O7lNd0VMG/cOG8lCtX3qWZjDModcLwVCiNxvjmqCGA90SQhVJwQIk3zhd8JpbhhUANvx+9xSOjAlBl/a+//pIiRYpqG3oLSrX279+vPWw7/i40F7BKU4OC/v37aenxqVOnzZTAAf1WoPf6lClT6v7zyuvXr7SHevRhgFoXyJDKnTu3/m/BPsMY4ugDAecZMmKwr3Pl+skIvF2bIuD4QQ/pqJKMz3Y8H7Fs3759eo113O+oom4N2eed8zig9ezZwzhnw0mXLq5j4wcVuJ7g2oBMtNSp05ipbqEGDZqXWMMZOsJ1bs2a1drXBfqGQM/6SZIk1ePFfZMU6/z3CK6TuF6itplVou4eMsnRAWZQgqEtBw8eJJs22TvkJPoSDMCJPtPevXt0eCs83KPaZq9evXVsaf/EAJx8IigG4ET+LbAG4OS3gnIATn6PATj5JlZBJ/pMKBGy2s8h/2rs2N+18yYiIiIiIiLPMAAn8oE2bdpK/fr1dRrj91avXk2r+REREREREXmEATiRD6DqeevWbSV58uQ6jyB84MD+2msxERERERGRMwzAiXwInX/NmTPPpXMhdELTvHkzDzsdISIiIiKi4C3E69ev2Qkb0RfAeOAYbgc9KAOGKxs7dpwO0eJX/vrrhDRt2lQOHDhophB5beHChdK9e1c5fPgoO2Ej8sCgQQNlyZIl8uefx80UCg769OmtnbB17NjZTCFytXPnDh2abe3a9WYKkc+FMIIHBuBEXwhDs3Tt2lXevn2j8ximZdCgwfLtt9/qvG/DOJtt27aVLVu2milEXlu2bJn0799Xtm/fqTU4iOhTI0eOkFWrVsmuXbvNFAoOhgwZLOHChdXmZUTuYQSc33//XRYvXmKmEPlciNOnTzMAJ/IF27dvl2HDhui4qpA9ew7p2bOXhA0bVud909mz/xjv3ZM3AvosGN951KgRRiC+Qv73v/+ZqUTkaNKkSbJx4wZZuXKVmULBwdixY40APIw0atTETCFyhXHs//hjqkyZMs1MIfI5jgNO5IvWr18nTZu63rwLFiwoU6f+IaFDhzZTfAfHASef4DjgRF7jOODBE8cBJ89wHHDyTeyEjcgXlSxZSiZNmixhwoTReZSKV6pUQU6ePKnzREREREQUfDEAJ/JlCMJR6p0iRUqdP3HihNSrV4dBOBERERFRMMcAnMgPFChQQObMmStJkiTReYwTXqdOLZk4cYJ8/PhR04iIiIiIKHhhG3AiP3T//n1p166t7N69y0wRadq0mTRr1vyLeqFGG/AqVSpL3rz5zBQir926dVP+/vtvyZ8/v4QObW8mQURunT9/zjhXbumQkhR8oHPTUKFCSbJkyc0UIlcPHjyQ169fsQ04+QoG4ER+7MOHD9pxx+TJk8wUkVSpUkm3bt19HEAjAK9Vq6Z07tzFTCHy2pEjR2TlyhXStWs3Pxsijyio27BhvRw7dky6d+9hplBwsGbNGu0wtXjx4mYKkavz58/L4cOHGICTr2AATuQP3r9/r2NIoof0ly9falqECBGkY8dOUqdO3c/uJZ29oJNPsBd0Iq+xF/Tgib2gk2fYCzr5JrYBJ/IH33zzjeTPX0DWrFknWbJk0TQE4r1795KaNWvI7du3hXlhRERERERfNwbgRP4oWbJkMnv2XGnZ8lczReTQoYOSI0c2LXV5/fq1mUpERERERF8bBuBE/ixSpEjSoUNHWbt2vQbklqlTp0ihQgVl4cIFZgoREREREX1NGIATBYAQIUJI+vTptUo6ekVHFXW4ceO6dO7cSRo0qC/Hjh3VDtyIiIiIiOjrwACcKAChIzb0SL1s2QrJmTOnpmGc8C1bNkuFCuXl55/ryb///qvpREREREQUtDEAJwoEMmXKJAsWLJK5c+dJggQJzFSRXbt2SvbsWaVjxw5y6NAhM5WIiIiIiIIiBuBEgUTIkCF1XPD16zfKsGEjJG7cuJqOIczQLrxGjWpSt25tOXBgv3z8yB7TiYiIiIiCGgbgRIEMOmmrVq2abN68VQYMGOgmEN+5c6exrKp06tTBSLFpWkC6ceOGvHr1ypwjIiIiIiLPMAAnCqQiRowoderUlf37D0qvXr3dVE0/d+6c3L9/X/Lmza1jiR88eMBc4r/QeVzevHnkxInjZgoREREREXmEAThRENCgQUMtER8z5ncpWrSYVleHmzdvyvTpf0j16tWkfPmyMmXKZLl06aIu8w8//PCDJE6cSOrWrSPbt28zU4koKNqzZ7dm6P311wkzxfehLwt8xtGjR8wUIp95/vyZHkuzZs00U8ivPXv2TBYsmK/b3XodOHDA2BfPzTWIyDsYgBMFEeHDh5cKFSrKtGl/yNix4zQIRyk5oOf0P//8U/r37yclShSXsmVLy6RJE7UHdb8eyqxkyVLy5MkT7bF99OhR8vLlS3OJ33r9+rX+vsePH5spzmH5qlUrdXtcuXJF3r59ay6hwG7UqJFSpEhhfciz2YJevwebN2+Srl27GMfgIzMlcPvrr780Q+/iRb/LxPv77zP6GWfPnjVTvm6rV6/Sa0/p0iX1WMarRo3qmrZp00a9jrn39OlTPW7Wr19nphBgmw0ZMticE+Ne80qPpQ0b1pspwQPu7zVrVjfn/M+5c2elUaOGemziuMZr/vx5Uq1aFb12EJH3MQAnCoLixYsn0aPHkO3bd8qIESOlUKHC5hJ7YHrixAkZOHCAZMmSSTtv69Wrpxw8eNBcw3fly5fPJSNg5MgRUrWq39+M8SBQv/4v+vuqVKlspn5q4cKFkitXTvn115a6PfLlyyOVKlXUtusU+E2fPl33NR6ykckUlKB/ht9/HyNz586RY8eOmakU3MyZM0evPTh+U6VKpa+QIUNoGoKZsmXLyJkzp8217VADAcfNmDGj5c2bN2aq/7lw4YIeuwHdx4gjNLmaMGG81vJCza/g7Pz5836aSeaRCRMmyP79+4x9ME3+/POEvipV8vj+6x179+7REnWi4IYBOFEQFitWLCMArWoEKDNk69bt0q7db5IuXTpzqR0C7xkzphuBcWVJmDC+NG7cUB+u9u/f7ysPdwkTJpK0adOacyInT/4lFSuW12D87t27ZqrvmTx5khQtWkQePXpopji3bNky6dixvRQpUlTb0V+5ck0GDx6iD7dDhgxiSXggt3XrVvnvvydSvHgJnV++fJn+H1SgfwSM8T98+AjJmjWbmUrB1ezZc43r7lh9zZ07X06f/ltatGiptXhQIo5MU0umTJn1uOnevYeEDRvWTPU/LVs2Nz5/WKCqdfL999/LwIGDZOjQYS4dk5L/uX37tqxYsVzy5MkjhQu7Zvh/iVu3bknNmjVk3TrW9KDghwE40VcgRIgQkjx5cmnTpq1xk1xlBN2HZdiw4VKgQAGJHDmyuZa9qvrGjRv14ap69aqSK9dP+ho6dIhMmzZVLl26pCUNn6tkydLmlN27d++0OjqqpqGamm9WS8fvnDZtuv5Oj+B3Tpo0QRInTqzbAQ9soUKFkqpVq2nHdqtXr9YMCAq8UP02TJgw0qRJE21+4Z2HNLRP9AsvXrzwUVOOn37Kpcfc//73PzPF7/jVb3fPO5+DbYVtRq5wjbZg+rvvvpNOnTrLyJGjtMo5MkZfvrRvM9QownGTJ09enf8cCJq/tD2uXwTeKE33zn3As+OrdOkyX1ziGlx557z1zjpocuZ4LHsFzwIcKYXoUwzAib4yCFpix45tBL/VZdasObJhwyZZsmSp1K5dR0uqw4ULZ66Jan335MaN6zJu3Fjp27ePEbDnk6JFC2uHbnXq1JY5c2brCw+IeHjyqMS8ePHiLh3DOUKb65YtW0iZMqXk7Nl/fOXBrkCBglKkSBFPS4bQER16ikfpN7aHBaWSmTNn0Wl8HwqccJxt3bpFUqVKLVmy/Cg5c+aUw4cPeZg5tHv3bm0TWbJkCT120eTi4sULOr1t21ZzLdH3QJqzTpvQthTLrl+/rvMIImfOnKFppUqV1P+RabVr1043xzE6FcOya9euydSpU3R6yZLFusx6T5xjlgYN6munie6h5gjWRQ0Py9KlSzUN3wXV8DGNV/36P8vDhw81qFm6dImmWb/du80/du3a5dJ5I15oZ//okfO26vh8tPV0/JzOnTu5uR5gm2DbYBthubXNsA19knkRXCCTtEKFClpbaN++fZqGaWy7fv366Dzs2bNH0+7cuaNVsTG9apVrJiRKE7t06SzlymHb2/cR2pi73/aYR6dZ9erV0XWs19q1a+Xo0aM6jWMZKleuqPP4PI/gM9H3CM7NHj26u7wfqtjjs3CMoM0wvhfawaPa/X///Wf+tR2O/SZNGunfWcfXoEEDPwnYGzZsoJm65D3Y/tZ1w9quffr0dnPevnr1UgYPHuRmncaNG2lNMQva3mPbA65PWAcl1565fPmStGvXxtjvZXS/428wWovVlGjixAnGsWB/z+PHj+tyvI4cOaxpRF87BuBEX7k4ceJI9uw5tPre+vUbjYed08YNdYpxQ22kJXTu4SEcHbrhYbpbt676Sps2taRMmVzy58+rD0p4tWjRXDuZwgsPUMmTpzDf4VNoU4hq461b/yr//OP3gS9u6BA1alT931H58uX1f79qE09fDrUT0LGfta/KlSuvpXq7d+/SeUcrV66Q2rVrGoHJXc0IypAho1Zfx3GL4xiBqgUP/khDsOLelSuXddnr1/bSGrSzXLx4kVYf79ixkxFY1tDgFhlTqI5pQTV5/B3W7devr0SLFl3Ch4+gy/AQimWvXrl2tHXq1Emnw/Y9ffpM17UyAODevbua1qFDe5k7d65mHn348FF/HwJ5BEYIfvCZSZIk1nXt2+KO+Q7OLVu21PgdteTff+9rE5Z06dIb5/FmrQXjDDI08MLnd+nSVa8ba9euMYKhqsb3cW0njAyHH36ILc2atdBthmtJz549tOoqeQylirBy5Ur9HwES9qVjO1905Ic0tA3HdrYfZ/bMVOxvBKYIcCpXriKdOnWRSJEiabCLfjAsCH7atm2t616+fFnfA/sU/6NJT5gwoXUatYUgWrRoOm/18eEMMjrxuahGf/78OX0/ZCAgaEPGLjJ5EFShuVS4cOE1U6Bp0ybmX9uNHTtW3r//YHzfJnp8RYgQQQM0dMLo6PTpUy7XdvIcMsRw3Rg2bKhky5Zdtyv+R3trZL5YkHmJdt2FCxfRdYoVKy4bN24w7vGNXTJKvv02okSJEkWnI0aMpMeEs3urBcct+oI5c+aM/PzzL0Yg3t5IDaFpeF4AHFNRotjfwzru8HLMMCf6qhknKREFMceP/2nLkiWzOedzHz58sD19+tR29uw/thkzpts6d+5kK126lM0ItG3x4sXxk1fixAlt9ev/YjOCANurV6/Mb/L58N3xfoUKFTRTXOF9sQy/48WLF2aq3dGjR3RZ4cKFzJTgY968efrbjaDUTAmc2rdvp9/z/v37Ov/27VtbggTxbD//XE/nLcYDvy1hwvi2cuXK2h4/fmym2mx37tzW/Yv3WLRooZlqsxkPf5o2YEB/M8VVkyaNdNm5c2fNFPvnOtq1a6eu061bFzPFZjMCCk1LnjypzXi4tRlBjrnEZmvcuKH5nufMFJsta9YsthQpkplzrvbs2aPrdu3q+t5GAKNp+fLlsT158kTT3r17ZzMCX1v8+HFtmTJltP3zz9+ajs81AhZdf/jwYZrmzN9/n9FtVqFCOZf3hFu3btkKFiygf7906RIz1WZbuHCBpq1bt9ZMsVuyZImmz58/30z5dHvhPTNmzGArUCC/mWKzTZ/+h/7dnDmzzZTAp1+/vra0adOYc1+mcuVK+nsfPHhgpnzKCFR0nebNm+n81atXdb5u3do6D6tWrdQ0HDtLly41U+3HQ+XKFW25c/9ke/TokZlqs71//95WpUplW6JECVz2y4YN6/U9jMDM9vr1a01zpkgR+7njfn86U6FCeV23Y8cO+plw/fp1Y/ul1s/Gd3j27Jmm4/3KlSujx+6xY8c0Ddx/zsuXL23Fixc1jp30NiOYN1NttuzZs9qSJUtiztls9+7d08+uVq2KmfJlevTobhs48NNrQ2CDYwDXEc9Y59nOnTvMFDvc55GO4wlw3cAxZMH8lCmTdZ2ZM2eYqfZzGWnLli0zU+zwzID0vXv36jz2XZEihW3FihXVaQs+o2DB/LYMGdKZKTbbzZs39W9r1apppgRu27dvsxUtWticI/oyLAEnCsZQbRwlJSlSpNSc6kGDBsuaNWtl3boNsm3bDtm0abM0b95CX4UKFZKYMWPpCznVPoU2YVu2bJY2bVpL+fLlfNTm3CvIRc+QIYO2aUd797t37+hrx44dYgRfuk7RokX1fwpcUPJtPMxptXOrlCV06NC6v/7885ib0l1Um0U1ywYNGrjp6yBWrB+kYsWK5pzP4XMBQ9nh+IkaNZrO47hy78cff9RS8s9pH+lddevWc2lHjmYUzZs31xIujECQMmUqTcfnlihRUr/zs2dPNc0Z123WyE3bdDRbQVVoRygxXbNmtfbcjRIyR9b54zhUlrW90P4b2wu9fX/77bfaJIR8R65cuaRSpUrmnL26OppBoG8Lq5QSUIqNzrLQTAG1G/A/akyECRNWfv21la937oYO5aySc4zSgfMPn4lj1ypBx/GB0n4cuy9euLZTt44blPzjuEGtEpSYo/bKkyeeDzNJn8L5vWbNGsmcObNxvOQ2U+2KFi2m/1vnLa4buKYAOgRErRt0eAfOrnNewagVaN7VqFFj7bvDgs/AaC24vrP/FSJWQSciJ1AFMFmyZNoGt3PnLvqaMWOWHDlyVF/79u2X+fMXurx69eotMWLYb9regWrxjRs3kX79+rvc7H0TMhbQ63D69Om1Wm22bFn11bRpYyNQyqrrIOOBAh9Uz0YVcYwTjerUGEYPL1S/RSCM6pKW9evt4/9aVXh92+nTp7WpRcGC+fX4KVmyuLnkU44jAfg2dNjlKFIkt/OWFClSaObTunUej4tsPXiXKuX1NkMgjSqqN27c1Gqr1r7AC1XgwTHYv3fvnlZVR1tS65y7ft3enpg8ZrW59o60ad2OcmHtz4ULF7jZP3ihujpgH926dVN7Ws+dO5cGyL7tu+/cXk89Okat7+/YqSKGzsSoGRUqlHM5brZt22Yupc+FTO2jR49oAI2mJo7HBHq4BzR5seCaWrt2LePY+Em3PYbt9CnrmjxlyiQ3n4sXMvOQqWd1NkgUnDEAJ6LPhgA9d+7cLi+U/qE9qVdQIjN27Hg5cOCQDrGTNas9GPYLKA1au3a9ZhyMGjVaX0eP/ukSzPjlZ5PP4QEOGShp0qTR0hnrhd7vUWqHtqH+Yd++vVKpUgUNXHCsYsz9I0eC53je0aJF1bbFjq/q1avrOdW6dRtdB8E3tteOHduNh/nasmjREiP4vqkjEZDnrCD6S3r4zpIlyyf7CPsG+wh9gARWz58/k19++VnmzZurJaRTp07T48Y7GUTkue+/j/nJMVGrVm09Jpo1a6brIOMG7fSRIY1+YnCPnDfvy8flRj8R7j+7ffsO+tm4thMFdwzAieiLeTZEFKoRN2jQUJYtW2E8XP0h5cqVM5f4D1Sdx4MtXqj+hlIhVMPLlCmTuQYFFuj1ePv2bdrEwbGGhfVCMIdSHasjPysz5dSpU/q/T6FU5tkzt0M3obdgVKFEh4U4dpImTWou8RsYacA/fM42Q0YIqpAjw61MmbIu55HjC6MSAKo3owO5AQMGavVTNCEgr+F4Rsdk8eLF1+rln8van0mTJnO6f/BKlCiRRI4cReLGjScXL17Snq8DCwwJicyuJk2aym+/tddOwOjLoLo3OoJE1X90YOnsmMAQd6hyjk7aUHMG49Mj/UtrpFnHI2oEuf9M64WOGomCOwbgRPRFUN0NQyG5h+ClVavWOgwaqqijxNlqIxgQUK0Z1Wj//feBtoEMGTLgvgs5h2GQcDyVLFnSTHELVc3RvtHqSddaz6raaME6Fy6cN+dcWW0dHXuXBvSwvmfPbnPODr07o1052qJa3r9/Z075HNq7om3stWtXzRQ7x7bUfsmqru9sm6Hnd0cIvvPly68ZHui3wTPoARscR0PAezp+BrmFXqJ79eohb9++Na5Jv/qoXTYyE3FdRcaiR8PIAdr758mTW5sEOA5fFtBwngGCQAvaiL9759q7Pn2eGDFiSPbs2eT48T+1Pw2PoGd9BOHI2LTa4QP6afEpZKAg4w5DMnL8byKPMQAnoi9y6NBBefDggTlnhw6B9uzZp1XOfvjhBzPV/z179kxL56dMmSyVK1eSmzdvyh9//KEdtFHgs3q1PTAoW9Z5LQkrHZ1K4SERQ2hFjx5dH/YwbjDaiKOtOIYgwxja7qG0Fh2KYTizGTOm61i3ixYt1OG0HANtiBMnrnZwhfGyAcFSixYtdPpLYIguBFwDBgzQkj98F4ypfezYUXMNv1W1ajXB8FIYJgrDWZ05c1o/u0uXTk7H4O3Tp68Ghug0EWN6o0o+4LtPmTLFZUxhbC+wMuPQWR5+19WrbjMagiuMa49rkfVC55BoF4s29mjigA78fAI1jDp16qztyOvWrS0bNmzQ9KdP/9PPWbXKPrQZtGjxq16PMVwexn7GkF7o6AzrYXg8izU8JcZ8xjniuMy3xY3retwg8EZm2O+/j3HJZCPn0G7e8XiyXlYfGYMGDdH/mzVropkz6FwNMLyo1YwHQ4ohY+bYsWM6ZCJgeE6M7e5T6DsGNWD+/vtvqV//F63RBAj08f02bHDtnwLHLjqAxTUIGXzILEBTFqLggAE4EX0Rxza5JUqUMIKoNX7WudrnwM08c+aM+gAyfvw4SZMmtSxYsFDy5y9grkGBDcb0TpAggfbe64y1DAHBjRvXtbrj4sVLtPQMwULWrFmkYsXyOk43Ovlz5rffOmgJEToLQy/83bt3k3Tp0n3ymZ06ddL3//nnupI8eVIdOxkZN87Gzv8cZcqUkYIFC+lYuzVr1tBxxRH4Nmtm7xzJr6FvBLTPxoMyzt3SpUtJpUoVtdO7adOm6zqOY6fHjBlTZs2ao22MMaZ33rx5dHvgu48b97sGTYDvj/ccOnSILkdnX8iYa9iwkS4P7jAmM65F1mvJksXa5nnr1m3aROdLYBsjsxNBTpMmjXT7Z8mSWT8HGVKW+PHjG+fLUi3xRJMBnCvZs2fV9azAHdBMCMc+9iXOEbTP9isVK1aSPHnyaKl8ihTJJFOmDPpdkClBHkNzKsfjyXohUw0wqsHcufMlZcqU0rVrF8mV6yc9LurWraMZ0tY6uE4iE61IkcK6vEWLZhpA4xrpU+3atdORU9AjOtr3431z5syu38+xlg1qyVWtWlWvNw0bNpBatWr4aWYPUWASwrh52u+eRBRkoKfohg0bytGjAdspFKryFitWRB/qUQqDEkn/gksXStdQdc4qRXGEZShFKVKkqHz7bQTtkCa4mz9/vnTu3NE4fk66DPEVmFy5csXYn99oW1WPILjGAyO+vzWMFqo6Xrx4QS5cuGA8wGfWQAMPmSgVHz58hJb6OsLDK0r2cIygjwB83v379+TFi5faQz96EgdU0UQAgxJgBC2xY8fRYZJw17RqdqCncFSbx3dxv01RmoN27Y7vCaiWjRJLlE6iVB4dzAFK3NEZEkr1Ad8TpfqYd+y1H6VfKGFGG0/3D8r4TagCim3gGWwzfB6+BzI2UCqOtt43btwwHozD6VBujlBtHsvwm/73v+8kXLjwuj4CdAveE1XRL1++LBkzZtL3Rdt2/Aa0QwaUzD58+Eg/z2ovGtj0799PFi1aZAQDp80Un8N+wv5yD80bHIcNc4TaHaitgwDFqpmBkmEE2J79HbYzjhlrnwL2D/aTI5w/OI+QiYWaCzhecDyHCxfOXMN+LO7du0eHucN3sI5J96zzEcebYxMj67sgIxZNGSzWced4nKOpAvoPQDMQtE3Gd8E5gmPN8dzB9/3w4aMkTJhQ561jEt/bN2paIYMJx36XLt3MlMAJ57hHj+64ViGwtqC2DZpfoeYKhhBFMxz31w1sZ9RoQT8C2I5Yhv2B/YbzFKxtjWXWsHKATDbUNMMx4jjsGFjLHI9HfDfHphbWfdza986O18ACHUyi5simTVvMFCKfYwBOFAQFlgAcVdXQ+3nPnr29fOCngBfYA3DfhNJdjwJwIs/4ZgBOQUdQCcApYDAAJ9/EKuhE5GPly5fXXqIZfBMREREReY0BOBH5GMaXtXqWJiIiIiIizzEAJyKirw76I8AQeOgDgIiIiCiwYABORERfHXTwlCZNGg87rCIiIiIKCAzAiYiIiIiIiPwBA3AiIiIiIiIif8AAnIiIiIiIiMgfMAAnIiIiIiIi8gcMwImIiIiIiIj8AQNwIiIiIiIiIn/AAJyIiIiIiIjIH4SwGcxpIgoiTpw4LmXLlpEQIUKYKUTeg0s+jxsij1mPRTxPghfud/JKypQpZdOmLeYckc8xACcKghCA16//i6xbt8FMIfLaypUrZNCggfoAETlyZDOViBz9/vsYWbNmtWzZss1MoeBg+PBhEi5cOGnZ8lczhcjV/v37ZcqUSQzAyVcwACcKghCAN2zYUI4ePWamEHlt/vz50rlzR+P4OSlRo0Y1U4nIUf/+/WTRokVy6tRpM4WCg549e0j48OGkS5duZgqRqx07tsvgwYMYgJOvYBtwIiIiIiIiIn/AAJyIiIiIiIjIHzAAJyIiIiIiIvIHDMCJiIiIiIiI/AEDcCIiIiIiIiJ/wACciIiIiIiIyB8wACciIiIiIiLyBwzAiYiIiIiIiPwBA3AiIiIiIiIif8AAnIiIvO3Dhw9y48YNl9fNmzfNJT7z9u1b2bZtm4wePUpfhw4d0vRXr17JwIEDJE+e3Ppav36dpvuX169fu/zGly9fmqn+a+7cOfrbN2zYYKb4rqtXr+j7d+vW1UwJfA4fPqzfccyY0WaKyL179zTtt9/amSkB68WL53qcPHv2zEwh73rx4oU5RV/i+fNnegzi3PDI48eP5fbt2+acHdbH3338+NFMcQvXPiz/77//zBSRJ0+eaBqu0Z7BveHOHbefR0R2DMCJKEi5e/euLFy4QFq0aCZVqlSWvn37yL//3jeXumWz2eSff/6RVq1+1XWnTZtq/P0dcyl9DjygTZ8+XSpVqii5cuV088K29Wnw0a1bF/nll3qyYsUKWb16lfFAeFfev38vzZo1lUmTJkqqVKkkR44cEiPG9+Zf+L3Lly9LuXJljSAvl/6+MmVKyenTp8yl/gcPvdeuXdUAzy+8fftO3//ff/81UwKf169f6Xd89OihmSJ6fCDNs2DDP61Zs0aPk/nz55kp/s+jACowO3LksJQuXVJmzZplppBPLV26VI/BSpUqyNOnT81Ut4YPHyYVKpQz5+waNKivf4cMR2d27typyydPnmSmiEycOF7T9u7dY6Y4V7BgfuPzyptzROSIATgRBRnHjx+XnDmzS8eOHeT6dXsOPILq7NmzyZYtm821XOGBo1ixInLp0kUJHz68DBs2VCpXrqxBHnkfSjKqVasqvXv31MyObt26y9ix4/TVtm073bYhQpgrfwYEtcuXL5eSJUvJrl27Zfv2nVK2bDnZt2+fMb1N6tdvIFOmTDX223DJmjWr+Vd+C0FvlSqVJHr06LJ58xYjOJgtjx8/kc6dO5trEAUeqEHSv38/6dChvZkSdJw+fdq4Nl+SAwf2myn0pa5fv673RCIK3BiAE1GQ8b///U9q1aote/fuMwK3FbJixUoZP36CfPPNN9K0aRM3VeI2bFgv48aN1eBuxYpVMnv2HJk0abI8ePCvloijFI28hgf8li2by6FDB6VRo8ayZcs2adKkqZQrV15fbdq01W0bMWIk8y+87+7de/Lu3TtJmzatmWJ38+YN/T9evHj6v39aunSJlgjXq/ezJE+eQgoUKGgE/z/KmTMIFi6aaxEFDqh5MmXKZLl27ZqZEnTgWn7ixEkZOXKUmUJfqnTpMjJ16hTNrCaiwIsBOBEFGYkTJ5b+/QdI/PgJJHTo0PoqU6aslCpVSgO5rVu36Hqojjl27FiJHDmy9OzZS8KECaPpCKayZcsmBw4c0Krs5DWUpvz555/6sNylS1eJECGCucRzaG94//59+euvv+Thw4efZHigpNmqtv7jj1l1Hev1/Lm9XSjah9rn3VZvx99dvHhRq4pjOZoaOPPmzRtdju+P/zHvlTdv3ur/8ePH1//x3siEiBo1qnz33Xea5l34nvhc6+X+8x89eiS3bt3UZhJYjvb13oG/w/o45h3h8y5cuKBtu7H8c6Ft58OHD3R7Ydo9a3s6a/uJaq9YZlWFttbFb8I2xLS1H7A9PfLsmf198Hr+/POr3uPzHD8roNoYY9/g8619hH1mfSePqvt6BNsbf2e9rO2C34bzDN6/t38eXu6PM6yPdOvzne0/fCcsw/6zPs/993T8DU+furYJ9gz2Nda3Xu6rR+PYcHb+Wn9nfR7WQXtkfAcLviuWvXlj/564pqBWDa7tL18Gz7blyLT85pvQ0qNHdzOFiAIjBuBEFOSlS5dB/7c6isHDGh7EMmfOIrFjx9Y0C0oIYO3aNfo/eW7evLlaw6Bt27b6v3egqnr27FmNwDqztp/OlCmD1KlT202b3V9++Vlat/5Vp6tWrazrWK8BA/ppOpoQYL5rV9dOwmbPniX58+fV9oX4H8t//33MJx2lYf+XLVtal5cvX1b/R7vyy5cvmWs4lzt3Lv3f6vRtxozp2klclSpVvd0OHRkGo0aNlHz57N/PenXq1FGXIzOiS5dOkiVLJsmZM4c2k8DyJk0auQkwnFm5coX+Xd26ddxkTOB75suXRwoVKiB58+bR98N2cRZsOTN79mzJkSOb8XcZdXthesCA/uZSuzVrVuv7zpgxw0xxhe+OZVZ7cmwzzCNzoX3733Ta2g+oUeGsBsoff0xz+e54YR8vWrTQXOo1BGONGjV081mlSpWQI0eOmGv4n+PH/9TPx2ejk7usWbO4fKeff67n7YwBXNNq1qyuf2e9GjZsoMtGjBiu2wgQqFrLN2/epGmwePFiY50Cmm59fsmSJWT//n3mGnbLli3TZdevX5MaNarpNI41QKZG165d9Hy23gPnCfps8Az+rmXLFrq+9cLfW7999+5dmobOFx0hcw1tla318T863MP1AMel5cGDB7ps9erVer6hXTJ+W7ZsPxrnfhnNAAxu4sSJI+XKlZOTJ/+SBQsWmKlEFNgwACeiIO/YsaP6f4UKFfV/tCsGlHa7Fz16DHOKvIL2mQgI0f76++9jmqkeQ2lf69attLO2ihUryeHDR4z3uGIE5H00QEDbaisIb9GihRGE19fpdu1+k6FDh7m88LeA2g2Yr1Gjps6jU7aePXsYAUktOXv2nPz991n59ddWGoigYz4Lgp+aNWtoadD27Tv0O6At+Z9/HpO+fft62qt5smTJ5aefftJet+vVqyP9+vU1flMbbevuXQgC8ffoqRvff9Gixfo/HowBGURRokSVyZOn6HfDq1ix4kbgtNkIhJbqOs5cvXpVt2+GDBlk3rz5+h4wfvw47Yywdu06cu7cBTl9+m9j+7bUgGXRokW6jmdOnTolM2fOMIKc9nLgwCH9rrFixdKOlxYsmG+u5TNDhw7Wknm8J16ZMmWSjRs3aj8OjpBZ0KdPb0mfPoM2c1i3br0eB+jgzDsQfFevXk07Z1u8eIlu05UrV0ukSJGkTZtWn/T+7F8mTZqgNTUGDBiovz9Pnjwa/DZp0thcw3M43lGLZNSo0fqb1q5dp/1YAM6PXr1663SiRIlctnGGDBk1DZ3Cdejwm9bmWLt2vf79/PkLjfP0rWaAOetEC5+Hcx7vg+snSsGbN2+mGZajR/+u77Fz527JmfMn6dy5k3ak5hEclxs3btDz2/53u6Ru3Xry7bffmmt86p9//pZq1apoL9sTJkyUM2f+0e+CYN2q4eQeAnB8TvfuPXRdNI05f/68Xm+CYud0XwrXK9TWGTlyuLHdPc9wJKIAYjwIEFEQYwQYtixZMptzwduJEydsiRMntDVv3tT24cMHTVu0aKEtXrw4tgkTxuu8o/fv3+uysmXLmCnBx7x58/S3G8GKmeK5Awf26/odO7Y3Uzy3a9dOXd94MLcZwbiZate9e1ddNm3aVDPFZtuyZYumGQ/dZord3LlzPln32rVrttSpU9q6dOlsprgqWbK4LWfO7LZXr17pfKVKFW25cuV0mbcYQbG+79GjR8yUT925c8dWpEghXQ+vpUuXmEvsTp8+bRs2bKjNCFrNFLeMQNaWMGF84/d2M1O8B981c+aMtkyZMpgpNtu4cWP1OyxZsthmBN+2vHnz2MqUKWV7/PixuYZN01OmTG7r0aO7meKqWLEixnb4yWYEUWaKW+fOndP3T5Eime3YsaNmqt2ZM6dtSZIksuXPn8/25s0bTcP3wPrjx396XlWvXlWX3b17V+fXrVun8/ny5XGzH+7du2dLnjyZLVu2H12OwytXruh3wH57+fKlpoERPNlGjhyh79Ozp+vvu3nzpqbVqlXTTLHZhgwZbEuaNLHxm86aKXb799uP4UmTJpopXuvXr68tbdo05pzXFiyY/8lnHDp0UNPwPi9evDBTbTqdPn1aW5o0qWzXr183Uz2GdfHyyIMHD/RzsO0cYTvjWMKx/PTpUzPVbtWqlXrN/PnnurqNYe7cufo+WbJkMs61q5oGa9eutcWPH9f4f42ZYmcEyPobWrRoZqZ8qkKFcvqejx8/MlPc2rJlsy7v37+fmWLT75QoUQLjun7cTLE7e/asnv/JkiUxU+y/EX+PtMuXL5upNj1ecU3AspMnT5qpXsM5NHBgf3MuaJkxY7r+3lmzZur8smVLdb5RowYu53/Xrl30vHNUqlRJXc/xGHVkncc4vyzYRkjbvHmTmeIc9kv27FnNuaBv+/ZttqJFC5tzRF+GJeBEFGShiuPYsWMkVKhQ0qLFrxIypPcvae7bSdKXW79+vf5fvnyFT6qrt27dVv/ftMm1euzn2LNnt5aklipVWjA0leMLpdboqR29KuN/VL8sWrSY8Vc2N+slSZJE38uj74Aqq/Xq1dWS/IkTJ2vp6ZAhQ7RnYcuZM2e0tBZtwp1ZsWK5tpNHh3Vewef89dcJreaPkm8ck85K51GKhyre4cOHk1mz5mjfBhaUDKJKL/pBcPyteCVPnlyrFKNU0TN58+bT5hqOUqdOI2nTphN0POe+LfDnQCeI4cKFM+dEvv/+e8mVK5fcuXPHpZ35zp079HeXLl1ae9S3hAgRQrJkcfu9nMF2Q+lomjRptLTXcRugZBg2bdqo//u34sWLu+k3AdNIQ1vo27dvadqxY8f0GHB8WTVF0O8FjnvU8sDv8a7Dhw9pFW3UrMBx7AgjDeBcQDMB900B0NQCfWxY0BQDfW0UKlTIzXaNHj2avq9n53OiRIn1f3z3+/e9HjIObbePHj2qx61Vim9JkSLFJ7/DkjlzZpf9DOjzo1Qpe1Ojs2f/0f+DG9QGK1iwkNY2MYJoM5WIAgsG4EQUJNlsNh16B9V2UcUxderU5hLP4cEfypfn+KTedfDgIXPKc6jiDXgg9m2owg5on5o8eTI3r+XLl+kywAM3AkZ0Hud+PbQB9wzGJEenaIsXL9WAduLESTpu/ODBA7WTK0C7WAQDUaJE0Xn38D1jxIjh0ombRzZs2KDtd8uUKS1jxowxAsitHmYKoX3r33//rcutTr0s1nbBWOzuf+/KlSt1mU9Z54jVFtivoMkA+PS4QTv3s2fP6rZwvw3QHjiwQ5DbpUtnNy90pAcdOnTSQBZNGnLkyK6ZP1bHa56xjovP3abRokUzp+ywb9AhmvvtitetW/YMBI+gGQSaS2Cc759+yikDBw7wtCkAquqjzXumTL5//QhukHnVsWNHzYwYN+53HT6SiAIPBuBEFOTggRBtSDFkVMOGjT4pbbRKT5w9qO531/kQeQy9k6NTnxs3rjvtFTsgzJkzV06dOuP0lTGja6kZ2pc7WwcvZNg4s3//fsmePYcG0JArV25tT7l27Vpp06a1nDx5UscsLlSosJuS2s+Fz2nRopmkSZPWmD4ou3btkhkzZnoY1MeMGUtatvxV23MiGEfND/fmz1/g9LfilS5dOnOtz2OdP+5LIwOrjBkzOf39eM2ZM89cK/Dp0KHjJ983SxZ7xgH6I1i/foNMmjRFokaNpu3669atrcv8C4I499/Peh075vFwVyi9X758paC/AmQEoA8HZBQFlmvJ1w61WHD9Qqd2zjpOBOua41GmjpXu0bWJiHyGATgRBSkIvrt376a9IyPI6tq1m1ZBd5Q0aVIJGzacbNmy+ZMSw3Pnzun/KMUkz6EaOTo0QjVV9ODtVYdGRYoU1f+x3d2zqjE7Vkf+HNb+QhVzjAfv7IXvmyBBQg0Y0GGZs3Xw8uw7XLly2ZwSPa7Q+Vrz5i20M7AaNaprddxmzZqba3wK2wAdSFklkM5MnDhet2mPHj0lbty4RjDv+dButWvX1gdpVB1G9eTFi107VnPdLrec/la8QoXyvPd6DOPkft/i+1m9aeN88gx6Y8d+8SmMtw5btjjvZMsrYcOGNfZ7Au2BHTVjnG0Dzzr+Cmg4Ht1/X8cmHPh9JUuW1A7Y8uXLrxlBO3ZsN5c653oufrpNcU3E/sX7hghhJnoA+wYZPti27r8jXl4NzYfzJU+evNr5GzpPRGYemmk4gww0NFFArSb3zR5w3f/wIfh1qPalGjduohlo6GTRWZBdsGBB/d8a9cERrgkbNqzXY9E6nojIdzAAJ6IgpXPnjtrjNXp87tOn7ydtjQGBU9OmTbXEEG3gLGgTieAlXbr0WrpJXkMNA1RLxYMYqpBaQ705g2rbgCqn1lBDFvSYDJ4Fr57BGO4IVMeNG+tpsJcsGarHJtcenlFy/TlQbfzatesa4FjQr0Dnzl20NAljVDdt2kwDD49YY9KPGjXCTPmUNRayY/CC9ueoSu0RBEsdO3bSYfX69++nJfGAdp4I4NAXgk97+t6xY4ecO3fWnLPbuXOntndHD/hWhoVVrX7v3t36vwVt769du2bOfT7UKMDvQ1V3x9+AYBo9eXsFtRHQRhnNB3B8fK3QfhwlydguaBfuGdR6wP5C23dU7XaE4d5QKoqaQxgz2jM4nhGA9+vXR4Ngn8J1Onv27DrtfixwC35fgQIFtLr09Ol/mKl2aGZy795dc468C+cVMhExFryzoTeROQJz5sz+5JhCsxf0MZE+fXpJmDChmUpEvoEBOBEFGRimaOnSpfrAjWClbVsMD+X6QvtIC0oN0dEQhiBCJ0AYs7ZOnVoaQHbp0kVLSclr0aNHlyVLlkmqVKllypTJOhaw++2O8XdRuoJ1qlSposFhpUoVZdWqlUawtleHXMKDHDqEsh7CPxcCa4wHjnanlSpV0GG38N4YJgvfAW2+LWPHjteSt+bNm2rVcZTIo5o31sPx4BG0t0WgULp0Sc1swPtj3HGM1Y3hrVDKijGL163zOLBH50cNGjTUz8OYxRjGDB2E4bMnTpyg66BqP/z6awv9DASZ+E1eHZMIqFBdGR2WDRo0UKvyIrMBGQQodcd74POs98Rnug9knClWrJhxvtTSsZ7xt/g7bDsM4/b77+NcaphkzZpNq0ZjHYxljW2BodoaN26k+8enUqZMKdWrV9cgHscNMhiwP/F7nj595mHnW4569eqj3xfHKH4Ljgt8z759e+s481/SkVxAwnjvEyaM19+CNv34fXHixNUhyACdAebPn187XWvXrq2O3X78+HGJGDGi/PZbBy25rly5kkydOkXfY+TIEVqNHe3K69atq+/hmcqVq2hHesikwf7AMYz3QZv0xo0bejoMWfv27WTo0CG6/rZtW/WcQuYVSsI90rNnbz3OBg8epOP441isXLmiZs44dj5I3odMjVq1nG9z3COHDx+pHU1irHqc09hf6IegVq0amvk6ZMgwc223kJGD/eP+hVoOFtwXnK3jeK8mCo4YgBNRkIHxa1EdFu2S0Xu0+9eFC+fNNe3tZtHuE9UaUV0dwXvIkKGMh9lJkjt3HnMt8g5sc4y1iyrTadOm1W2NaqJHjx7RaVT7RqYIOv7p33+gdl72zTehNEhu166N7pcRI0bJuHHj3fRUj2rBeO8wYcKaKXYoGUb6//7n9oG7Vq3asnDhYq0Wi56zEVwjsMB3QCBqwUPl1q3bdfxw9IiODJc+fXrpejguPILqmNOnz5Cffsqlv7dly+ZadRMPsNu375QVK1bpsrFjf/ewijm2Qbdu3XXcZ5TooeZA7972z7aaQ6A6eZ06dXWsYoyxjGDz119bS5MmTV16age0u8R2cAxAK1WqrOuhRGvWrJmahrGVFyxYqH+LqsnYLnhP+3bxuKkFAn68f716v+gY4AcPHpAGDX6RPXv2aE/d8+Yt0HPNgt82ZMhQDciwXTFO+IsXL41gbKy2v8Z7WTVSIka071v3nXpB7Ng/6DJkklgQePXt2984jsJpoIkMhMiRoxgP+dONAD2VvHzpWjsAn4G/R20AC77b+vUbjX3dVXsXR4CIDAWU5KM5irOaMr7FOl7xfS3hwoXXNFSpdg9j6mOZV/0IoAPAb7+NYPZ1Ud/4TaO0xsPcufP09wL+b9++gx7/yBhCoPvkib2qMcadX7ZsubFvMmhGUtOmjbUUFLWH1qxZK7Fi/aDrwf/+Z/0Gt+cc3n/kyFHGMT9Oj1/UPkJgjcy1O3fuamaAM2iWEDp0GB2fu1mzJsb+7am1SNCLv9XHQoQI1jESXecBx/rMmTOlU6fO2ukgjmH83R9/zNDzyZF1HDgeo5YoUSLrskiRPK8i/7XAtRK/11ntHOxDZFChz4mECV17iwcsq1q1qkyaNFmvFXPnztFrwKFDByVbtuzaft99cy3sL3wWau1g/7h/WecqrkfeuVcTBUchbKjLRERByokTx40HsoZGAGTvdZo8h5JCtHlEaW5wNn/+fK3Cf+LESQ+H0fIulJjEihXzk+DZ0cOHDzTTw6868Hn06JG3fod313OE6pgvX77wNGD3DlTFRwmys3bnWIYaGY6BpG/wye+1oGoy/tarv0fJKjIBHId/8i1f8v0tqOaMANcxyPculMAvWrRITp06baYEvMuXL2nw5NlQi9h3CIycQTCLocDixfO8d36vIAhH7SOv2n47QtMAdCDnVYaDZ3D9Rk0bvM+GDX4zpFzPnj00A6hLl25mSvCDc+/x40dG8Ox5vw/BETI3UTNj0yaf9VVB5Igl4ET01UOpTnAPvn0bqkN7FnwDSkr8svdc7wZpPgnmUBL3pcE3oJTfo07fsMy3g2/4kuAVAZx3/h6lmH4RfMOXBt+AANEnwXdglThxEk+Db/Ao+Aa0Bf7S4BuwTT8n+AaUkn9J8A2ogo4hJK1+Jshv4Nxj8E3k9xiAExEREVGAw/jnJUsWl27dumo1aAzZh2mMaZ0sWXKpWrWauSYRUdDFAJyIiIiIAtx33/1P4sdPoB0XVq1aRdsjY7pEieIye/Ycp23qiYiCGgbgRERERBTgUAUaHYIdOnREFi9eIhs2bNLp8eMnOu1sjYgoKGIATkRERESBSvbsOTj+NBF9lRiAExEREREREfkDBuBERERERERE/oABOBEREREREZE/YABORERERERE5A8YgBMRERERERH5AwbgRERERERERP4ghM1gThNREHHixHGpW7eOjB79u5lC5LVdu3bKjBnTZdy48RIxYiQzlYgcLVy4QPbs2a1jT1PwMXfuHAkTJoxUrVrNTCFydfLkX7Jhw3rZtGmLmULkcwzAiYKgc+fOSZs2rcw5IiIiIvJLiRIllgkTmDFHX44BOBEREREREZE/YBtwIiIiIiIiIn/AAJyIiIiIiIjIHzAAJyIiIiIiIvIHDMCJiIiIiIiI/AEDcCIiIiIiIiJ/wACciIiIiIiIyB8wACciIiIiIiLyBwzAiYiIiIiIiPwBA3AiIiIiIiIif8AAnIiIiIiIiMgfMAAnIiIiIiIi8gcMwImIiIiIiIj8AQNwIiIiIiIiIn/AAJyIiIiIiIjIHzAAJyIiIiIiIvJzIv8HCLMnzqppOyEAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAABhkAAAJhCAIAAADT0EbyAAAgAElEQVR4AeydC5Lkqs5u7zwqclZdw+ocVk4rb5yjE9+vlgDjN7bXjh0dGIQeCxKw7Mz6f1/+gwAEIAABCEAAAhCAAAQgAAEIQAACEIBAH4H/1yeGFAQgAAEIQAACEIAABCAAAQhAAAIQgAAEvuSSmAQQgAAEIAABCEAAAhCAAAQgAAEIQAACvQTIJfWSQg4CEIAABCAAAQhAAAIQgAAEIAABCECAXBJzAAIQgAAEIAABCEAAAhCAAAQgAAEIQKCXALmkXlLIQQACEIAABCAAAQhAAAIQgAAEIAABCJBLYg5AAAIQgAAEIAABCEAAAhCAAAQgAAEI9BIgl9RLCjkIQAACEIAABCAAAQhAAAIQgAAEIAABcknMAQhAAAIQgAAEIAABCEAAAhCAAAQgAIFeAuSSekkhBwEIQAACEIAABCAAAQhAAAIQgAAEIEAuiTkAAQhAAAIQgAAEIAABCEAAAhCAAAQg0EuAXFIvKeQgAAEIQAACEIAABCAAAQhAAAIQgAAEyCUxByAAAQhAAAIQgAAEIAABCEAAAhCAAAR6CZBL6iWFHAQgAAEIQAACEIAABCAAAQhAAAIQgAC5JOYABCAAAQhAAAIQgAAEIAABCEAAAhCAQC8Bckm9pJCDAAQgAAEIQAACEIAABCAAAQhAAAIQIJfEHIAABCAAAQhAAAIQgAAEIAABCEAAAhDoJUAuqZcUchCAAAQgAAEIQAACEIAABCAAAQhAAALkkpgDEIAABCAAAQhAAAIQgAAEIAABCEAAAr0EyCX1kkIOAhCAAAQgAAEIQAACEIAABCAAAQhAgFwScwACEIAABCAAAQhAAAIQgAAEIAABCECglwC5pF5SyEEAAhCAAAQgAAEIQAACEIAABCAAAQiQS2IOQAACEIAABCAAAQhAAAIQgAAEIAABCPQSIJfUSwo5CEAAAhCAAAQgAAEIQAACEIAABCAAAXJJzAEIQAACEJhN4P3++37//Xw+s3vSAQIQgAAEIPAAArZRvt9/HxDrwhCLiDhgLKRJNwgcToBc0uHIMQiBYQi8339/f//c+JTz+XzuHeAxU8nmSUgbvV4/r9fPjSfPMWyxAgEIQAACdyVgG+Xr9XPXAGfF9X7/zceGIiIOGLPAIgyBEwmQSzoRPqYhcCaBz+dT3MLP9Knbdshr1Pr9/v6xGGsCs+o7jc7SOb6wHf5q5z9ySeOPIB5CAAIQgMApBDY5Zd3j7FE7cxYRWSUHjFMmLUYhMIsAuaRZuBCGwK0IXHG3Lh47aqNieZDf3z81gc76WUY7dV5IzMIPx9krTp4LMcdVCEAAAhC4OoGVhwc9y7k6B/PfaIQjWRERB4x7jDhRPIEAuaQnjDIxQuA+BIrHjr3DO8Xo3kGt1M9RbyVAukMAAhCAwL0JrDw83CyXVBzrIiIOGEVWVEJgQALkkgYcFFyCAASqBIrHjqr0Rg2nGN3I973UcNTbiyx6IQABCEDgFgRWHh7IJd1iFhAEBO5MgFzSnUeX2CCwnoAdZSa/td5/4pl7tAq/1DO3ew+ByRj7jfZL1hwzDZPArbuwF+VNVc1Q0DD3x0Ebfra9avtDKwQgAAEIQGAQArO2Mx0AtCOrJocjzY3NVzK5e6hp7MhBsnY56aqCmtQwKek1FO2GcMShU3NRpze6oNzvwx7WFzhMFwgcQ4Bc0jGcsQKBEQnkDc82S9ut/Q8lmmT4lruFZH8rTaqskPf7olhWKAe8vGkLJnSZbYm19n7VfL9fmVBZql6vn+KvAnkBKwejmdXr9TPrT8j5eGWuk4/JS9j+7JqU5KC+3+/n8xEcL/l+/w0Evt+vCYSQi5XFKEJHPxaUIQABCEAAAjsR0DaX9avJ71CqtF3Sb45WzvujaVZHdbEdWZdyoLb5/v7+8crVMRekys4w+hsjkvQReWFflsONg1De0HXMKKqSA7XzjwR890alHUgkoIIH5VUVT2LheaSX8X2tbDBDmGIlB4rHqiLJRqIwW6cGAlckQC7piqOGzxDYhoD2RamzLfP9/msFy4b4fTRssUo0SLL49+OlwYuZ9aBQDvjjkR2M5JV1tMti7iOEE/byYEIuiYY/h/UYDa6GLiFA+eYLmY90hu5y3kPwwlIV3PBB6cSj2H36KVjUEAcNcsAHYpVBbe3Y5ztShgAEIAABCGxLQBtiVqsmv7WpUhkHnTR0Qsg7mrZgS1to8/X1csBMhF1SW6cX8/uy3PDeSr+0+RqpKhYUafDHh2llM93QrMyRnPRKvHXVd1bK6KTm7/cr4TAKZtQfbBS7r9S5KJwYpVY+qCbMBKmVpI2gD5YyBO5HgFzS/caUiCDQSyDv69oLw1MXnatCfdaQbUtn2HeLSQoJB0NS22NRwtKmGn9cCMeIWozyM5wwTKd65eh04PCHP++JleVk1mDB+u4SDs7LVngE553P+oMzUuItSsNkpXwLarmEAAQgAAEIHE+gsSupyW9tqrT8SHBYW6SvV5eww+psYPu475LLUuKd8ceVRpdgt6YqaJBYOGt5t8MxQ12Ck0FzeKXLtxbPb+3K4IPPGXnNcjv7VnRblaKXa3T4yT5I2PuQD2y+lTIE7kqAXNJdR5a4IDBNIG/h2iDzfqxt1TeZhrzRetsNGTPnu7cdkA/FtI43amVp802q1BlCrWryMbaNNk4POty0vV3GJztf01MLSlGrIIeL4U9WmiE/mtJMAQIQgAAEIHAwAW1/2a6a/NamyuJGVtwiazuvzwS1zwDmmyWqvDNeQ/a/cfZouCQ9jUjVVDtm9IcTJM2x/sr2KHg9DRq19JPC9Mkvz18CmYOOhb7JfPA1ok0BAjcmQC7pxoNLaBCYIJD3de2dxZ55t5YGvwGHvrmXBHQyU03bAe3f/gyhvrlQ1FastL5qCuEozGBC/tdOD7WOXs9WfBp6Gk3yxN7KLkp2VtboyQQFCEAAAhCAwGEEtCtli2ry232x0ve1jI9yHJucAWzzXZZL8r6prChUkwuS8eGbmJoavXKTauwHoYrvcNlZIpzfGpXZN7Mi5Xb0mhyFWkRibj5oWM1KrZf3wXsoJbUDoRBRgMCdCJBLutNoEgsE5hHIW3h777RWv3f6Bz7521X+qZpsFQvyu+3A3rkk6Q8xymf5aYVJb2sKpUcaZKJYyPKqUcE6Bs+ttdaUf1mzKNlfqROeTQZOVBodChCAAAQgcDAB7bDZrpr8plms9H0lYJXh0kta2XbPkD2xF2H8dikx74w/QQXNsquOxULo5S+lIVhsGG001X5QPAQuJ70njcrsm3UMzuvSqw1lsxIUKgllreHEIscaBa8waPNNwRkuIXAnAuSS7jSaxAKBeQS0Qapbe0u21rxBSo8VvIAUBplw2emAUjPhgKLuoSDrvr5YKYEcQsNoW5XpLCqUOWkIQMJllleNCg1DxaZgwl/6EVT4PZUSlrbQS95SgAAEIAABCOxKQDtstqImv0kVK31fCVhluPSSVtZW6JtUmQvemUbuRnazBl/jjYayNASLDaO1JqnyplX2dudWZt9MmyyagC69rVA201lho6+8bRSCQmlTl+AGlxC4HwFySfcbUyKCQC+BvNtpIyyqsNawd5qkOppOPd5Rvf7OiP8LFyrLnORVEwrZ5yDgL4vaipXqZfpDjDWjbVWms6hQ5qRhPZ+GodykJ6LFv0NcDL+n0uJSUGZXk0FRU4AABCAAAQjsTUCbUTakJr+1FSt9XwlYZbj0kla2TdA//aptvqbKO1PL3fh6HaKKheyPauR5sOiVS1gF9VKNfxnHq8qS/lGTurcrvULfRcpNQJdeJpTzKcj/TFLxrKKxK7K1yny8Ca97h+/NBa+4hMANCJBLusEgEgIEFhLQTqn+7S3ZWmu7uz+C6OQkhY1esu41+Epfzj771lCWdV9frJSA6Q/e1oy2Vflw8oHDLEpDsCh/QkHyoV4HsqKeEJQOf/mUEyTNSn+l98r/PWNfTxkCEIAABCBwAIHGjqkmv2kWK72fJqCtU/JexpfD4aGx+Zoq74w/Qnidjfog1riU58FiW7l6SbOlxgRE9VlSpxSdD004IPKV2TdrlXI7WelS1kNB2MNJTM6bDyGKomNBc+NSXtWiaPSlCQIXIkAu6UKDhasQ2JhA3im1+RUtWWt7X8waipt0UX/7EGNdss81VTVt2UOvwfSHGBtGi/JS2OgYZMIhRq2h0HC+4UlokpIQpo56oT50N5eKlcFbHeBCPZcQgAAEIACBvQlos8uG1OT3u2Kl75s3vlwjee2Ayp409FuTd6Z2hjH9DbtyoFGY9EQ+eyXqpcqaG1lSB4yg2TQUKwONYNR3qblhXYrO+EqVvUVVhgyU3JgsWK7K65zsggAELkeAXNLlhgyHIbAZgbyFa+8s2rDW9r6YNeiN7p79OHcPnmSfg4C/LGorVqpX8UTSMNqITk1tYhJbyafoucUVmkQgOFarD92LOgXQF3SS9pWUIQABCEAAAgcQ0B4UNjvVh78Zok3w9frJO7JavefawX2lldWkrIc0BH+UZwn1km8oz35m4VwjzcFiO4GlXlJYPB4oHAVu8iY8qzJHl33wfwSmEY5vkhLpl2+q0STpfNQnJirYBPB21UQBArchQC7pNkNJIBCYTUB7p3pqf1WNL1ir3xdr5zC/9Wo/zn/by/72RzYRjhpFAfuhH++MF7NyMZxipfoWD0bqko2G6KRHh0iPQq2+EDToHGNf5g8ByhOvwcpFz4tN3qLMSXMYUx0KgyfZnP18gBzTd9wmCagLBQhAAAIQgMCGBHTOsS1Mf3FMe7Tf2vw+GLZCNXn58Js77/df21K1/cm6RTR385W8zh7astWUT1ZhLy7CrIUzN5eUMYYfDPLWAw1ralSGXIzX3BgFf+SQe75S6HylElK+UpTsFy19LBprVYZfn1RfDZkkKUDgTgTIJd1pNIkFAvMI5C1cm19RkbVqC9d+LD1WCBuqqdKOHoTD07+2A0VVRVetsqitWCkl5p5iVH3wX/XhKBmiy3p8R18O+r0efxBpOF/zvJgMKprzA+p9K2rOlUWdxcnglVOGAAQgAAEI7ETA72vaWC1fkHcx7bA5GWTCPtEgh4sm7GwjixIubpSW/TFhSVohyPtDRc2u6fEnh6DTJ4y8QhMThEYvNRV9sMyLueH1Zxo6n4QniEIRws86256YvB8177D6WkFN3mdVynkVamolENKRwRyXELgHAXJJ9xhHooDAEgLa8NS5cYbQ4cPvsv4ckLVJrRWkXJJ5o5VM6BsuvYbQ5C+L2oqV6mWaQ4zW2jbqW60snZ0FOeZVBU8kk3VaryDvPQ9N3ooGQpVef1Fzo1JKwunQ66QMAQhAAAIQOICA9k3tTWY072KStO1S8lkyux2EJWD1usynJrMl017Syl5z2Md1MPMy2tCzKtXIXEOhhFVQL9UUHfCVXr+c9N0blSYmASt4hV5PUTgfQhRCUY9ag+bgg10GGfWVcNFE6MUlBK5OgFzS1UcQ/yEwBIH2E7Dg4ib76+e//wXNe1/2GF0f3XoN/Rx6IurXZpKzJsNc5chDAAIQgAAE5hLo2ZiUDvC7sC9PGu0XnrX59gj3m56MYpnArg7k75S1ndzDmfyzDEUfemZasSOVELgiAXJJVxw1fIYABCAAAQhAAAIQgAAENiNQzCVtph1FEIAABG5HgFzS7YaUgCAAAQhAAAIQgAAEIACBOQTIJc2hhSwEIACBL7kkJgEEIAABCEAAAhCAAAQg8GgC5JIePfwEDwEIzCdALmk+M3pAAAIQgAAEIAABCEAAAjciQC7pRoNJKBCAwBEEyCUdQRkbEIAABCAAAQhAAAIQgMCwBOzHlef+zPOw4eAYBCAAgb0JkEvamzD6IQABCEAAAhCAAAQgAAEIQAACEIDAfQiQS7rPWBIJBCAAAQhAAAIQgAAEIAABCEAAAhDYmwC5pL0Jox8CEIAABCAAAQhAAAIQgAAEIAABCNyHALmk+4wlkUAAAhCAAAQgAAEIQAACEIAABCAAgb0JkEvamzD6IQABCEAAAhCAAAQgAAEIQAACEIDAfQiQS7rPWBIJBCAAAQhAAAIQgAAEIAABCEAAAhDYmwC5pL0Jox8CEIAABCAAAQhAAAIQgAAEIAABCNyHALmk+4wlkUAAAhCAAAQgAAEIQAACEIAABCAAgb0JkEvamzD6IXANAu/338/ncw1fH+/l5/N5v/++33/nkljcca6hmry5vcDzmsKH1284oO/339frx/9/2JqwbDI/fOgJHwIQgMBoBDbckkYLbQR/wDvCKOBDIEAuKQDhEgJPJPD7++f1+jkrl/T5fH5//6zPL7zff39//5wVxZp5Y573E9Bt/1yjizvONVSTV6qiJkD9LAKbDKiUaHRU6J+Ts9wOwnIg1HMJAQhAAAIXIsBivutggXdXvChfRoBc0jJu9ILAfQjY5nTMTWORmmWyXq+fYmtn5efzsRvg4wNZmb2S5/0EFp8nFnfsHIVJMSUpJiUR6CGwfkCl4ff3j7d48KfJFoHgg/eHMgQgAIFBCKzc9AeJYg83tKHsoRydZ+G1J74HnwoY7qsQIJd0lZHCTwjsQuCsnckHYz6sv420fe7IQ95W9MzzfgKL7S7u6MdrTdki7c+arbH1hL7rB7Q2IlZ/WGZWGdUjP79PmCHECAEIbEhg/ZK7oTMDqoLProNyPF6fRTr4VLArSZRvSIBc0oYwUQWB6xFgb1gzZsfv6+btYruLO66h5PvWMhdehnI/gfUDWlsBavX9vs2VtFgOy17NdQ95CEAAAuuX3HszhM+u43s8XrNoPx9x/KlgV5go34oAuaStSKIHAtcjwLsAK8fs+H3dHF5sd3HHlaDUnVySUGxSWDmgWgFyBueUU6MZ3YQMSiAAAQhsTmDlkru5P6MphM+uI7IY7+K99fPf/yyoU04Fu/JE+SYEyCVtghElELgkgc5tycRyhOqeb0Sz8Pf7tX1o8febVnZf4IAF2IhOBIrxblUpK0Knmrkmcsdc09ApYXnSEP5+v5IXw/WD2La4vtU87NRjARaFFXuxVZUS60GahVUjhbMK6q4BUnfjkOtNQOPY47aEpbxWMH9qrdRDAAIQWEagcxVqLIlmVwLL3FjQyzzv7NhYQk1PbUmXfoGalCxu8cfzkefLCgvwFsl0Bi6xnq0zC6tmbrCzwqwp75xCte7U35UAuaS7jixxQWCagG1LeV/UhuG/Ke3VaT8zSfu39kMnRWH/Z+Mk4E2YTqvRj3PLXPGnhaw1h+OjaGjwNPS+Rk1e9bngo+gsS0mQL3pufxTWugT5yUuPWmVZL1I1nRnI6/XT+Kt5NeWyZWrDZfDflDS8Ksq/Xj95DiiTGJo8xjDNinZN/v3+64fGu+HrFV1WVRSref79fovya2aCgMhJheaHJuAqutFwu3MaCKDJB6NqpQABCEBgLoG8ChVv44ti/lRTFLBls+aSuhTXtLDkmhIpzHtu3ke0jDe2JPlgmu1fH5fZLYo1tvjiXrByS6phbNQXGXqSgbzwfr/fsOP7Q6ksSr+P1+v0IZuwHY2kwQpFMds681jsseP7wINv/Zei0d8FyScQIJf0hFEmRgiUCdR2F20Yfq+VClW+33/tf9XkTVFNtmt6eSnUIUY1OiFpv//9/WN9zbfibi23vR4dyKRB5sLJzOplRfJFiz4QH5o/ZHg32mWZ8GLy0+s3nqLq5XvK0ikNIZDicUrCYiI9bXnvuQ1ZiFR6ityKA9oIc4E2M6FJMklDLomJvy2RnhB4nq7mqpkLRjMKxeXVmgNyo4Gl1vR+/1V3jaw+worUd89um1jnNAg+1yLN9d4HyhCAAAQ6CWjxDItt6K6VUGKq0ZJo6QDVS7KxXnnrwaIOOaH7tltS9lY1isscs03KB2WehGOSCSsuvyVJ3go53j1qzFZgqIjMPW/X5LVTW7xikjcy6fcyMic9mUNQZcS0z4bN13toiSSz69WaA3IjdJm8NIWTYm0B0WiL0fo0AuSSnjbixAuB/yNQ2120jYXtUK805+OFzhb/p9099tHW61tVLvZt+KD9O6gt7nNWGY5NOsb5RIDcCFHLXKgXDa9EQc0qKFj1kjMZtQ4TC+xKbT5j+TDlho8xM5QnRfkwOl6/PFdlDlOueuXtsroE09arMT0yDYUWHNNI5cmgSZVBqVfbfxn1/iuo4InSrKa8rbnWKuXeYgNXUY/c9q3SHGhoxDNzb9erogwBCEBgGYHish9U2WKVF1gtYl6+WOkFfFnCeYHVfhGatFmElVPLbPBT8nlLmhWXd9vKfq32rQoqeNK/JUmDd75WDny8JzWGJmMKQ3dZCfUL8Dasy0rwNlzKaHDGui/GG6x4GsWm/soi0v7uSN6VALmku44scUFgmoBtDFlOG2HY4bR3hlOOaQjbjA4iRWFvVAcLXykfit21B+cu3ufaWaqYIpEbXoP0h+isXl0ktqygYNVdNcXw1Sr5zoIcLqoVVRGQvGq8IQ2xbzXf8jHIM1cuyVcGl8yZoh7vgy+3vTXHvKuaz0UrRciqDHoUSFGVHAsxeuf900ivXBaLfdUaVHVeyjFv0fqa5lyfNWsa+KZG94ZRjYhXRRkCEIDAMgK2EBUXTylsyOQmLV/q3ihIuLiQFhdJqyzuI9bkd08tmMXUfHZerhZNq1UFHQlU4y0WqRad9N21V0qyXSiik8JGIMUmq9wErw1uUZXGvYhIzmvr9DGKRrGvWqWks2AdO4VrYqbEe1uTpP5RBMglPWq4CRYC/xCo7S6N7arWxT+SMhuNjfYfJ9wvNPv6hg/+rttvt9bF73Pmg6+RibyLa/uXjC9k5f5I5CUXlEOw8q14TFljtx1jtqujpOfsAwxYpKEtXzwNh2EyzTU93geVFV1QZQLB1Ualbyq6GipNftZksy7+X3vZPjgpnpvPBO9z4z6kSFJu25c+hN3XN4ZPQRWVW0epogABCEBgMQFbTxq/+6PkSNGE7YB+pcrLXbGjVUrYa5B8WO2tvljpm8LuY/Kh0svLnC9oZ/eVvhy+0Kcmrd47bUky1FmYxBXIT8oHkg2819rxLZBOqjWxBr1aF+qfQIBc0hNGmRghUCBgG2HxQFDbPnUwkkCxYMb6dx2p9V5Ks6/05ay/ViNVxYKOGkU3ZNFaJWz17S7qO1mQY0FtMCc9i+1OdgyehEs5oEJQGC4lpkJRYe5VFJOSWkF6itxMZ2gqVpp+afPmGo6pqVEI1v2PJvheEpMPqvHOrMkqhhizfvMn13uj3md/BJfbwVtdNpRbkyQpQAACEFhMQLkP/R5QUBUWseKlXwYnFzevX8JegwSKy2Cx0rpImzQoEeaX3yBcjEiVXlXt96G9cvlQjMjvDl7zfuUGrmJTsVLuWasuG3h9k/Uq/hso+R/w9vIS2wSvlHgTtbJM+6hrZVMyq0tNFfV3IkAu6U6jSSwQmEfANobcR7tOaOrcoqxX/64jtd5czQfJZP21GqkqFrQvFt2QOWuVsNW3u6jvZEGOBbXBnPQstjvZMXgSLuWACkFhuJSYCjWFVh/EauFLLBRkvdjRTISmYqWplTZvpeb/gpOlVOWCnJQPqvHOrD+4N/TXyGRvVSPfpFY1oVBTLoxBnksIQAACywhoOcorlRYcNRULfvmVth5nJOw1qGNxGSxWWhdpkwbvv6/0W0MxIlWql5SryReyWDEib1dddi2Yk0Vnik3FSnlorbps4PVN1qv4r3esKGCVEtMoqMY704lXShoW1VQzFOzaZfC2KEPlAwmQS3rgoBMyBP5HwDaGjEPbTGjSFuX/2EcuW6/+XUdqvbmaD5LJ+ms1/m9nZG/1LaqiGzJnrWHfbXdR38lCCFZqgznpkYBqOguTHYMn4TJbCQrDZZavKbR6i1dKauFntVbT7uhNSEOxMmiTsD8++korm6rOyaavGIQvXwR/2hF1niyzq6pp6A+eWBe5HYbGhLNa1YRCUbnJBFWhI5cQgAAE5hII74P417FtwbHv+ebjgdXokDB3yW0ssNpNimtpqLR4pc2HL/99pfezFpTVWy//9pY3nS2qxot50xLwlfuVJ7eS4GdDXiPiva3hlfBVdnwLxIe2oNymt0AhXe5BgFzSPcaRKCCwhEBtd6ltn7NOCf27TlFtzQfFaQL+kJct5hp1z4WiGxKz1nAuaXdR38lCCFZqgznpkYBqOguTHc0THbWDY9mKJRck36nfvzNvOn1HX84WGzXqWORWnAzFyuySjDaANFSpuxV0cM9+BiXtiPwNQzDRednQHzzxtvyHzgyZsIxKrWp8oRG+HdA1nXwvyhCAAATWEPDf4dLaa2tX3pJqhtqLW+glYZnzAnmNVYaiKC9tWUn2vyjsO/py2MfVlJWopuih3yakJBekRPAbhZohU1tk2GhqyAu+d1iO+cqG/izmf98zb23BH5GpRS2BoqFGpRlqCPQ0BW97uiDzBALkkp4wysQIgTKB2u5i9fl0or0230xmA/17XlGy4UPtvJL3OdOc9+/sbU2nJE1V2OCLnqtLfyEHm2u8Nr0e4it7ym2H1aowc02wkpnnGnVREqE9tRoapKpYaHtbVFusNOXS5m2ZfNF/k++ZbEXNZiX707CYf/Deu9pTlicacfWa5YkJq68WiqzWf9Byq/mT671myhCAAAQWE7Dd0y8ytnz1nGr88tXjQGOBrS2SeeGVIWlTjZQUt6T+uGpG51rs3JL0Rxva70zll8J84FaueS4yfqBrlVJr2nQp+SJegzNrxw/OSL+vNx+KFjvxev9VzqGpqb/QoN2vBMn7ESCXdL8xJSII9BKopSQam1nt+VU2qcTB5F7bPq8Uuxe3tFwpH3qOiUU3FJe1+i1/7rFSqnIhA9fQBIv+GVc4beg1/qxfNYqxQdWrFcDX6yczlJPS3z7rSN6bUF9NLaORzRWHQN0bZLxXgWeeM1IoVqrRya/ov1hlz72GxrSRRe+koPlKUyiLRX+C0eJl0aJJZmT5NIQAACAASURBVDJ5lpqklHgTcjvQ8D7niExVrveaKUMAAhBYTMCWJr/IaOvp0Vlc7mod/XIXZLRCek+0xYRK61s0XVuWtesV9/rgTF7tTaCovOZ5ewsOFre6lDNBoeoDyVqkPl6vqkjABDS4wYTvbmUNXJAs1hcrg8UFO74Fkn2bVdOmN0sVwnciQC7pTqNJLBCYR0CbVujWs33at8R9x/f7b7hv1HZuP0ZgrXokpb5FN+SD/fkVafZ/+koarFDc5+SD/3UAO/TU9vWg1i7NydBFhwn71ZtMoKgqVypYNUmzD99CkHA4T5iH7YOjZAIrDUH+8/C+SaOgc2rOMdU810CYaUWqgu8YOJuMdfQ+qK8KgmMjYpPNTNu/QXPgID21jI/0e0mVFWN7svlIFY7n7J30wvpxpfZMkD+TBRn1Fq1XJiNhzTH/nZEwG3VTFH6IxOZzVu6NTrqNAAQgAIEeAloztenb4qOF12dAek41fkG2Hd+ryi5py/BbklXuvSXJVYvL+xnOKn7nshD0aMpc9XFJbf/hxHfftux3pc9//9MRcS5e7VneQw2fr1RZ3MLMsZ1RwD0xVcrzfOjyak1+/Y6fx1FR9BdMST4t9GtA8pYEyCXdclgJCgK9BIp7Q3v79PuiJK2gm0yZ9/tlEM57qnppU7dURehol+quXlaf9zltzFmPF5arUugL1urlrTUozwJeSa0sx4JAUG5idmqxspe3mrYDiqI4iOE8JOVFYTOXR8EfzU1G/3o9Uu4LkvSVVm40BeEiNGU9Ah9TGypNYXE+TLpRtJ6tFMUafIrytZkQgDQuFWMmkH32CURx8J/QoCTcjVgXWyKKys2ZvIY0/KcJAhCAQI2AX1H9khVWqsaeZemSoD+sxllbW948OWZLqhEIcRXF/P6SYwwQtLxrTwkQ9rsserIAr46d3lVNG1/py0XroiHJopjHLkkrFOX9iAT5yUtzaVKsLWBK8mRo96L19gTIJd1+iAkQAi0Cxb3BKvOLBl6RZHzBC/iyl7Gyby0ePtTFvyHiK70GK1trcZ+TCWnIz4IkkzXLh6Lyhs6iqlwpDblJXoXo7NLL5xrfamXTpihkt6dvEG5PDx3L1EvONGxZk9xTF2krNnkxK8uoVxhi95JFtSLv9UuzrwxldZRwnmyKSDLmgy6DTs1ACchnq8nyPTVyVdrUy9TW6uWGydeEg9tt5Q0l6kgBAhCAQD8BLXFasvKaJm2S8QW1+oIXaChUFy+vrdN8C91NMlSaHsUitX4f8ZWhHKzbZZCRcgn71bvtT1AYLoOhPS7lsxXM27l4BdN7KM2+Mpcl5gtBzDfpSKDKIOzhm4yGwC6zfLtmWa+gM3gSWrl8LAFySY8degKHwH8I6ACxGId2uB4NxddYih1t09Kpy54c9ncv6txKSVZuL1fn+q1qJiHrAdcCi5PKvU573Odr2uVZym3Q8ygrulnasp62q5u39syKHhnv2CwCvuO25TVuFEdTldv6iTYIQAACtvX3c+hc3zrFZPf0LanH4R4ZRWRnSH95Yvl0vD27eY+MZzh3OHxfyhA4hgC5pGM4YwUC4xIoPr053d2cSzrdpZEdGHMQZxGzl7qLX3Fan/Gc5QnCuxLQaPqjv40+5+ZdyaMcAhCAAAQgAAEIbEiAXNKGMFEFgasSsBs5f2t3eiTXzSXpVlkhNApbcbYR3Erb8XrM//xL3uYJiYbOEWnMtNB0VtZG7x/5Vw71kekMEzEIQAACEIAABCAAgdMJkEs6fQhwAAJDEAh/1+N0n3Tre7oncx2wb4HZ392Y/Heu8pr8UHnAmpPFev3VlVoiae7XE4pWHlI5Od8kcMCEsZ93NYv2VQjljMLbZ5J5yDARJgQgAAEIQAACELgBAXJJNxhEQoDADQlcN5d0w8HYLSQlFxqJpN2Mo3hfAvoIh0JIJO3rBNohAAEIQAACEIAABPYhQC5pH65ohQAE1hHQCxTr1NB7dAL29soBr8mMDuKO/ulTrAIDfcdxJiYIQAACEIAABJ5IgFzSE0edmCEAAQhAAAIQgAAEIAABCEAAAhCAwDIC5JKWcaMXBCAAAQhAAAIQgAAEIAABCEAAAhB4IgFySU8cdWKGAAQgAAEIQAACEIAABCAAAQhAAALLCJBLWsaNXhCAAAQgAAEIQAACEIAABCAAAQhA4IkEyCU9cdSJGQIQgAAEIAABCEAAAhCAAAQgAAEILCNALmkZN3pBAAIQgAAEIAABCEAAAhCAAAQgAIEnEiCX9MRRJ2YIQAACEIAABCAAAQhAAAIQgAAEPIHPf//zNZRrBMgl1chQDwEIQAACEIAABCAAAQhAAAIQgMAjCLzff1+vn9fr5/3++4iA1wVJLmkdP3pDAAL/Eni//9r//1aPcvX5fO60N1g47/ffz+fjEdsQhEovcOOyMXlm7DceVkKDAAQgcDyBwY80xwPB4lYEmFpbkdxcz+/vH8sl/f7+2Vz5/RSSS7rfmBIRBM4kYOvv6/VzphMV2/aoobg3rN/UP5/P6/Uj5T2PNSRT8Xe6WhpCgmz9E5X1Gqa9303CnN9NPYohAAEIQOARBEY+0owzAPYI5/f3z8qnOO/339/fP+E8M06YDU8+n89cz0+ZWnoAeUXIDf6zmuzA37hP0dDoSD9L/9OEySU9bcSJFwL7EtASvK+Z+dot1xM2Dzu4yGcVFuyy9hxDHWtZHu+4ZHzlrLI0yK51t0BCZb/mIqt298W22mqXtYa83jIl9IIABCAAgYcT0Kng4Rza4es9jjUnAR08wjmtbXqT1pUpsO/3KwL9/hw8tXRclF17/Lk+9v6QB5EUgZo/lhlcnxut6b9ZPbmkmw0o4UDgZAKTa/RZ/plj/qDjd1Z7TKHTwIKvSZt+7cpS7i2G2CUT6vsvpSFYycH26/x+v6a284HMmCNuQ6nhmBU+whCAAAQgAIHv9zvmBjfa0OgosnLPXXl0WYBFni/o67vMOjVZxyOnlsK0l6fCY1QfyBPKR5J/Ak9ySU8YZWKEwHEExlyjtY96EPYQLBx9lj0Zy/pVE7I83gHJ+MpZZWkIVlYeyExtIFNzbMwRt3EMWGohUA8BCEAAAhDIBMbc4LKf1CwjoEPUsu5reh05texFm+DtsuNuUHLFyyPJX5HPXJ/JJc0lhjwEINAiMOYabW+p9GcWLIo18jqgNJRIpgW02SYNwcpc/4MR6x4qa5djjrieJ9fcph4CEIAABCDQJjDsBtd2m9ZOAjpEdcpvKDbC1FL44Qy5YZjjqNLvooq8aqwgV/WrUvmRqkn6eqvRC19SokLNigRyQQ74vllskBpySYMMBG5A4AIEtOs0vs2uNXqreGS0rbAtZl61NfhWk+/fXLN++dNQIhlvOpTbMmoNVtr+q1dtHGd9xc9s1VT5cMxucNUL9JcVQkObyfTrRBICEIAABCDgCeQNLm/3Xt6Xe/apLO9rrCw9uam/pratt08LQb9oNHbe0MVfqruvnFWei2JSflJglnsNYcUudKpp9Nq7SeHLq70tnqhfwGsF+dbAYn2Fq6gq6/Fi6iuxUJB136v2+Q19T7kkl3QKdoxC4GQCWqqKfqjVljx7OTYsarV1TWLSHLSp3gomn9fWotHiL/hIv0znvIb/C2vBgeJlzauisBzwrarMoUlMMqpRwR5K+Iis7B+G6IeN8ljU/PevNEt5+H1B8yoYkmO+IA2hoJBN1fv914+mWtXL67Ryo0nQJPN6/RS9lWTWTw0EIAABCNybgO0R2nEUrPbBvHFo11AvbTT+95VVmTWYFemRZHGfslbbyvVzjfLTb/FtPb6Ld6C2+dY0K+qg0O/gRU8Ur9dgklaj6NS9eJxTa3ZAJiSTkUrm+/1qlCUfLEpYAioE6z2X0paF1ST95okuc5fDauSbH7jDrB9sSMBrBfnTwGJ9a7PaWm188wyU3QbtRi/rXltz5PzxBXJJxzPH4kIC/k2/xudwofbndfMLYoheu77V26rq+UsgD4TWSulsLMr6IlLQ4xdT2ZVmv5JKud4vtd8UlHWdmYIJL5DLDThZuFgjxxp2JRM0LAg/WCn6r1HzrIpUgz+1SxsaadBIaYAswPArj3JVHbP+WpNCkC3VyKi01fBKgAIEIAABCNyVQG0LUL02IxHQhqIabUbWZFuPxHI6w6ecJvcpU+53fD0J85XSI2fyfieHrdDefOW/DgO+pqjKTMsT0y/JIlJ1MeU9thSgNIeskByQpEchN4xe26I9sVPg0pxnhXemVpbpICD99szPrNjTTYUQuhx5KbeXRX2kq+ttaYhFXjVWkIkGFuurYbU5phsNr9nK0lw7Ccuon+pSa60+mRtSor77WWVySWeRx24XgdrbGfq4hlcqupQi9F8C2t0zD62VuUk1WknDDqShkWRjUa7lkkyJPyKYtqw818iuCuZA8FOtuSCHc1N/jZToNBM2Lb+vBLUWVHY4BysrQThrkGSmqqEMbnReZq/UUUaLB+5Gx2KTacv7qKzIrgqZg5ooQAACEIDAjQkoHRNi1JanxI0EbMvwu4w2I1/pbx2L9aHSy8uWzj9mImzN2RPr2NjvvGaJ5c13cif1xwmxyhEVzfm+Qpd90NB4eQ/EKzc9QbIo3IhagQTO6uItLigX9agyGFX4FlrDnGc4WW7oqTUJS03glvUiWYtOA9eYdfnrDmFY87T3kzYvPr616Jjczl4V5Q+rJJd0GGoMzSagD7M+P5bX95dWbm9ysw0/o4NWvbAqCXvY/AKVWneNjuSlMBgyAZP3TSZfHFOpkm+5u+yqYL28CTXlguIqOpDlazVyVUAaBa+kEb52GoUvKyG6gKUmZnYVclDivWqUFVeWadttdCw2WaVi9+ZqTVa/LC6vnzIEIAABCFyOQHELsJOk3UX7iIoblmko3hZK3iupbUZ5+1ZNvquU5ln7nXdDGvL2N+mhDj86G6jGm/DlorkGOv/2ltejLqo0zTUHQixyoyhvwgGIusjiskJRj1ksOiP5PPreAQHpKfiOPWWNb2DS0/fSMoJZi0Kjk8mob23gJJD7+pxy7i6jxU99u28tkGPqySUdwxkrswkoWZ5/C8Z0hVeWiov1bKsP66Alz8ct8r4ylO0VG+selsusU+tjkDSdWYnJF4XzzidzRXkz0VAY4vLnm9pqnrsUaxT13PeS2t7a6ChYWVGNOROoakxrQQX5YkS1Sg1BFpB7ualxjK41maGiqoBFMmvikhIKEIAABCBwRQJ5P1VN3p5yTW0zMhQN+SKrvE/VdqiiZunMetSkQkNDYycNvXRZOzlkc/4oYobyPbP1yse5Im3zwauVUR3Y1CqHVeOFi7TVxUsuKGc9CrBGr81ngQ9zu9hEeuDd0yR5jWaeSJN9JTA57kG5DUft8+K/AdeQmTsHNpEnl7QJRpRsSUDrb36BsGhGH78HLohFIP2VebkU/KzEfydLa2XO9KlJGrIVNeno4JdUaWgUJC+HTVj12URtWfeSmks9wr5jLrejNnnJ+O6NqNWkMKVBNaYq0FBHb8iXpcdXdpYbyttqGx1zk2oahQChOLs6g0IMAhCAAASuTiDvQbbL+xszbfe2uYR9RDtOEYW1qknCjYLXb2K+xlQ1uqsp95Ib/hUGX+nrpadYCG4EJflSnL1X0pzla/pzF9U0CjJadEPWrVXCVq8uEltWyHpyTdCsiEL9MZf2QXjmfdMkeY1dmC06VTayOZPKJRCUW33j8bO8alg/ZvIEK+SSAhAuzyegj1n/p2VBl/PjHMMDQ6cVTUtV8M4TDmX1tS5qlQbpDJJe3jdJQ6Pg5aVf8jJtBRPwXYKAFzMlRYFZlfKqYVcyXrOiaBSkUxpUY6qsryqlyhvyZenxlZ3lhvK22kbH3KSaRkHxynMTzvUSoAABCEAAAjcmYLuAAvSXYYPwTUG+dhwNXeyy/a/fj0zS15jdtoZaL/nsc0a+0te3TQQ3gpJ8qb3exyITWb6mP3dRTaMgo0U3ZN1aJWz16iKxZYWsJ9cEzYoo1B9wKd8CjQNMj2BiknyDz2TffoEAXx17CqHvuVTJJZ3LH+uRgH/NRA+LolC69r2G+oAlT4er0JplntmTisBQb+uEXzq3vkE4KPRnlyBpFrMSq2nn5vPc0NKfX2ezpqJ1jYem0FZPaeRPw65k5IYeenSGLw3BSqCaB8Vb9GMU6nsuG8rlXlFPo2NuUk3+CXPV5FlhvQKcojNUQgACEIDA/QjYLmC7g21J2hH8qxnWlA8A2nqKZKxVTRLWrpQLfp8yefmzWI86qlDbfFWfHfM1pkfhSG2t4NVKZrJ7FqjVrDwRmUvmZKAtz+X2skLWk2uC5hxsENjpUo7l2b6TxdHUTpIXojBbdESvJZdnCQTl8qqnMBRScklDDQfOfPUR8tttDxflAhqf8B49T5PRimnAjb+HILBh1dOKGeo1glIiE0HSBEzeN+UaqZosyJafBlbpTQQ9inHDnVWeNOxKxvszK3xpCFaCErv0TLxF/ejAsvAbyuVeMGeXjY65KdcUdYZK6zV3MQlKuIQABCAAgYsSsG3ItsiwI/gdyov5SNtbj7VKvi0sMRVMPmzfOlw1tmxpqBV8aF6mVu9lVO4PR2p9LJPdc/i5S5aRe7lQdENi1uo9XPkgTZqLeuSMF/PlHKxvtbJkegq5e67xz4Zz60NqBLMWr8YuzJaez+akcgkE5VbfTpsq4Vvz/JR6ckmnYMdomYBu6cMHrCydarVELuue9D2iwjO31TMkFLSkZhy28AXaWiUlLw1B0gSykqIb0jZZ0DSQpCksWvc/mhACV/dlhXbUplMy3sSs8KUhRBeo1sRkN8irvqeQR1y9ZFc1vtDoWGyyyv7EUNu694QyBCAAAQjckoAdcuwOzTYRH6bVNDaL4mYkDTWFnfuUrEuhFeRPp57QvZjakIwZ7dEsN8IBQ6pUKEq20amLlBRv1E2s83gmnUWHrTU0qYt3Y0G5qKc2vv7k2c4YKnfQU5h0W8fjTp6TCi8q0J6Z/uMTZktxigYIk8olEJRb/RWHhlxSmANcnkmguBb3O+TTIv29kBR222bCCUOtAZTqi6uh3x01Lr7StGlj80okHzwJDtQupVMCUqgaFRRFz/Jtwt5V6ckFaW7IS8Z3l7eNjpKXhiBse5IqpbP4h40zMdMv5TJXLGhfzK1tDbIrP02D6sOEsfqekTI9bevZW2ogAAEIQOB+BLQh1v5aiG0Wxc2lscHpxtITm7VPyTGvwScaii4F4eJlY/vr97B9cvB2Zc7v5kJXjKIYu7pIuXzwmtUaCkU3JGOtQY+6SGxZoahHh5msU03hnJMlt6qRxUBgK/0X0pOnWXBeo5lZTfbtFwjKJzsGJ8e5JJc0zljgyf++4BY+XbO4XPejOCvMzYXFLe9q2sh9GkLrbO1kFvRIv/3i0ufz0V+Fs+0tDLrf83yTdfQ5pvATTnLM9yoe+PTFLvOt9szHozZJb923hnLNEy8mGV/pHbNHqb71/f7rHZCGYry+UpJ+HL0tr9Ysiox3IJc1WDYWRaO5l3/yo1mkWSFvfUdNxUks1sv89xooQwACEIDA0whoQwnbn3GwnULbUICj1lDv+/qmWftUY5P1G6vfVW3rzPu198Fvr6HeJ6osZK/KDkK+i9wIwkFShL2rQme/YilDn89Har0tHdXCAVLCk1t/0Q2ZsFbvYZGG/FTHnoJMe2FNBk9P5xzx8V12KgeGxRPvTqYHVDtJXqMZZkttivoYJ5VLIChvGPX6ByyTSxpwUJ7rkn3AwqdrFg59RGf1Qri9hGkTEl47kOnSAyxW+pyFBEyJmc6DXjRqffWMy+/TXm3WpgDlqmp8x1zO8qppF6Q/O6OOklGNCj3h+/NisGKBhMoaruLxuuGbnLRCViuBSSXFMO0kZyFIVc2WhkyzwkuGyqCNSwhAAAIQuD0B7UQhSWGBaxsqctAW02gNTXlPlJKwJVl92KmlzbstDVYIetRFBfVVjS80PMzngZz7kDNKu8icj8WLqewL6i7f1KoaK2iMJKCCR1F0Q6qs1XtYVJ4FpKFRkOkgU0Pt60OXzS/lm6AVC5vbHVahplNtrEUsCwhdLbp+gaDcT4n80aiZG6GeXNIIo4AP/yNgn8Dw6ZpLx5TM7fVwea2bNQ5aHP0YqdL3KlaagJq8EjNdHHR5FTp6c1mmrUp9c8dgxS6DfFG5ZHxB+htdJOM7+nLbpbm5JNOcdXqLKptvDecl6d0oQise39U9+COLQZXk/XMh39cLyCVpC61cQgACEIDAcwg0NpT2RqxdpsiqoVYdfSEosab2PuW7qxz05Mt2UCYvbb5Qc0YKJewl1eorJakdWTW1U4EEckQ9W3/RDamyVu+hmmS39nqaJGsFmS4KeP2Kvd2lqGdZpQwFN8LlMuVX7CUgxcngp2sWELRa4P0CWbkc0yTJVnKvLHNwDbmkg4FjrkXAPoFrPif6HLbM0LaUwOe//y3t/b9+C9LtPXYn1a6cXfYcY83kXMytJ/y5yu3bgo1eC+Jd4+fk8GVX2yGY/7kXNRCAAAQgAIHDCGxybFizvU5GOsvD/s0631S3d+1JP01gPxSzOHR668X21u9tUW4Q0K2i7gt6vrNpCvOsDob6BfJ88K8mBd/864HB4umX5JJOHwIc+D8C+uT8X9XM0uRneKY+xO9DQGv0spBsai3re8Vel47Xxjrv01ccCHyGAAQgAAEIXI4AB/LLDdlzHNbX3DRL/YlRySZfaXAkX2PVL5CV2w94Zd+k0wr9+dyak9vWk0valifaVhGwz4//8vNcdfYxW6NhrkXkL0TAtocF08M6Ftf9C4Xf7+rVczG2DvTHiyQEIAABCEAAAhsS0A3whjqPUaVUgkJoFI5xCSubE/Bv+oQ/a2Mv0IVKc0A/W17zp1+gkRKSA5p4k2pr/hxQTy7pAMiY6CWg5bu3w79y6v6ce/5/AXA1TWDZK9ZPm1GNHW4a8dkSNsSXDuFshNiHAAQgAAEIrCKg2+BVWs7orDt53cA3Cmc4iE0IDESAXNJAg4Er/qf1FtDQvsVt5AJ6dIEABCAAAQhAAAIQgMB6AjqTr1eFBghAYFgC5JKGHZqHOqZ3i+Z+EUnfL53b8aGgCRsCEIAABCAAAQhAAAI7ENC7PDvoRiUEIDAKAXJJo4wEfoiAHmX0f7FIGajFf85T1ilAAAIQgAAEIAABCEAAAhCAAAQg0CBALqkBh6ZzCOgNo9frp+fbavr7XCSSzhkwrEIAAhCAAAQgAAEIQAACEIDAkwiQS3rSaF8n1v73jLxkT+LpOgzwFAIQgAAEIAABCEAAAhCAAAQgMCIBckkjjgo+fb9f/7aRfetNX722gn99qfMNJsBCAAIQgAAEIAABCEAAAhCAAAQgsJIAuaSVAOm+LwH/2pF+RykU+LHtfccA7RCAAAQgAAEIQAACEIAABCAAAUeAXJKDQXFUAvYiUkghWeWoLuMXBCAAAQhAAAIQgAAEIAABCEDgngQekUv6fD76etTkMM4SntSGwLYE7DWl/r/vtq11tEEAAhCAAAQgAAEIQAACEIAABCDwiFyS/57U5JDPEp7UhsC2BMglbcsTbRCAAAQgAAEIQAACEIAABCAAgbkEyCVFYrfJJd0mED9C5JI8DcoQgAAEIAABCEAAAhCAAAQgAIHjCZBLisyvnoKx7+iFnxaKQV72mlzSZYcOxyEAAQhAAAIQgAAEIAABCEDgJgTIJcWBvHQu6ff3T8gi2WUM8rLX5JIuO3Q4DgEIQAACEIAABCAAAQhAAAI3IUAuKQ7kPXJJ9uvUyivFIC97TS7pskOH4xCAAAQgAAEIQAACEIAABCBwEwLkkuJAXjqX9H7//Xw+ColcklBQgAAEIAABCEAAAhCAAAQgAAEIjEbg9/fPaC71+EMuKVKazCXZDxK933/1v0/fRHXfr8R8IYtZjclIodn6/f2jmlrHYj25pCIWKiEAAQhAAAIQgAAEIAABCEAAAiMQeL1+Ft/yn+g/uaQIv51L8q3K1LxeP/adsqjr+/UyvtyWV6u6qCabaNSoe0PmWk3GfxmNa0WKtxCAAAQgAAEIQAACEIAABCBwewJKMlwrUnJJcbw0kK/XT2jzTUrTWKH43lDtl7CtS/FNNmuyr6p5E8uyJ9IQArnuJbmk644dnkMAAhCAAAQgAAEIQAACEIBAIPD5fJQiWHbjHxQec0kuKXL2CSPf5gfYZ47e77/FrJASSeE3jLx+r8dsKZekNNDv75+gwXvVLktJW+xCreSSLjRYuAoBCEAAAhCAAAQgAAEIQAACkwR0526FnCiY1HC8ALmkyNznenyb6nvGVcK1tKLmijfxTd+J67EVNPjLmhUvc60yuaRrjRfeQgACEIAABCAAAQhAAAIQgECbgBIIuoUf/xeUyCXFMfWj6NtU7ytrZZsBxfeVrIu0hWSTnzo15f310tbfZXBJ4xagDe4z7kEAAhCAAAQgAAEIQAACEIAABGoE9C0o3cIrpbDy/ZKaxfX15JIiQ2V5wu8lqb6RITJdmgeNlEdNRlNnkxkjbTHIMa4FQX7uVxgj4tle+L/9RxkCEIAABCAAAQhAAAIQgMAVCWxyezv7bupSHdr3wot/92Y/BuSSIlvljEIuySc+2u+bSUP7Q25zJeSbNIGiW4uut9W2yIWJTm1EudV+hcp+Qyq3Nmom/Nih2U+YfvW+l4aPAgQgAAEIQAACEIAABCAAgesSCLe9dn+knxj2cRUla/dTtbunmnyu18279yGkAnIvX1PT0B9ILYrg0uv1005EeK8OKJNLipD9VAhtvsnGtTg/slieBL7GW1G9r1xc3lbbYjc27Ghsi9g3tLKVqmX81YsCBCAAAQhAAAIQgAAEIACBGxAo3sEVb5yLko0btCKchnxoKvpwcC4p/25yMShVhhDOuiSXFMn7yRTbvt+cOs2pQa9B410rhI+KxLLpBTXbalvgwOZdjG2AtrmVrRTqPalZCtXLsqNuNAAAIABJREFU/kSgBpECBCAAAQhAAAIQgAAEIACBKxIo3sF9Ph9/72Plud+GyxqKtmp3ZEUfNtEwK5CeW7+ceagFdUw9uaTIWZmg2u8i2WwLH2A/UaShOK1Dpe/o85HRrUXXcnJR7xE7XSuXtJ5gbWkLs2jupSaGFeZ2Rx4CdyWgj8aCL9LelQlxQQACELgWgfzc91r+4y0EdiKgQ87r9bOTibbacNu7/kbpfhr8GPmynUsHBPiIXJL//uFkilHDNimpnJF9cVGzWfULxlvWpW1NYVttazzZqu/TcklbcQt6NEXvN0NCpFxCoIdAfkKwYPXuMYQMBCAAAQjsTcAf++2cw5K+N3P0D07g8/mEHOvgDj/TvXyDNtqvI+VxeUQuyb/vM5kh0t31pOT3+/XbleBqHvRoUC8ryHqoX3a5rbZlPmzbi1zSVjzDjlJ7C28rc+iBwLAEtGJrwZz1Dflh48IxCEAAAk8m4Jd0VvUnzwRiD2f+8A4EfMYhkEdqQTLh4HCekkvyY9NA3CnmNWivmqz0ArVyUVtNeLJ+W22T5g4QIJe0IWRNDyvw1G5Dtqi6BAH/MMB/HEitXmL4cBICEIBAg0BY4VnYG6xouiuB4tMy+4LbXUO+dFz+LDp+FslQPyWX5HeU2nbiZfrHT6Pu565yUjVbXtiXi9q8wKzyttpmmd5JmFzShmD9hLepQjppQ7yoGplA+9cN+9f/kWPENwhAAAIPJxBupFnbHz4fHhV+mPy6JbQCn4UBJ4OG7Fqj85Rckv+aWy0d6z9meYYVx7Ux6m1tpj/rVK/swIKabbUtcGDzLgY8c9vc0EMUaoZYAbAPGfeHhxmmfb7kg/DwGUL4EIDAbQiEFZ7l/TYjSyANAmHa58tGX5rOInDRm9wH5ZLyWxj6qXm9RtT4BqnJhD/uow9nfqHD6zS1MqdH4nlLk8JN5vG22jZxaaWSi37MVka9X/f8ocgzeT/raIbAwQTyb09qkfQFPgUHjwvmIAABCOxEQA99tcjvZAi1EBiBQJ7wmvm+MIKr+BAIvF4/Vzx/PiiXZAMWUjz+c9VIJIXXmkKv2sBPfp7zN+CkOUyvZZfbalvmw7a9yCVty/P7/YZPRJ6Tm1tEIQSOJ9CZRbI183j3sAgBCEAAAjsR4JyzE1jUjkMg/zla3QMWC+N4jiciUMsnSGDMwuNySfbH1/RmkH3A7G2jySG0F4t8l/xiUR5m66WdTG82Fc3p3aWsZ0HNttoWOLB5F3JJmyPNedKeWb2HG+iEwB4EwmpfPFSFyj3cQCcEIAABCJxCgFewT8GO0WMIzHpUpnvYY3zDyhMIPDGX9IRxvWuM5JJ2GlnlOm2bKSY6dzKNWgjsQWDB6Yoz1h4DgU4IQAACpxPIXxQ43SUcgMBKAovPOTwzXkme7p4AuSRPg/LoBMgl7TdCvJqxH1s0H0lgwYtIfvJzxjpysLAFAQhA4BgC4ZkZ3+g/BjtWNicw9+ts/oRjZc45mw/KkxWSS3ry6F8vdnJJ+40ZT+32Y4vmYwjkOZyPUJM1nLGOGSysQAACEDiYQFj/We0P5o+59QQ456xniIZtCZBL2pYn2vYlQC5pV74cs3bFi/KdCKx/RudnPncXOw0TaiEAAQicSyDch/Nq0rnDgfV+Atuec/rtIgmBSQLkkiYRITAQAXJJuw4Gv0+5K16Ub0vA/zEEnwxaWebHwrYdJrRBAAIQGIdASCe9Xj/j+IYnEPAELH8Uvpu58oRj3b0VyhBYSYBc0kqAdD+UgC2pPEraD3rYtEC9H2o0ryGQ7wc2OWBxX7FmUOgLAQhAYHwCnHPGHyM8/H6/nHOYBpcgQC7pEsOEk/8h4N+a4d2B/eZEOGbxlZ/9UKN5PYHNH9ytdwkNEIAABCAwLAF/mLSHEBwphx0sHLOk0so/KuIftnGqZ1JtS4Bc0rY80bYjAb8U8vrAfqA5Zu3HFs27Etgkr7SrhyiHAAQgAIHTCeRzzuku4QAEegis/3Z/jxVkINBPgFxSPyskTyPgd32988nXr/YbD0FW/m4/W2iGwB4EluWVWFX2GAt0QgACEBiNQHgFm8V/tAHCn0kCy845k2oRgMAsAuSSZuFC+BwCSm3Ym5m6PMebZ1hVFskKvBP7jGG/bZRhPtcumee3nQEEBgEIQOBfAmEjYP3/Fw9XVyIQJnPj8kpR4esVCJBLusIoPdtH/1KSfac91zyb0F7Rh61oLzPohcDOBPyKEWZ1uOReYuehQD0EIACBUQjwatIoI4EfqwmEw0zjcrUpFEDgHwLkkv7BwcWABLTZ+9s8vZrEa8n7DVm+A+f3Kfejjeb9CDQOVaHJLzL7+YNmCEAAAhAYgQBbwAijgA8rCehGKczn4uVKW3SHQCBALikA4XIsAsoZ5Xs8LZ2kk/YbM0G2DQnU+6FG8x4Ecj5US0rxjJXXmT28QicEIAABCAxCIJxz2AUGGRfc6CQw65zDMb6TKmL9BMgl9bNC8mgCWh+La59aX68f3pfZb2w4Zu3HFs17EyjO3lDpk0rcRew9IuiHAAQgMBQBf5i07YAj5VADhDMNArXZWzvncMhpwKRpGQFyScu40esIAloKG8Z0H9iQoWkNgdpGtUYnfSFwAAEtILZK+JR07e0kjlkHjAsmIAABCAxFIJ9zhnIPZyBQI1A75+QpbQchDjk1ktQvJkAuaTE6Ou5LQDd77QdEWi79jeK+nj1Pu8aCzN3zBv+qEWtl0KQNK0k4gXHMuupI4zcEIACB1QTCjsCRcjVRFOxOoH04z6eg1+uHXNLuo/I8A+SSnjfmF4lYd4CT/vZLTqpCoEZAkLnlriGifigCPTM2yHDMGmoEcQYCEIDAkQTCjsBd95HwsbWAQJixWUMQ4JCTEVGzngC5pPUM0bA9AS1/4VWCoiWl3nmOVOSzSWX76ccmJlACga0IaE1oryThQTTHrK34owcCEIDA5QiEHYEj5eVG8FEOh2N5LfUZZnVN7FHoCHZbAuSStuWJtg0IaOHr38jVhVVygwGoqAj7Vv/oVPRRDYG9CCiFZIXGsqClY1JyL1/RCwEIQAACYxDo3zvG8BcvHkqg/0AeHq01jkMPRUnYqwmQS1qNEAWbEvCr3izFOgGwUM7iNks43Hj3vDU2Sz/CEFhPIMzS9oLgFxzeS1oPHw0QgAAErksg7Aj8meDrDuWNPQ+JpNfrpx2sn9XtE1FbD60QKBIgl1TEQuVpBJQSmpun8Gvl3L6nRXtBw7Nu1C8YHy5fm0A4Y/Ucm3yXHvlrA8J7CEAAAhCoE/A7wuv1wyvYdVS0nEDA3+zYHVPPLY+O7hxyThizu5skl3T3Eb5UfCsXO50A2Pv3G/Zl29h+/qAZAiKgBcQOWP3rgDpyzBJMChCAAASeSSCcc9gXnjkNxoxax5W55xyTZzKPOayX9opc0qWH71bOa/Nes9IpnbRGya2w7hCMINvONPl67Q4uoBICkYAWEE3Lnod10sIxSygoQAACEHg4gXDHzpHy4fNhkPDXHL/tjMRMHmQo7+QGuaQ7jea1Y9Ed4MowttKz0o17dxdk7sDvPdAXim79nOT3ki403LgKAQhAYFcC6/eUXd1D+QMJrJyTlop6IDdC3pUAuaRd8aK8l4By7etT5no9Yb2qXu+fJ6fx0sb2PAZEPBABfeo1IWe9lGSRvN9/WTQGGlRcgQAEIHAegfBqUv+Xps9zGct3JhAO3gsmpJ2U7syI2M4gQC7pDOrY/JeA7gMXrIz/avrflU4AC+4niwqpzAQE2e7etxq7bIgaCEwSUArJCotTQqwYk6gRgAAEIPAQAlvtLA/BRZj7EdCNkubksuPKsl77xYXmGxAgl3SDQbx8CMpKbLjG2WpLgmPXyaEtzQobDt+ubqP8ZgS0gPCpv9nIEg4EIACBEwlsdQN/YgiYvgeBcN6+R1BEcQ8C5JLuMY4XjkLr4+JXCYrB6wSwrdqircdWCrIGkXTSYyfDWYGHt775JfizBgK7EIAABO5HIGwxPKG83xAPHhEn7cEHCPfIJTEHzifw+Xz2yPi8339Jbew9uhyz9iaM/gYBpl8DDk0QgAAEILCeAK++rmeIhsUEmH6L0dHxGALkko7hjBUI3JZAuJ/nxZDbjvRggfGwbrABwR0IQAACNyTAXnPDQb1ISBywLzJQj3aTXNKjh5/gIbAJAX3HzQp7vGW2iZ8ouRMBZt2dRpNYIAABCIxMIOw4I7uKb7chEGYdp+vbjOydAiGXdKfRJBYInEOAJyfncH+wVR4UP3jwCR0CEIDA0QTCV424qz96AJ5nLxyt+a2u502Ba0RMLuka44SXEBicQDhmsecNPl5Xdy88rOOX0a4+oPgPAQhAYHACYd8hnTT4eF3aPR6YXXr4HuU8uaRHDTfBQmBHAuGYxe39jqyfrZrE5bPHn+ghAAEInECA2/sToD/VZDhRk7h86kS4QNzkki4wSLgIgUsQ4Jh1iWG6upPhrW9+6/3qA4r/EIAABK5CIGxAvIJ9lYG7lp/hgRmJpGsN39O8JZf0tBEnXgjsSCDsfxyzdmT9SNXkKx857AQNAQhAYBQCnHNGGYmb+hHOORykbzrO9wmLXNJ9xpJIIDACAd7LHWEU7upDOMTzsO6uA01cEIAABMYkEG71X68fvtE/5khd1Ktwir5oFLj9HALkkp4z1kQKgYMIsBEeBPphZsKXC0gkPWz8CRcCEIDAEATCZsRXrYcYlVs4Ec7PnHNuMao3D4Jc0s0HmPAgcDyBcMxiLzx+CG5pMbyUxKPgW44yQUEAAhAYnACvJg0+QBd1Lxye+XbbRcfxaW6TS3raiBMvBI4gEG77SScdAf3WNsLDOhJJtx5tgoMABCAwOoGwK43uLv6NTYAE5djjg3dVAuSSqmhogAAE1hAIxyzSSWtgPrxvSE3ysO7h84HwIQABCJxOINz8szGdPiKXdoAz86WH78nOk0t68ugTOwR2JBCOWfw+5Y6sb606vPXNL1PcerQJDgIQgMBlCITtiWdmlxm5wRzlgdlgA4I7MwiQS5oBC1EIQGAWAXbHWbgQzgTISGYm1EAAAhCAwCAEOOcMMhDXdYNzznXHDs+/3y+5JKYBBCCwIwHe2t0R7gNUc0x/wCATIgQgAIGrEiARcNWRG8ZvzsnDDAWOLCFALmkJNfpAAAKdBMIb4HxBqZMbYt/vl8nDNIAABCAAgcEJsFUNPkAju8fkGXl08K2HALmkHkrIQAACywmEV0v4QYHlKB/WM8wcftn0YeNPuBCAAAQuQIBXky4wSEO6GBJJHHKGHCWcmiBALmkCEM0QgMBKAhyzVgJ8ZveQSCIF+cxpQNQQgAAExicQkgK8gj3+kJ3uIWfj04cABzYhQC5pE4wogQAEJgiEL4RPSNP8bALhXM7DumdPB6KHAAQgMDqB8PyDbWv0ATvbv3Aq5oHZ2QOC/YUEyCUtBEc3CEBgFgGewMzC9WThkEjiAe+TJwOxQwACELgKAbIDVxmp0/0k83j6EODAVgTIJW1FEj0QgMAEAfbOCUA0f7/kHJkFEIAABCBwUQLhnMPLJhcdx13d5pyzK16UH0yAXNLBwDEHgUcT4Kndo4e/I/hwEOdrAh3MEIEABCAAgSEIkCYYYhjGdiKchD+fz9j+4h0EWgTIJbXo0AYBCGxLgK8vbcvzZtqYHjcbUMKBAAQg8DQCbGRPG/FZ8TI9ZuFCeHwC5JLGHyM8hMCtCIQXT3gD/Fajuy4Y5sY6fvSGAAQgAIGTCfBq0skDMLB55sbAg4NrCwmQS1oIjm4QgMAyAmyly7jdvldIJPHtttuPOAFCAAIQuCWBfM65ZZgENZdAOOfwMHUuQOQHJEAuacBBwSUI3JwAr/jefIDnh5dP3vyCwHyK9IAABCAAgSEIhKwBT0eGGJVTnQhHXxJJp44GxjcjQC5pM5QoggAE+gmEPZVjVj+6W0qGn6K8ZYwEBQEIQAACzyEQ9jVyB88Z+hwph97MhJp7ECCXdI9xJAoIXI9AeGrHeyjXG8KNPN5vJugov5GnqIEABCAAAQh0EeB92y5MDxDadSbYOYdM5QPm0aAhkksadGBwCwJPIKBbfSs8IWRiDAR2fVinCRaMcgkBCEAAAhDYm8CuG9zezqN/KwI6ilhh20enppNc0laDhZ65BMglzSWGPAQgsBmBcMx6vX42U42iKxDYewLoAHcFGPgIAQhAAAJ3IxC2Oe757zbAU/GECbD5QZdc0tQI0L4vAXJJ+/JFOwQg0CYQvt/EDye1cd2sNYz+5odsckk3mzCEAwEIQOBaBML3mzjkXGv4VnobRv/1+tn2paTv90suaeUY0X0lAXJJKwHSHQIQWEXggI12lX903o1ASCTtccIml7Tb6KEYAhCAAAS6CORzTlc3hK5P4LBzzuaP4q7PnggOIkAu6SDQmIEABGoE9n4BuGaX+hMJ5LP15g/r9Lxu81fKT+SGaQhAAAIQuByBA3IKl2Nye4ePOdzyXtLtJ9LgAZJLGnyAcA8CjyDAMesRw+yC1BtDy45B7/dfP2fe77/FVJSsOMvfz+fzfv+1/309ZQhAAAIQgMBOBLQfLdv1dvIKtTsRWPnAzA4qmjO/v39qbx4VpxPnnJ2GFbWZALmkzIQaCEDgaAIrN92j3cXeOgI+DfR6/cz6dtvn8wnd/WEr+KUm1fuZVkw/SZICBCAAAQhAYCsCfvexvYk9aCu2A+oJB5VaJqjoeX6hSYeZPGesyev3My3LFy1SCYHFBMglLUZHRwhAYEsCfvOzrXFL7egahkAe6FlnHZsbv79/fC9/8PL1On4peh3vvJhaKUAAAhCAAAR2IqANSBvZToZQeyKBlYccnWdCekiTJ5xebC55YZOc9ZTuRFyYvjoBcklXH0H8h8B9COjOP2+N9wny8ZGEUZ7FQ2es3EtN/kQlWyYvmdydGghAAAIQgMDeBLQrcc7ZG/VZ+nXS0FjP8qQxMYpNoVLWZxlFGAKLCZBLWoyOjhCAwPYE9OAl7I7bW0LjGQRsWPWvz/v0uNOYFf5JoFTJ0Pf7n59JssvwTE/CFCAAAQhAAAK7EgiHHF4e2ZX28cp10tDxY9aRQ72Knmvy+FbrYqcpWZ9l1GujDIG5BMglzSWGPAQgsCMBbYTaUNkRd8R9rGodg2xw556hNTdqU0JzRmH5GivX+qoLBQhAAAIQgMB+BPTmyLKtcD/H0LyewJpzjg45tdORZo7302aR5ZI453gylI8hQC7pGM5YgQAEeglos7RNkT/o3gtubDkdkjSsc9M6mhi1QCWg151ky453tfNZTSH1EIAABCAAgc0JhIyD9qzNDaHwSAI6hOjsMcu6ujfmQ9ZsNZpRnHNmMUd4PQFySesZogECENiYgDZF7ZEbG0Dd4QR0ALJC46hUc03HrEkBKQ9G5/7NuJoh6iEAAQhAAAJrCITtSdvWGp30PZHAhg/MGpNB00aRqkYF0kmCQ+EAAuSSDoCMCQhAYB6B9VvyPHtI70xgk+TgmlzS57//2Ulr7vtQO7NBPQQgAAEIPI4A55ybDXk45zTyQbXAdchp9FXCSEqsxvJHmlScc8SHwt4EyCXtTRj9EIDAEgLaEfPGuUQdfc4jsNVQSk/tkJSnSqjRUa9xUDuPE5YhAAEIQOBBBLQl+XTAg+K/UahhKJedMXTIqb1YpGSTJ2eTRxblSe2k5PtShsB6AuSS1jNEAwQgsAsBJQLCTrmLMZTuRmDDcWzPBBlSKD01EqYAAQhAAAIQOJKANqn27nakS9haQCCM4wIN1kV6ihp6cknf75e5VKRH5U4EyCXtBBa1EIDAWgJ6RKPNlccsa5ke3l9HHw3iGhcaD9zUpKdzOlH5n2+XWO253xr36AsBCEAAAhDoJxC2SDamfnTjSOpcYeecNSdVzYc8E3Qk9occnXN8pfzxlePgwpObESCXdLMBJRwI3IqAtlXbofPmeqtobxeMjj5bDZ9X6I9rtZNTMYFVE74dfgKCAAQgAIHRCWhL2mqjHD3ge/m3+TFV88GfeHX48ZUG0qZNSBtJSai/F3uiGYIAuaQhhgEnIACBGoGwT/t3TGpdqB+EgE4zdtbx2Z/FHupEpTyRClm/mrw5ryF38ZKUIQABCEAAArsS8FvShnvlrj6j3AjsdEANZyedZHIiqfhe0vf79ZOKcw7TdVcC5JJ2xYtyCEBgAwJhWy3uphuYQcWmBHT6scK2D8fe77/2/+v1Y4Wi7xLLrY2mLEwNBCAAAQhAYD8CYcfczxCatyLg8zU2fBtmbT6fTzjk1JSbWG6Vhm1PX1vRQ89tCJBLus1QEggEbktg1w37ttRODYz036n4MQ4BCEAAAlciEM45PDMbf/DCOYeUzfhDhod7ECCXtAdVdEIAAhsTCMcsvum2Md9N1TFYm+JEGQQgAAEI3J8AuYkLjXEYLHJ/Fxo7XN2WALmkbXmiDQIQ2ItAeAOcR0B7gV6tl5FajRAFEIAABCDwOALsnlcZckbqKiOFn3sTIJe0N2H0QwAC2xDIb7vk74dvYwktKwjs9FOUKzyiKwQgAAEIQOACBMIGytsuY44ZLyWNOS54dQoBckmnYMcoBCCwhAD79xJqB/Yh33cgbExBAAIQgMDdCHDOGXxEOecMPkC4dzABckkHA8ccBCCwigDvFa/Ct3NnDsE7A0Y9BCAAAQjcmQCpisFHN5xCB/cW9yCwNwFySXsTRj8EILAxgZCw4JtuG/Ndqi68nM/voy8FST8IQAACEHguATbTMceeNN+Y44JX5xIgl3Quf6xDAAJLCPjnQvygwBKCW/cJZ18GZWvA6IMABCAAgacQCM/M2FJHGHh/8ny9fvgLMCMMCj6cToBc0ulDgAMQgMBsAjwdmo1szw55OPa0hm4IQAACEIDAnQnkXZVXsM8db7J75/LH+rAEyCUNOzQ4BgEItAjwgKhF59g2xuJY3liDAAQgAIH7Ewh76/0DHjjCMBa8lDTwWOHaoQTIJR2KG2MQgMBWBHhqtxXJlXrCt9v4maSVPOkOAQhAAAIQ+H6/bK+DTANeShpkIHBjQALkkgYcFFyCAAS6CLC7d2HaU4iM3p500Q0BCEAAAo8mwDnn9OHnnHP6EODAyATIJY08OvgGAQhMEOCt4wlAOzdzzN0ZMOohAAEIQOC5BEhknD724ZzJD1edPiI4MBQBcklDDQfOQAAC8whwzJrHa1NpXr/fFCfKIAABCEAAApEAW20kcuB1eGDGzyQdyB5T1yBALuka44SXEIBAjUA4ZvGnc2ugtq0ni7ctT7RBAAIQgAAEigRCRoNzTpHS5pXhjSQSSZsTRuENCJBLusEgEgIEnk6AdNLxMyCcsY53AIsQgAAEIACBhxAIey7ftNp73Mnf7U0Y/fcgQC7pHuNIFBB4OoFwzHo6jp3jD8k7HtbtzBv1EIAABCDwaAJh2+VPpu49G8KpknPO3sDRf1EC5JIuOnC4DQEI/EOAr1z9g2Pni3DG2tka6iEAAQhAAAJPJxB2XrIb+00IXkrajy2ab0aAXNLNBpRwIPBcAuz9B4w9ObsDIGMCAhCAAAQgkAmEcw7ppIxofQ3nnPUM0fAcAuSSnjPWl4n08/m833+X/X+ZIHF0HwJbPbXjlwhq4xMOsvwCaA0U9RCAAAQgAIFtCWyV5uCQ0xiXcJKEVYMVTRAgl8QcOIeATxiFu9OwiK+5/P39o5wUm8E5I32s1U2OWa/XD8/6iuMWfq+BRFKREpUQgAAEIACBnQiEjXjBDyfZSWkn966uNtyScM65+oDi/94EyCXtTRj9/yOg5NHc3JCSQbXCMoWklu46NcMxa+45wI4R5JLy9NgkT5fVUgMBCEAAAhCAQD+BlfkO695v7jmS4QC5IE/3HFZECgEjQC6JmbAvAUsh1dI9+703pNRV3hi8M7+/f0gq7TsDztC++Jil2UIuKY+b/+Dw6lbmQw0EIAABCEDgGAJhR+4/ytoBae5jtmOCOtdKeGAGonOHA+tXIUAu6SojdUk/dWce9ryzbtRH8+eSg3oFp/NAd3qtiXrWFO3083ixxUiPdxWLEIAABCAAgXsTWLwp2zmHQ06eHgEpiDIiaiCQCZBLykyo2YBAyO7bWwyDrMt6ZUmJg9frh+cPG4z6SCrCmaBnfH2XQebqOET9h4WXksYZFzyBAAQgAIFnEliwL+utbQ45Yc74EyA3BQEOlxBoECCX1IBD00ICfkUe/Etkn89HOyt3yAvHe9RufmRfr5/2G+Ah+8kxy49qIAkcD4cyBCAAAQhA4HgC4dwy65zDPu7Hay5J35cyBB5OgFzSwyfALuHrUclV9iqf/NqFCEpPIqCpaIWGF6RLanD8p4OHdTVK1EMAAhCAAAQOJtC/QYd0yVXO5wfwDGQmU3IHuIQJCFyIALmkCw3WZVzVDfxlPP5+r+jzhfCe5WrnESEkknhDTePVf05VFwoQgAAEIAABCBxDIGzTtSRROOfUxI7xeSgrgUzPTyIM5T/OQOBcAuSSzuV/T+vKywz+BTejH77mds8heXBU4ZiV/8JrzjeRS9JHQ59lK7S/J/jgWUboEIAABCAAgXMIhGxIzhOFrZxDjsZp8ogoSQoQgECRALmkIhYqVxEIm9bv75+8sa0ysFHn9/tv2IBzomEjU6g5k0AY5fDQKUxXuxxzxh4MMZCBycH8MQcBCEAAAhDoIdDYr8MRiEOOeOZHiTwwExwKEOgkQC6pExRiMwiELU2X49yLyqVcmBEnohch0HjulCeA1YwzV89i3IB2lkvYhQAEIAABCEAgE6ht2bmeQ47oZThqogABCHQSIJfUCQqxGQRso/p+v3mZtiZ7U+nI2/X3+6/9bw6Ef33TjDgRvQ6B8FzOXk0KlX5WHDk5x6ToafA+/JhjhFcQgAAEIAABI1DctWvnnPCC9gMZ8lLSAwedkPcgQC5pD6pP12n7mSh8Pp9aUsnvfEr3qND/rqmZUEefG/ImQvn9/isT8lBuU7gTgXyicnL4AAAgAElEQVRo0IiHWWGXD88lhdMnh847fRaIBQIQgAAE7kcgn3PCVh5OO/cjMCuiAGdWX4QhAAERIJckFBQ2I2DbVVGd0j1hSzvm0qwrf+Q9VGbBV1K+E4F8zGrMuifnkjKo4kfmTnODWCAAAQhAAAJXJxDyI41DzpN/HpRDztXnOf4PRYBc0lDDcRNnbPfqD0YJpuKPYbf3wtyqL9CZ2k43yCV1grq0mEY5T5tQ89hcUkDEG0mXnvA4DwEIQAACjyLQn056FBYfbEDEOcfDoQyBuQTIJc0lhvw0Abstn5YbSUK30CM5hS+bEej8oqUySs88W/CwbrMJhyIIQAACEIDAgQTsAaqOMZOFA10byJRO++IzkHO4AoELEiCXdMFBG95lW6CHd/MfB7W7/FPLxZUJWP4oPIDS6WGycOXQF/oemDz25ayF+OgGAQhAAAIQOJDA3PyR3+UPdHMUUzwwG2Uk8ONGBMgl3WgwhwnF9qph3OlyhFxSF6aLCPnT0uLyRWLdzE19BERsM9UoggAEIAABCEBgOwLaqRcXtvPlMpo451xmqHD0OgTIJV1nrK7jqW1s1/H3P55qg7mW23grAnO/xTZ5/JLmhxQCEF5Kesi4EyYEIAABCIxPQH+wOGzWay7Hj3pDD3kpaUOYqIKACJBLEgoKmxGwjW0zdYcoIpd0CObtjWjg1hynin2393VgjeGbgM/8uaiBxwfXIAABCEDgoQQ452wy8OGcwwOzTaiiBALkktbOAS3xrEpCSS5JKCgcQMB+LyCcEorpoVmVz/lE54d1B4waJiAAAQhAAAIQ6CGwyZ85zkegHtP3kAlHxOcc8O4xfEQxMoHjcknt38HV33H/fD4j88q+kUvKTMglZSbUHENgw/PWQ44aOZF0uUX4mKmFFQhAAAIQgMDpBHTfkXNDc2sest2Hcw5vXp8+h3HgTgSOyyX1r32/v38utLoprofcefbMfnJJPZSQ2Y9AO3Pdedh6yCeah3X7zUM0QwACEIAABPYg8Pl8wvbdebbxYg855/iQX6+fPYYDnRB4LIETckl6Bcm+maJ/w0d987Sxvgiz7dJJLil/eGwoc/3INRrHkZ3Et7kE1vwg9+ZL0FznD5DXtLfP7LZr4wH+YwICEIAABCDwZAJrkkq33/TDG0mv18+FXlZ48qwm9gsROCGX1F65fEapLTmXsjRvq1Y3Y9uqnRvdUPLkkoYaDpz5fr/6+M8q3B5doHH7eAkQAhCAAAQgcD8CuhkJ23r78vZ3LhnL/YaeiCBwLoHhckkhv77hMqf1dEOd/m/Jb6v23Gmx0rqhXqnk4O7abw62i7nDCGiItRRMFg7z7RRDIXxWsFNGAaMQgAAEIACBTQjMPefc+/1rXkraZFKhBAJtAsPlksxd/x3grV5H1I3TtrdMWri3VdsetsFbDfXgTgb3NI6hnsubEQjZai0LxcLNYvfh+DX29fq594HSB04ZAhCAAAQgcGMCs/4IyY05hHMOt2k3Hut7hLZVxuNgGoPmksJ3UtpQOtHrXrF/NenRrBxEv9pGOD0WG90HaSKXNMhA4EaNQGdGaZMPdc2HE+vzw7oTncE0BCAAAQhAAALbEsgbve6DfGFbo+NoC4kkHpiNMzR4UiNw0Se74+aSlKPJv5Rmv6Ltl0IrF/8AnNeTu7xeP/52sZbLf7//1rI80i89qpG5omM2k2q/DWy/UF6bbd/vt3gz3DBUC60WV8P0ZJMFPik2lIBGbSivcGZXArVPnz65+lDv6sbByvP5co9F4OCgMAcBCEAAAhCAQCCgw60ONqHAOScQ4xICZxGwT2vjXv4sx9p2x80l+VeT/Eo3d1nsl++X9EzVS38nLizTuiwmxdVaK3hbKsto7lW8LQzp+dCr6JhsLSiY/gUdT+wipCf6gOlTCBTTsjaHN/9onBJgMBpWg1vGGELmEgIQgAAEIPBYArXHyeGB+m34hNscfxd5mxgJ5H4E/LPexlssowV+vVySgc5JO+UCwntM9uqBb7VXfiz144fKNIcVJ9xn5kyNNOsOzfumVlvXgvLv9/v7+8fL2/zwvfKdnqZa6GhbRZ5hRcfsV8PVlOPKevpryCX1s0JyEAL6WIUjyCDubeWGX1uu+DndigN6IAABCEAAAo8ikA8AF/1OTXvUdGtTu/Nqd6cVAicSCPcgOQlwom8109fIJb1eP7UAfL1WyZyyqb3l5Ls3yhrarFlGG2uWuncG4v88XO4ii9mZHIKEsx4Tlm+57+Ia07m4+ykdBeoU6xgdhIA+DioM4thWbiguK/SsIVuZRg8EIAABCEAAAucSCMeA2t3BuU6use4D5JCzhiR9jyegu1E/jY93Y5bFW+WS9GZBMY2nUVmwsmhos2Y1mf4ifTkW3pkqCltlo4ssNrqrSen5WtQS2PDVpAYKOTZaYRbV0ZzHnw0J6BNh03jDz8WGTi5TpUmuxXCZHnpBAAIQgAAEIHBFAuH7FnfKJflbp/sd4a442fB5LoE8h20m1+7i5+rfQ/5WuST/8lGGpdunZeOh7kGzvz0LTf5SYv3WZTF0kaqeu9zJKShtwYp3fm7ZjM7tda68OJzrBtYHIaCMUvhKrL4be8WClpRbvta+Zuboq9BXHNbs8xoU9IUABCAgAjdYGxULBU9Ah147D+R95Fo1Fpo/5Nz1p6D8IFK+JYEwjf2l/2WecWK/Ri4pvw3kCfqtTsS9gJXV1J806dGs5bit1icas2++Rst3zWFZnHzLSZLtrJMZavvvPZwsm8JJsaEExGorr/zk6dfpe2kmzF07fEeV23MgeKheoRDEGpe1QBpdQlMwrcsg1rhc6YP/zOrDeJuC8WzQC00rYdqfntQg+kIw1Lis+dA/t2sa/HOIGwxxg6GaGigk0y7sp2GTAW0771v9bFS53wf7Tro6qrBew6xNeb/h8Kza5ZoP/ShqGtp2Q6uGwBf6fWBAPU8dja67MNpW7ieDlddPiUE+ocsC0QOz646s99zG1Ne07xzzfLAaP/nb5fWLVU3DsgH1EfVrqPkwa2570yr3+7DJklsLpD2IvnU/Df0ozIeez+asAfJh7lG+Ri6piKy9w2VYWmKK2iRvAynhXJCkFeRGW62/Vwkawq8jZYtZc5hntVyDfMs6c0172c0+N2pMeUNgwCax2tA3QZ6lU718Ic+Bhk7fUeX1Gma9CC2ecsAKDbdD03oN/kPn3QiG2pe+4/3K7dh96/rhWK+hNqDr53ZYUa8+0H7gauX1w7Few34DWou6WF8MZNakWq+hNuWKDhcriz4cvGgzoBqaewzo7R+oaLwmCyMP6KzFqhbIDertVkgr4eQNfDHkyZkgARkKeiQwWahpWD+g6zWs3ztm+VBEMUtDbfeZHAUJFH1Yz2Hu+3FhOjUuN7xtF4RlhUvmkvJ4Kw8q6BmHmhqzM99RTGqWMw215owc8L7lrVrfqZF8UXN2NfxZt8kUlfRboWjFu9pfNoX98iNIahxHcAYfxiGgiRE+Lxe9tGVhHLyne3Kz8b3i2nv6HMABCEAgEJh8qnrFHXDDU27AdcXLm+19fgg+//3P11CGwIUI5Bv8sN6OtpSNm0vyy5yfAR5xpincvouV1ZR7mcAyzfKzplaeyAHV+ERSfrdI8jXNxc3eZ+K9b0qK1Qq+ozxcVjDPl/U9q5dYneUAdiEAgSMJ+N8fra2xR/qzxpbfvPgxrDUk6QsBCOg4dIPFJKyNV1/qmZwQgMDtCej2PxTs/n3A8MfNJXmCAud3uOKWoF7qooKaih29ZnXxBXX3lf7dn6JaL5w1qKbYt93qNXvnvSrVe+EDyub5AYY2NHEWqw1DQBUEINBPQAvs3DeQ+00cJqnlS0EdZhpDEIDAnQiExcQfKS8aplbFKx5NL8octyEAgWUEwgqs5WuZtmN6DZpLCi/siIVHrEpfaEBXU3FrlOZiq/8epjfXn0tSRP77jXIp6LRLtdZc8r38sxfVTwYlyW0L5vm2OvfWJlZ7G0I/BCBwIgH/OpLW2A3fyjwrNL8F3OBtgrMwYhcCjyVQXBt7zp+DE2NtHHyAcA8CEBAB3Y3qgJp/wUbCgxQGzSWJYPjVK20Jte1NHTNfNRX7SnPuaDXqHgQ06j5JFGSKKSdll4r++OxVTSBYyR7KRNu3oGf9pXmyXs+RGjSORxrFFgQgcCQBfcy1Wl5xsSoS02qv0G6QICtGSiUEILA5gRuvjf44bctj56F6c8gohAAEINAmoCOcPRS8xEFuuFySfzCSMyBCnJvsb05LIA+Vmop91VocNr/LBs2+qbY/+VO+uqtj0R/fpaZWqqygEHy9KjuV+L6Ly2Z0cfdTOmo4TrGOUQhAYFcC+oBrSfSFXU0fqVwPRa64CB8JClsQgIAdm8Oi4RfG8DT3usT8idoCLB71rxsgnkMAAjcgoJOq/Rmuq0Q0UC5JBG2hL2ZYvEzYCcJWkQfA9220Zrthow19vdriNwve77/SEJRrz27HEtJAQdj8UfjBhOqLvimWok61zi1YXHN7nSuvcTzXDaxDAALbEvArsJZcXwgL7LbWD9bmF3yLcdu1/eBwMAcBCOxHQMcevx76cjhP7ufJAZp1DrcA7xTaAfQwAQEIHEDAlqnLHUpPyCXZOq6/Jub3LZVrq3w4KEuJdkTtFnnIJeMd0FOXmmYpVCFollqvQY4pomIqRzrtx19DL2kOs8p6Wc4ydHm9fvKdg7dibqiX7rKCiRDj3EuLem6vc+VF+1w3sA4BCGxFQB9qvw7n8rar31bOL9aTo16sio4QgMAtCeRVIi+MN/ijBGHsQow3W/lDsFxCAAKXI1C8ix8/itNySWFN1+X7/TdnQzxHn7JRLyt8Ph9tkL6Lymr1HdVa02yJLfWVvBV8vVIzXr+Va9mxkOhRR4Ngl2HDk0wu1NDJydzFamruhWA7L01np/AgYkI0iD+4AQEILCagj3NtxfP1YYFdbHScjmFb2XZ5HydMPIEABGYR8D8i4dfAWvlma2M+5NfOzLOoIgwBCEDgyQQGyiXNGoa881l33ULUtElAGrxkbtVWqiYv739UW/XSrIKUSMYXJKaCWq0md5ekL6hXraAQfK89Hj2Z/pobY9YLzpju4RUEINBJIKxvk5edai8kptVMsV/IeVyFAAT2IJCXBa0PtcIebpyu0webT9enu4cDEIAABK5F4Lhc0uZc7C2kZU8V7EteNZesdZlm6ZylxGKZu6vpq2oy2lOQrbnmepSbjG3V/fIjSOqYNYIz+AABCMwl0Hgt1N885PJcQ5eQ59WkSwwTTkLgAAJzX0fSInmAb8ebCGvjfifh40PDIgQgAIHjCVw4l3Q8LCx2EiCX1AkKMQhAYD0BJYJ1CzSrsN6BATXwbY4BBwWXIHAkAf+zD7OWRAkf6e2RthSgFUgnHQkfWxCAwM0IkEu62YAOEY5tz0O40u2Ebke7eyAIAQicSUCf2XBjMOvyxr8lRDrpzNmJbQicR2DxS5ph8Twvgn0tszbuyxftEIDAkwiQS3rSaB8VK7mko0hjBwKPI7DVbZItU/d+Ih3SbTdOnD3uY0DAEPiXgL2FFL7AFXJDsy7/VX+3qwCKtfFuA0w8EIDAUQTIJR1F+kl2yCU9abSJFQK7E9j8Nkn3VPfOJfm/DmEh3z7e3eciBiAwEoH1X2TTYhgKI0W5iy8hXtbGXSijFAIQuDsBckl3H+Ez4rMd+gzLy23qAf5yFfSEAAR2I2B/aiCc/tdfPuH+ITyBf0LIu01DFENgOALbvqqpRXW4OLd2iG+6bU0UfRCAwBMJkEt64qjvHTO5pL0Jox8CTyagu531hSdgVKJcuJ4QNTFC4IEE9BlfX3gCPdbGJ4wyMUIAArsSIJe0K96HKrdDzLWC15HiWm7jLQQeS8DeVAov3cy9g3oIvUCJHwd5yLgT5jMJrH+L8yFvL/Jq0jM/IEQNAQhsSIBc0oYwUfU/AuSSmAoQgMCRBBbfOx3p5Lm2Qpbt8/mc6w/WIQCBAwgs+0Glh+SSjH9YGw8YFExAAAIQuA0Bckm3GcqBAiGXNNBg4AoEHkYgP2oOtwr+8jlsMhbSSc8ZfSKFQP4lfr8ShvKjckmsjXw6IAABCCwmQC5pMTo6VgnYoaTaPGQD33EbclhwCgKzCeQbg3Cb5C9na79yB77pduXRw3cIrCUQVgC/Eobyo3JJ3+83kOFbwGunGv0hAIHHECCX9JihPjBQO5QcaHADU+SSNoCICggMQCDcFDUuH3jDEGg87Y5xgOmJCxA4h8CsJPsDV4aQTnoggXPmJVYhAIGLEyCXdPEBHNJ9cklDDgtOQeD+BHKuJNT4ywfeLShpLg73nxNECAEIfL/6yFshLwVegLXx9fph1kAAAhCAwCQBckmTiBCYTcBOJLO7ndpB56pTvcA4BCCwnIA+xbopMl26DIUH3i99S7eUy4nTEwIQuAKB4trYeFPpmT+mFl5NeuCLq1eYy/gIAQiMRYBc0ljjcQ9vyCXdYxyJAgIXIpDvi3Q7lJtsjXpmLin/OMhjOVxoeuMqBBYTyAug1saQPVG2fbGtS3dsgLp0XDgPAQhAYD8C5JL2Y/tczeSSnjv2RA6BkwiEm6KQH8mP5V+vnyBzkuPnmNVNoxV0b3mON1iFAAR2I9BeG8NScMXz24bk8k6xoXJUQQACELgfAXJJ9xvT8yO64llEB4jz8eEBBCAwk0C4WSp+NyHIPDyXxBP4mVMMcQhckoDONnYwywn0vBQ8/KeCArHibnLJqYDTEIAABHYgQC5pB6iPV6nHXBciofvMC/mMqxCAwPf7zfdCxbdssli+rXoUTy16tmJzy/So0SfYJxDoT4vo2GaFJ8BpxBjWxuKG0uhOEwQgAIHnECCX9JyxPi5SbcO/v3/G34M/n493+DhMWIIABLYgEO6CGhmikE5qSG7h1wV09KO7QDC4CAEIOAJhuWu/bRSEnZqHFnUsJLn20BlA2BCAQB8Bckl9nJCaQyA8Chv5hu1Crs4ZAWQh8BQC4SPcvl8Kf8Vs5KXpmPGbS+8Yr7ACAQisJzA3U+zl11u/ugbWxquPIP5DAALHECCXdAznx1nJ2/D7/Xecd5Te77/Bw9/fP9xYPm6aEvD1Cfj7n8lEUvhCHB/5kFx7+G9IXf/TQAQQ+B+BcMKZuzbCMf+9S74FzKyAAAQgkAmQS8pMqNmMQD7N2I2fpXKOvJH7fD45f6S70CM92QwuiiDwbALhSxmv109ntlpfXuCDH5JrtiR2Ynz27CN6CIxLYP3aOG5sB3q2GOOBPmIKAhCAwMkEyCWdPABPMG95HCVuagUlmFSYBUe9VNAdY8Mid02zICMMgXEIhM/1rMSQ9Z3VZZzA9/AkwNzDBDohAIFjCITDz6wXaqwvRyMbqfxA9JgRxAoEIACBqxAgl3SVkbqJn0r0hFuXYy7NOoekm0wmwngwgTU3S4bt9/fPrFuse8MOT+Ahc+/hJrobEwjpj7mfZVsKyLNrhqzfa6SKAgQgAIH7ESCXdL8xvVhEyi5ZIWzby3JMXieZo4tNCNyFwBSBkPjo/3ZbUNzzGyKhy40vw9rLzeSNx5rQ7kpgk7XRTlB3RTQ3rk2QzjWKPAQgAIGrECCXdJWRwk8IQAACEPgPgZBiJuux1bQA7FYk0QOBUwiEj/ApPtzPKOmk+40pEUEAAlsRIJe0FUn0QAACEIDA7gTCNzh4t2hD4rDdECaqIHAwgZBIIsm+IX/YbggTVRCAwJ0IkEu602gSCwQgAIGbEwhner7Euu148023bXmiDQLHECARvDdn1sa9CaMfAhC4IgFySVccNXyGAAQg8EQCnOb3HnW+zbE3YfRDYHMCfGw3R5oVAjkzoQYCEIAAuSTmAAQgAAEIXIBAePDONzh2GrPAmW8R7sQZtRDYikBIss/9221buXF7PayNtx9iAoQABOYSIJc0lxjyEIAABCBwNIFwiOdmadcB4NZ0V7woh8CGBFgbN4Q5qYq1cRIRAhCAwKMIkEt61HATLAQgAIHrEeDLBQePGcAPBo45CCwjwEd1Gbc1vfjNvjX06AsBCNyMALmkmw0o4UAAAhC4G4FwdufbbccMcMB+jFGsQAAC/QTCh5S1sR/dYknyd4vR0RECELgfAXJJ9xtTIoIABCBwHwLhGxz8fM9hQwv5w1BjCAILCPAJXQBtky6k8DbBiBIIQOAGBMgl3WAQCQECEIDAbQmEU/vn87ltqOMFFn4chLcexhsiPHougbA2PhfE4ZHzatLhyDEIAQgMSoBc0qADg1sQgAAEIBByGfzk9sFTglumg4FjDgKdBMLaSJK9k9tWYuGlMPamrcCiBwIQuBYBcknXGi+8hQAEIPAUAuGwzrfbThl4RuEU7BiFQINA+FSSyGiw2q8pjAKvbe6HGs0QgMCwBMglDTs0OAYBCEDguQR4I2acsQ9vQHDjOs7Q4MkDCYQUBp/HE+dAWBtJJ504FpiGAAROIUAu6RTsGIUABCAAgRYBzugtOse2kdc7ljfWIFAlwIexiuakhvCrVXzZ8KRxwCwEIHAOAXJJ53DHKgQgAAEI1AiE0zkPe2ugDqsPr0LwfcPDyGMIAp4Aa6OnMUKZ7N4Io4APEIDAWQTIJZ1FHrsQgAAEIFAgQNqiAGWAKm5iBxgEXHg0AdbGMYeftXHMccErCEDgAALkkg6AjAkIQAACEOgiwDPeLkwnCYUvHu7qxfv99/Rvi3w+n/f7b3gtTpWnu7cr/5pyA/LM2GtMDqsnZ3EY6lmG2LZm4UIYAhC4EwFySXcaTWKBAAQgcG0CIVvBz8oONZzhlmm/0bFp4BMWZlo1ekGjwadHptH9+/0WNagy5JjaqkKrJQXWaAgKD7tU+IdZxJARYG0ceSYcOTpKZ48MBN8gAIGHECCX9JCBJkwIQAACoxPQbaoev4/u8fP8O2CMLG0U8ix2qybeckM1udAjk3v5mqIGVQYPfcd2WRraYr5VSTRfeVbZ/N8vk3hWXCPbDWnc1+tnqCkxMrrDfNO2tV+mWEuHbI3w/uZhhDEEAQgMSIBc0oCDgksQgAAEHkeAm6WrDPneT+DtNinQeL1+fPJC91RBzF/2yHj5XC5qUOXiXJIF6MPJplWz332pTCwo2BwgnbEA3YIumnKzZs4CQ3RZQ2DvLUwL7+/vn/f7ry5JLK4ZNfpCAAIrCZBLWgmQ7hCAAAQgsAEBfzIOiYMNtKNiOwK73jLZbXNI0+RK3V03wuqRaXTf7ztulhHoTMSMmUuyORCGqQ2T1mUEdv24LXOJXg0C9oHVvw3JWU1azfy6obnRmZieZRFhCEAAAj0EyCX1UEIGAhCAAAR2JKCD8ph3zjtGfk3VYbxer5+t4ii+8GKzwt9EyYGG3R6ZRvedcklzvRr2E2GOtQHSup6Acda/5O/WI91Vg/I7GjK/cC02bdry6Gs92cTKYvfoCAEIPJYAuaTHDj2BQwACEBiFgI7dVhjFLfyoEwhDlm9y6l1bLcUJkCt1B9XQ1SOjKIp6ihpU2Qi5oda6N/oGT0xVj7xpDt2XXSrGRvcNzTWsPLxJA9GYUQ9HNGD4Gqz+D287Ck2DothWVorKqYQABCDQJkAuqc2HVghAAAIQ2JdA+HYbz1f3xb2R9v0ev4fvaxTvo4qVIbKGzOfzCbOu+LXKogZV/v/2zgbJdVVXowPpyqw6w+oMK9Pyq3t163vaEmD8Ewfb69SpXVgIIS0wAcVxF/M72ezj8eM17eA3O8nVSziXemtWNU2TD0cQGidM2ZSyCsV+i96apg9NRijsRUAj1RjNvfrCzl4Edl8b7V4LC6O8tTWHO1FAKEAAAkcSIJd0JG36ggAEIACBfwiEs2ttu/xPGy7GIBDyJtvHrj89oWnTIFHT0UnPXmH7ev1JM4Qgue9FwnB48zTMpjSLiSpvM5f1Z78tieBdVWbHqqZp8l3LVCP7YFXhl4nCYukqj6X4cl+LLkBQ7xS2E/DDumIKbXcAC6sJ7Dt2jXu59lPc1Z7TEAIQgMAiAuSSFuFCGQIQgAAEdiPgD9s6GO9mHUOfJ6CsRPu00+lIf3pCM0dZm1zQcS70bq4qI6PaHIJ6kY4/ufk0ihIxIRtlDw1ly95gu9xoa1X2b0846kgNJZmmyYTZ/6KyNbQqb4TyXgQ0oxr89+oLO58goPXHRtAvF0u7a1soLlNLu0AfAhCAwDoC5JLWcaMVBCAAAQhsIpAPS/k8vKkDGh9CYMcj04pckk7ajYLHYF3kjImSRL6qeEiT0B8O1bvvS2UhkqS/0DhGqlPviSz3NJSygireg2YqV5lcRijsRYC1cS+SX7Sz4yA27mUtXOExwy8GTtcQgMCtCJBLutVwEywEIACBUQjogG0bZX+GH8VF/OggsOORyTIaxcxIcES5j/w4kiSaYL5towsFIn31Iok/uclPNZTE6/smQd5z2ThGWlXtDLmoYTFSuWckc3TWhdQo7EVAU7cxiHv1hZ3PEdBt1b5VZx1oTwP1MmsHBQhAAAK7EyCXtDtSDEIAAhCAwAwBbX9tl0wiaYbX2NVKpuxyZMrPv+ToNX9ylSRFHXnYKLQtyKxyK5KoYS5Yd2qSFWqSRkOFUGy7qKFMNQrZeVMu9o5wNQFNp8YIrjZOw4MJhNFc90nXngnq4uDQ6A4CEIDANE3kkpgGEIAABCBwNIFwZM3H1KMdor9tBHYZUDsU9UyGnuNTUSf4WbwUiaIFCeWnJGqYC9aRmmSFmqTRUM4X2y5qKFONQnbelIu9I1xNIAzBajs0HITA9gE1C/kGtAB71p9BUOAGBCBwPQLkkq43pkQEAQhAYGgC4Rcc676qHTrC+zmXH03qebwocLJDUe3I5JV7jk9FHTuV+T+Lpt/EqaCOihYklJ+SqGEutE+DWV+SRkOr2uU3bjIlCLmQB9RayVUK2wloIKygObbdMha+RSCsjSs+79qTwdafFWa/BYR+IQCBKxEgl3Sl0SQWCEAAAqMTCBvr4p8bH9QpoMUAACAASURBVD0G/CsR2J4itENRz/m5J31T1GmfykJYRQsSyk9JQnNdas7ndIx0aoWGw1a1by6p5kZRzh+qL2JZLdx+B63umoYfJRBGVktHZ6e2wtSyRY0lotM+ahCAAARWEyCXtBodDSEAAQhAYDEBHYCtsLg9DQYmEAZ33ZGpp9Vs+qb2xuv2qSygLfYiofdTgQcLdqkmxdq20Cz7vqTf7nRRQ3nYn+2yJkXH5CGFfgJKOLaHtd8gmkMR2JJO0twoRmQTpv/OLRpBCAEIQGAdAXJJ67jRCgIQgAAElhHQhliHJba/ywgOr71xiNV8NlDlPhqaRR110TP3ihYk9GkUHRTzswPq0esr1RWEOZxFKSHfXC554TRNkvsHmuRk9j8016VxmPVf+hQaBMSftbFB6dRVG4e4ODFks/+2PTVDnIcABAYkQC5pwEHBJQhAAAIXJOAPsfw65oID/N+QlGqxw8/SQ461moWjXhqaNR3NQ3slkCy83++QGSlakNAr61AXJraUMweLdDal5b21DJQc1vFSEl/wXVsvr9efWZNNry+hvUzKV71ef9nPzpHydijXCAi+Uc2zpdYQ+YkI6JZs37nFiLTCPJ+/djO+329Nm3x7Fo0ghAAEILA7AXJJuyPFIAQgAAEIRAJhG81hKQK60LWOPSuOTDZPfJqmCEbTqVhrwoaOzmDyUAV/KitakDA4maOWzTzbZaThv1Vls2oi+5KEQjFMS5lZ26Avr2RZhRCCeRWEwRqXnQQy9s6GqJ2OQLglF91BeZ7Y7emXrNMBwWEIQODsBMglnX0E8R8CEIDACQjoUGqFcA4/QQC4uITA6uG289Ls9NCxquFUW0e13tXQr3R8LxIGZdNRrcw21IpVvq+iTSmoC0lyQTpWsB7lZNafpik0scugaRY6/Q9tuQwEAnCoBj5XutStp0FfGp0aFm/MpdbQhwAEILCRALmkjQBpDgEIQAACMwS2fBk7Y5rqIQnkp2n6vzw/+Iz0/u9/u1NsZwTsjmjrBJcWKYe2/fDVsI3F/JcyhdUEticXVndNw68Q2OXTcMUd/ZVg6RQCELg8AXJJlx9iAoQABCDwTQJb0grf9Ju+txFYfWSyCbMldbLN8SNaH5wv2zckHkrai2dIJC36xdNePmDnYAJ8IB4MnO4gAIGPEiCX9FG8GIcABCBwdwLhmfxr5wjuPtj/xr966C0PddXv3k+di1H649+h5moxAZHUbbLYBA1OSyCk2vlYPO1I4jgE7k6AXNLdZwDxQwACEPgcAXbMn2M7vuUt38AX/3bY+CH3eHjqc6P98burpvl6hm8XnS23xi4OYOS7BJgA3+VP7xCAwF4EyCXtRRI7EIAABCDwD4GwXeYXHP/QucdFSCYyB+4x7EQ5Q4D7YgbQDap5MO0Gg0yIELg+AXJJ1x9jIoQABCBwPIGwUSaJcPwQDNIjM2GQgcCNQQiEO+Lx+BnEMdw4mAApxYOB0x0EILA7AXJJuyPFIAQgAAEIxL8sfurf9TCcGwnojTBW2GiN5hA4NYFwO7A2nno0tzhPVnELPdpCAAIjECCXNMIo4AMEIACBSxHg69ZLDefmYPi142aEGLgIgZA+4IHNi4zr2jD4rFxLjnYQgMAQBMglDTEMOAEBCEDgMgRC4uDx+OFNvZcZ3NWBhCMTz2KsJknD8xJgbTzv2H3O8/CcGh+Xn0ONZQhAYHcC5JJ2R4pBCEAAArcmEHbGZA1uPRtc8EwMB4PiHQmEW+COCIg5ESDDmJAggAAETkOAXNJphgpHIQABCIxPIDx+wi84xh+ywzzkyHQYajoajQCTf7QRGcoffvk41HDgDAQg0E+AXFI/KzQhAAEIQKBFIJ+XWtrU3Y8AR6b7jTkR/4cASXbmQZtAWBt5nreNi1oIQGAQAuSSBhkI3IAABCBwbgI5kcR7H849op/xnkP1Z7hidVwCIU3wePyM6yuefY9AWBtJJ31vKOgZAhDoJUAuqZcUehCAAAQg0CDAeakBhyoRYJ4IBYWbEAivSSJHcJNxXxoma+NSYuhDAAJfJ0Au6etDgAMQgAAETk8gbIJ5TdLpR/STAYSv35ktn4SN7S8TYG388gCcqnvWxlMNF85CAAITuSQmAQQgAAEIbCLAr9s24btfYybM/cb8phEz1W868BvCDk+x8VPxDSxpCgEIfJwAuaSPI6YDCEAAAtcmEPa+/ILj2sO9V3Rh2uxlFjsQGIdAmOSsjeMMzbCekH8cdmhwDAIQyATIJWUmSCAAAQhAoJcAz+T3kkLvXwIcmf7lwdXVCIS1kUTS1Qb4Y/GEmcOvgD9GGsMQgMBWAuSSthKkPQQgAIHbEsjpgNuiIPAVBHiVzApoNDkFgbA2kg44xaiN4yRPtI0zFngCAQg0CJBLasChCgIQgAAEqgTCYenx+OHNDlVYVFQI8A18BQzicxMIuYBzB4P3hxPg4/Vw5HQIAQisIUAuaQ012kAAAhCAQHio5PH4gQkElhJgFi0lhv74BEIiiV+3jT9kA3rILBpwUHAJAhAIBMglBSBcQgACEIDAPAG+NZ1nhEYfAR5N6uOE1jkIMJ/PMU5n8DLMJZKSZxg0fITAvQiQS7rXeBMtBCAAgV0IsMfdBSNGpmkiL8k0uAwBJvNlhnKQQMLTSfyQfJBxwQ0IQMAIkEtiJkAAAhCAwDIC4XdJfFm6DB/aiUCYUfxeMhFCcA4C4eTP2niOYRvYS7KTAw8OrkEAAhO5JCYBBCAAAQgsIBCO/fx9ogXsUK0TYF7V2VBzDgLhaU3WxnMM2/BeMq+GHyIchMB9CZBLuu/YEzkEIACBpQTCgZ/nR5YCRL9BIMwunulosKJqNAI8PzLaiFzJH553u9JoEgsErkSAXNKVRpNYIAABCHyQAIelD8LF9H8JhG/gSScxL85CIJz2ea/NWQbuFH7y4XuKYcJJCNyQALmkGw46IUMAAhBYQyA8NsJDSWsg0qZJgDnWxEPloASYt4MOzIXcCslK8uwXGltCgcCJCZBLOvHg4ToEIACBwwjwvehhqG/eUXg0iZfO3Hw+jB9+SCQxY8cfsjN6yEfwGUcNnyFweQLkki4/xAQIAQhAYAcCnPB3gIiJDgIcmTogoTIKAabrKCNxDz/C00n3CJooIQCBcQmQSxp3bPCsh8D7/X69/vz/Pa3QgQAEFhHgi/dFuFDeSCCfzzcapDkEPkQgnO355dGHOGPWCOS1kTdzMTcgAIEvEiCX9EX4dL2ewOv1F56S8Pu55/OX/dx6uLSEwL8E2Lz+y4OrIwiEFZ7fDR0BnT4WEmCWLgSG+g4EmHU7QMQEBCCwEwFySTuBxMxRBPKx9vH4CZ+slld6Pn/5uuaoYaGfKxPwiVret33lkR4stjDx+IZgsPG5uzt5N8KW4+5z4qj4WRuPIk0/EIDADAFySTOAqB6KgN+61R4+er/fPrXE3m6oEcSZcxHwd5xtXrmhzjWCp/aW6Xfq4bu88+E8z9p4+REfJ0DWxnHGAk8gcHMC5JJuPgFOFr62brNfUPvXu5wsSNyFwDAE/H1kd98wruHILQhozbfC7Mp/CygEOQAB1sYBBuHWLoQZyNp469lA8BD4HgFySd9jT88LCehpo84XZ0j/8fjhC8OFsFGHwMQ3n0yCEQj4lfzx+FlxZLI/0TBCLPhwDQKsjdcYx1NHscsktAf5T80B5yEAge8SIJf0Xf703ktA304vOkjoENKZfur1Bj0I3ICAbh+7+7iJbjDmI4a4/ci0LgM1Igt8GoNAWBsXbUvGiAAvrkAgPJq04m2GrI1XmAfEAIGvEiCX9FX8dN5HQJ+XK06z2vPxaFIfbLQg8B8CuulIJDEhvk4gp5P6XbKPAE77/cTQbBMIayNTq42L2o8SCLOxf5OsRZUJ/NEBwjgELk+AXNLlh/gKAeqhpBX5IH1e9n/EXgEZMUBgAwHdNVtuvQ390xQCkYC+FViU3NRBi/NSBMr1KgKaUYvm4aquaASBLgJhbezcJ6sVa2MXZZQgAIEKAXJJFTCIRyKwcdOm8/BIMeELBMYloFvGCuw1xx2qO3m2dFr6lChz+E4z5VOx+hlls7Hz3P4ph7ALgf8SCGvjLBWfEmVtnMWFAgQg0CBALqkBh6ohCOgzb8sHHkfiIcYSJ85AQF9XctecYbhu5OPSk7yfyVs+Pm6EmFCbBMKJnURSkxaVxxFYtDYGZdbG48aJniBwRQLkkq44qteKiVzStcaTaEYnEM5Lo7uLf3ciECZn4xTUr3knfsS6noC2Ippa623REgJ7Ewjzk7Vxb8DYgwAEygTIJZW5IB2HgD4gt3wHaJu/xofrOPHiCQS+RSB8Xfl4/Gy56b4VBf1emEDnFM1qLP4XnhUHhJZnFGvjAdjpop9A5xTNaqyN/ZDRhAAEMgFySZkJkrEIkEsaazzw5roE/G+CHo8fXld/3aE+cWT6RLBvCPIszYcl/u71icd7DNdZG8cYB7xoEQhr4+Pxk7X1VJ0K5JIyJSQQgEA/AXJJ/azQ/A4BfTpu+cDjuaTvDB69nocAh6XzjNXdPQ3ZopBOCjOZxf/u02Vz/NqE6Pi92SQGIPARAmH1Y238CGWMQgACjgC5JAeD4pAEdGxYnUvSRpCH0occYZz6PgHdZToscbN8f1TwoE4gHJn06aDVXjOZXFKdIjXzBFgb5xmhMQyBxnRlbRxmlHAEApciQC7pUsN51WB0KlgX4Mbm6zqlFQRORED3CAfvE43azV3Nkzafo6SjZNPNoRH+UgIha7m0OfoQOJhAzhlN05SFrI0HjwvdQeCqBMglXXVkLxWXNnMrzgP6BF3R9lIQCQYCFQK6v2xzGZ6KrzRCDIEvE2hkjnRMUoH1/8ujdcLu8wTjac0TDuMdXda+V5/pWglzgbXxjlOEmCGwHwFySfuxxNLHCPjPxaWd6INzaUP0IXATArpHrMDO8ibjfoEww9RtXDKrLzDcB4fgNx42tQ52gO4gsJpAnr215ZG1cTVkGkIAAtM0kUtiGpyDgD4FFz00oQcuFrU6BxG8hMAeBHSP2C3GtnIPqNg4iEB+ckSfFKHAR8BBQ3KVbvLU4qGkq4ztLeLIEzgsif7yFkQIEgIQ+AwBckmf4YrVDxDQobfzVCD9x+OHXeAHBgSTpycQtpskkk4/oncK4P1+v15/fp33p6NcvhMbYt1KIMyrzl3H1l5pD4E9CLxef6yNe4DEBgQgME+AXNI8IzTGIaDt3fP520gPvd9vrzmO/3gCgXEIhGfgOSyNMzR4UiOw9IzkM0o1m8ghEAiEtfHx+AkKXEJgNAKWW/crXn95tFjwBwIQOBEBckknGixc/Q8BJYnsY9KOFv5fr8DxmEkDgSKB8EQSz+4VKSEcgcDS549qJ6gRYsGH8QmwNo4/RnhoBLbk1v06CU8IQAACqwmQS1qNjoZfI5C/M/Qfiio3Hlz6mut0DIExCOg2sQK/bhtjWPDifwTsjBRm6cZL4EKgh4D/Ourx+GFt7IGGzmEEtjx/VFtC2S0fNnx0BIHrESCXdL0xvUtEtS+rX68/PhfvMgmIcxWBcFji8b1VFGn0KQK1A89GOZ8LnxqwC9kNayOJpAuN7elD6fwadcU6yTw//eQgAAh8jwC5pO+xp+f9CNhn5372sASBKxMIe032kVce7NPGFmbp9kvm+WnnwnGOh2l2XMf0BIFuAmGWbr9kbexmjyIEIBAJ3DeX5BP8kUrpWot1qfI0Mr1X6DQe9zlqo9OnixYEbk0gfPHOQ0m3ng1jB197+FQfx4sKnJfGHu3vexfWRh5k+/6Q4EGFwL6/dGNtrGBGDAEIzBMgl/TT+Rc6tGedhzqYhv+jZorCCpf5/LBwBgOPOxAYjkB+rexwLuIQBEoE/Nc/4YOs8/Iyn3clPMi2EggTjCT7VqC0P4pAmLqd66FXY208aqzoBwIXJEAu6cq5pEYWSZ8i19gwWTgXvEEJCQL7EciJJL54348ulo4gsOXb+Gt82B1B+X595NP4/RgQ8bkJ9Gz4tfPPhXMHj/cQgMD3CJBLunguyT4wns9f/0bq1+vPP8t9gR02uaTvrSH0fBoC/q7n7xOdZthwtEQgH/7z6ShLSpaQ3Z0ASfa7z4ALxb86o3QhBoQCAQgcSoBc0pVzSdM0PZ+/tUcP/F780En3gc7IJX0AKiYvRSCcq3mm/VKje9dgwvciYZLny7tyIu4WAZLsLTrUnZPA0qTSOaPEawhA4PsEyCVdPJfUnmLaQp39YEkuqT3Q1N6cgO50u1Mu8CjizQeU8D2B/FxJziKZ5OyfdD5qyrsQYG3cBSNGxiTQn1FibRxzBPHqVgROehuSSzpxLmn7nNOjSdtNffduJ5f0Xf70PjiBcLQ++/0+OG3c+woBfZyF2R4uv+IbnQ5LIEwP1sZhRwrHVhPoWRuZ+avx0hACexE46dsnyCXtk0sqrtSNpbmoX3tYQMo2Wf13sBunryw3XN3YxTHNbTt4TF/0AoFzEeCL93ONF96uJtDzJfxq4zS8HgHWxuuNKREVCcz+HPjsp4Bi1AghcC4C9pFUywYMGwu5pB1ySeF7LV0WZ4PPBEnTF/LrjZTxmaYpNN84sWT57J8iBnAjDZpD4HoEdI9rkblejEQEAU+gnVHKn7C+LeX7EAi7qcfjh7lxn9G/Z6TttfGeTIgaAuMQ0KeS/cmscRxre0IuaWsuSd9r+XSM/d1iL7Fh0CwJj7H5v3OcM1A6DU7TpAPh6/WX7bcHO9fK8tm3UOSS8uAigYBfcOweOfudzphCoJNA7Xv47Z+bnQ6gNjgB7abYPww+Uri3LwHt/LkF9gWLNQhsJxDuylNs2sklbc0l2ajnBFBxPmmKFLezWt9DreSL+io6EITyJ8hPd2mBnM5tHIbARwko07370vFRtzEOgb0I5HRq54f1Xg5gZ0ACeVacYr8+IElcOi+BsD3gubzzDiWeX4lAOPI/Hj+NP8g+SODkkvbJJYXsT3F0NT8aysXkjhralCoaXyFUXw1/Vpj9ShNySV/BTqcjE/DrBjfIyCOFb58mEO6FT3eH/cEJaPNjhQtsgQYHjnvDEvBrIzfCsMOEY/chkL/qsM+pkTNK5JL2ySX1ZPT1JUDjlijq+LV+r2/P1NHj8dPw5ytV3rew59v3kg/Or4wvnfYQsB+xbvk33CxbTNEWAmcn4D9Wzh4L/m8h4GeCLZJbrNEWAmcnoDvCXtGyezg9Gx50IAABEQi793A54NGVXNJuuaTZpIx2LZouuaC0ka+ScLYL36pd1tQccFL6eOXnJwofjd1H0R4LX+tb+ZAXueobqrzdwqLpVwvEB9suy/NQaLfytdt92G7Bv+PMBzI7HF6ZMgQgAAEIQAACEDgdAb8rs3IxhNlNkbfzIQsH73JrO8wjUdR8WITiQ8OxiEMtED9t2uXPWegPpOZDJtxvsx31LrXkkrbmksLTaI1Xr+ep0JD454/83Npl1P23ELsY/LoRI/l1N4IDGt8gb1+qlS8sWjV8Q5W3W1j00eInrXw42EItj9PmH2q98yoHnfZlEcXscKgvChCAAAQgAAEIQOCMBPIGad2myNvZbmH7/rDowy673Nn9oUdRnBLbLWwPZJEPRZiLLFx7QIujPM7LH8klbc0lTdMU0kk25PkeKE6FmtCvFP4e8/J1ZSWSen6Xt66L41sZxuP7bfeoR4XbaqFWrXzB5xaDfr70DVXebiFP6dy1JPpThnLAClKYLWy3ME1T6H2pD7tYKAYyOxy1lQE5BCAAAQhAAAIQOAWBvNlbtynydrZb2L67K/qwyz55dn/oURR3udstbA9kkQ9FmIssXGlA/Tm9eI+P9u4kcknLckmNLKDdz37Ug7JVdf4gOawUMuvlK8qaoMG3FaaGamJ8hnIJZyCwhUBxf4AQAhCAAAQgAAEInIXAlo0QbSFwQwI68ufC6/W3NMV2AMD75pL8w0Sz+VcN56zmNE3K14QHf8zIiiTOXs8lybEVPhwwF7d0YWy3WKAtBCAAAQhAAAIQgAAEIAABCEDgeAL+yK/kw2gPIgUs980l+Z9WzmaINJyzmsZXWRuvLyNhDGYv/cSaVS4q+MTZ9RJJGspi7AghAAEIQAACEIAABCAAAQhAAALDElACQUkDn0kY0+1b55L8gDWGp1PNW1D2x88ACRe90sx+Aqop5XvpLF8+kUQuqXMmoAYBCEAAAhCAAAQgAAEIQAACoxHQef/x+PE5hNH89P7cOpfkkzuNAdO4NnQ8U5/98U06uwumvLWlSSgzJf/XNc/+DCixGAd0DJcgAAEIQAACEIAABCAAAQhAAAI1Aj5RUNMZUH7rXJKeZ7FMRPF1Vv6hpKJCUahWoVby8ColPzNCk425pJ4efe8nLZNLOunA4TYEIAABCEAAAhCAAAQgAIE7E7Bc0uneRXP3XFJ4VbY9UWZ/HMFnYWqpH/18zP89BTXMs0H6elbIN1Q+MtxIki99sEieqLtGIXR6rktySecaL7yFAAQgAAEIQAACEIAABCAAAXvAxf+e6SxMyCX9Z6TaOZecEtLo+ixPSNPUWr3f70YrMxIeTfL66rqnEFxqX/YYHFbHQhvWPRyDAAQgAAEIQAACEIAABCAAAQhkAuH4nxXGlJBL+t+4WIrHJ5Wez9/X6292XEPDzlb2yzWfJNIDSnmiWBemkGsbEtnsKTTsjF9FLmn8McJDCEAAAhCAAAQgAAEIQAACELgGAXJJ1xjHu0dBLunuM4D4IQABCEAAAhCAAAQgAAEIQOAoAuSSjiJNP58kQC7pk3SxDQEIQAACEIAABCAAAQhAAAIQ+H8C5JL+nwWl8xIgl3TescNzCEAAAhCAAAQgAAEIQAACEDgXAXJJ5xovvC0TIJdU5oIUAhCAAAQgAAEIQAACEIAABCCwNwFySXsTxd43CJBL+gZ1+oQABCAAAQhAAAIQgAAEIACBOxIgl3THUb9YzO/323JJs39072KBEw4EIAABCEAAAhCAAAQgAAEIQOB4AuSSjmdOjzsTeD5/LZf0fP7ubBpzEIAABCAAAQhAAAIQgAAEIAABCPxLgFzSvzy4OhuB1+vPEkn692wR4C8EIAABCEAAAhCAAAQgAAEIQOBMBMglnWm08DUQUCLp+fzl6aQAh0sIQAACEIAABCAAAQhAAAIQgMAnCJBL+gRVbB5EIDyLFC4PcoJuIAABCEAAAhCAAAQgAAEIQAACdyJALulOo32tWPODSFlyrYiJBgIQgAAE1hB4vf78/2tM0AYCEIAABCAAAQhAwBEgl+RgUDwPAf267fH48V7r0ST+ppvHQhkCexHQrfd6/e1lcxc7X3dMDuwSDkbEc+NMkx19Olhho1kGCAKBgGZakHN5PAHd7Md3TY8QgAAEbkWAXNKthvsiwb7fb20Ucs5ITyddJFrCgMBIBHReGu0o/nXH5MBIw3ViX8Rzy0zTx4F/KMmEW8yeGCuuf4yAZuzHesBwLwFtEXsboAcBCEAAAqsIkEtahY1GXyXgjwfZEWWans/fXIsEAhDYQkDnpQOO4u/3+/X667yRj3SsCFAOFGsRLiUgnqtnmj4LwlcOZnm12aWBoH8TApqxB8RrudHOtfEAf0brglzSaCOCPxCAwFUJkEu66sheNi5t1xonAemEI8RloRAYBI4ioJurcQPu5Yv66jEo5QMcK/ojB4q1CJcSEM/VA2oW8nnb5KvNLg0E/ZsQ0Iw9IF5yJW3I8GnzoRYCEIDAXgTIJe1FEjtHEND3zPl4ELrXs0tBziUEILCFgM5LBxzF1VePw1I+wLGiP3KgWItwKQHxXD2gZiE3r8mXeog+BDwBzVgv/FCZXEkbLHzafKiFAAQgsBcBckl7kcTOEQS0V8vHg9B9v2ZoyCUEINAgcOSdpb4a/qhKyrOLg5rsW5AD+5q9rTXxXD2gdp7Mzc1ylt8WNYHvQkAzdhdrbSPkSuDTJkAtBCAAgWMIkEs6hjO97ECg/6Ek64xHk3aAjolLELAXD9nx4/n8fb3+ij//tHdweLUcvc5LxaO4vd5IZ/iijmx6rx6PH++Y3gbiTZlQzUMhOOY9MctB31/6wB+PnxofNXm/31peZFwOmJpFVyOg2uJAqCNfMCeL+lYV+vL6HrXJvWXvsNmXfrApucYr25mmyatpBIua6lo8jf80TeIZfGjYUZXF6GeyH1OznM1ucVv2zUg2Lt8oDEUg38vFWyzMDQ23j0Uz1gtVznNSVbmQu1OP3o7dLCYpum2WG3NSVb65hNbcr6VyI/hsPgT9rKPb3Os31HpWY2G3RckCsXs//J3f0BGXEIAABCCwnQC5pO0MsXAQAe1C/Kan0bdyT4/HT2eThjWqIHBSArpxtL3WcV0R+ZvFq+Ufk2rjHk7LkvvmtrlXL75Q9Epb/2DEX3ojviwH/MnHN8yxWNaj5klRf5qmor5llKw780pIi4uPjPgQ2mUzHrBbE4XpLUhfnkitOC4GMJ9UzWbRiBkMAfpeQtm7p7JQeGXPsxiymhcL3pTKsqNIfVvNH+mr4NWsXKMherXJk00h+SKB4tzTPJFjRbW8r9AUUkMr1GZLbZLUujNrmpahkN2WGzXHahlbr190Jtzy0zSZMyro0nyQweBzJhAUdFmMrgbWywWBAgQgAAEIfIIAuaRPUMXm/gS0pcibmEZn2sHkLUujFVUQuAwB7ar9XjzcRDUdnSK8vu4pb1CaXqicTr77ivp2sPHk1ZcX1spStrUieGLC7InkRf1wXBSokIwLXcvD7IlVyY7vVK1qhZo1f37zbRWa91Zde6G1sihsaCyVo2cQ1Or5/NVk8A90SGiDGOISn8y/OBPUXSNkH2mtXGtu/gQn7VkMb0puBLcl9ww9DS/3BikPRUDj6GevL5u3uiN8laZ0UejDVC9+vvnZ4i1IOU8h37x2y/t+fVneeqGVVeXtS/h8/vpbXnIl/WUwrDb+saPiPS5T4ebSmmOWPRAPyr4GUKe+St1ZrTykAAEIeBXv8AAAIABJREFUQAACnyBALukTVLG5MwFtDsK2o6cbtfVbpZ6G6EDgAgRsy96+ceweyTeI9vG+SmcACYtqhk5VnqQs+AOAV1BZmpI0ClIOCSBrolrfqQVehCN9X9tYTBSpP2XJSHC7Jg9q4bKWGakdLE0/H0r9o1W+C3nlQzYFBe71/XFOkyEo6FLGJWk39zxnjXubvlwjZs70mC26LRp+Llm/0u8x7l2lfDwBG6w8270nGlAvtLJNAz/QReWsZs01w70F3bN5agUHpBnkxcuiY6apKu+GhH41M/2i234JCp7X9P0jUUWfvbB4I+s29JpWVlX2PysjgQAEIACBLQTIJW2hR9sjCGgvsm5b4JuHXc4R3tMHBL5KQKeChhe2Uy8q5BOLDOrsIUnDgpR16vCSYsNFhw2vXLOcDyRZ4j3JsWeJ19cBxguLXRSFvlWx3GhVdKwoNMvFIZMwr5NmquFVz+KcjajHomXxrA1osZUXWo+5ufWb5b6tytltk9RCrnUqgxQGIdCefuZkYzRz8yzRclcMOUwkNe+ZmaFt0b6EsiyJCqrynRaFalJkYsKcmJMpNfeFoimvYGUz4j0U2CA0fb/ry9aQQAACEIDAjgTIJe0IE1MfIaA9U3HT0Nll55al0xpqEDgLAW3li8+nWBR2dxQjUnPVSqL7URLp+ILVSllnAK9TK7cth1ZS9n15HSmYMFx6TStr5Qn6nfa9kdCkATy7IUljEQuu+q6LKY9i7EWhNyVPQqEdjsxmtUZEPcnB4Ea+rNk3l8Kg1JoHtxVO1jdJp/Fac+SHEdBQFu8Rc6M2hXytHJZBSdrLXdAPl95ILptjDc99k4ZlVfnboSiUwSKTotDfxWruC9aR79rXil42Lg+Dvi4X8VErChCAAAQgsJQAuaSlxNA/lMBe3y/pK+78lfuh8dAZBA4noMnv/8yNvNCmXJvvYiHr6wBQ1A/CrCyDjYJ8a+ioSsrqS1VWkELxMij7U5AZVPNO+7VeZCf32JYY0mLvou0tFIVSsFpd+ni90MtlsFjobOXVzE4xIt9vTcGbKpZr9m0IimY1OiFG2ZeCJKHQMB40ufw6Ab82hjf1+BkYJkO4VBR5bkgSmoRLsyChDDYKi5TlRjaoKn87FIVqa7VeX0mfIJRc3hYLoZV/mZTX92ryUF6FghoGOZcQgAAEILAvAXJJ+/LE2s4EbEOQH5xe0c2Oplb0ThMIfJGAdt75LghV2oKHgpyXvnb2QbN4mZVlsFFQXw0dVUlZfanKClIoXgZlf5I0g2reaV8GDYiy2HZ8rRlRq1wwO8WGYu5bFYVSsFpd+ni90MtlsFhQK4GyR+HsLbwSSk3nzGJEvt+agjdVLJufubk5E+T+ewv5nN3OktB10XjQ4XIcAhpQmy1+sxGqitPePxkkfUUnSa2tyU1fOmreKCxSlhvZoKr87VAUqq3Vev3GvSw/GwVvStk9vf5ff8PBq8lDeRUK6i7IuYQABCAAgX0JkEvalyfW9iSgXYWOYVus66jgdyRbDNIWAuci4L/v1ZFpdlMeYpS+7qNFu/ZFyuor+FC8lLIcC2pSMHm4DMo5lyH9TvsyaOuYgBuBFWuaNSz2XqRaFMorq9Wlj9cLG/KgZpeipHillns0STEi329NQZZrhZp9czKYNeVZtxVgrdOi8Zoy8kEIaFjt4U3zSsIwVWo+S18KWaKqXLAZ6JNTWUeSRcoNN1TlYywK1bXVev2eXJKaNwoKKiyPuUd5WLMmUzUF5BCAAAQgsAsBckm7YMTI/gQ+kfpRcipsg/b3HosQGJVA2IXrRuv0V811E+m26rGg5uG0UGwr5WJtEEpZjgUF81O1CrzmSTiNSD+nG6wjORD6VUP95bKahdAwXJo/8t/XBletqihUK6vVpc/deKF83n7EzT2GLFvoVzyLIQfl4qX1mJubZS9XX9lOcFuj6Zv7VrVOvQ7lMQmEaTA71iGK0HzpvaOFtLYi+e5smnXeldkxmVKVn89FYWji9Ru5JAWl5rVCo1Or8j1qaGqsFvGpuYQcAhCAAARmCZBLmkWEwncI2FZg3aGr4bF2GH5f0tCnCgLXI2B3geKyy847Iu/4s0SWi4X+W1uWi3aCUMrFRaN49mh4In1vzfQfj5/iAUa1wTEdtOw3X8WXoL/f71n+NW/lajhYNvyRS95VAfRCK7dNef2appz0yuqxzXOWjLfpy+ZMbm79erk88c1ruQDFmN2WHW882ORyZAI2uPJQYy1Jo6DR9zq1Seh1rKzmfs3JaiZZ51iescr1+BkrT7xQnlhtqKqF2TYlmz6XHSxP02ROBrn1WGSlTsOS6LujDAEIQAACuxAgl7QLRox8hEB+F+b2bnrObNt7wQIEBiGQDw/aZ8tDSbKydFSQst/Z62CzyELxGKCO/OlikVn/KxWzph/3hR4VS5Ar8RHSRl4/uKQjWfH0ooYGysfowwzycCkjvmvvauhagxLs2GX2RPazvqoCqKypTr2TOg0GD5XSej5/a/rF1FvutygxZ/xENTULx8sVYM0Nb98z9/p+Dnjjvi3lcQj4sTOvNA28kzaLZmd+7UaWzdyd78XKun1mu5Nmj1l/o/lOazNWPhensdWGqtq9pq7DWurdsLI6DbFLHnqsyf3tmRec3C8SCEAAAhDYQoBc0hZ6tIUABCAwNAHbcMvF2v5bJ5NwdDe5mvvzkt/Zy2zWDwbNlO9O2/3c1p9DzI7v1HsVHPOmfF+5ua+VQQklUUFVistLrCxlX5Ba9sHoZblv7gNUL96mhGqlWkl8IetrEL2ayrKmwK0q2JERDauXSCizuTZIQndq2FMw3zJY6yLIFaAsS5Ld9lWhXDQumxTGIWAjJX80jmFi+Anpq0Jzf4fKphVkOUxmk3tl35eUJfSafm3MngRNr2yTWTZ9Qa2KwlDrUch+EFoTWcvxKkbTFCjZkSRoBn3doV4/d6cQKEAAAhCAwF4EyCXtRRI7EIAABIYj4L951j47PwYSvsuVphX8V986GGi7bzFLHtrmp4Tsp0NFx/J310EtdOpxywH/FIx3pti2EbiP2ncUXLIu7K8OWdkrqyxPshtWleVqq0Kxa3vWMnetHtXcF7K+B+g1rdwA5UetpiZ5DrMYlOeZm2T3ipIaWIs0mC26Ibd1WBUN4RJne56iaLzoHsLvEiiOeF4ba+uJjbtfJTQlQlx+Fmm2qOAtWEKq6Ji/y8x+UAudhsuiDzZjzRN/OygQL5TB4gzPRqTvs2yKWgX/FJL6Va2lkCT3Nv1PUL2+gZIkNOESAhCAAAT2JUAuaV+eWIMABCAwFgH9gXP9leWaf9LUDj6fJSxzUfv9qVl4Pn/VV7ag3mVKyuFYZZr+b0IXFUxN1tRKZ56at/IkB66qYkHpG2sonXApub63DykJU7Bjj1dulK0LDZABCbFbcwVVtJZdLRoJbaUjB4psg5Pen+IIiqfNBOmYHV0GZ2Yva82tu2w2uG0KJqxN41yrWTfrHgpfJ2DDp/WnNsqWttD0kH6YQro7inFpqvh7p6jpu6v1ZQ1tbTSdminJzT0ZVLDmmI9FgXhhsBOqshHpq2A67U8HOWl+Wi/yR6Z8wX9AKKh2E9+cMgQgAAEIbCFALmkLPdpCAAIQgAAEZgjooQAdddTAUg/+y3lVUTgjAcsM5oE+Yyz4DAEIQAACEIAABBoEyCU14FAFAQhAAAIQ2ERAiaTiQ0mWSwpf8m/q76KN9VjHbOGLMG00iwN90WEhLAhAAAIQgAAE7kuAXNJ9x57IIQABCEDgowSUSKo9edT5+5SPOnkK43oBymzhgGeCLJ8VuOn9NbWxDvpcQgACEIAABCAAgVMTIJd06uHDeQhAAAIQGJQAyYVBB2azWz6fpWeRTEgiaTNdDEAAAhCAAAQgcA4C5JLOMU54CQEIQAAC5yKgjMO53MbbWQIa2VyYbYsCBCAAAQhAAAIQuAYBcknXGEeigAAEIACBsQjYHxj64ut7xsJxLW/ya5sY6GuNMNFAAAIQgAAEIDBDgFzSDCCqIQABCEAAAhCAAAQgAAEIQAACEIAABESAXJJQUIAABCAAAQhAAAIQgAAEIAABCEAAAhCYIUAuaQYQ1RCAAAQgAAEIQAACEIAABCAAAQhAAAIiQC5JKChAAAIQgAAEIAABCEAAAhCAAAQgAAEIzBAglzQDiGoIQAACEIAABCAAAQhAAAIQgAAEIAABESCXJBQUIAABCEAAAhCAAAQgAAEIQAACEIAABGYIkEuaAUQ1BCAAAQhAAAIQgAAEIAABCEAAAhCAgAiQSxIKChCAAAQuTuD1+rP/Lx4n4UEAAhDoJvB+v1kbu2mhCAEIQAACEPgfAXJJTAUIQAACFydgJ6XH40f/v15/F4/52PDe73fo8PX6M9pBziUEIDAOgff7/Xz+amF8PH5YG2dHp3O5M6rwnOWJAgQgAIHzEiCXdN6xw3MIQAACXQR0WHo+f3kuqQvZEiUdRH0jckmeBmUIjElAayPPJXUOUHFlKwrJJXUiRQ0CEIDAeQmQSzrv2OE5BCAAgXkC2uU/n7/z2mgsJPB+v8klLWSGOgSGIKC1MT9oM4R/Qzqh7Jv3TiS9kFySp0EZAhCAwCUJkEu65LASFAQgAIH/EdAun/PSh+aEPdEQ8Ar7hzrFLAQgsJGA3aQk2RdhtF9M9yx35JIWgUUZAhCAwBkJkEs646jhMwQgAIFeAiQ1ekntqgf2XXFiDAL7E7CblBf6bCdbXO7IJW0HiwUIQAACgxMglzT4AOEeBCAAgU0Eir/A2mSRxh0EioerjnaoQAACBxEg2bEX6OJyB9698GIHAhCAwLAEyCUNOzQ4BgEIQGATgfDn2/LLZf17uIuHAbOgF2TYq7uLPvnfefk/jfR8/vpfQ5jaujOGD2fWE3NSQeU/z/R6/VlcwUMfnff28fipdWpq4ekGde0NTtPk4XhoQY1LCEDgcwT8ra2/SKBbOPyMy+5l1ZpXfjlqLA7TNFlfaqXlNBjUipQXqwYHb7xhQVW1RcyWJq1ajSXaAs/OWxPvqjficTV8ECXvSVHfAg9u+Oav15//6NFAmFdFm3I+r9KqogABCEAAAp4AuSRPgzIEIACB6xDw23HbQIftvi6LtbXmdnAKmMyCTize4OPx8/7vf0FYtBPM2qV/v3UwEk4L0zSZQrGJvRhFZzlvKp9JfG0oBydV6+Wi54WdXfsmlCEAgd0J6J4NBevIbl5bE6Tglwjd3apVYdGKtH1ttH4by12jylNtROTVLCNjnXq5mnuhqfm0nSjJba9vZZkKysZK+oorAJfcj5eEwWZ+VVZNU/1SgAAEIAABT4BckqdBGQIQgMDVCGj3nAOzKktwhK95taH33+76b2vDLjyYsr78vvz5/PVfBcv+4/GTHfMSGfEPEHlPwllCnnh9JXEUrLXydvzZQ19ie0+8ES8vElaA0pTEO+zL0qQAAQgcQMDu3HDjK12i+93WRt2qupF9Q7+SSNNC0IrkHziScUup+8WqaL9GQ8b96loz7p30zuuhJN+L3AhLveRFZS/UwmgxCosshPSQyHtQ4VlOGZmmSWH6Tk3ofdYniA/Zoyja9EJf9n1RhgAEIAABcknMAQhAAAJXJqANfQ5SVWGvrM13kJuFYisJ/X7djgGqCg7oJBCa1NSCXE6G5ku7k53ZrJYeegqaxR51XpLbpuYPOaqiAAEIHE/AbsmwgPiMRiPZ0Vgbwz1eXB98KiSsJ75qlslS44uWu7yIeTjet6KmfGsQ9qxkpJ9tyByZBW9TMLMPQuGrzOdgwUdKGQIQgAAEPAFySZ4GZQhAAAJXI6ANfQ6stm/Wnj43MYk1zFvwfChS/sUrm5HiVj73aH1luSyHTrNv1rYRlLJaxV6CMPtjkuBG7q6oFoxzCQEIHEZgdq3Iq1b7Ls53vZapbErKuUpr4yyKFSGo31njct5rFpsXhTXfzFommSWz/QqUPT9rFkIqyoTelMq5xyyRMgUIQAACEMgEyCVlJkggAAEIXIdAY3NsVfkkU5MLSlZY0YsOKtkBdSQdL/Fl6zdLss3iaccaNqpkWTq1HvtzSUFTXVCAAASOJJDXMetdN3twRvK8vDQazvZStJbXmeCMXX7IuCLNbqjK+1MU1nxTQ68gC0UateehvNws5OY5BDmgTiUx5UYTaVKAAAQgAIFpmsglMQ0gAAEIXJmANsc5SKuqbb6zXBYaW3DpqFDrRXmino4URbGgvho2s89q1VMV+lVb9RgyREWbegAqvBDEW6MMAQgcQ6C2NBVv3pC2qHmohUIKs70UF0BrJSO1wr7GFbiiyG5Ix7tUFNZ8U0OvIAtFGtZEXslC+Bl14zeJalssyKAedPK+qZYCBCAAAQgEAuSSAhAuIQABCFyKgLbOOaradrkmlwXt+yVZ0YuyMI3DgzqS/WJBbjRsypRXtnKxKuR99G5yc8AbkUteWLTpj6PWihdzeGiUIXAkAbsH8/oze/PmJnI7rwazvRStWSuZrRX2Mu5zKFrrihz6hTXfFItXkNkiDWti+iFrrzciFf8wqMyqbbEgl6wQWoUfzQVlLiEAAQjcmQC5pDuPPrFDAALXJ6Ctcw7VqvLevSaXBW21JVnRSyPvI7O5I1XVCjXnG6ZylSQ512P2fe/F2GXBa6qs2uL5R2oUIACBzxFYulbots1rppzMq8FsL0Vr1kpma4W9jJudnuVOELxLRWHNNzX0CrJQpGFNTD/kktTQW1MXqpWkv6C2PEbaDw1NCEDgbgTIJd1txIkXAhC4F4Hi/tsQFDff+po3nysELjdc0UtPLknflqvr2UL2zZroYJAt5KrZcLyRonK26ZtYudgwqyGBAAQ+QWDpWqHlqLY2Fu/62V6K2RNrNRv1LsbNSMjRWNfZjWKMRWHNN7Mcmqxjq1a1d29LYZZkTaEBp9YEOQQgAIH7ECCXdJ+xJlIIQOCOBBpb4dpeX7v84rP9xdoVvfTkkqRTPOcUh3M2qNxKEamqFk7WrHlY1JR9FawjXVKAAAQOI7BirdDKUFwbw5+ot0Bmexk2l1RMxBRXtqLQAi/m3WTZ165gG4CHyzb/zmlWDK2zLWoQgAAELk+AXNLlh5gAIQCBWxPQBj1TqB1yfH4knHP0FiF/BvD6K3oJXQQL2sqHHoOaLmtByY40VchVguZPjDr/hMSWlGXQvxdJwhxmsaH0KUAAAh8lsGKt8GudXxz0OGd+/fNsL3llUC+z4e9iXAtRLSLvRl4ti8udQjDj3vL7/dbniJf7JkFe1M+eaIn2SKUWbPqgVM46giMdChCAAAQgIALkkoSCAgQgAIELEmhsha3Kb7sVv/bf/lURXihNK6zrpeGAty/j3hkdPLymhDkoOR/0iwchKStt5CUSNmKXvrqzKMJliEi1FCAAgU8TqK0/+eb1nqjWrwMS5pVntpfcROuY77dY3su42VFECsfkvmtVzQrlmwp+sc2WQ63sq8cAypvNypIIZtbPPgSJXQqLt0kZAhCAAASmaSKXxDSAAAQgcGUCjd2wVYUNuljoq2BZUGHRl7eNXhpVciP/1We5YYXgTM2mDiTespVzlb7f9n3Zg1HZvnS85WCzaNBevB3890YoQwACnyOQ72XrK9y82YHa2lh8dnK2l+IKbK1y10Gyl/FiRFq1vIdFOEWhQlCtSeRzcekrepL/RoHUAhD57BNAXuh9sLLcqKn58EN3XEIAAhC4OQFySTefAIQPAQhcnID+wHOO06q0k84K7/fbdJ7P3+fz195vmtXs+2TTzLWNXhpV2Y6csWd5am1rcjVvWPZV0ld3VpvtmyScN9Tc2zRNI2llX0sZAhA4kkC+l6334s0bHJOO1ofaQjrbS7Fh5/qwo3EzpXAs3mxfgXsgRaEPwRRmP0cCfzmTEWXH5I+cCa2siSW2VFar0LVW6WAk6HMJAQhA4OYEyCXdfAIQPgQgAAEIQAACEIAABCAAAQhAAAIQWECAXNICWKhCAAIQgAAEIAABCEAAAhCAAAQgAIGbEyCXdPMJQPgQgAAEIAABCEAAAhCAAAQgAAEIQGABAXJJC2ChCgEIQAACEIAABCAAAQhAAAIQgAAEbk6AXNLNJwDhQwACEIAABCAAAQhAAAIQgAAEIACBBQTIJS2AhSoEIAABCEAAAhCAAAQgAAEIQAACELg5AXJJN58AhA8BCEAAAhCAAAQgAAEIQAACEIAABBYQIJe0ABaqEIAABCAAAQhAAAIQgAAEIAABCEDg5gTIJd18AhA+BCAAAQhAAAIQgAAEIAABCEAAAhBYQIBc0gJYqEIAAhCAAAQgAAEIQAACEIAABCAAgZsTIJd08wlA+BCAAAQgAAEIQAACEIAABCAAAQhAYAEBckkLYKEKAQhAAAIQgAAEIAABCEAAAhCAAARuToBc0s0nAOFDAAIQgAAEIAABCEAAAhCAAAQgAIEFBMglLYCFKgQgAAEIQAACEIAABCAAAQhAAAIQuDkBckk3nwCEDwEIQGCGwOPx83j8vF5/M3q3r36/37sw2MvOLs4sMrLI89frz6bWoi5QhsAgBJjA/QOxaGWomd3FSM34p+WLnNfU4mP30+OCfQhAYCMBckkbAdIcAhCAwMUJkEvqGWDt/nuUazoycsYjhM2Tx+OnFl2QK9gg/+jl6/X3fP6aq8/n7+v1t+iM91HfMH4uAl+ZwOdCZN4uXRmKMZ6a9tLPUAV72AfB+/1Wp4/Hj62NxYFACAEIQMATIJfkaVCGAAQgAIFIYOk+OLa/x7UyFFvClZHDjhDTNL1ef5Zh2eL5+/1eemLU0WVLv/1txVZ+qvB8/vbbQRMCRuDgCXxS7CtWhmKkun+LtR8S2tq4cTUWgX47mlr9TbYQEFstiSqQat8ClrYQuAMBckl3GGVihAAEILCegG0rj9nUrvfy2y3te92NO28zcjBqHRs2IrRzV78RnZf6m2zR1DTWGMmBx+NHwi1d0PZWBDR/bhX1imBtZdh4i+2ywC51XovG0oZBf/XaeMxnQX4QSXObPHsYSi4hAIFAgFxSAMIlBCAAAQj8Q2Cv/fQ/RrkYhsBeuaSlAem4srThOv3aqYzpvY4nrQ6ewAA/nsC3FgdNrdqqtS+KYi/yYd++sAYBCFyMALmkiw0o4UAAAhDYmcC39tM7h4G5CoGb5JIq0f/nJ35GoKaAHAJFAsycIpYrCb/12aepVczyHEb4Wx8NhwVIRxCAwHYC5JK2M8QCBCAAgREJNH4wtajK76ftWX1J2j9b8O85Lr7kOLhhG+iwezYdbWqLdor0/c8K3u+3vRIiaHoPZ9826mO3P2znXQ2xWEfeB9+81peMFMH2oDAdNVeAxR69S4qon3CG6eP1teJvP6Yw93Re8prHlwdx4/jA79yjTVR//4pGuIMk15vF1CrMnHCv6R70Fqy87kbOf0zT27EbvNGpd8PfpyEK76FeozO7Jih2fTSIUuY2TZN5Lh3fvLhS5SY+HHVhvdcsWNSGKKObNeibB+XZy0ZbvzZqiDUoQjTbxScU9LH7CePYhAAErkGAXNI1xpEoIAABCEQCeuVnPmBoj5i3qraL9W9J0PFARws1r71opqipjbIc1Y55mibZ9C7V7OSIZFMFM2jHDBlXreCoygo+8Fll76qPRQ3lQ2cgMuItm7VFFuzsF0KzPI5888yDZu7dt6qVZcQr1Djb4Up8fJODy2J+cL9090UCGvS8khSnsblqVVoiZGSapuLtmY3XNPNCasb9bRLWz2KP2U4Rsu47Bev//GLNcnFZaNzg6lq9SDKLTpCLTSS0HJPsh0Lgb7VfXBszwCJqy4XJWx/swWXxPLhfuoMABE5EgFzSiQYLVyEAAQgsI1Dbj2qPmLfsuYlX1u7cHyGCT9of+62zDg++Ry+0k5L/AtzsPJ+/6tQnhrwwOGCXCkQvFpU/6lcSO5OoR29QkYavu9///U+asimJkjVm1ocm5XD2k9w7pvNnDwqzkHs0iTHxHspJf5gMCp2XmifSF7r2MVj6uWBn6c5/Z6dEtq8Z5adlUQ3hxQhofQhxaRqH6ZTvTUn803a6W4v3mlYYb1x2slC3rd0CpqDbyi8I/kEbbydEZ5fmm1YJM25V8tAvQfIw3CZe7jsNa6OQyhnfMCwOvkr6uk/DMiUUfnX1T/p4r0LUMu4hS2gFa+JRBIXOy6KdYr+KqNjEd6dnuzqXR9+2szzrQ6cd1CAAgQsTIJd04cElNAhA4O4EbF9ePABoy+4ZFYW2oQybeP+FsN9qayvszVpZW2dVqbuQUvHGpayC2fGdqsoX5HYIXx5mC6rKdoIRr2BlxeKr5IM/0gR9b1lGvG8SestWziik7C145XBy+2guSSOenZGfeV75MAWwp5B78aZqZbO8rm3NJvLxCdgM9HefEhb5tvIZIoXWmMOq8vNKQllQIfco5eBh0ZOGHVX5gu6msC4VF0BrqHtZdhoeSscK6k5ytc0rv0YhVKmJjAiFh2y1CsRXyQ0vNP0cncn3WhyynaKHwfm8VpuC/Ssgiqtd8G17yrLfo4wOBCBwWwLkkm479AQOAQhcn4A2rD5U2zdry+6PE7YZDaeXvA+WtVxlG9C8WVd3fn+s3WroUcptO3KjWNDG2gcoy7UURohIHha78MKiZrDm9YtJHBnxgTeMSF+WsyRXeeNFN9RkUUHA1SpLVKVzYG0gTLPzK3f/1IbvYrbc9nC2OQrnJdBeG2s/CPX3TuNe023l9dfdyGH5KlrWKLRdkpp5sm7VVUT9907WlJ+yJt+skFmpidc0NS9ROXeaJVIuGm+jVtueQmc4MqXcVo2Pfd2yaHmU8c5C9rmzIWoQgMCtCJBLutVwEywEIHA7ArYj9GFLYhtov1stbh+LQjOYq7LN3LV61A5eEin32JFysWC+5VSFOi22Cv2Gy2ITExbNZj7BQlCQEQ8k6BQtSCgLkqigKm9c56UMSg07CwG4uqs1n1WoNdxLLgcCkL3sY2dwAjaEBKB9AAASzklEQVRjvZOSqKDaLNH8kY4vmL6fWlmS9SVpGF9kRwZ9oWbBOvU+N1rVjPgmVjZNv8IoulpfUpC1LNHaJZ1QsH4lzG6oqmhc9mtOqvlsIbPKEm9E/mzv2pvtL8uB/iZoQgAC9yRALume407UEIDAXQiEDbR9G287VCvr22ltH8M34Y1drzXx+1111yhIXz1KolFpNFeVlIuFmprkjYL8MR1dFjsyoWLxOrPNg4KMqEdJGt4WD2neDZVDdyaXZamtKwQ78rxmbVah1nAXuR5L0fzfxSxGTkQg3A5+bbQHQ8JtGKZKewJbbbCge6RWEL2acclrFkwuO8WC6cg36bRt+lZyIxuRNRVkVpLZ5lLITbJE9osF6atWEl+wWi+5bS5Ja2PYCQQ4XEIAAhCYpolcEtMAAhCAwJUJhE25XWqP6DfQeq4+4DCd4pnBrPkq7dcbBenLN0nUdaO5qqRcLNTUJG8U5I/p6LLYkQkVi9eZbR4UZEQ9StLwllySZ95T1mEpvJOlpy06lyFgN1e412xt1H1nwYbUkgmDTsBSNN6+i3tuZHXaNhWcCZdh2VFt26ZvJTdET0ZyQWZVNdtcCrlJlsh+sSB91UriC1brJffMJWltDJnTQIZLCEAAAkaAXBIzAQIQgMCVCWhraJv+sGO2LbuvymcDa5LleveQr2ooZ8o6MHgLprbITrasY4A/nnnLWd4wkt3LyorFV81GERRkRD1mibefy9LPVWIi46ZjPnQCKZot2ml7osnT7nfRC0GUIW046V/rzmGpDerytVob/QRW1P7etLKqrNCe4Vare03KkgRr4VL6NXmnndDcLn1oXqEm9zpWlns9bphZf6fPNpeCuu6RSLlYyG54Nav1ktqCGXR6LjPYLPF2FGwD7yf+jpv6ZW30w0EZAhBoECCX1IBDFQQgAIErENC21c5OfntqEvvb0qaWD+RqnlnY1tMbLH6BnxuaRDtXb8GqFtkp2je3/QHGW87yohFzo2djrVi8nQa6YjJFRgREx11JvP1cloVcVTsa1UAVLTSEwc6s521XrSPZ7Cn0IJJXPWPaCJaqaxCweaWb0U8h3ftaJEPI7QlstTKoiSdJsBYua8aX2glm7dKizp70r7pyo+c+0s0rZxRd9sF0sidqIiPyQZJ2Ibvh9TUTsrDmpNdslzNwza5iQwXb6Fo6iqtdKHbkheZSfuu816EMAQhAIBAglxSAcAkBCEDgagS06bRCyBZpm2uFHLwUcpUZ9Ptd9ZWVs0TK3oKpqSq36pRoYx30ZTl3GjR1wuz5JZTMeiPmQ/G4pYOQr5UR71stEN+RyrIgiS8Uh3KRfW8tlLMdScKUs4aqDXY+dyk4nvnnusPy+ARsSmhi+IkqoXRCOFIIcrvMrRZN+IbxRXaKvpkFv8h4nzvz7HLDQ2t0580quuKdqLXRW1YT30UtEK+jshyWxBes1ktqyfeg03OZ/VQ4PkaZkqt5jKSzb4FE0r48sQaB+xAgl3SfsSZSCEDgpgS0Nbf9YqCgL0j9Xt/r5H2wam1DHPa72gcXd8lq6zM1wYLpmJ3iYcMbqZXlRlZQ1ayHOk7MppN0NvDdqaMchfbu3gcZCUD6UciCd0Nls1M0PhugjNQKClYKcsYefJNcE9KaSP7RgoDnsfhovxgfmYBNRc0N76pmqdX6KitreucqLW7Fe61nBjaMq6rHTtG34jpgmlbVY1luzC4djZWh+BSMAQ8+qDsfkYSBs9dRObuhKq3zXiJh8CTo9FwWgQu1/wiYpkmz8fH46Ymrx4G2jno8pru2M9RCAALnIkAu6VzjhbcQgAAE1hDQNjpvFrUd3yuX5A16myb3DkjTCxWeas35INdlraCQiwqq9R7a4SE4E9yw2kYsvjvfiz8YeLnXV18NH3yV6RcteKHK1q+3YFXyJxtU29mCjHhNCRW+l1jZ63+oLLC5d0kylg85g9mhCDQmgKrCKmH+a1IVw7HaMKnURLeDN+XtSNMLVfaO+S6sldRqBWvuG0pT/ZpOkIcm3g0hysalFqxJrrZK3wQ+ys15TbPmjXj3TK4evWUvVDnr+07Nn9y7mrcLZty7F4yb5QA/Q2j3sq42d+qRFj1f1xGtIACBSxIgl3TJYSUoCEAAAv8Q0O4wbGf9q4hzlZlo7CZtG5ob6ntO9auC/45Xu9hswbpu2Anf5f4T7X8v1GOu8lFLTQXvobWVn9KxgteUju/O1F6vv1ogIQoZyUBqFsJDAbLg3VBZ/khihWA81HZeCo7X18MdqpUPbVe9ke3l0HvxMjPf3i8WxiegyZAngKZorvK5gGKM1jY3DPeael90I4enV7yRYKfom+ln30y54aFf8UxZiIIPXlNVckatamujbx46khEr1FYY69QvsNkNb8pqvaT4MREUOi/NeAZeRP18/no+nV2sVhOWRiF7vro7GkIAAhcjQC7pYgNKOBCAAATKBOxPYhXrrMpvu71ao9b+lEy74fP5a5vj7ID+Ek3Ngu3mraG309CX59aqvQmWZfsGOHsoa3Z0lH7WVCy+iT9CqK3RKIYgI+1a+2GIGQyasuDdULnYxGrtUGe+SX9RwYwXgZtXgiyz1kSXnyvIt0YhkPycM1geisDqW6bd0GqLk0oNV9/IBtDb0cQu9hiAm3JDU5b9qlu8tc2yGayt8/JNboRciSmIRtExuSQjvqAutMi8Xn/BjnR8Q5WtVpcqWL/yTfJFBTMe/DELwb50Gk0WdT2rLCyNgryatYYCBCBwNwLkku424sQLAQhAAAIHEfC5pIO6pBsIQAACYxMIuaSxncU7CEAAAhCoEiCXVEVDBQQgAAEIQGALgfPmkhrfUeeqLYhoCwEI3I3AqXNJeQGsSXic524Tm3ghcEMC5JJuOOiEDAEIQAACRxA4by7JPO/89wiU9AEBCFyFwKlzSZ2r4jFvzr7KjCAOCEDgrATIJZ115PAbAhCAAAQGJ3DeXNLgYHEPAhA4L4FT55LOix3PIQABCOxOgFzS7kgxCAEIQAACEPgPAXJJzAMIQAACgQC5pACESwhAAAInJUAu6aQDh9sQgAAEIDA6AXuPBm/NGH2c8A8CEDiQgP4oG2vjgdTpCgIQgMD+BMgl7c8UixCAAAQgAAEIQAACEIAABCAAAQhA4KoEyCVddWSJCwIQgAAEIAABCEAAAhCAAAQgAAEI7E+AXNL+TLEIAQhAAAIQgAAEIAABCEAAAhCAAASuSoBc0lVHlrggAAEIQAACEIAABCAAAQhAAAIQgMD+BMgl7c8UixCAAAQgAAEIQAACEIAABCAAAQhA4KoEyCVddWSJCwIQgAAEIAABCEAAAhCAAAQgAAEI7E+AXNL+TLEIAQhAAAIQgAAEIAABCEAAAhCAAASuSoBc0lVHlrggAAEIQAACEIAABCAAAQhAAAIQgMD+BMgl7c8UixCAAATGIfB4/Nj/waXX6y9Idrx8v987WsMUBCAAAQhAAAIQgAAEIDAUAXJJQw0HzkAAAhDYmUAxl1QU7tXx6/Vn9renq16vv+L/tVyVKVvvz+dvTW2vSLEDAQhAAAIQgAAEIACBexIgl3TPcSdqCEDgLgRy2uj9fmfhjjiez9+cS3q/38oKdfalnJS8VaGYpVK/UrMCGaVO4KhBAAIQgAAEIAABCECgkwC5pE5QqEEAAhA4JQElVrz3ltb5UJJFaaPQo3lSTAN5TZUtl/R8/ioJpUL2XIkk2fepKNmkAAEIQAACEIAABCAAAQhsJ0AuaTtDLEAAAhAYl0Axl3S8u8rsKNcz64M16dS3MIPNFZ0GC1xCAAIQgAAEIAABCEAAApkAuaTMBAkEIACB6xA4ey4pP4KUx8ZyRs/nb6jSr/lyVdDkEgIQgAAEIAABCEAAAhDoJ0AuqZ8VmhCAAATOR6CYS9KPxRRP+GGanuh5PH78k0GmZj8oq73cWqYsDeSbPB4//jdr6r1YKD5q1ND0fkqtGL5qKUAAAhCAAAQgAAEIQAACKwiQS1oBjSYQgAAETkOgmEzJQiWP9CyPdCwBNE2T3knkq/JzQzJlyR1d+lZWbkPs0ZmmSQ7XrJmd7GdNHzkEIAABCEAAAhCAAAQg0CZALqnNh1oIQAAC5yagDI4PIwuV8Xk+f/XAkdI0lk7yzyi932+llrzlaZpkyj8oVBSGhuHSnNQjVK/XXzEfJMuhuS5lRxIKEIAABCAAAQhAAAIQgMAWAuSSttCjLQQgAIHRCeS00TRNWaiMzOPxE0JSzsjnhvwDQUEuU15eFIaO/KVPY8lbS2mFjJIs++a+TC7J06AMAQhAAAIQgAAEIACB7QTIJW1niAUIQAAC4xJQIsa7mIXKyPgEkDVRlbdgZUszhSbS9/KiMBuUxN6yZJfhjUsh2yXLahsK5JICEC4hAAEIQAACEIAABCCwkQC5pI0AaQ4BCEBgaAI5bdR+LskngCywRrLGqkIT6Xt5UbgUXNGIhDVr5JJqZJBDAAIQgAAEIAABCEBgHQFySeu40QoCEIDAOQhcKZek938/n7+iTy5JKChAAAIQgAAEIAABCEDgGALkko7hTC8QgAAEvkPgYrmknDnKkgCa55ICEC4hAAEIQAACEIAABCCwkQC5pI0AaQ4BCEBgaAKXzyXpLd3FYZjNNBVbIYQABCAAAQhAAAIQgAAEGgTIJTXgUAUBCEDg9AQun0vS65/865k0bMXwVUsBAhCAAAQgAAEIQAACEFhBgFzSCmg0gQAEIHAaAsVkShbq+Z2ckVFVjtmqQhPpe3lRmA3OSuwvx/n3JU3TZMaDcJomPbLkPZntAgUIQAACEIAABCAAAQhAoE2AXFKbD7UQgAAEzk0gp430IM/j8aPYGrkeVUlZBasKmRrpe7mEOeMja77g20puiaTH4+f9fkvoc0Y+omKYvhVlCEAAAhCAAAQgAAEIQGAdAXJJ67jRCgIQgMA5CAySS/KZncfj5/X6K2aLxDS4rUtrKzUVlKtSOklN2h3JAgUIQAACEIAABCAAAQhAoJMAuaROUKhBAAIQOCUBpVS891moXEzOvKjKW7CyVYUm0g9yPVVkvYdab1wW5KcKtcea3u93sD/bi++RMgQgAAEIQAACEIAABCDQT4BcUj8rNCEAAQicj4A9ARQSN1n4fr9NGH4+Zr8gqz1GZK1Ck4Yps2PPFoVWgayMPJ+/z+dvzbfQytT69UNzLiEAAQhAAAIQgAAEIACBHgLkknoooQMBCEAAAhCAAAQgAAEIQAACEIAABCDwHwLkkpgHEIAABCAAAQhAAAIQgAAEIAABCEAAAr0EyCX1kkIPAhCAAAQgAAEIQAACEIAABCAAAQhAgFwScwACEIAABCAAAQhAAAIQgAAEIAABCECglwC5pF5S6EEAAhCAAAQgAAEIQAACEIAABCAAAQiQS2IOQAACEIAABCAAAQhAAAIQgAAEIAABCPQSIJfUSwo9CEAAAhCAAAQgAAEIQAACEIAABCAAAXJJzAEIQAACEIAABCAAAQhAAAIQgAAEIACBXgLkknpJoQcBCEAAAhCAAAQgAAEIQAACEIAABCBALok5AAEIQAACEIAABCAAAQhAAAIQgAAEINBLgFxSLyn0IAABCEAAAhCAAAQgAAEIQAACEIAABMglMQcgAAEIQAACEIAABCAAAQhAAAIQgAAEegmQS+olhR4EIAABCEAAAhCAAAQgAAEIQAACEIAAuSTmAAQgAAEIQAACEIAABCAAAQhAAAIQgEAvAXJJvaTQgwAEIAABCEAAAhCAAAQgAAEIQAACECCXxByAAAQgAAEIQAACEIAABCAAAQhAAAIQ6CVALqmXFHoQgAAEIAABCEAAAhCAAAQgAAEIQAAC5JKYAxCAAAQgAAEIQAACEIAABCAAAQhAAAK9BMgl9ZJCDwIQgAAEIAABCEAAAhCAAAQgAAEIQIBcEnMAAhCAAAQgAAEIQAACEIAABCAAAQhAoJcAuaReUuhBAAIQgAAEIAABCEAAAhCAAAQgAAEIkEtiDkAAAhCAAAQgAAEIQAACEIAABCAAAQj0EiCX1EsKPQhAAAIQgAAEIAABCEAAAhCAAAQgAAFyScwBCEAAAhCAAAQgAAEIQAACEIAABCAAgV4C5JJ6SaEHAQhAAAIQgAAEIAABCEAAAhCAAAQgQC6JOQABCEAAAhCAAAQgAAEIQAACEIAABCDQS4BcUi8p9CAAAQhAAAIQgAAEIAABCEAAAhCAAATIJTEHIAABCEAAAhCAAAQgAAEIQAACEIAABHoJkEvqJYUeBCAAAQhAAAIQgAAEIAABCEAAAhCAALkk5gAEIAABCEAAAhCAAAQgAAEIQAACEIBALwFySb2k0IMABCAAAQhAAAIQgAAEIAABCEAAAhAgl8QcgAAEIAABCEAAAhCAAAQgAAEIQAACEOglQC6plxR6EIAABCAAAQhAAAIQgAAEIAABCEAAAv8H8zHvGwOl9f8AAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAABhcAAAK3CAIAAAAJfolzAAAgAElEQVR4AeydC5Irqa5F3zwqPKvjYZWH5Wn5Rbf67laLj8k/kKvjxrkYhJAWJCiVadf/ffgPAhCAAAQgAAEIQAACEIAABCAAAQhAAALfCPzfNwHaIQABCEAAAhCAAAQgAAEIQAACEIAABCDwIYvEIoAABCAAAQhAAAIQgAAEIAABCEAAAhD4ToAs0ndGSEAAAhCAAAQgAAEIQAACEIAABCAAAQiQRWINQAACEIAABCAAAQhAAAIQgAAEIAABCHwnQBbpOyMkIAABCEAAAhCAAAQgAAEIQAACEIAABMgisQYgAAEIQAACEIAABCAAAQhAAAIQgAAEvhMgi/SdERIQgAAEIAABCEAAAhCAAAQgAAEIQAACZJFYAxCAAAQgAAEIQAACEIAABCAAAQhAAALfCZBF+s4ICQhAAAIQgAAEIAABCEAAAhCAAAQgAAGySKwBCEAAAhCAAAQgAAEIQAACEIAABCAAge8EyCJ9Z4QEBCAAAQhAAAIQgAAEIAABCEAAAhCAAFkk1gAEIAABCEAAAhCAAAQgAAEIQAACEIDAdwJkkb4zQgICEIAABCAAAQhAAAIQgAAEIAABCECALBJrAAIQOJDA+/1+vX5fr98Dx1ir2gx7v99rFdAPAhCAAAQgMBsBDsfZZhR/IAABCOxNgCzS3kTRBwEIOAKv1+/j8fN4/Li6XopmmM9wvd/v5/OPr9lu6xE6t1uFBghAAAIQgECWQHo4ZsXOr+z8PH29fp/PPzyaOn9hMCIEIHA+AbJI5zNnRAjciMAuWaSDYrI0UH4+/2zMeaWmbtd5o+WCqxCAAAQgcDWB9HBcYVF6Gq5QErr0fJ6+3+9duAWX+QgBCECgTwJkkfqcF6yCwCQENmaRNnavQ0wDPhvu+fxT75htTbWZ2Bad2YGohAAEIAABCBxHoHScNY64sXtllM7PU3P8iPRZhQlNEIAABC4hQBbpEuwMCoG7ENiYBtrYvU5530h3X211y2mFAAQgAAEIHERg43G2sftBTqEWAhCAAAR2JEAWaUeYqIIABCKBjWmgjd2jNf/9vG+ku6+2/1rKJwhAAAIQgMBJBDYeZxu7n+Qkw0AAAhCAwAYCZJE2wKMrBG5AQHmclt+cToVVk6JS0+PxU1IumbR7qFkRti7tYvKlXwpfqi3Yb56WOHhhMWkR/nw+kvdKKEMAAhCAwKwE6qdV8DoVrhxnOlAqB3elux9aqnzlLmUzYBdVUpJSUtOiQoueRjKNYovMQxgCEIBAIwGySI2gEIPAkAQqQYaaQjJC4Zd+KlJBz+PxU/rCv7RJ2H5dSPUenyol/Hj8hL9skpWRbdJmf7HF6zFVEqgUrJd3X4OGXqr3A5lMtslrloDXaZU2dMq59MNMWWff73d2CJ8/Ss32xlCGAAQgAIF+CGjHTk3KNvkDRb8/LcnKgaKzQ8J2KtlHfziWDpRwcEtPKLSoKkUXHoIM9pU21ufz+XqYZrunqoK1KdJSBi3LzfRraE8mTE32iA8yFW3eEcoQgAAEjiZAFulowuiHwJUEFLikRqgpBEwW4igae71+7X8KfdJQz8dYQV5N3gBL9EhSlvhoyZIj6u6Fpcp3NAHJe1WSD4U04JNCL6lKb4P0m52SeT7/SMxAqSnVaZKehiBLv3ppRix+VV/rnga1GteblKqVfgoQgAAEINADAR0EqTHZJtvt7c/M+wOlciD6A0VnhMmrVxobSDIcQLIz1NvH1+vXhw1ev5evPKby+o2Aaj6fj9WYR7JQo4RTLwvQtOnQlHLVpMeucZakFUx54Pb5fGSM12OmSoOfEXGTtR6grJKzNvVSRQECEIDACQTIIp0AmSEgcBkBRRupBWoKEY+ilhB7+UjIayvp8SFR6Vtg0iPhYIyUS1IFNfnoylpLkZz6lsSk00uu1mZKsjpVGeJmcQj1CpQrkxLQaR69L5QhAAEIQKBzApXdO9tUOlDC6znea+kJB6hXFc4U393KOrCCpCkPldbFmtKDTOOmo/iarFjJF+VuvCWqDI6nh6y8S61Vk9csDaFSI4Z675f6lqzyQZT8DRr4CAEIQOBMAmSRzqTNWBA4m0A25DIj1BQim1KQV4pHK/IKjHwAVEJgkVYwRkamvSrjWq808gtKTIMfMTuciaWx3VdtJpDVqUo/uhSmhllNCWMqL/JZ/RqIAgQgAAEI9EagsuFnm3SgZM+pNIsh+ewBUW8NrLIHd/ZI8t+Jy9ppvbJNGlS2qUaHXfbET3EpARTkpVkGpH39oKLqK1PHNZzUenmVbfRgkrWWDMvOnRRSgAAEIHA0AbJIRxNGPwSuJKD4IzVCTSEWScMg31eRk4VEXyMkjeKVhLK9vJ0NRivdK3bKqjBQ+JhqyA5nYuHXH4IqBbIBpo+bfZfsQBIIhsmdbIipd8TC0KYk/aabRqEAAQhAAAIdEtDundqWbaofKOkJYqdt6UCpHGfeHv+t8+zpEypLp6F0ZmMAtVoh62k4MX2XLK5spWIb655C82pLvqSWmMEV1N6vlJh/eqdW2a+aYBsfIQABCJxAgCzSCZAZAgKXEciGXGaNmkIgkoZB3vrQSx+9jC+XBLK/IpmmPErdVa9wKlvwlqTl1FOp9cKKJvV7E75V5VSbNWV1Ziulylo1LxJWjST9EKHVm52CDRr4CAEIQAACnRDQcZbak23SGZHKW03oVTqt1L0k0Hhwl7rLjEohHGQyyQpZT0vDlXI9UqKxdFyqJpUJlmRzbaklaU2qR6oqWPwhLmsblWdHpBICEIDARgJkkTYCpDsEuiagSCi1Uk0Km0ymHpeEXvqY6rearIAq05gpGCPJoF/1qQZfE3qFj6mnUhskVS/lQUBRYLD/axSb6lEXqdLoqgm9TCBtVceK2UEVHyEAAQhA4FoClR0726StvmR26GUf0yND3bMCGkXaVAiqst11SqpXthBUySQryAZfXxpOh2n6ZfDQRWo1elrjR7RyUCIHpSRbk+qRWBaIKr1amafWrFoqIQABCBxHgCzScWzRDIHrCSjUSE1Rkw9NFM2ESnUPvfRRAqGQCqgmfEfM6sO4Ei6p9X+jRH/WRIXQK3xMQ8DScPZWud54X/THWbI6s5Uyz1qFQsKqkaQVgny21Zz9+l596MtHCEAAAhA4mUAlNZBt0hlRsjP0so+lAyUbBuj9l5aDu6RfZuiMTgstvx8UskKl4b5mkaRHh7sACukiSqklaY2G8AUTq8czKRkZmY1JvH7KEIAABHYnQBZpd6QohEBHBBRkpDapKQRJ9aBHvSyg0cdUv9UEAR+Jhi4mGYwJ3dVF9UFeAi2F1FOpLXW3X4JIO2bDblOS1Zmt1KDWKtckrBpJWmHRz0mUlASdfIQABCAAgUsI2BGjHIe3IdukM8JL+rL10lOE7BGWyvvDwk4ZaZBwOK2svqQ/a7xUtRSynpaGq2SRdGRbJGMavAEayEPwAgpmfHIntSSt8UpUbhSTvC/I1OyC8ZKUIQABCOxIgCzSjjBRBYHuCCi8SC1TUwiS6tGMtfpgpS4fHvGVBlW0F4yRfGq/jZsGtalkqSa1vDKcV5LN2qTarEtWZ7ZSQ1irR2HKPXYJKxr28r5V5azZaqUAAQhAAAI9EKhs+NmmlgPF/7BOXV75EX+m1A84L1k5kjSuz7wsAi4NvlfJNsUV2aNTB6LpTGOJLGqN22hJVkxKVCjZIIF6IQRadWFaIQABCOxCgCzSLhhRAoFOCSgcDFGUr8/Gf4/HTxrnZeOhSvgieY2umjBoKe6UfMpX46Z2psLZmjT0rAznNSj69JWpNmvN6sxWSpu1ekSSTyNdcfDyUuULWbO9AGUIQAACELicQGlXV72OVDO1ckDobPVdfACQOqtR/JlSOuCy9dlK/+fG0oMsNSNbI099a2m4ehZJEMzfNJAQh9Ra9fWIhNpXSjJV4l2QWGqGFyuVZWpJgHoIQAACuxMgi7Q7UhRCoC8CFmDZ1+bff/9ncZjCDh/xKAxKwzJFb0Fe0Y+GsNBN+k2VQfHCipZer18Jl5Tb7wWY/amq1+tX2ixUDXqyU1Lx0cv7n4Hw32jzI34+H++CiZkScfM6s5USsNbggrr4n06wQe3fIO/N9sF0MFuDUoAABCAAgR4IaLfXC0Q6JdXk7VSlP4XDz/l5eX9gaQh/uqWHow44nSD+77Wlp480+NPQn0R2kHmrwjnum1SWp6pR0BJsMIGsvPqakfavKlXw4YrPAUmnr7Re8lpKUtQG0LAIphez34qShqyk7yh7sgSkhwIEIACBfQmQRdqXJ9og0B0BHwkpZrLoJxvxqFJRo3qVfsExO4TFpopvxEU1Qa3qJWmFYEaIk0Kr1+nDrKDTPspTtaY2qMZrVtitjv4pqyStVRq8cLZSAtYaPPXxt4awV8ZS+cqMaBQKEIAABCDQJ4Hs0WaHmu3/3mwdKKWdP3saZoewM8WG8GdQVrNlglJ7UmFvbdqqEy3Ny/iO/hD09am1ahUZ1fiCWr2nXsAnd2SkFbKmlizRQHUlpRnxoVeJXsWF4BEfIQABCOxCgCzSLhhRAoGuCaQRjJmbjXh8ZYh46mFKEBYRq9dHHwiqi6/0kt5OE05tSL3LZnlKar1CqfLCqpS1vktF0prUPSvpK1W2LqVRUjOy8ho3lddAFCAAAQhAoE8C2rqtoBPBPnqbtdv7k1TdvWRalpg/NxvPFD9c0CyTUmtN0o+rclCSfpRa32Tdxcc3ZeUlUG9NxWRndqz6W1FqlRL/HcPKWCYvAc9cqkr2+F6UIQABCOxLgCzSvjzRBoGuCWQfSAaLLS7xQUnLe+ZS4juqMlvwX0/LCvjK8Fa8b1K5fWh1WVRooWcR3iK124XtAWbJ/Uazt5uBBghAAAIQ2JdAywaezYaUToTUvKVncYtJNsrX4GHR0KnlJ9e0I60b1gKwhUyLnroltEIAAhBYTYAs0mp0dITAnATSLNKcfk7klU0ZAeVEU4orEIAABFoJZLNIrZ2RgwAEIAABCCwnQBZpOTN6QGBqAmSRxppe/ZLCWGZjLQQgAAEI7EKALNIuGFECAQhAAALtBMgitbNCEgK3IEAWqc9ptvsE/fUWKyiFxItIfc4aVkEAAhA4mgBZpKMJox8CEIAABAIBskgBCB8hcHcCZJH6XAG6T7AJ8v+SQupzyrAKAhCAwAkEdDqcMBZDQAACEIAABD6fD1kklgEEIPAfAvaSC4mJ/0Dp44P9xLhNkP7twzSsgAAEIACBawjoaLhmeEaFAAQgAIH7ESCLdL85x2MIQAACEIAABCAAAQhAAAIQgAAEILCcAFmk5czoAQEIQAACEIAABCAAAQhAAAIQgAAE7keALNL95hyPIQABCEAAAhCAAAQgAAEIQAACEIDAcgJkkZYzowcEIAABCEAAAhCAAAQgAAEIQAACELgfAbJI95tzPIYABCAAAQhAAAIQgAAEIAABCEAAAssJkEVazoweEIAABCAAAQhAAAIQgAAEIAABCEDgfgTIIt1vzvEYAhCAAAQgAAEIQAACEIAABCAAAQgsJ0AWaTkzekAAAhCAAAQgAAEIQAACEIAABCAAgfsRIIt0vznHYwicSOD1+n29ft/v94lj3nEo4/x6/d7ReXyGAAQgAAEIQKBKgDihiodGCEBgGQGySMt4IQ0BCCwi8Hj8PB4/ZDe+Qnu/34/HT5puez7/GMPn809Fick8Hj9e5vX6PQG+jRKG9mZQhgAEIAABCGQJvN/v1+v3+fyTHn9Z+VLlLkpKyjupPyhOeD7/nBCkEQ12soowAwJ7ESCLtBdJ9EDgXgQaAz7ihsZlYdmiVFjpoXqaRmLSYOGm1avyiIJZfkIMeoTx6IQABCBwEwKNp/bJNPSkZMshovNui5J1jp9Jddw4gadN61YXvSDQMwGySD3PDrZBoDsCCgUaYzWySI1T+Hj8pG8bGe2WIDvNIn0+H6tM1Taa1Chmo5wZSTcahhgEIAABCOgsqD+KuAqUgoqNh8j5J5EsPw3dcXFCY0S32tNzopHV5tERAhBYQYAs0gpodIHAfQkobGqMOSx0aBS+LVajmlLSaz6GsXIP8FXgOLbZuPa44dAMAQhAAAKLCFx4QCyycyxhhUPnmD16nJD9zv456BgFAhA4ggBZpCOoohMC0xJQ2JSmPLI+k0XKYgmVRil9Emv1JlyS8a2VNFMYca+PzO9eJNEDAQhA4CACtlGff0Ac5E4nahUOnWNPKQawerOhJONbz18GJ4M6ZzoYBQIQIIvEGoDALQi0B5EmWUoSKRooCQSaQdvS7kHbXh+XmmHye42e6jFKoV5GWn0gGYStdUV0qI6VCQ2W+KGzlnsByhCAAAQgsI5AfduXzsoWbTLa59VlUaH0Vxq+jutHkfCKc+rz+ah75ajyw6VlaUibsjVf5b8KZNWursyetsGG+oJZvQxaOgZLvJvWtHrivCrKEIBAPwTIIvUzF1gCgUMI6GhXHJCN4bJi/u2YrIDprNhtAq/Xr3780pvh9ZsSjZINOKTNhKUqa4CpCr8KJP3qm33L2lotctXPEmVH2V4pk4IqqxcHMyO4oy5yRzX138J4v9/yS31TFLItK2OtJZO8JZQhAAEIQKCRQHZ/1lkgJVmxsCH7rduXU21Sq6PH6/fy9lfVvDYrpwe66cyeI7JTrX4InV+fz6cxeDAbghLrriG8zcFayWRHlLUVj0y5MO5b8OZ5zVYvrzuMEzSVAbj3gjIEIDAiAbJII84aNkOglYAij9frV/8L8dDn81FCwcuEuFB/jtfq7U/DmnzFGglbQfrtYyVtoajIK5cSVaY1laYWN627qQ3BqzSfU5ANNpymMju6CYf8YLbSP9S1J8x+UrzyFJcUEg56UJQhAAEI7EhAO6025+fzT9h1/fEkMevoj3hrShUGbd54JSZ0BPh3kSrjpge6jy58zOD/tLyOtnDom80aLviYjmXyQYm6+8NONDwEmWFdZK0geKohHJJtYXRP9aCyKJl+eZEdTo771mxlY5zQjtePSBkCEJiDAFmkOeYRLyCQJ2DxQT2ysbDDR0imKxuOqLKuU9YoQEn1KziTsA9csvpTd0xJqlx2SvkiN2V2GqpKoRU0kO9SKYfupY8KzrxA6r5aNaJq9AAwpJaEPYWW9k1l5K8XpgwBCEAAArsQaNxjbc/3eRAbvf0sKFkrA7LHX+kYSsfVKZbVo9E1XDj0pTA9hnSKSYnOu6ySUClhfzjKjNRaDRdoq4s3o1SWOy2F1OCsWhH2raY/q0FDp/IeRcj9eeFQNoXpBGUHCn35CAEIjE6ALNLoM4j9EKgRsLM8hD6hQ0XGmnw4orDJVwaF/qNpSIOM8NK4utT1p/Yoigo+ptmlRW6acIirZKQvyGB1qRd830rZ1AbIVpmFqUG9zrRSuLJK1FdOBaomYGqzTdJAAQIQgAAEVhCo7PPSVpHJ7t7pWSBVaUEawgGkxzyl4yMcDaXkSxixNJxpy46lg8yf0Sbvba5QUiJJB5nMyI6YKhcNb0NwzX80DY3/ei+8klA2m4NwxWuN7vWklcKbRaG+IiaGakrx+ibKEIDAHATIIs0xj3gBgTwBiw/82+OpnMmk9f55lFoVN4TARQKhYMpLwmmUWdef1Vap9MHNIjezOoNrh340A7z9Pu+WDm3yIZxNK4U3aA4KJRbq7aPNWmlOs12ohAAEIACBFgLafu33BLNdTCa7CSsF4FvTsyCr1iplQCpTGVcBg8a1QeuZCJ+LUUcb17qHSpmUBg+p/CJr5XV2xFS5t1xWnVwwq8JprgWQGmPyxAkpGWogAIEVBMgirYBGFwgMQ0DxRDYG8mGQwotsQQ7XIy2JqVAa1wRSbWmNVOnpVgjy1EWSlZqsd6qUhrrZEjuooFnzv7bgf94iEBCZr9Fh6mnWBYlVCqkNWVVUQgACEIDAIgJKkTweP+kvIvkNv3GLlliLGekBql7SUynY0SAlX0+KkqQNUeqe9krlK0aqSfpThfJakZKErUldvORpZY1OnHAacwaCAAQ8AbJIngZlCExIQKGGwibvZNoqMV9QF8mHcEoCoWBKSsKptrTGKyxps3pJmhI/qNR6p9KyNJQGksChha/WetfMEvniDUsr0xovr7LEKoXUBnWnAAEIQAACWwiEvTfst6E1+9F3kUCLSTqAUmHpqRRsXCnxZqQKlaDxP+BtYjZEqXuqP5WvGKkm6U8VemutVcLWpC5e8rSyXCgVgrU++eiNVHdVpjVq8gWJVQqpDV4DZQhAYGgCZJGGnj6Mh0ATgfB3ef0b5gqD0sdZvkbDeHlVVgoWXpQiiVRbWuOVl7SF+vAxxKner1DWWKkGNZ1QsAfR+hsx3kg9ow5mmMG7v4vkhw7l8BZ9sIePEIAABCCwhcDr9asNP/zks2342TNCG7XforMHRMk2ncKpQPu4UlI6/aW8JGljlbqnvVL5dmtDkCDbVLDhgjGyQWKnFfTCcnYNaNkEewwIcULAwkcIQGAdAbJI67jRCwJDElDQo2BINY3+SF4a6h3TwM7LS5viXdVk9Ze0qZcpN7HsQL6yUi4NlHbR0Nbl67+phrTGlIiJF1DsGPhoXC+cVqY1Xl7lRjHJU4AABCAAgSMIvN/vNClgW3Q4BSqjL9rSdailCtvHlZKvRpYk62Oplw7KVD6tST1SjRRmDbbW0KQuUlIpmDGN/4aBUrUaWu57GcUJoVWje+G0Mq3x8io3ikmeAgQgMBkBskiTTSjuQOALAYtHfYxioUCINkpaFLt4DSVhvUFdEk6jkLp+k89qkxclGQlUrFVTSYkEVLD3vPT492tBHUsFGzo8LfTCWYHGyjpejSKxxlWhjhQgAAEIQGBfAkoKSK1t0f61YjVlC9kDIivp38pJBRaN2ziojptwslv3UCmTUuWp/CJrS2bYiNYajFEXWVUpfI0NvMDXkzd1Pwyd0lA8FqKLVJX8Cv6GIST21drQkY8QgMAcBMgizTGPeAGBVgJpFslqGuNRxQ318ELWKEBJ4wypkrD/M2Qh0FEYnf56gnWXFzZiOpwE/HClcjYCKwnvWC83K3jFzcuIszcmrZT+8P0I38vPQuOqCN35CAEIQAACexHQvi2FqklPOsn4QnoW+NZQ1hET6v3R4E+fVMxq7My1HwgvyfikVdApm1MfsxaavFciSr6yZIl0ZoWtNTSpS0nnQfUtfmVtE1JvWFop/cQJHhRlCEAgECCLFIDwEQJTEQh/3kWBhQ/LFDHYF+x9U/qXhiVs2Zz33/9VkFmAYtGkIjD/ir4qpUQxjRnvf9Qp6FEXH92WYlZZbm76vqmbZkNqm+91RDk7QWEg74iaBE01pQePiuw1g9bFHoSquyxpwaVeFCAAAQhAYAuBsBXruAw5fe3kqXx6cknYTtVUwBuszd9XquxVBT3hJNVRZYeyhO1MV6Sh4SRgY+lQC4+O6vJBSbu1JbVmjLUG5d5B811OCdcRBZlaGU62eZuF1FuVrRQ3HyfozWt1lxhxgphQgMB9CJBFus9c4+ntCCiMUJRgBR9VGJSSZDYjo7ihpM2DNpnP5xN6VfpmjbEAOhvJaTjTGSJOtYZMk4StEAL0inle4e5lWVXXnIqlNaUskj37zU5HePCYnQgbKOCqW0srBCAAAQg0EshuzuGBkKnKStoWHU75dDOvGKMkRUmmMm56NEibDqlwiEgg2CxHssOlA0k+mJ3tHmyovBJl2kqxR1AeXAiW7PXRjA/va6fKU7G0ZnucoOmTchXSOUqNpAYCEBiXAFmkcecOyyHwnUB6wFeiHJ39vpAdwwtUFCpAMSW+VyXXkxW2ylIkF7rYx9K/wQz7GIStsu5a6LLLx8ZxNa2yUE55M7KVEpASiUmbZDSDkrGCF6AMAQhAAAI7Egj7bSVfkG7jlbPVq61YK50VmaVHgx86HCIaLhxAJmaVoXuQNDu9fGp50GAfvVjJDJOx1sq49dH9QNvLqfFZnalHguDls5USkBKJfYUgSSmhAAEITEmALNKU04pTEIgEsgd/FPrf50bhRrH/af3n/8NL76E1fKy8sB0kFdS2W9UumY41U00L5K9fXZwJCL5AAAIQ6IFAy+ZsdjZu0Y1i7b4vUtjuTvZAXxQ8ZF1YZG1WQ6ly+nCiZe6Ow1vCTj0EIHAhAbJIF8JnaAhAYDcC9mI5b1DvBhRFEIAABCAAgYsI2Cst02dnLqLLsBCAAAS2EiCLtJUg/SEAgcsJ6LcJWh6XXW4tBkAAAhCAAAQgUCFAFqkChyYIQAAClxMgi3T5FGAABCCwnoD+fk34Zej1GukJAQhAAAIQgMClBMgiXYqfwSEAAQh8IUAW6QsgmiEAgZ4J6HcceQup52nCNghAAAIQgEA7AbJI7ayQhAAEIHA+AbJI5zNnRAhAYDcCr9dv9k8g7zYAiiAAAQhAAAIQOJfA6/W7/ee0zzWZ0SAAAQjciABZpBtNNq5CAAIQgAAEIAABCEAAAhCAAAQgAIHVBMgirUZHRwhAAAIQgAAEIAABCEAAAhCAAAQgcCMCZJFuNNm4CgEIQAACEIAABCAAAQhAAAIQgAAEVhMgi7QaHR0hAAEIQAACEIAABCAAAQhAAAIQgMCNCJBFutFk4yoEIAABCEAAAhCAAAQgAAEIQAACEFhNgCzSanR0hAAEIAABCEAAAhCAAAQgAAEIQAACNyJAFulGk42rEIAABCAAAQhAAAIQgAAEIACBmxN4//3fzSGsdp8s0mp0dIQABCAAAQhAAAIQgAAEIAABCEBgJAKv1+/j8fN4/LxevyPZ3Y2tZJG6mQoMgUCXBF6vX/tfl9btadR9PN2TGrogAAEIQKAnAu/3246z9/vdk13fbRnU7O+OnSJBDHMKZgaZh8Dz+ceySM/nn3m8OtETskgnwmYoCAxIwHbYx+NnLNvf7/fz+WfR44UhPF0UJkp4uHuJsRYb1kIAAhDoh8C4D9iz7wW8Xr/P5599TzHTuShCOHl+Z41hlOJsgU8Mc/Kqm08K/UQAACAASURBVGk4W2n1GwGF/WSR1k09WaR13OgFgbsQ0CY7lsN6wtBu9lWeWrBoo5estZBXFqqQjcN0CyExKzRG4UI3XOqwRI96CEAAAvchoCMge0D0zMGOKm/2+/1OKxe5kB580tnzGaeDuN1ZnfjtXXaRbIlhPp+PlqXsfDx+svnBrOTj8ZNOZdZ+oet5frOWU7kjAa0iv58E/bZ0s4swSPIxS4AsUhYLlRCAwD8EdN6PRcTOj0WPF873VIdcfWgvZo/mfJCUHpCmzZ7AmLz0fw3CfHhNBDbWmsdaCEAAAv52PT0dOudjR1Uw2yq/Hl6pa1ltJmZNiyKEVP+hNTPFMJ/Px4Bb2iiEJWmkodnRu0jq/nUZEMMcuiwHUq7IOewnA7nQv6lkkfqfIyyEwJUEdHhfacQpY5/vqUIlxT1ZR601DZ6USwq9Uknp/xo0C4IVgmY+QgACEIBA5wTGvX2yc2evu759tXU+6T5Tc5qpRthe5ajHDPY+dTBMkUmYcWKYAIqPKwiMuw2ucPaqLmSRriLPuHkCevKgQl6O2rMIWGSQPiw6a/zzxjnfUx851SOwEgXr5fWUJHWglgQ+n4+lpSR5h0mv0KAJAhCAwIgEtIe3HA1dOdh+orWYva+2lhGvlTF/zzy4/QKz0ZcS0Fr92rFFkhjmK8Y7CNj9o56z+hfzX69fn6PUr3T5ys/no3rh8r+yFJSYjLrY6EGh9ISCbnVVaOwY9Fz1kSzSVeQZNxLQ+Zct+LMq9uTzkQQ0HRrEahpnZJGwRQkaSAVFD42DqmOlIL+kUzWVXsc12ehL9bfjFcPSEF7gWhQlC6mHAAQgAIGvBLSZ63RTzde+/gtxLcL2CowG8l00aLbVS6rcfqK1dFmhTWqt0K5BzgYNx33UMS28qjlu0IpmG70ikG1q5/ZV0gtciyLrKZWnEdDsZwu6Xvxe5yt9vdmspeUV+i6+XuWv/koyFL527EeALFI/c3FfS7LXZ7ioHo8ff8XeF9YSz41hyq30FrHpDr00EXpXRTWVHzvMzmmaYjdVlvjXcwPvYqMe38XK6lhpkiP2PS99TLucUCMUi8ayXukUp0oMSOUbbXqId8mL8anB1EAAAhC4G4HKyaUjMj1JQy99tGfmOtqsUDoF/G8kq0sqLOX+XiucQZKRnkq04KfY5IO2bGXWWnX04/pyKlAaXbTVPcVufVNnd4kopNZbeOiI6UCLagzUoi5+CX3taEDSBamOxDBCcfOCrtlsQZuAX36+0tfb7UlWj/a0dK+QfGnTyN5PqZf9fNgQk0gWaYhpmtlIf/ml7wFajS4tfkh/0VIoRSGqT998VpMG8vAtlxcmJd0lNad6RVM1QdiUh/1UQ6vXVz3qokLqiDVJZ/DF10vJmQWhWDSo9QrnX6pBecPAX5KmR/GZfUyXh+QpQAACEIDAEQRKu7q25XTDt/NL9Tr+rF5f6NAxp61e9uuMCCejDeoPDikPXaRKo6w4uLO+Vyq9tT4+9FGK3PffQxFMma3HJ/qLqLJfwp6DdZSzskTMs2b74eplcQ5i6Ygm6etDl3M+mr9Lxyq5GfRosaVTYJI2uha2pizo4eMdCNiVqyvC7wB+E/DZIm2exkfL0hfef/8ntZbr0UfTbN9r0/IrRdGhlyZFwylFpaY+C2SR+pyXu1ilC8kf/1nn/aUVrvasPJU+gx5oCLvFPb41nMSKq9LUuA51Hdumx2YqVPrNOh3OBg3BwSI9Xqc3I+zgWkVhLPlilqTaVOPPhq/lRQv169CyQQWZrRpfUASs6Q5eS1gCqpFrqqEAAQhAAAInELANORwf2u2zJ4VVaofXSZfeimi3l7B5FDTIzfQs8MpLB32pPpzIGkUFGy74nlbKBnXMFtKOEkv9Wh3tpHGUn6zgiwz4Wsj6qMowfX7EOmQ53lJYZLwp/OpXEMiudpMhhgms+LiIgC6WyjIuyajeVnW43EJrZbtLNwd/N5Q1zCtf5O8lwmSRLsHOoH/9dJnOsOyFlDLyXcIlnQpTYwQMciBs+1p6eGvz8vKappS55D3t7J5bMkbK/YheOB1UoV62SZZUbEt3fL+tDxSB2Qxm3RElES7h0mXlBdRLPClAAAIQgMAJBLKHl1Vqu/ZmpNu1NGRPB5P3Z67JZ4WlSgeEarJnpSmXcGqnH9e3Wjm1TWeZ71gx2OvMavMDBRdMPk29+QihUb8oebN9369lafCSZmF9poJTvrtgytN6YZHxpioMV/+o9VxZMLIwK+Mfl3oB9aobQOvEBHQFVZZxSUb12TSQ3xBKl5tWYDq6NWWvYpuOSt/e5ossUm8zchd79EAsvcAqCHTklK7bSt97NtlW6CGrRrukyKQ1PuaQmAoVecn4giZdldorVaOCNemjL6T5L99q5dQ2LR4faviOFWO82EHlir/ZEeVgyZ30OV76xp+Y+BVSn/SsMVRCAAIQgMBeBNLjQDVW8Dt2WqPTwYvJtpJ8Vjg9I1qUayxfSAMA32rl1DadR948b0PpBMx21Ig2UIgks5XWRSNKg8hkDVCrN1t9WwpLR5S/wamWsXaRMXqLVNmSKN1OE8MsgolwIKArqHINlmRUX7qaJFBZvdn9pGVnkPKK5cHZqz6SRbqK/K3H1RVSuvwqdBSI9H91Vbw4rUmoNaIBzD7AsS0vTEp2H5S2EDdoOPXKFkL3dJvO9gqV9QUgSzRWWqMmK0h/qD/no43eOJaugmz8mirRD5GGyTU9qZJrUaT2UwMBCEDgPgTCDmw3Hnbk2UGmnVznmt/GVZk9Ja3VN2m4SkHyFeVqquhJj3s/rdZRY1lTtlKHoH3d3rsvhdmOXmcwRmZLgy9Yq2rkrGpCoTJ6kMx+TPWnNaFj3f4gvPvHwKeuX/fSWslf5W3GgzwxTJ3bnVt1vYT9xDMpyag+bBHqK4GScgkEDapXkjRb2Lh7yM6jC2SRjiaM/gwBfxVlmr9VXXtSfrOuu/ZwtPuPYZ8KH80Tqwz7oJz02sJLnuqYFkL3VHnaJa0p7d2mXGtMY6U1arKChgj153y00VvGkiMpt0p39RI31aS9rkWR2kMNBCAAgfsQCJuzfdTW7Q+LIGmIVKkuHl3Q5t9h0c6fFqSqolxNaXdf440JZRPTWNaarUzNDr0kkNarKZyhMjJY5c1Qk5xVTSiUzA5ipY+p/rQm9K3bH4R3/2ijN6qVqdnZySqR++qimlRe+tMmam5CQMtDCyZ1vCSj+rBFSIMESsolEDT4eq3SSkEj9lkgi9TnvExulS6YdX5u7L5u0HF7GS7b6fwjTSV97NmOtrbwTK9O21oFR0qyyXVVSr6kXPXqkhaCndJpBVmi+rRGTVbQoKH+nI+BZGlQPcHL/nZDqZfV2xA68wREjpcK6lLXTysEIAABCGwnoM3Zjjl74UJq/fsXtmmHFzTUPbt1W6tvkpL0nFWNDtyKct+kjmlBjqQFs8TbpoxPqLS++ntq1lFGWmtWm28KN3gmHyplpLXqo5xVTShURg+S2Y+p/rQmdKzbH4R3/xj4VPTbAk7/ZkulizUFpAIix0uF7OL5OhwCQxPQ8qjMfklG9aXdQAIl5RIIGnx9abmqvqS8n3khi9TPXNzIErtCtlwe2zXcB7f2LKWNfKRlJNUU9jsFcGm9AVR3++jHaiFs3VPlpfoWnSVLvtrWMqhkWgqLVrgprDuoFFK4Z6j3UqsNIavsL5KmIb5A2c8Khj+MKm0UIAABCEDgIAJ+uw7327ZF207uxWSJ9nDt9mrSWe+bskp8F1+uKFeTl19UzlqSrfRq9ZXtEEtUOlpTVj5UaiDroo91Z3VYe87q21JI9ac1QU/WqZKMhCuFRcYHPmFcfVQKaZFy625DqCMxjKhSSAnoetGCaZdR39JuIIGScgkEDarPxt6h0t+spcb3UEMWqYdZuJcNuoS2uB3Oki2qpu+raEYF77JNR2VSFGH4XiqncYPVNO59FeWL9MgeFbIemc7spi84YceXQiuELb7+sRGCaTbbwnD+oyxcl0JSQjDrvh9IknUUoQsfIQABCEBgLwJ2s/18/tEZ7TXrLMseHDr+srt9qtBqGk+WunKzZ9HZl/Xra6UX8L/z6OtFyVda2ZrCGZetVF9r1UcdlBXIpT/w5JWUyuLsBSoeKUIITvnulkOsxy2+ddE8pnzC0J/PRymkRZqlp+K+ZKxgknUUoQsfJyOgKyh7hZqzJRnVl5aQBErKJRA0qH7dJdDbHJFF6m1G5rdHl9AWV01J6erdonnKvjp605hGJMPTTnGoH8bWKmFFCY3xaEW5YmivvL2cXWaKYFI9ago7fip5UE1K0g8kdxrB+r5WloaWo6syL6lmaiAAAQhAYF8C2rGtEJTbFm1NaSDk+4aO2XeRlIBoOR3qyjce3PLLm52t9AJXZZEUNoQpEM804gpmVz6Ks5fRiL7SymrqM4ZRcLjiy/jmoIC0rFJimHSF3K1GCyZcnp5DSUb1patJAiXlEggaVF/q6M3rv0wWqf85ms1CXUJbHDMlc1yEWzg09hXz7Pmt4zbLU63ZsazVNyl+soeo/rxPvxtVUR70+CFSPb7VynLZN0mnxXZmW/hhhbDj++6HllOSGs5Hh/45oS9LWJeGyPu3/RuTUJV50UAUIAABCEDgOALah9N9Wwdc9sBSa/ZM1xnhLdcpY8eKmuxLQzpNlIQq5Ud0yFoAID3W0evxTSqby8HstDI10uwPoLxT5kgYKNATcIn5grX6Gr2OZA/hdCLbx9Ts0Lf+UZPoxYR3rBjGm20LQ6xU0NrQ+lQNMYxfA5QbCegKCvuJ716SUX3YItRXAiXlEkg11PcZDTFEgSzSENM0lZG6tLZ4tfF43jL0iH3FPN3O/AOirGv1/c5aQ0cfMai7FUKQp9agwT6260m7y+XQVNLp60OXcz5mSfqQXayyBRkpx1OxAF9d0oL6pk3UQAACEIDACQS0D6c3Kjqw0iZ/alRa0yblXDSuCv7s0BGTajAmsk3dVfB6sgBNMmhOK7OmPp9/lHcoWaJBZZJqfErIV6psXfTRCj7BIZ3mZmp26Fv/KM5BrITX14cu53zM8rGhRaZS0KTL8VT46/qRp+qrGgp3I9ByRWixafkZJdVnb5q+7rFeINWg7at9PXc7d2SRup2amQ2z/X2Lh6YhXPZbFE7ft0JM22UWQv0wrkylOvpCGEJNod5/lIwveIFsudEp0ykN4aPqTyiUhpYj3v207C3Mdll0sUi/V0sZAhCAAATOJFA6F5TyyG7sOgIqrZUm7f8qeJfryiWpvr6g1lLBhINtlcqvymWtSWpcdVSNkKZ3fSYTNPiO2b4mH3wJvSofZXlWRvYHq8LHbN+DKitDB2uzHz0o+e4lvcBXF9TxqyQCExP4ugy00sLqUn1pN5BA6CiYEshqkGHZVlNS0qwheiiQRephFm5ng66fdZ7r4lzXnV4nE9hlKwyvo+/iwi6G7WLJQUrCa/8HjYJaCEAAAhCYicD77/928ejocza8f5S1ueVb8NmOqyv1HsSh7h+qfLXvO3YkhtkR5g1V6WZT3zkNr//odjJcSqovZXkkEDoKsgSyGvQ6klkYvuZplSXNGqKHAlmkHmbhdjbo+llxkehszl6Zt0OJwxCAAAQgAAEIQAAC3RDQPWRLkqsbqzEEAlMR8DeMyih5D3WdhrtR1ZfuNCUQOkq5BL5qkGGhEBJe0txVgSxSV9NxF2P8hb3U5y0ZqKVjIQ8BCEAAAhCAAAQgAIFGAmmI628pw71i+rFxFMQgAIGvBOx7DHaVpT/5b63pu4qqLyWJJFBKE0ugpMEst7ftdGOrl5JKar/6e7IAWaSTgTPcPwT8NdMOZV2vdv1IQgACEIAABCAAAQhA4CsBfVPG7hXtnlCJId0K+ltKk6n8+3VQBCAAAQj0QIAsUg+zcFMbdNA2vranFFL2z9XfFCJuQwACEIAABCAAAQicTkBxbCg0hrWn28uAEIAABHYjQBZpN5QoWkHAn7v17u2SdT20QgACEIAABCAAAQhAYDsBH51auf4dlu0jogECEIBADwTIIvUwC/e1wX97/PH4sVd8PQ57DZi3kDwTyhCAAAQgAAEIQAACEIAABCAAgUsIkEW6BDuD/oeATxKlT3VU83z+0ZfM/9OfDxCAAAQgAAEIQAACEIAABCAAAQgcT4As0vGMGaGBgL1zpIRRKKS/n9+gEhEIQAACEIAABCAAAQhAAAJ3JODvp+7oPz4fSYAs0pF0/9atP/DJN6XbWduu1y6PJAQgAAEIQAACEIAABCAAAQgYAbJIrITjCJBFWsNW12TLX2GoZJGsiS9qpXNAFillQg0EIAABCEAAAhCAAAQgAIEWArpjfTx+WuSRgUA7AbJI7az+kfQXZMs1Wcoi+R+WbslGLTZ05A5kkUaePWyHAAQgAAEIQAACEIAABK4k4G9ar7SDsWckQBZp8az6C9L+rFhdRSmLpHoyJilAmKRMqIEABCAAAQhAAAIQgAAEINBCwN+0tsgjA4F2AmSR2ln9JanUj/6s2NdfO1KXIOnfRQpNy2yaUZos0oyzik8QgAAEIAABCEAAAhCAwBkEyCKdQfmuY5BFWjbzPnmkK7OuopRFsl789bEsPbJIWSxUQgACEIAABCAAAQhAAAIQ+EpA96otv8HyVRsCEPAEyCJ5Gt/Luhr9X6Z/v9+VnvUsUqXjnZvIIt159vEdAhCAAAQgAAEIQAACENhCQPetZJG2YNyxbz1psONAJ6gii7QAsvJBdinqK2n176OpV11sgR03ECWLdINJxkUIQAACEIAABCAAAQhA4BACZJEOwbpB6ev1O80fZyeLtGAh+K+zWTddnBUtlSySulcSTO/3W+NK3grZdKaG88LD/Q04M75ClSYIQAACEIAABCAAAQhAAAIQyBLwN4NZASrPJ2CTUrn3P9+kdSOSRVrATZei0jdK2VSWQkVGCrPdK/mj7PrTu1FSGwoye4HPF4ma5RcNzrAQgAAEIAABCEAAAhCAAAQGJuDvBAd2Yy7T/dsh2QzAKO6SRWqdKSWD/DdLs5VBo2TShaJrO236fD5qVcE0h48aTvXeQq8nO4q6d1UwX7oyCWMgAAEIQAACEIAABCAAAQgMQaB0bziE8bMaqcyAzc5At+dhRsgiBSDFj5ryMNm6PkO9FJU61vM7/sWirOZQqbxm9strah3ldSSySFo/FCAAAQhAAAIQgAAEIAABCCwioLvU8IbBIiUI70vA3+PbBA36S0lkkVoXhq7D0EEJmmz65vP5rMsiabiWvI9fjll5CZSMDE5d/tHcv9wMDIAABCAAAQhAAAIQgAAEIDAcAd1OkkXqau6UPfATNFwuiSxS06JSFia8AeSTRKXrc0UWqdIla67ks61WqWVakTmoSebJhoMK6ewc5NFeal+vX/4HAQhAAAIQgAAEIAABCEBgXwL+hmuvmxf0bCdQvzUe5X6WLFLTStBkZ9/00SWanXX1TVtLHVWfHS612OTr7xnJjLT70TUaWn4dVEgJH+2apRFtx2+cLDPJuhzEAbUQgAAEIAABCEAAAhCAAASMQJqfar9zeb/faffX63e7hkV3ahtt8HdtXlW7FyUNi+5ADebXZbkI7yKMewmTRWoiqZn2a05ltWbzOMqhpCtMHUOT6puMy/0OtzSkhUWXSqMBu4uZ2burPUJhZX7rw6VTQw0EIAABCEAAAhCAAAQgAIGjCYTbzxW3Lds11AcNrbrn8mQW2bBdgx/al4OplY9ZG7wqX+75tp0sUmWW/2nS19n8pJbKqTqtlXSVS0loUn2qLVsj+ZZCVkNvleZIb1btbk/LfCEDAQhAAAIQgAAEIAABCEBgNYHd72JQuIVAfR6fzz8hObBlrIP6kkX6DlZpoPp8W2s65eqeNklhaFL9d+P+lpB8S6FR57Vi5si1Ngw9elgJYYEN7RrGQ2AjAV0dXBcbSdIdAhDYkYC2ptLvbO44FqogMBwBu0A4uBdNHLvKIlynCSs54CdI5VEWOVmk7wtGv6Our7ClhcrEa6Gka6LUS/XfjftbwuRT/Y3dOxQzjzo0bCCTtG7nWx4DzQKmdkVAuzE7TFfzgjEQgMDn8/Gn9kwRHZMLge0EdHVwaSyCadEOMc8iaCcIaz37CXo8fsZa3mSRvi8VTXBF1N+cBDE1pStDmkOT6oOq0sel8iU9/dSbR/3YM6Il6Tcxe/5u7YiEsXkgAunlwNP+gaYPUyFwBwIKFx+Pn+zvbN4BAj5CICXgb7nDHVMqTI0noDtEYh6P5fKynxcrj7iwySJ9WUia5q+zK8lwr66wINWgLqFJ22WoL9m6VL6kp596I9OPPYNaorWnlTaoI5gNgdUE3u+3dkhdCMM98FntPh0hAIGBCPg9aiCzMRUCxxEIJ3jjndFx9oylmS2lw/kKd2fjPjMgi1RbXf7xdcgNpd20JsIGV6r/uL+tVuryePx8Hdf+6KC2iRb51Pjeasyd3qwa0Z5w+o67VY0IH5svJ6DtVzukCmHXvdxUDIAABCAQjmyAQODmBNJDnLN70ZJQzMO7SIu4HSqsff71+h36tp0sUm2d+M2rJvd3m085eWEpSTc+Xdtpk1ZYYyKpRX6glWpkPEbKqwlomVkhXWyrNdMRAn0SKL1/5K+FgfbDPiFjFQQgsDsBRYy2WbFN7U4YhQMR8Lc2Or4JYhfNoLiRRVrE7VDhabZ3ski1daJrr3HPkrw/+BUTpEoknzb5nJSJ2d/8sx/2thrfK5UPPwFuXWre9tQ2lrU9kcvYkq4Nvz4zHaiCwLAEWvJHbC/DTi+GQ2B+ArZB2b+8Pjz/fONhgUA2hcS30Qu0itV+PykK0XAigdfrd5qNnSxSbeHo2vP5mkqHbMIoW2lKvuqXQLYQrNJAWWGrrBjfVdNY1naFLmtMWBJh5WS7UAmB4Qi07IG6FobzDoMhAIE7ENAeRSB0h+nGxyyBymlOBJslVqr0+0lJhnoIrCNAFqnIzW9hRaH/NqiLzzKqMt34dG2nTaa4/lw9+0aJhpNyFQb6+qXZ/F+6fFpPgNeR1rOj5wgE7NmO9rqvBb9Fj+AfNkIAAnchEKK4bKR3Fxb4eUsCacgazvRbUlnptEe3UgXdIFAgQBapAKa/6vf7bV9SazRN32gbMQSxXa/RU8RaCITAlLvoFmjI9E8gLGwfMFXKpcR9//5iIQQgMDeBcAvNZjX3dONdIBDWf/YcD134WCHgAVbEaILACgJkkVZAo8vhBGzXO3yYmw0QzmZi05vN/1TuWlbdh0eLyiz+qVYDzkBgLgJhN5vLObyBQJ5A+7Ge709tjoDfTHLt1EFgPQGySOvZ0fM4ArbrHaf/tprDrxVyL33blTCo4+1Rpo+c0vKIb2gOOmWYDQEILCUQXrFkv1oKEPnhCITHnOmp7WuG8+5Cg+F2IfzphyaLNP0UD+mg7XpDmt690f5E4a9ddD9dGPgPgaW/fBTWefgIVghAAALdEgh31Dzv6XamMGwXAmHBh/M6+3GXce+gxNO7g7/4eCYBskhn0masVgK267VKI7eEQHpa85xzCT9kzyOwb+aIWOq8mWMkCEBgG4Hw4vA2ZfSGQL8E0qDUH9alcr/+dGaZB9iZaZgzPAGySMNP4ZQO2K43pWs9OOUPFV5H6mFGsCFLICzUHT9mh6MSAhCAQCcEwpfaOrEKMyCwO4F1J/vuZsyq0OOd1Uf8uooAWaSryDNukYCCJ/6OWJHRtob0yQ+vI20jSu8DCdifmwxP5n1gtKJ8oLmohgAEILCZQDim+VLbZqIo6I5AWOSLjvLunMEgCNyPAFmk+8153x6HQ4XsxkHTFe7JSdgdxBm1+xKwjNKiWDMV5n5s30lBGwQgcAQBv3dxRh9BGJ0XEtADY7/O28uc4xfOHUNDwAiQRWIl9EVA2Q0V+rJvImtE2I5tjuSJ5vYWrtjfawvLuCUGZanfYn3gJATGJ+A3tPG9wQMI/EUgPC32i7y9zDnOYoLA5QTIIl0+BRjwLwGdH++///Mf/xWitBOB9CDnza+d0KLmbAKL3lEi+jx7ehgPAhBYRcBnydm4ViGkU18ENr6CpPsCLoe+5hVrbkmALNItp71LpxUt6c1tHTaq6dLwsY3SkWyFsZ3B+hsT0AYSlnT6kejzxssE1yEwEgFFQRzQI00btuYIvN/v9mM6PbjTmtwg1EEAAucRIIt0HmtGqhDw78V4MR053Ph5LDuWPXk7pHkjaUe8qDqHQLjXSsNNX8Nmcs6kMAoEILCdgN+7OJ2380TD+QTs6+d+Je9SPt8RRoQABDwBskieBuXLCOhECTd4/ubwMuNmH1jwrRCmYHbv8W94An6X0BoOq9p/ZIUPP+U4AIHbEGDvus1UT+uoX8M7lqflhWMQGIQAWaRBJmpqM/1NYOqoWrn3S+HsUsPrSLtgRMlVBPTGooWntlFUQtWr7GRcCEAAAksJKAR6PH74dv9SeshfTsB+tbD933CgV45ybgoun1wMuDkBskg3XwDXu68URiU80qHC69wHTZgI24FdmYuDDEAtBNYRKC1dbSxpDLpuIHpBAAIQOJ9A2MrON4ARIXAmgXCmpye4asginTkvjAWBlABZpJQJNacS0IFRzxCR3Th6VjQRoD4aNfr3IhDurx6Pn7CNKNz0hb1GRw8EIACBEwj47evx+DlhRIaAwFUE/Gr/+oNKVxnJuIGAzdTz+SfEYEGMj5MRIIs02YQO5o5e1f76SEG3i7wmc9Aci7COcA6Dg1Cjdi8CWqtWSLeRdFVzD7YXfPRAAALnEFCkZBsdR/M52BnlfALhTDcDsue4SZ5vISNmCeg5dBqGfT4ftqwstAkqySJNMImjuqDAqDExVN+kRqXQk92aER3kPVmHLRD4DwFtCLZcS9tIECOL9B+IfIAABEYgoEP58fjJ3qeN4AQ2QqBGIGSLwjpPj3KuhRrNc9t0+xASRtq4zjWH0U4iQBbpJNAMEwj40yJsOkHSf9R+FE4XuVrbRgAAIABJREFUL0N5CwGdBPU78y1D0BcC2wn4DcTWamUb0b5hhe2jowECEIDAmQTCLfSZQzMWBM4hEOLP9EwPVwFZpHPmZcsoir62KKFvtwTIInU7NZMbpp1lUT7InzGTA7rOPU0Nt9zXTQIjfyGwaJX6fYN3kb6QpRkCEOiPAJtYf3OCRTsTaDnWw4XAgb7zHOytTnO6t2L0dUGALFIX03A3I/x7BOnThjoNbUmL0k91nbR6An52+NPCngzlTgiEOLJlK/DPMDvxAjMgAAEINBII53LLpteoGTEIdEJA4X098vSn+VhZJPsJ6tfrt379mkBdJkyZNId6+02i1+u38VZLerLyXy1PR9ecpk3UTECALNIEkzieC9pWsvtU3R8fS63oXldOqxFYcZcOOgicQyBEkKWfQwrG+H0jNPERAhCAQP8EFDjV77H7dwQLIZASCGFnPbz3wouyLem459R4g3Uhp9FLCG9MMuugNX0+n1Sz0FWa5LXJWJopjC7zXq/f0KQhgh7/HUO5mRbUi8LoBMgijT6D49mvzSi7M7b4o51Re1xLL2QWEdA02QEA6kX0ED6IgE8G2cpMo5nS0No3SgLUQwACEOiWgHYw2/q6tRPDILCCQIg5WzRYl86jUx+0PJ9/9J6RleWmd18yyr+kPlqT9gTrInkNaqN45SFkMg1Bj+Stu8aSmM8WmQtq0p1dMElOSUC+UxiXAFmkceduSMu1tW3cR/bSMyTEU4wWYX8snTIyg0CgSECrUWFNUTTXoIAp10gdBCAAgX4JhEN5YxDVr59YdksC/nBvX9uW7wiZkX74+Wu2YqTE0myRmgIT4fJqJWytvklZnjBEqV6JpDRhlB1aekp29jMpWLIjAbJIO8JE1XcCtvuEXex7t5yE9ji/UeYEqVtJQKeCzoyViugGgT0I6JLfso3YA7E9zEEHBCAAgVMJ6Cy2wqljMxgEDiMQos1FUb39lM9hpm1SrKCl7pGu6+xgUuJbS1GQSIZszufzyY4i+dTCRUNITxg3O6h3hPLQBMgiDT19gxmvrTDdrdZ5Utrj1mmjV0pAUwbqFA41ZxIID9nG+k3NM0ExFgQgMCsB3arZibxXKDUrLvwahUAINUcx+6uddp2GxEropdimJKar3ncsac4Kq6P10kf/s0q+0sqlIZSQ8gZrXF8pSQK2FO8cNWSR5pjHMbyobEnrHChtW+u00SslIMI2d5wEKSJqziGgFbj7NnKO/YwCAQhAYCOBcCKHG7aNyukOgasI+PN9mlWtq7VOtUUsDXvSGhulrs16eXsq8qUhlBvyMyU9vlKS3Dt45jOVySLNNJtd+6ItZt+nZ7bN7fIVua7xXWdceEYE6uum4r4ja/ew652I5L5LAc8hcG8C2gP5S233XgjzeK+XcSppixG9VdxSN75FLCWT1tgodW3Wy9tTkS8NodyQTxhJj6+UJDGbZz5TmSzSTLPZtS92ToT9ZbvFpnbfzNR2qybTYGeJ/oX2ZPPbuTuKTmwFksfsfL4wDwIQOI5A2A+PGwjNEDiHQHhUec6gJ4yiS7U+VotYmtBJa2yUujbr5e2pyJeGUG7I39BJj6+UJFkkz3ymMlmkmWYTXyBwFIFwzIdz4qhR0Xt7AuEp5ePxQxLz9osCABC4NQG7u6vc492aDs6PRmDW9azESn1CvoopCvLBT+nyr2uzXt6einxpCOWG/I2A9PhKSZJF8sxnKpNFmmk28QUCRxHQMabz3p9nR42K3tsT0HqrBDS3hwQACEDgRgR0w8aX2m4065O66hfzfLkGBTD12auLCZFXUoqIssLqaL30kV/X9igoryBAFmkFNLpA4I4EdDjVD7w7osHnYwiEN+D4LtsxmNEKAQgMRkCn8Hw33oPNBOZuI+BP+fAayzbFXfSWd/XopSKmJ7gBDlmkLib49kaQRbr9EgAABJoJ6KizA6x+LjZrRRACGQIKnnS/lBGiCgIQgMD9CISz+H4A8HgSAjrfp/y6ug9jns8/ygS9Xr+v16/e6A9imlo9u02D7VGySN6F9/stAvKRwtAEyCINPX0YD4FTCeg80MF/6vAMdicCWmOlaOlOMPAVAhCAwL8Ewln8bwMlCIxD4A7LOPjoAxufUqmIZd83LMVF0pNdBdbLN1XkS0Po146y9vtKG8i7nPXF20N5LAJkkcaaL6yFwMUEwiPQ9AnJxfYx/BQEFNko/pjCLZyAAAQgsAMB//LC4/GT3rntMAYqIHAwAX/Qzx1Mek8V1YTL9vX6DQG2/fCZXlnys1FK8WggL6yy9dLHE34X6fP5hM3Kj055dAJkkUafQeyHwNkEdASWjrGzDWK8uQiEmGPKF93nmjG8gQAEzibgD+K578DPJst4ZxHwazibKznLkPPGaXQzJJjOs++wkd5//3eYehRfQ4As0jXcGRUC4xLgJn/cuRvC8vA4br5waohZwEgIQKBnAnrpwG7FG+9Oe/YI225FICzgW/mOsxCYgwBZpDnmES8gcCqBcPzzIPRU+lMPFpYWKaSpZxvnIACBlQTC4xy2ypUc6XYRAf8iEqv3oklgWAhsIkAWaRM+OkPgtgS427/t1B/neFhUZCePQ41mCEBgdAL+PpyfrR19Nm9lfzjreZPuVrOPs9MQIIs0zVTiCATOJsA3j84mPvV44dE6N0VTzzbOQQACWwlwK76VIP0vIhCix4usYFgIQGATAbJIm/DRGQI3J8Cz0JsvgB3dD2uJV9x3ZIsqCEBgPgIhi8SeOd8Uz+qRP+5Zt7POMn5NT4As0vRTjIMQOJBAeKDEV5AOZD216nA7xItIU882zkEAAvsQ8HfjnL/7MEXLwQTCcU8W6WDeqIfAUQTIIh1FFr0QuAkBH8U+Hj8EBDeZ9x3dTL/Lxq8k7IgXVRCAwKwEwoOcWd3Er5kIsGhnmk18uTMBskh3nn18h8AOBEgB7ADx3ipCTMkT9XsvB7yHAARaCYTzl6c4reCQu46Af/TIcX/dPDAyBLYSIIu0lSD9IQABsgCsgdUEwsvtfJdtNUk6QgACNyTAPfkNJ31cl8OJT95z3KnEcgiQRWINQAACOxDwgSzfa9sB6D1UhAfpj8cP32W7x8zjJQQgsBsBf/7uphRFEDiAQHjoeMAIqIQABE4iQBbpJNAMA4G5CZAOmHt+D/LO3/zwFtJBkFELAQjMTcDfmfNyx9xzPbp3/tDn62yjzyb235wAWaSbLwDch8CeBHx8QCy7J9kZdfnVwvtrM84wPkEAAmcQ8N8S4uQ9gzhjrCLgFyqH/iqEdIJARwTIInU0GZgCgdEJ+CeihAijz+ah9odokheRDqWNcghAYGIC4V3giT3FtaEJhHN/aF8wHgIQIIvEGoAABPYkwAsme9KcVFe45+HnkCadZ9yCAAROIuBPXn5d7iToDLOQgF+lvDS3EB7iEOiOAFmk7qYEgyAwNAESBENP3znGh3fW+HGEc7AzCgQgMCsB/5YHO+qsszy0XyE4HNoXjIcABD6fD1kklgEEILAzAXIEOwOdS52/23k8frjhmWt68QYCELiAALfoF0BnyCUE/NHPi0hLyCELgU4JkEXqdGIwCwJDE/DvLfMDSUNP5b7Gh1sdvsu2L160QQACtyUQjt3bcsDxPgn49cmXLvucI6yCwCICZJEW4UIYAhBoIkCyoAnT/YR8HEl68X7zj8cQgMBRBPy7HiToj6KM3lUEwuJcpYNOEIBAXwTIIvU1H1gDgWkIhKCBF5inmdnVjoQlwd9lW02SjhCAAAQCgbDBcuYGPny8kIB/gMTKvHAiGBoCOxIgi7QjTFRBAAL/EuB1pH9ZUPqbgI8jSSGxKCAAAQjsS8Dvsfzk3L5s0baaAPnN1ejoCIGeCZBF6nl2sA0CwxPwQS2Jg+Gnc4MD4TfXj/5ZhNfr1/63wWS6QgACEBiJQNhmRzIdW+clwLKcd27x7NYEyCLdevpxHgJHEwhvJPF09GjgfeoPjyJPWAZKX/YJBKsgAAEI7E4gHLh8dWh3wihcQUDHMX+VdQU9ukCgWwJkkbqdGgyDwCQEwmMo4tpJ5rXZjfNTSJ/PR2Frs5kIQgACEBiegLY+7tiHn8spHAgBABHgFLOKExD4iwBZJNYBBCBwOAESSYcj7nWA8Gz8tL8cpFupXsFgFwQgAIH9CYSb9v0HQCMElhAI4d+SrshCAAJdEyCL1PX0YBwE5iBwVSphDnpDe6FsjhVOew6pcYemh/EQgAAEFhEIp+1pW+4iIxG+DwGdxbwcd59Jx9ObECCLdJOJxk0IXEwgPCDll7Yvno9Thr9w0hW5nuIog0AAAhDohYB2v8fjhyxSL7NySztCDMBqvOUqwOlpCZBFmnZqcQwCXREID0hP+2ZTVxDuZoy/mdn3fubrn2DT0Hdjjr8QgMDNCfAdopsvgH7cD1mkfgzDEghAYDsBskjbGaIBAhBoIhDiCV5HaqI2rFC4k9nl77KluUh7ST59wpnNImkF7mLMsDOD4RCAwMwEtNHZNphujzM7j289EdBBzNfZepoWbIHAPgTIIu3DES0QgEALgSMyCy3jInMygTTd836/N9rgF4/eRVKQGhJDqtegurMKkhKgAAEIQGAOAtoAuXufY0JH9CKEAWQzR5xEbIZAhQBZpAocmiAAgZ0JhKiC77XtzLcPdcrX2J3MLlkbrZw0G6Xskg9SdRNlSNR9F2P6wIwVEIAABPIEwiacF6IWAkcSYBEeSRfdELieAFmk6+cACyBwNwK67bdb/bu5P7e/ytcoj5PmfVYQMG0+TyQlfkRVavTP5yOBbHd1oQABCEBgGgLaA/f9Tbpp+ODI0QRYgUcTRj8EriVAFula/owOgTsS0F29goxdEg13RNmfz5pTK+ySuNGCKa0TDSoevsbKpb7qQgECEIDANAT8myC8gznNtI7iiF9+/AjmKLOGnRBYRIAs0iJcCEMAAvsQCBEGQcY+WK/WctC0Sm3Fv5C0UhbJ+u6SzKqMThMEIACBrgho27TNsCvbMGZ6An75cf5OP904eE8CZJHuOe94DYGLCejtEt3t86rIxVOyx/CaTSvsFTsqHq3YGEYMlvALXBV0NEEAAlMS8NvgXrvxlKBwancCrL3dkaIQAr0RIIvU24xgDwTuQkCpAUUbd/F8Uj/Dz13t+B0KLZUKOVtFulPSono+/8iwSneaIAABCExGQDun7YeTeYc73RJg4XU7NRgGgR0JkEXaESaqIACBZQR0e28x7o55h2V2IL2ZQPpy2WaV/ypQSPpv1X9LEtAbbcoimaA+SuC/CvgEAQhAYDYCYVtWkn02P/GnMwI6cB+PH+K6ziYHcyCwGwGySLuhRBEEILCUQIhx+drRUoCdyJ8wjxaVlu6CFLMKSKjxFkqGAgQgAIG5CWgn5H5+7onuxzs91Kmf2v0YjCUQgMA6AmSR1nGjFwQgsA8Bf3tvMcc+etFyIoHwTlkp17PFIg2RvkykJj+u7p00qMR4NComFCAAgbkJhFv6uZ3Fux4I6KglouthOrABAscRIIt0HFs0QwACTQRCmMtNfhO1boTC9PlUzo42+myjH0IBa1g2aRbp8/nIVK9hRyNRBQEIQKArAn7nfDx+2Pq6mp0pjdHhy3qbcn5xCgIiQBZJKChAAAKXEdDtveKPy0xh4IUENGVWWNh7gXi6SPzQQZGaGuuDGB8hAAEIzEFAmyF39XNMaM9ehGOarGXPk4VtENhIgCzSRoB0hwAEdiAQnpfyA0k7MD1Fhb8/OeEWJUSoNno2TpVhAYNWWnh3KYjxEQIQgMAcBPTCpu2KcziFF30SCGd0n0ZiFQQgsAsBski7YEQJBCCwlUAIPh6Pn60a6X8wgXBzcnJeJps8Othj1EMAAhAYjEA4W9k5B5u/oczV8xt+zX2oecNYCKwhQBZpDTX6QAACRxC4NitxhEcT69RLPYoaJ3YW1yAAAQiMS0C7NPf2405i/5aHqIB8Zf9ThoUQ2EKALNIWevSFAAT2JBBCEL7XtifcXXUxU7viRBkEIACBAwmEJzQHjoTqGxMIb73dmASuQ+AWBMgi3WKacRICoxAgPTHETIV7kpO/yzYEIoyEAAQg0AmBcHvPSyKdzMtkZvDK22QTijsQqBMgi1TnQysEIHA2ATIUZxNfOF64IeEXrBbyQxwCEIDA2QS4wz+b+M3GC4EBmcqbzT/u3pEAWaQ7zjo+Q6BzAj7ePeEvf3VOozfzmJ3eZgR7IAABCNQJhH27LkwrBJYSCFmkpd2RhwAEhiNAFmm4KcNgCMxPIIQjfGGqnykPU8OLSP1MDZZAAAIQqBDwiaT3+12RpAkCSwn41UVgsJQe8hAYkQBZpBFnDZshMD+BkK3g7egepjxMCtm9HiYFGyAAAQi0EPAbOEdqCzFkGgmEX7Rs7IUYBCAwNAGySENPH8ZDYGYC4QeSiHqvnWx/B2JPHa+1h9EhAAEIQKCdALf67ayQXETAhwc8XlqEDmEIjEuALNK4c4flEJifQHhHmpfwr5rycPvxePwwF1fNBeNCAAIQWEfAH6ns4esY0isl4NcVD/xSPtRAYEoCZJGmnFacgsAkBEhedDKR4b0wHjZ2Mi+YAQEIQKCdgH9nhLv9dm5IVgiEOK0iSRMEIDATAbJIM80mvkBgQgL+GRd/r+2SCfY3HjYdl5jBoBCAAAQgsIVA2My3qKIvBIyAX1SkJlkVELgPAbJI95lrPIXAkATCYy6+S3X+LPIi0vnMGRECEIDAEQT8gxnu+Y8gfDedPkJgRd1t9vH3zgTIIt159vEdAmMQ8DHK4/HD16nOnDb/mBH4Z5JnLAhAAAK7Ewjn6e76UXg3Aj4veTff8RcCdyZAFunOs4/vEBiGgA9T+F7badPGi2CnoWYgCEAAAicQCA8GeHnkBOYTD+FjM57wTTzRuAaBlABZpJQJNRCAQHcESGdcMiU+QHw8fi6xgUEhAAEIQGBHAn5j585/R7B3UxUCMzKSd1sA+HtzAmSRbr4AcB8CIxEg9j1ztsIXH/iz0GfCZywIQAACBxEIe/tBo6B2egIspOmnGAchUCFAFqkChyYIQKAvAuHBF7+0fdz0hG898Lz6ONRohgAEIHAmgbC98wrJmfBnGosHezPNJr5AYCkBskhLiSEPAQhcScBHLfxA0kEzEe4x+C7bQZxRCwEIQOASAv4kJYt0yRSMPmiIE1hFo08o9kNgKQGySEuJIQ8BCFxJgNeRTqAfXlPnRaQTmDMEBCAAgdMIhE3+tHEZaBoCIYvEd96nmVkcgUAjAbJIjaAQ20rg9frV//xDsC1lKbTCVhPpPwiBEP6uy3HwHlNptkNouA5vSTn1EIAABCBwOYGwz5MCuHxGhjMgRO/D2Y/BEIDARgJkkTYCpHuegKV1wt1+OHKO+6jsUt44ascnEBbP0lepbWUu7TU+tu8e8KrXd0ZIQAACEBifgD9GOQ3Hn89TPQihAuvnVPoMBoE+CJBF6mMeprDi9fr9mjZSfscKKx5/vd/voMRHQmn5+fzD8TbF+vqPEyGCWfQz23oGu2L5/ceIGT+EK4hrZ8ZJxicIQAACnxCwQQQC7QQUR1nMQDTVjg5JCExDgCzSNFN5mSPv9zvEInaoWPrm5LtQSzCV7OGcu2yVHDBwCGIafwHap58OMGpsleHC4btsY08n1kMAAhAoEwhnKAFSGRUtkUB44BSb+QwBCNyAAFmkG0zyYS7aa0H+LLEkzmEDLlacWrjopZXF49HhXAIhCG7JevhEybnG9j6az6/xdLH32cI+CEAAApsJhPhtsz4U3IJAiBZOflp8C8Q4CYERCJBFGmGWerXRxx+Nb4Jc5cpApl6FaNBxF81syDoN6vJBZi8ieZANqIUABCAAgdMIsO2fhnqmgQilZppNfIHAagJkkVaju3tH/yxiiAcR3mDe3J5m+fppfTx+6q8j+ReROs97njxBISisYzzZNoaDAAQgAIGDCPhEEqHRQZAnU0soNdmE4g4E1hEgi7SOG70+uu0cIoVkEzaizSy1rwRCQFNakEGMLJLA6rqw2wlSSCJDAQIQgMDcBPzJWDo95yaAd0sJ+Mzj0r7IQwAC0xAgizTNVJ7tiL/zHOL5lf8VcEKls5fLweP5OPjx+EnnN7yyZDHQwUaNoT4lM8TlPAZcrIQABCDQNwEfy/Fwpe+56sI6v2B45tTFlGAEBC4iQBbpIvDjD+sPEvsmUbc3n+lvbKdZhvEn5NYefE2F+EdnKt8a2f+cFw0rcGn8Dwz/DwEIQOAWBPwpwBFwiynf4KR/aMdq2QCSrhAYngBZpOGn8CoHQhZJUYj9mbYeMkpmiQzzBU6+q5bNceOmC9LGShNMWgnHGTOKZh8Ofv1VqVGcwk4IQAACEGgnEA6C9o5I3o1ACLTu5j7+QgACngBZJE+D8gICOks+n39/I0n351Z4Pv9YKueErI0GCvGQTDIb7OMJ9ixAiehOBMLU27vWWgBp4ebLIM2v9ZD83WktoAYCEIAABJoIKJwjQGridWMhH0fxdbYbLwRch8BfBMgisQ5WElDYof6q8cdMtqwuGwtZ5WmlTxZYq6/ZaAPd+yGQrsC0xi+Pmy8DjyL7Y1L9zCyWQAACEIDAcQT8cXDzk/E4yKNrDgEV62T0CcV+CGwkQBZpI8D7dtdxEhDYjxCp1YcmLWX/+lLlK2lfVenVpGCedeTwC1im+RheR6qvkzsvg/RFpGnWAI5AAAIQgMAiAuHoXNQX4ZsQCIE9Ly/fZN5xEwIlAmSRSmSo/0JAx0ldTkml1+s3hCn1O/z2Vp94+nqqkUWqz9forWlypLKQbptF0sVrcHgvffRlj/0QgAAEthAIh8LXUGrLWPQdlECIpgb1ArMhAIG9CJBF2ovk7fQo5tjouV4aaixsDG7IIm2cr867L3p/7Z5ZpDTRtvGa6nxJYB4EIAABCHwl4HME9zwcvyK6s0CIHFghd14M+A4BI0AWiZWwksBeWaSVw6/tRhZpLbl++9n7bj4CbizfMwwKcO4Jod/VjGUQgAAEriAQ3ha/wgTG7JeAYn4LIXj41O9UYRkEziJAFuks0tONoxNlLM/s/OPOeaxZS61d9M5RyJvo4w2/yRXuE25IIF1L1EAAAhCAgII60gQshpSAAqfH44fIIeVDDQRuSIAs0g0nfR+XFXDso+4sLXYQkkU6i/ee4+ySOfKR0OPxs6d93esKb6Q/Hj88Tux+0jAQAhCAwEkE/PlIpuAk6CMME4IHQugRJg0bIXA4AbJIhyOedQCySLPObId++dB233KHzh5nUkBHIHgcajRDAAIQGI5AOCOGsx+DDyKggN9WyEGjoBYCEBiLAFmksearI2t1qHRkU4MpdgRy/9yAqiORI95CulswFJ4l3u09rI5WM6ZAAAIQ6JKA4jo7H3lZtctZusCo8F34CyxgSAhAoD8CA2SR7AZy6W3/++//TgB+2kAn+LJoCEUbi3pdLkwW6fIp2GjA6/UbAhqb03X/bjRmlO5pConbg1HmDjshAAEInEMgnBRLA+9zjGSU8wn4+IpVcT5/RoRAnwQGyCJp82onqATH0ZudBrrhg3353j4vPUjacjp6YfTg6fQ2aAVqi1hRuMlKCHm3m3g9/SWAgxCAAAT2JRCO0X2Vo21EAiHW4hHUiJOIzRA4gsCcWSR/Cm6nVrnj8gNVxLbb0KEGnSsd2lYxyabsbpNVATJBk5aivx4by3dYCYHPHVyeYFXjAgQgAIFLCPjTk5TBJVPQ1aB+PdzwkXlXc4ExEOiKwJxZJD1433K/5G+9SnOmgW64sYpPCU6f9XYcblkYffqFVVqQIeKpf5x+JQQs/NkdrhQIQAACEKgQ8JHt9EdkhQNNn88nfMkRJhCAAAREYM4skm18Gx+h+Lsv8UoL/C5SyqTnGrJIPc/Odtve77e/cuspJGvdPmi3GkL893j8bNwVu/UUwyAAAQhAYBcC4eDYRSdKBiXgAyqeQg06iZgNgYMITJtF2s7Lb53btc2nQXzGco0s0ljztdralvzR9FmkAIGnyquXEx0hAAEI3IeAPzvu4zWepgT8SiCESPlQA4E7EyCLVJx9ZUlu+G21IhTXID6uboCinYichQNM1WYTtUR9GJSWN4/TqYLwPJl9rNN5wiwIQAACnRHwX2rj7Ohsck41x4dMvMt8KnoGm5SA/aXpOZybM4tk32p5vX5LW54EXq9f+5+XtBp/iErMCpp7r0eVVlAX1avm+fxTsU3yQY/18ukPU+gt9329bXVJ36u9rFv09i49SJJF6mEWTrPh/X77C9nHQyr7a+o0w44eKE0hlTaKoy1BPwQgAAEIjEVAAZ4dlBwfY03fXtaGZbCXWvRA4OYEHo+f5/PPBPvqnFkkbXzp/WH9rtKWtW4vSwWtfg2UPqtR3/TX6dRU/45xeh9oHbXy7OMiH1Nh+bK0IN+XdrxWvgTtWqsY/WgCWq66+lTY8aI42ot2/SF3Vt9q2tUiCQEIQAACdyCgI/Lx+JnylLzDJG700QcSrIGNMOkOARHQldX+Ton6dlW4XRZJM2fnor2kY4elJsafndmyJP2tqSqtoI4hGeQNMJlsMjL00ntMUvv5fKyc7uwaQq8vyc5g5JaPR+jcYk9j3xK0xu6IjUuglEGeL8Oia9NvF+NOHJZDAAIQgMDJBBRJ2jly8ugM1wMBhRD8aY4epgMbpiEQovT0Rn4UT++VRdK0pROWpnIknL5npNmtyGjztZM46Pcd05tYn0JKTQ1HexCQ5lBvr0TJ8u0FDbRd1ZkabF5SOGfawFgXEsjmki60Z/eh/e5hqz1sPruPiEIIQAACEJiMgGI8zpHJZrbRHd3F2LdvGnshBgEItBDw15eVR7wzvWkWqWWC/Qlakq/I+PWRvYvzyaCgX02lJSWB9E1jmRR07v7xtIH2tXzca3VfDjfXptVr62EmGn5zSPeHmTzFFwhAAAIQOI6Aj2PT553HjYvmywmEx1Glm5HL7cQACAxKIMQNtysqAAAgAElEQVTq2mzHutbIIhWXn7/PLAlVZLQgSq8y+b5h0ahvy7ihr9SW+u5Vf9pAexlseoxtgLbvEGgbhYAutGnWgzxinY+yCLETAhCAQJ8EwoHSp5FYdQQBRfi2Bo4YAp0QuDOBcImFzXaUu5KbZpFaHqr4CS4t9IqMFkRlKWRlpLNuZLbv5/Np7F7yqL1eA7V36UHSuFUmpQcjseE0AqWnAbq+hi6chrGfgbQvDT1xMr4fsFgCAQjcjUDYTrOv1d+NyU38DaHRTbzGTQicRiC87qeoTwX9Ka3TTFox0L2ySGHO6qkEf3yWyFZktA4qo2RlspWpASUx76P9unbad5ca+b6LttOUGLfKpCy1RGftIp2ip3m0Qvvox2lY5EiwfwXerIbSG3xZPpqCoCornFb6SyZomOPjrSa0tBjmmErzYrgJ3b5ZlaY1vZxLNaXLvCSf1m/XoL+JEVYjEyogKfZSzfbp2K7h8/lkV+Y0ExoQVfzKclh0joexLlkS009o6WpK68U/FFLJUg0TKjKBoT5K4Gth+xla0lC5qINVpQndriEMVP+Y3WrabTjuGl+03ZWmQ2vDF3pO398ri2S/MO3nxn40LjtDfo5La7oio1Eqizsrk61MDaiIpZf6ERlN+Z7a1nONcatMylLj3++3/QW97CqqaNPf3fOFinxo0ri++yK/ShoWORJGt4/bNeziSCBW+ajFrMtq6MLr9ev/PuP26diu4ZwJzYYXQ0+lGe9nc+nfhZ3jCi1tVpWLOm3KokjFKjUHadh+fW3XcM4VKrbTTGjWke3TsV3DXhMa9k/NYChkOSyywV6lTy+xMFD9Y9p9qQ1ZR7ZPx3YNixzJetGuIUREnmqdf2j1HVUOMvWP6uUL9S6hNYti+3Rs19A+HXbr6gmoHJytfMxy6CScqJidNmUdWTQd2zWIfyik1pZqzIawu6Yfj7h5L5m0rv52WSS7GtObjfTrY34bLcGtyGg1VHaKrEy2MjWgLpb9Q1Spj6na9hr53t6lB0njVpmUHozEhpMJZA+VcDwM9PFkep0Mp119oJmqmKodnr+P08kCwwwI3JCAIj3bkRbdrd0Q1xwu+9Nn0RsWc7iPFxA4gUDYWsNFN8pd6h2zSFocaapFTf4Hhip7qF8Evq9/cb2yFLRovEy2Mihv1G9e6OZq3z/YJN9T23quMbweeM/WYhsEINBCQNtRZbtu0dOPjN+3p3GqH7xYAgEItBAI77YTO7VAG1qGGR96+jB+FAIhxrOb0/5fPgp4b51FMhZ+Iv0B2XJbUpFpSQZlZbKVYdras0ipj6mqdTXyfV33q3oZXj/RV1nCuBCAwC4E/B4+TcJFGyxb1i6LBCUQgMA6AmEvWqeEXqMQCNPN22ejTBx2jkVAN/tWGC5/ZLTJIv3FQXPpkwt+Jy0tzYpMVmfQk5VRZeV2yI/rbQ76/Uep9ZVbyrJhi5Lz+xqHRmjnm8eIEIDAIgLaiHbf4haZcYSwPNr3NdIjTEUnBCAwMQG/F03sJq75GyKbdJhAAAK7EwiB67j3pGSR/lobOiD9RPo5Li2gikxWZ9BTklF96SGAf/bubQ76/Ufp9JVbyvJ9i5Lz+xqHRmjnm8eIEIBAO4Hw7r1d3e3dO5fUpj2ZX51jxzwIQCAQWBFzBg18HIWAP3f2/TXVUQhgJwSOJjDNjkoW6a+lok3TJxf8/Ymv92tLmZT0vaGsTt+3NG74SaY0keQNa39GLXuCDas/yvfVGi7paBxKE3qJSQwKAQisIBB2wt23uBUm7d5FTj0eP+lZsPtwKIQABCCQElC8x4/9p3BmqvET3X5/MRMBfIHACQSmuRUdKYtU+XM21qSJ1z4YkgUmFmJxnxGUBisogtf3FUNfDbRvFunz+XirvONWH1q92XUfAxDfcWlZvi/teK38NJfutRgZHQLXEiilkCbLtmibJaC/dr0xOgRuTkDxcBru3pzMTO77mwsmeqaZxZd+CFhcF/IJ/Zi3yJKRskj+DMuW5bki75A0yfayyux7m2E/NUmNEl4a8vWV94y8mOwJdppMdnQ9CCr1VX1ayPro7VlUFuRFvS4XNixZ4JfbhgEQgEALAW0+6S43WbYlJMta4CADAQhAYHcCPiIlgtodbycK/ZHaiUmYAYHJCMyRP7JJuVcWqXTvUTkR0y5+NftWX79LFunz+bzf73Byy1Tt9aoxA7xJkjnizkoDBcc7/2hMArTObcY8CEBABPyW6Lc4lSe7uuXXZK9ZaUIpQAAC/RNQyGc7Uv8GY+FSAn6K933qvNQS5CEAgSEIDJBFOoKjviPWqPz9fr9ev12lD3VrUbJqqY+NKCSm80Y1QxSM22T3mUOQx0gIbCfwNYV0RMZ8u9lbNGinnc+1LVjoCwEInExAYSd70cnkzxnOH68EyecwZxQIDE3gplmkoefMjNdxfpUvure5yoB145JFWseNXhC4nID2HO1+2cJk4W/w+vJZwAAIQOCeBMJ+e08IE3vt53diN3ENAhDYiwBZpL1InqrH31ecOrAbTDa4ugGKdkxOdp85AHdMhMA2AuEXgny8G8rzvYrvHWTv2raO6A0BCKwkoKjPdqTSi/ArtdPtUgJhci+1hcEhAIExCJBFGmOevJX+burCOwodOd62/ssW/VzIrX9EWAiB3gj4Tc+nVErl3uzfaI//ogF/N2cjTLpDAALrCIR9mDhqHcYOezGzHU4KJkGgfwJkkTqdo+fzT/aEDnv9hdaTRboQPkND4CYEwo5XShuF+sngaLM1N7NHw2Qu4w4EINAhgbl32g6Bn2NSOGJ4y+wc7IwCgdEJkEXqdAbDUZ39eO1Gr1OnU4IFs7gNK4ChGgLdEViXQprybR1/BMz3lb3uVh4GQQACOQIK/GxHujYKzRlI3RoC/nyZ8gD1UCyuGPphjC5D7xflLAH761i+yWr0F6j2XQlL7zFlxufzsbfOx9pUySL5pdVROXyFIWzx+y76dW4PuostvcLXwaEXBCCwkcDqFNKUfz8onAgb2dIdAhCAwDoCPhztIRZd5wW9RCActdPP6ePxM/qTmEHvv7TkziyEgNBvX6G8S/pm6T2myduCtCtxrMVJFunMxbx4rDRjussqX2xHrsOgu9jSKzznOnUQgMCxBELSJBz2Xz/OFwdrv2UHO3bloR0CEKgSCJtzVZbGAQiEw6Wfu4zd2SlfNrqPmrLdEU2m0ED5gNAiKPvRGL0H5EPKjQQWRWiaR1momo1mnNadLNJpqGcbaLi1bhOw6Aqfbc7wBwIjENDe4o/2RWUdySO422qjJzClg60gkIMABK4jEPbn6wxh5H0I+JNl7q+zaenuA+46LdM4cjRCA+VHsdWeRlC6CtIm3/1ruaQ/2zE7j4s0ZNWeWUkW6UzaU42VXf39ezjW9dk/TyyEwL4EwoNuHe2LCmO9EtwIMBBo7IUYBCAAgR0J6IUOoqkdqV6oyp8sUx6dYjvNih30/ksTcVrBZtwPV1oD2tY2XgIl/d4GlW0ew4gWA29MZmmIowtkkY4mPK3+QXexRVf4tJOHYxDoj8Au+SO7wKd8oKot13wc/Z38/hYgFkEAAk0EtM1O8BMzTQ7PKxSOlVHuXVdMiNIEExydmrUVHO7TxSiFHE3lHlDb2hZEFf2p2qzwWJNLFimdVmqaCIy10OVS9qJVKwUIQOB8Au/3e98U0pRZpM/noygn/GDk+VPGiBCAwG0JKPyzHem2HCZwPJy8E3hUckGLNgjYj+NYasl+i9ZWtf10ThD2H01YALPy+uUd39HK1j2b0vImpR0/n4/3JZjxev1WdGazhKbBN9UNyDrVYkYYyLzw42adXV1pUxP0V+4BFV+lI5rlEjACqZiCNBvUxErLSWnNVI91yc5jKnxtDVmka/kPPLrfxQZywy7OsK0MZD+mQmAyAgrCdELvUpjyGg+sJlsJuAMBCAxBQPc/BFRDzFfFSH/aTnloync7PfVRBa3hsKqtPrzJol66A/IA0y46stOMgDpKpwrWlHaRgEbP2vx4/KR9K8NJm/Sb2VnfNaKE9SfqNYQKwQw/kGSOW3XZXJiNmw4q2ypNslmF4KDPImnqJWwFdbHMlMeoskmmlkignwJZpH7mYjBLdMmNZfdAF+dYYLEWAisI6NmUnm5lC9KsbScczOnHIQ5g+dVYCO4rHGnsjhgEIACBXQiELXcXnSg5mcCtDhRbsSlhq7d7fh82KAvgK627uPkXf/wr1cq/eMkwtK6gcI6rS5D3HyVjXymVhd4GVVpHDef1WFna1JTWqClNMKnGjygN2UrR9gA1hKzKRoPZysAwqPIfjYO3yr9n5Outl7j5ptfrV8sjDC15e2FcrQKSzfF5C/WumVZRaO3qI1mkrqZjJGN0SYxk9P++EuK3g7Hsx1oI3JmATm5/VGfLQxzAK6bSO8s+tgIgXSAAgV0I+L1IN0u7aEbJOQTCeXrOoFeNYss1HV3LOD1Pxcf30ss42TUvbWq1mhCQqDL9croNmhrjbdD9V1BrMqkNekcm+2V/afNDmJLUjFAvGr6vlVN6GqglkyIvWgqpnak9VlPSliUpFzSbXq2pCh2lP+0i90MXr1Nl06OP3RbIInU7Nb0bpuuhd0P/a59dme07zn978wkCELiSgE5oHbGhxn+80tDDxvYOZiPCw0ZGMQQgAIF/Cfi9iJjqXy7jlPwMjmP1SkvN2bSzIKRN2ducbKXvawp1RWT1y5g0ixS6e80q121Qq2xYkUWSEg2qd2R84GFifiDJS4NaVeM1SD4UxK2loCGCkvRjRVuqRMKpniwNcU5VmYa6Qj+KSfqaPstkkfqclwGs0nYwgK3ORLsyS1e4E6QIAQj0RUBPvfxVHCp1SLeEKX2512yN9zF93tWsBkEIQAAC6wkoCOQvta2HeF3PcHReZ8hJI9u5mQ6m8zRt0gr3TfZ+SuV1ElOou4xUia9JrUpr/OhW9hrSVs2sN3Kpm9khrNKrtRo5642RGWqVTtV4+XPK6ez4r6f5l6Rkv/fXGyl3fGXQ75t84ulr5NayDILySz6SRboE+wyD6vr5ejH04602hQu3sH5oYAkExiKgPcfOV+08/mvt1qR/x3Kw0Vq9ZZ0+xmzUgBgEIACBjQQUUI1yw7PR38m63+ocseAhmw6oRwvp2raayk2EAhVbMPqoLkbePlpZwUzFTr/8pNNX+nLqVFoj+ZK21NNSjZRnC3JcA6lGNpxWSF2wof1uZjUt1qba0prg2lcBkzex0LfDj2SROpyUMUzyl5x2wJ5Nr/zsXM9mYxsEIGAE7FjVvwGL35EkM8TWFBz5+lHBzShxxlePEIAABEYkoJ2WvWi46fNzN+VBGWaktETFIcjbx7SX1VTyIDqgpTB0sY/G3ISlzSeY1D0tpEMEGRvCv5Gd1qhLSZvVK/WmEEsd9QUuKc8W5J0GUo1XdU7ZLMwaoLyqtbZYm2pLa4JfXwVM3sRC3w4/kkXqcFKGMUmXnL3P3O05lL6qMAxiDIUABP4moAimcgYHmYlf1TEIFRSsGghAAAJHE9CNlu1F3QaBR3MYTn+YuOHsX2GwLdG0ow7TtElZEt/09dgVW/XyNb5sAt4wX1b3tJAqCTKpU2mNupS0KaDyWRUllay7qc0mZaRfBQ3UIp/9W2ylyvadp2JwMC98lBe+kGpLa7y8VtRXAqYn9O3wI1mkDidlJJN0mdmKt9u2r5fHOR7aduNTXRPfVZ6DlFEgcBWBsNVUzPCXfIh4Kr3GavI++ueNY3mBtRCAwOgEFPsRXw00lf4E6SRiP5pe6bZcCzhrQNrL0FVCC+sSqEqPdfdjWY2edlc0q5fCIdX4Qsj+WFPFzYo2rZPP5yM7/VhWGZz1Ar6sgVrkZXBLoUWh55CVD+YJY2lGJO99NGuz+v3vIvkuadk0l5Sk8hfWkEW6EP48Q+taClf78/nHUjnnuKosdTCjflWfYxujQAACWwj4i/rr4arQZ9YMS9hyvwLZQp6+EIAABEoE/GY7635b8n3cen+etr/HMa6/lXdAhCLrnbX6Jh2+WW6lVqu3f0NWwjc1pmJLo5iduiS9hXLTVwZ576aVNZAKQaZUH8RSbVmBEyqNQzZkSrlVoCmtFmbTuoRK8+trWkruV4yUTCcFskidTMQMZmg30YWXLWSv3nX+nz/iOjvpBQEIbCTgN5MWVdocdtxwWsY9TcYDmdXH02AyEAQgsI6AdlrbkdYpodeZBPzZcZ/EnxZqQC0aod4+Zld1qYuGSKlak/71Y6kyO5aXVLkykPJlwQZ1CdGC6oO8xpKzpQyXCQS16u4LGqtF2HfcsVyyVrZ5DtlKM0ZNwRfhCvX+RaS0KThYMjKI9fCRLFIPszCVDfUXgnSBZQvqGwrKEGd7ZStPfg1qqinEGQh0RkAH9qI/KW29sg+FOvNvjTlhV1yjgj4QgAAEthHQA3aLxL7eIG0bjd47EPAx86znY4pJUURoEo1Qbx+tNTT5w1ev9vgLQZW+owZKW9XkUxi+bygrtrGISBedfEz1+CaTt/ss05B10wbNOuvtkYApVJN9R08fF6VRfK99y+aplr0Z6eH42fFzqi7eEV9pdkq/Jd1Mm//jTunUBAdlTKjv8yNZpD7nZR6rdIm+Xr/aa/yOuUtZWSd//c8DEU8gcG8CfutQwNSCxA7vFsnhZBRq2BbK1jfcDGIwBOYg4KO49LZqDh+n8eLOB4ct1BBCaPVmp9ha0yYfk0iDFUpnscQq2oJtqaTV2CS+Xr8+zSH9z+efrA1h6k3eLlgrZ4fzvbIC+m6XDPAF75FU+cqSzoPqvW2hXNq7SnOdlTedJSY2ZXXXbLis8nrHS1rJIl2CnUH/IeBzTMoEfS2ADwIQuBUBf9jfyvG6sx7LhWFZ3UhaIQCBuQno5tB2pOwd7NwEBvIu3BIPZPl2U7P357rjyOq31myT7l+ezz/27Yf6yjf5rIxUZVvT0b0q9bWXX+qRgAnruxoSrripq1vCqT2fz0dmiEaaMZFMo5vZgTZWarpDoa5WlgtyyQVP0soCUuoShh5rFyWLFKaPjxCAAAQg0BEBnysZ5fnMOfjufD9wDmFGgQAEvhIIL0TU7za/akPgUAL+PL3bTGmhNt7PHzoRoyhXmDGKwUPbaTm7gS5MskhDrzeMhwAEIDAzAT0Hs9h3oMP1hFkJcIiMT2DOEBCAQErA5ya+/vBH2p2acwhwZNiPT/M4qnG9KYVE6NVIbIuYZTnHWpxkkbbMOH0hAAEIQOBAAgpi7C7lwJHGVO1v3sYKPsbkjdUQgECGAOmJDJT+qjhP7btXpT831t+MXWmRVgsppHOmwYCP9TiQLNI5a4NRIAABCEBgMQGfJeERd4oPPikTaiAAgZMJhCwSt50n828czp8XzFEjtHuKaamwTu65ABq9JovUCAoxCEAAAhA4lYB+xcACGqKZlH64eRvrKVbqDjUQgMCgBHTbaX87fFAvJjY7HBacpxPP9UbXtFR4wXkjyem7k0WafopxEAIQgMCQBBTK2P0JKZJ0Fkm0pUyogQAEzicQtuvzDWDEOgF9QcnO07owrTcnwJf+br4AGt0ni9QICjEIQAACEDiVgH+4zdfZSuihVCJDPQQgcCYBn6fgVZczybeM5U8K3jFpIYYMBCBQJ0AWqc6HVghAAAIQuIAAb9m0Q/e3B7yx1c4NSQhAYEcC/nUk8hQ7gt2uyk8Nr5ls54kGCEDg8/mQRWIZQAACEIBAdwRC1NudfT0ZxCsAPc0GtkDgvgR8Rvu+FPrz3J8RvNjb3/xgEQSGJEAWachpw2gIQAACcxPwdyM81q7PNRm3Oh9aIQCBcwj4bAVfajuHecso/jxlXlqIIQMBCHwlQBbpKyIEIAABCEDgbAJEvYuIe1yLOiIMAQhAYC8CPqNNtmIvqhv1+EnhRaSNMOkOAQiIAFkkoaAAAQhAAAJdEAhRL7/183VWeAXgKyIEIACBowmE37M7ejj0txDw5ykv9rYQQwYCEGghQBaphRIyEIAABCBwHgGfE+HZaQt37hNaKCEDAQgcTcC/F8nrSEfTbtHvZ4RHMi3EkIEABFoIkEVqoYQMBCAAAQicRICn2etA+1uFdRroBQEIQGAjAZ/Rfjx+SFts5Lmxe5iOjdroDgEIQEAEyCIJBQUIQAACELiegI96ef2+fT54gaudFZIQgMBBBMJjAF5HOohzo1r/dIG5aISGGAQg0EKALFILJWQgAAEIQOAkAkS960D77BuvAKxjSC8IQGA7Ab+H85Xk7TxXa+BQWI2OjhCAwFcCZJG+IkIAAhCAAAROIhCeY5806izD+Js3XuOaZVbxAwKDESB50cmE8YJqJxOBGRCYkgBZpCmnFacgAAEIDEkg3H4M6cN1RvssEq8AXDcPjAyBWxMI2zhfpLpqNfgTgVm4ahYYFwKzEiCLNOvM4hcEIACB8Qj4Z6dEvUvnL9y88bu2SwEiDwEI7ELA5y94L3IXpEuVhOOA83QpQOQhAIE6AbJIdT60QgACEIDAeQT8vQdJkKXcw/cBuW1YChB5CEBgFwL+eQDvRe6CdKkSpmApMeQhAIFFBMgiLcKFMAQgAAEIHEXAp5B4fL2OsmfIzds6hvSCAAQ2EiCjvRHg9u7+LOA83c4TDRCAQCBAFikA4SMEIAABCFxAgLuOXaCHbzHwPtcuVFECAQgsJUAWYymxHeXDQcB7qTuyRRUEIGAEyCKxEiAAAQhA4HoCIeq93qAxLSAZN+a8YTUEZiPAln7hjPJ1tgvhMzQEbkKALNJNJho3IQABCHRNgAfXe00P9w97kUQPBCCwmgAZ7dXotnfkPN3OEA0QgECdAFmkOh9aIQABCEDgDAI+6uX1+y3EeQVgCz36QgACexFgV9+L5CI94QjgPF1ED2EIQKCRAFmkRlCIQQACEIDAUQRC1Muv+WwBzSsAW+jRFwIQ2ItA2Nj3UoueOgGw1/nQCgEI7EKALNIuGFECAQhAAALrCfAlrPXscj39KwA9/HWe9/v9ev3ySDw3V9RBYGYCfi9iBzhnpq9lbls9c33OXDMKBC4kQBbpQvgMDQEIQAACH96dOWIR+BuJI/Qv0qln44t6IQwBCIxOQNf+4/HTQ0Z7dJ5f7Q/n6Vf53QV09OyuGYUQgEBXBMgidTUdGAMBCEDgdgT8bcbj8cPX2XZZAf71rssfC2uKd3ENJRCAwCgELk9qjAJqLzu12T4eP5fs/GSR9ppK9ECgcwJkkTqfIMyDAAQgMDkBBZ1WmNzbs9zz9xKPx89Zw+bHkTH5ZmohAIF5CbDDnzm3nvYlj2RkwJleMxYEIHA+AbJI5zNnRAhAAAIQ+IdAeFJ9ybPTWSdD0fxVD6UFliySUFCAwN0I6PK3HemS1MZNmAfUl3itc+eS0RkUAhA4jQBZpNNQMxAEIAABCEQCIeolixQBbfisaN4KGzRt7apZ3qqI/hCAwGgEdPnbRsQmf9wEetRXcda5c5ybaIYABHogQBaph1nABghAAAI3JeB/vufyL15NNgf+juK4H5zS31+r3LTIkskI4w4EINBCQJkFfmO7BddqGc+5siGv1q+/v1Z5oUw2rB6FjhCAwBAEyCINMU0YCQEIQGBOAoo4L//W1Xx8j/62YNBvU/l8/klvMLJZJN897TLfdOARBG5LQDuA7RK35XCo44dCDs97bB6ziSqd6d5Z2cbf6fNYKENgaAJkkYaePoyHAAQgMDABRZY8oD5oFhXQ737zppuK5/OPHlBruJAV0kR7N02YmwrPhDIEpiTgU8Y8MDhoirX97nue+rnTVq/9P33LVWbITe3/7PZiQgECExAgizTBJOICBCAAgSEJ+Eg0+1RzSK96Mlrhu0X2Ibmz2lKpTRVqTr1yyavSxLipEBAKEJibgJIL++Y45obW7p32WOO843la2qt9dsnbqYm2Somx23tKlCEwAQGySBNMIi5AAAIQGJKAwk1+Eemg+VMEv+OthW5XsjcqGtG3qou5WbotOQgCaiEAgcsJaBOwvehyeyYzQOn7ffFq1rK4NKjf7XWsfz6f7HGQVUUlBCAwHAGySP/f3tkgu47qanQgpzKrs4e1M6xMK6/e1b1fqyUgdvwHeHV1dRMshLQEGBQ7e7iQYTAEIACBGQhor7nvrncGNLv6sDtnnSv8ycGbbD36q2ryfr992beiDAEITExAEz+vDxN7fZpru6/zZrmiVnREV/1qL0ve7zexLnKjEgJzECCLNEcc8QICEIDAYAS01+RnMg6NnDb6Bnx7XwpcTVV+1Eg2vN9vu5pfhatpox4CEJiDgJYO1vx9A6pHfoywz+ls7KitUP36t9UUZbvqL200huYQgEBXBMgidRUOjIEABCBwCwJKK9iOk5zCcVHXRr99HlhugA4JtSYKrgRUo7YcLQSHAgRuQkAvQNk6cBOvT3AzLLA79vjxrqElXZ2qRgXu74JDAQIzESCLNFM08QUCEIDAGAS0v7TCGEYPa6WnvT19I201HjrSSEA19gyCadjxC3N1RAECEOiWgF8HeBxpxzBpTd79l8s/rtXqWu6o5ufnr/KGukoBAhCYhgBZpGlCiSMQgAAExiCw+9MxY7h9nZXh8LbREB0Sanrab7T5n0biO+oaQ+ohMCUBrR675zumxLXEqUPvpxavWsZfXfsvJxRiM14fWe2XRBMZCAxEgCzSQMHCVAhAAAIzEAhJDTaXRwdVe/32kWChGQpf7WiRe1ETdcF31EJBAQL3IaClwFaJ+zh+nKeHIpXyov266u8FShtZE3/3KSqhEgIQGJQAWaRBA4fZEIAABEYloF0mB4nTQrgjc38qyBnAYnpIhw35KyX+S2xdpQABCMxKwK9FPvswq79H++V57r6cNhZqXXo8/ngfZY8qdVPY3Tx1QQECEDifAFmk85nTIwQgAIFbE9Auk5/GOHMceOwb+62pUrYoHA5V7/tVZTiEeBnKEIDAZAT8xA8LxWSenuCOh3nQ/VSrfQjWx3rvfjRAaoUAACAASURBVE3Yy1CGAATGIkAWaax4YS0EIACBsQmcsOsdG9Bh1msfv8thw3+9/Hz+2r/WRf7CWUEPzsmk/ExTkOQjBCAwBwGtBjb953DqKi8CzCMWUv/MkZZ6rf8htfR+v7WqBya1u0MQ4yMEIDAKAbJIo0QKOyEAAQjMQEC7T44QJ4fTnzdyoucLY7xCnRzyocL/nHboxZ9Pjjj/hO74CAEI9EBAy8Xj8YeJvyUinuRxD3W+Xq9w47YfRy/GTiYFv7Ta73L3Ccr5CAEInE+ALNL5zOkRAhCAwH0JaIu5yxMx9+W43nNt4i0E6xVUW7xer2LyqNqACxCAwI0J+AQ0S8fXA+G4Jb1h0us//zQEuAQBCNyEAFmkmwQaNyEAAQhcT8AfHvgW+vx4kMI7nzk9QgACgcAl6Y9gwwQf/f2UB3wmCCguQGAsAmSRxooX1kIAAhAYmEB4Kn5gT8Y0nVPHmHHDagjMRoCM9vaIwnA7QzRAAAJfEyCL9DU6GkIAAhCAwDoCfte7riXSOxEgBDuBRA0EIPA9AZ/RPu4Hfb63r/uWAOw+RBgIgckJkEWaPMC4BwEIQKATAux6ewiEzyJxeOshItgAgRsSCLcDfh1p7RjwKzn01tJDHgIQ2E6ALNJ2hmiAAAQgAIHPBPyxgV3vZ17HSPgokEU6hjFaIQCBzwR8HoSf9fnMy0mEH5bifurYUIQABE4iQBbpJNB0AwEIQODmBPyZofgXgm/O5xz3OX6cw5leIACBNgF+Jq/Np3GVLwMacLgEAQicQ4As0jmc6QUCEIDArQmw6+0n/D6dxyMA/cQFSyBwKwLhpsADNcujzxq+nBWSEIDAQQTIIh0EFrUQgAAEIPAPAf+1M6eFf7hcUQqHN54LuyII9AkBCLzJhnwxCHie9AtoNIEABHYnQBZpd6QohAAEIACBSMCfFkhbRDrnfuYQci5veoMABMoE/LcL/ExbmVGqBVpCQgUEIHABAbJIF0CnSwhAAAK3IuBTSBwVegg9EekhCtgAgZsTCM9F8pjqkvHgV29eSV5CDBkIQOAIAmSRjqCKTghAAAIQ+IeA3/VyTviHy3WlcHi7zhB6hgAEbk2Au8Oq8Ielm/vpKnoIQwACOxIgi7QjTFRBAAIQgEAkwK43EungM0HpIAiYAAEIvHk/a9UgCEs3r4evoocwBCCwIwGySDvCRBUEIAABCEQCHBIikT4++0cAeC2ij5hgBQRuR4C0yKqQ+3Wb18NXoUMYAhDYlwBZpH15og0CEIAABP5FwO96efz+X2gu/UB271L8dA4BCPyXAPeIhUOBP4ywEBRiEIDACQTIIp0AmS4gAAEI3JQA3zN3G/gQGhJ83UYKwyAwN4GwFs3t7BbvAiheZ9sCk7YQgMBGAmSRNgKkOQQgAAEIVAnwwEsVTQcX/CMAvNTWQUAwAQI3JeDXIpIjtUHgKfE6W40S9RCAwDkEyCKdw5leIAABCNyRgN/18rRLhyPAB6hD8zAJAhC4AwH/lA13imLEw+tsRRkqIQABCJxGgCzSaajpCAIQgMC9CPiDwePxh7NBh+H3WSQC1GGAMAkCdyAQbhZ3cHmtjx4Ra/VaeshDAAK7EyCLtDtSFEIAAhCAwP8T4HW2/scBJ5P+Y4SFELgDATLa7Sj7+ylZpDYrrkIAAicQIIt0AmS6gAAEIHBHAv5UwM/u9DkCeEuiz7hgFQTuRsBnSfjRnxx9fz/NV6mBAAQgcDIBskgnA6c7CEAAArcg4B9y4XW2nkPuDyd8xd1zpLANAhMT4JbRCK6Hw1cyDVBcggAETiNAFuk01HQEAQhA4EYE+GJ5lGD788nj8Yc/kDRK4LATApMR8BltciU+uP5+Sq7fk6EMAQhcRYAs0lXk6fe/BF6v1/P5u/xfwEEAAkMQ8OcBdr09hyy81Eaweg4WtkFgYgI+V8JLbQp0SPSrngIEIACBCwmQRboQ/l269hkif7Dcq/zz81dd8C36XUYVfvZNgF1v3/GJ1oXVOF7mMwQgAIHjCYQbx6qMtm0Fj7fxgh78+swjWhcEgC4hAIESAbJIJSrU7UHA3/bOL+/hATogAIEvCfjDwKqTwJf90WwbAR8vHgHYxpLWEIDA9wT8dnH5vcNWsO977bhlWJyXM+nYJ0yDAARmIEAWaYYoduKDvZsWHkj2GwKV/dNDeozIF8wjX1MsS2GtYB3xgFInIwQz7kPAT0kmYP9x56DSf4ywEAJ3IBD2kEtc1ju5S4SHkwmLM/fT4SKIwRCYlQBZpFkje6pf4SanA6TPFh1tkNJMYQsiY/gC5+gQoB8CRiAsCGAZgoCWysfjDy9NDBEyjITAfATC7eNj0kRbvln3eH5l5kHR+QY8HkFgXAJkkcaNXReWh/u9/T3v5/P3443/BOstrxRuwLPuM07gSRcQWEjATzpm3EJol4vpMGbhu9weDIAABO5JYOEdRI8gmXwP287d4xV85H66O2EUQgACXxMgi/Q1Ohq+/anj5+dvt7dwe9XO70sIHgQgcBCBkFnudlk4yP1x1XJcGTd2WA6BmQj4vWXt6ZsgUxMbHQv309EjiP0QmJgAWaSJg3usa/7IMcRB8fV6advB9znHDg6035iAZhmPtAw3CnyqnZfahgsfBkNgDgIfUyfhLmNPwc/he/CCNTkA4SMEINAPAbJI/cRiMEt0mx8oIzOizYMNC8y9PQG/6x1ocbh93P4fgFZIMoCMBwhA4EIC/j7iM9r++0svM+W9Jjg7pY8XjjG6hgAENhIgi7QR4H2b+/PGKBS05+BmPErIsHMsAn5ZmPj74bGCstxawrecFZIQgMBxBLRbs4I6CvX6KIGZCmFBnsk1fIEABCYgQBZpgiBe40K4vXWel/Gvs3G4vWbE0OsNCIQXDW7g8Wwu6lTGOjlbaPEHAkMR8GtR/nVLf3XWH0XifjrUgMVYCNyOAFmk24V8L4dDFsnu6PZn0fbqYrue2s6j85zXdsfRAIFLCPidvX8N4RJj6PQLAmFh/0IDTSAAAQhsJxByKP7mEsqz3mu8m+xat48oNEAAAvsSIIu0L88badNhIzzmo9vez8/f85NKljaSbTLm8fhjf0XOargf32ik4upZBMK8Y5adBX7nfvyySRB3hos6CNyVgG0Il/zXCIUbil+XQnnKZSq4P8Qfsbnr0MZvCNyUAFmkmwZ+u9u6w0nV8/nb/u5IeSVtI767L6q5Fdqd2nsZ6ogskuJFAQL7EggzcV/laDuNgNZ2S76f1i8dQQACExMIvxUdMkFbPmqDNxO9AGQm1/AFAhCYgwBZpDnieIEXOmkU+7b8TrgLnvZRaaZsm9kw5TdX2VlqIHAmAT/BZ33F4EyeV/UVDntXmUG/EIDAfAQ+ft3o7yMLy/NRYhGeL6Z4BIH5CJBFmi+mJ3nUziIFI5TW2Te7FNSGTosfySIVsVAJgY0EtCAwxTaS7KG5P7yRc+8hItgAgZkIhAdX/YLzRXkmMuaLv5/ylcx88cUjCMxBgCzSHHG8wAvd5C7oe0OXHHE3wKMpBKoEtCDYFKvKcWEEAj6aZJFGiBg2QmAwAn6R+SJzpCZTLlDyjr+VOdiwxlwI3IkAWaQ7RXtXX7UD2FXr4crs3jzltuNwdnQAgToBdr11NuNd0fJuYR3PASyGAAS6JxDWGX8TWV6ecjvn3Z/yV5+6H5sYCAEIfCZAFukzIySKBHT7L17tttLuzVNuO7pljmHTE+BHHOYLsT/GsGDOF188gkAPBMK9wy87C8vzrU7B8R7ChA0QgAAEMgGySJkJNYsIkEVahAkhCNyAgFYDHr+fJtrhh0um8QtHIACBrgi8Xi9/Bwk5lI8fJ3tUJ6TV5suRdTX2MAYCENhCgCzSFnq3bqu7/lgUbEfCjXmsqGFt5wT8Rn+yPX3n5I8zj8PMcWzRDAEIBAJhwfH3lHY56Bn9o7bW5jX309EDiv0QmJgAWaSJg3usa7rVHdvN3trtxkwWaW+u6LsvgbD7vy+I6Tz3hzf+TtB04cUhCPRFINxK/PrTKPflw2ZrvKesuptxogACEDiQQEdZJGUlhj7hv16vn5+/Pz9/h/ZiyYhTvJYI9yNjd+jpo9MPcCyZnoB/9YmZNVO4tcjbsjmTa/gCAQj0ScDfUHxKpVbu04vvrAp5NO6n32GkFQQgcA4Bskg7c/bb7p1Vd6ZOnnZm1wdzyCJ9AMRlCKwk4Df37HpXwutaXIs8y2bXccI4CMxFwN9T2uW5/H6HJXcy73AHAhCYjABZpJ0D6m94cx+odLfbmeDB6jgOHQwY9fcioHXAZta9nL+Bt/e5o90gmLgIgTEIhEdy/CoUymP4s9jK8BzW4nYIQgACELiAAFmknaH7e8DOqjtTp9NjZ3Z9MMe2IHMn+D4g4DIE9iPg9/T8iMN+XHvR5O9oj8efXszCDghAYHYCYfHx9xqVJ2Mgv/hrp5NFFncgMCUBskj7h/X1n3/219uZRrJInQUEcyBwNgEtArb3JTl7dgCO748QH8+YHiAAgTKBj4mkcrMxa8Niy19nGzOMWA2BGxEgi3SjYO/rqm54+6o9WhvH3aMJo/8+BMIW/z6O38pT//U4j5vdKvQ4C4HLCYS7jF+OJns6cmLXLh9FGACBfgjMlCAePot0WjBO66ifgd62hCxSmw9XITA9Ab/rJb8wa7jDKW5WN/ELAhDok0BYgnTfmenp1/BTUDO51uegwioIXEXg+fz9+fk7R1ZhjCySEha2sL5er3xTyWvuwjuNVGUNr9dLXUvb4/GnEX4v3xigXsxrLo6qVcLWaRFRw+yGqbVLsqom0Ge90c6x7tNarIJAtwS0AticKq5d3RqPYcsJhECzeC5HhyQEILALAW3U/YZ5prUoLLPcT3cZNiiBQJ8EpjmKDplF8ncRXw53FL8oN4aRNAQZ31wyvhC6s+a+VVCoj15JKGedXmEQrv38XqNJ1i+r1hbUy9qG18obwx05XOsOvUPgKgJaAWxOXWUG/Z5AwN96WDxPAE4XEIBAIOBXofk2csG74DsfIQCBmQj4+T60X+Nlkfw3EuEY83j88fl7/4Cor/cBk0x4HUP1ulc9n7/2EJqPfVbrTfIdWdlf9ZrlVFDozfj5+Ws2BCW5F2nLTbLw1zUy42sNlzQU9kt6p1MITEPAr4Rh/ZzGRxwxAj7Wk/0WCSGGAASGIOD3w/Nt5PwaS6Z+iAGJkRD4moBO0Dbxw9n/a7XnNxwsi2T5kXBi8W9vhUtal2uLsgLpQ+jvVcWGPk0TYiaFeavt1RZfLvM2vN9vyQenrEd1FK6qPlse9AfL135UR2sbXis/3+bjWp70fk8CWp2YUDcZALqZhm9rbuI+bkIAAj0Q0Pa79jB+D0autUHbaVtm1zZHHgIQGItA2EK3fyqnZ9cGyyIZ6AzUx8Nf9Uuzr1dZO2PVvN9v3aVyIkZiahhkGj2qScj7SGcoyIxa9qcoIAOCtt0/ntbRvpZbFELU9u0CbRCYnoCmv02o6f3FQR9x1k/GAwQgcBUBbX2nWYjk0UypsauGB/1CYAgCftb7/EDtyN+nU+NlkWp8fTzE2meX8v1G2+JwSeGUnlxQ2/DM0dr6rFk1H/Md6svbr8oaKOnfWFBHG/Wc3Pwj1ZPtoTsIjEhAi2Qtsz+iU9jcIOBvpuGu12jFJQicQEAv+09QOHrndkI4ju5Ca5H/0YahQ+/vp0fTQz8EINADAR2i/fRX2Z/re7C2ZsN4WaSaJz4eXkbZpfwEkC55een5GEIFu9g87LMlnM3wzVWWGe0than1pqrh0e8dqCPZPEQhE9totvYu7UiFXtQqFIJY46P9AcHQ3I+ERlu7VNOw3ZHtGlY5kiFYzUcCEihqWOVFDaa6+Fg4TsMqR5ag0Ca+OJuKGgiosHwcCV5ArXxh94D6HnNZXesutvYL8+1jWzaEQra2VrPdhu0a3u93sN8+XhXQYEwNXa7fjiJ0rY+5r1qNt8GPzNHLPz9/i794UONQG1SrllwPU7FYpcG38uWG2eHSKhvCPWj0oMt+OyB4gL4ciDU+roJZ1DOHhtrsuOGSWwvochTHaSiOwFqlnxEqL/fiuCGxasE0mJr4tcLz+bvKtRq04+rnzyIp2RHSOu/328IW0jqS/zggFHUfYzUP3Un4o1oLttejtrVCcEHZMZM/aBTKwuNG5xGaxWQv5eKwMLLqtxhNXf1YUL9Bz8eGEqhpWOVI6P0LvEUNYfrI5mKh5khRuFhZ1LCKg9aT4E6xu1plaGsfa8K5vujF2gN/0YaAIqwwwZKiBgIqLAFX+6Na+UIIxyUaegjoKht6mKE1Gwiohnd7MIerajVlITjb+Fhzv9EkXKrdO4JY4+N2DbXZUet0ykSSLQX3DGgx0EUURclaZXFksuQKbA8oarEr1m8P6HYNohcKRYOLlUUbgjZ99EmGorYLK+fPIvk7k58tCo+vtCSlXQr1OUhFDX5k+CZFYS8Qyl6P2tYK2dQsmWVCj2s/ysK1Da+VNzI70hCHtTpzjFYditRv0LMcb03DKkdC71/gLWroAcUqDn6d8R4tD8d2DacF1DuYIxWu6uNyFDVHNmoYLqC1IbHKEfH3he0aVmUnDwpoHnvtEeIJqNxuEq6qlS8EmfZH31Dl7eHYrmEVzJ4DKqqjF5bHtOZpeyj6qz0H1NsZyjXHR6z34a7ZH9xvfBw0oNmjIoos1qgpovC0G23tUtGG7Ro6WXK3O7Jdw8cQeIHtAd2uoTgkdglo1ux977BMFulPSPJpeH2cGEVJVYbxpJHxUa2NEq9HbWuFrNP/3Tq1Co8sbRyOsnCjnpObG41M7GQz6A4CgxII3wAP6gVmf0dAdxN+D+s7gLTakYAeitR7DaMX5BEblSXjZPRwe/vDSWSJ+8hAAALjEgh7ab+5GuhPtt0ii+S/0bUBpwxITqzo0sdEg0LuV3813yuLtHGGPJ+/fl/y0anl3cnT5U16kGRz1kMUsGFcApr45BHGDeLXlvu7SbjHfa2ThhBYRSD/osSq5j0L53OF3172bDm2QQACEIDAcgJhN6WUwo7n9OXGfC15lyySTj52S1bwcrQkmS8Fygq5r1fzsMOW8Ee1pk16Fsp7G3JZ/garsuTyGlm4vEkPkmSReogCNoxLQEvZqneaxvUXyz0BLfsspB4L5dMIhBE43yqUHTyNLR1BAAIQgMA5BPxeetwN1V2ySPqGx5IyCl4eK5JsJ1wkFp5m8jsAr3xtHqem3+tcVW64vEqPhOWpaoYojDtXh8CLkXMT0Ky3eTS3s3hXJKBbCQ+jFflQeRCB4nv682WR3u+33y4yyw4aTqiFAAQgcBWBsJcOmYSrrPqi37tkkfxLbQpe7TEf7ZJrAv42H2SkPCShfP3C4SIzdnmkWdq+GCXFJvKoeLXbSuMQotattRgGga4IaBnhbNNVXM40Jhxxz+yavu5JoJY/suVoPib6ElHr7S6bwPlA4REEIACBEQloH3XQX1E/jcmNskjKeih4tRuzv4UX0w3SkPNB6iVkkXziaeEB7KMZNkqCF+GjZGw7kg3+eqjJ0681XNLQOBTDeok9dAqBUQhoytskKi41o/iCnV8TCMOAtfRrkjT8SCD/BJISKyp8VDKigN/+macjeoHNEIAABCCQCUyzi75RFsk/jvTxrqwNSpAMG+g8MrxAuOovmVq//7arviYbHK4WmxQr5U7QECxc9VHurGp1uXAmf7lJGACBIQhoyodVcQjjMXJHArqhTPk+0Y6gULWFQFhw/Kjz5S1d9NzW+8hE6zlS2AYBCEBgOQG7tS2X71nyvlmkdlTaT1Db3b2YkfH7ntxF+ItpYZeQNwr5+6iPTbKAanZ8EOn9fsvT7GbPNUajGLuezcY2CFxOQCvJwqcpLzcYAw4i4EdCfur2oE5Rex8CSzZg09/K8/aPxz/vMwXwFAIQmJXA6z//zOHdvbJISnwszKdIPmyaf37+1m7nvkltiHiZoLmotiH/8/M3JERqwkGsZtvyenW0vEkPktNvPXuAjA3zEQhHmt3Xk/mITeyRFn9bTou3rYndx7XjCHz8pi1smeZeiMJEW7hxPS46aIYABCAAAQiIQEdZJNnUYeH5/LV/97XN3vlf/ttaq+QPslkEtL9RzRAFskhDhAkjeyOg+W4zqDfzsOdkAv4wP/dJ/mSwt+0urDB+gDXK04+9gGV6f287/nEcAhCAwHAEyCINF7JeDNbmpheDltlh+1G2YstoIQWB/xLwBzm+EmdYaP23gQEQCHxHYPnLa34JUvm7TsdqpT/nYl6zexkrfFgLAQhAYFYCZJFmjezhfukUcXhPu3bAPmxXnCi7BQFNdqbPLeK9zEmd5B+PP7zUtowZUv8lsDF5pLF3B6DhbWKm2x2Cjo8QgAAE+idAFqn/GHVqoQ6WndpXMYtjcAUM1RCoEghfhlfluHAnAroF5L8LcScM+LqCgL2VrxzQ9sKKvkcWzYmkkb3BdghAAAIQmIEAWaQZoniJDzpCXNL7152SRfoaHQ1vSyAc9m7LAcc9Ad0CbHj4S5QhkAmEZWSXj7mXWWsCLt5rmzXQ+AUBCEBgFAJkkUaJVHd26gjRnWVNg2wrxg6sCYmLEPiHQPganLnzD5rbl/zJloFx++FQBqCtgh8tu5RvNeTCOsx7beXRRm3HBJb/KaGOncC0CQnYX6O6/MX8I/6K19HRIot0NOFp9WtrOJaHZJHGihfWXk5AM93mzuU32suBYIAI8KqjUFD4SMC2yLvkj+55Hw/Tjb9y8HHIIdAJAeVA2T8sj4i9//vz83cjtOfzd7uS5WZfIvnz87e4HmrNbH/lULyhGLd2w+3O6ob4fr9ts310j9tt9hrIInkalFcQ0NlyRZsORIuLRQd2YQIEOiWgm5wVOrUSs64goLsA6+oV+Afu0zboYW1Z+3Gs3fYu0QqIbkhgF4woOZmAHeYZrquwL8yAtHUqf3c+/I3Jr7Zf/qr5WHTQL5i+SSibmNcgbo/HnyC840f1oq6HmylkkXYcD/dSpfPDWG7nxWIs+7EWAmcS0E3OJs6ZXdPXEAT8Lq34ZeAQXmDkhQS+fkZJO+8LjT+567Ag817byfzp7gsCgx4WvvB03ybitjEdY/fojUpWuSbLV7X6Wti6yw5a/ZJkXPFgWKz82shiQ4GS8VrhVVNs2E8lWaR+YjGYJRr9Y9l9wrowFhCshUCDgKY5f4erQenOl7RFs6X1zijwfTuBVc8ojbLP3o7Fa/Br8uPxh9Sth0O5QwLcGjoMyqEmaY06tBcprw0wPddjAo2nikzg/K8lDFRYw2W2HOy5QBap5+h0bdvJy8ReLK5aLPayHz0QOJOA7r586X0m9oH60o2ApXWgqPVsql9z2uWevTjUNn1fLT73TKgdChnluxCwsRrOybtoRkm3BLQrOMFCWwOLA8wu6feGGptYkzw/i1Ts90x62wNEFmk7w5tqGGugK0jFSaurFCAAAU/A5ov919dThoAI+EFy/j5MZlCYgIAfSx/LE/j7tQsBDvPua5I0PJSAnRSWjE8b0kuM0emj8XTJEj0bZRqumS9LvH6/35rL39mzsblPsiw0QPxr8h8Fag2/qK+h9jaoXItITUnbno9qrXlDuV3KvdTqs+TlNWSRLg/BqAZo/ozlQGM+j+UI1kLgaAKa47w3cTTqofXzUtvQ4evHeL/g2J26/d9+LD/fEh5HOp85PX5BwCZ1flbOb8XDHaTxzEge9rY5Cfq9cm+zmjceXaklGpRteT5/X6+XbPbyxRUs2CZ7vBK/0Ele2nwX3jXZoOar/LK/Aae2VsgaZMb7/RZAtQryEpaACnJ8x4K684hMv12yepkdrJUlZmRQUrO8yC1vkmWb9ITfhfAWyhIrFO0JMp18JIvUSSDGM0MzZCzTB5qcY4HF2vkI+D1KuL/O5ywefU1A9wJbXbUJ/lohDW9IQBt97blf//lHH3PhhpS8y359zmcYL0kZAlcRsGmbe7d6/Q6a/cS+H9L5PqKrPz9/Td7fevwWRfWhX9Xnh5i0/oQm/qM1l81ywWSyearxtpmwt0S+WKV6lIxvrk5NuVCor5woURNpDvkgGWCSIYsnMwyRepSw79EyLDJGmr0L3ozjymaeRpGsLfZoV4ORxSYaJ7bkysGQIRIB4fI1RRt8ZdEeL9BPmSxSP7EYzBKtLGPZPdDkHAss1s5HQDfRvOWaz1k82kLAD5WwFduilrb3IaBNto0lfzLxo8uX7wOn5qmnEY4xtSbUQ+BMAjZEc48aun6m63mfnBXV6V15AenU0qFbj4QlYwVJ5sliJ5pgTGiuU0/Is8js3FxNZNv7/ZYZWd73WGwrbtkGee370htzSyol7Ld8MiP3KEdCUNTEu1MsS9L71SgXleRKofCXTG3gYALFSzJDSqQ2o5DM2sHgG/qy9e5r+iyTReozLgNYpck/gK3OxOJi4a5ThAAE/p+A7qB5PwcgCAQC2k2OsvUJ9vPxWgLaTtj4CYcrv3f369K1NvfQeyYTjnM9GIkNdyZQuyNoIucRq9XAczP5YgrAzwI1kX7VaFdj8kFVQ780yLDQ1muWsAqmWWuarFWNJEOh2J38ytx8fsqryq6Z5qIB6lT6VVOUz8qVRvGpKG+PL0u5/GoXfNtG2dSGMFnlci9kiTqyfU5Rg2RWDQbfKpSt91DZ4UeySB0GZQyTNPnHMPd/VtrMDIvL/y7yfwhA4P8JaHYzXxgQSwiEAaMN6JK2yNycgI5V2rXn8RPSlKPssE+IbJh6H084J5hEFxAQgdpU1WSXpAoa0qrREpFXBpPJ2rISX5OtyjXqXQWvQZXegFBpH7V22UcpqfkiJZL0B5bsqeT9e2peuTXxSkyzr5ESodbVohmSz8r9BlJiJxfMKg/Bw8nGFL2wSp8LK6qtacv1q8hYX0UlXVWSReoqHCMZ015Z+vQkr4992olVELiWgPY9o9zJrsVF7/r+zQYMR1mGxHICNmb0X51egoawKPnNM222yAAAIABJREFUfZC820dtxph9dwt95/7ayCzeDjTfiy7YVV3SCFdNKEhAq0eusQXEGlpZWYaFE0c6a73LqWLBWulSUJI/qjs55e+zWd7rz01yjSwpFiRfNEO921UJW72aSOzMgnrXjxapYJ4Ga0U11AvLKqfUu5oXCx+BWKuPYpcLkEW6PASjGuCnyig+aDKHxWIU+7ETAucQ0EwZ5U52DhZ6aRBgzDTgcKlGwG8k2qvNcslaXxPXM/smDu7QrtUmtUZs0bvQSnO/KOwf8fB7e1OiGq/TFIZL+vixlyAg8+RUsWCtdCkoyR+l1hv2sbkJ5Ca5RqqKBckXzZC1gaTVq4nEziwU3fGVck1W2dVQryarnJLval4sqOtawVrVrvZTTxapn1iMZ4mfG2H69eZM+Jua+gqiNzuxBwKXE9AjezbBO5/al+PCABHwdwTWWGGh0CDgx8zHx4vC40gNtXe7FBbt4tMfd2OCvz0QsAmeLdHEz5f0bIgu6WSumlCQgN+uWBc2F2yC6Kp9tEtq+/GeJclG73rsJResVdtxr1ndyWyRaSyVpj83yTX682HZ1OfzVzSKZshOu+qV+6SexE4raCUseqc7SLAnQ8uoxSG0DR8lVqSqytAqfzSTcn1vNWSReovISPbY33TUmmh/9UBLTw+eZAvbP63fg83YAIFrCeguaFO7qxl9LRl6bxPQFi3/BZx2Q67ekIC2+9pCfFxqQpMbQmu47GcfE7ABiktnEqgdhjXri8aEVtqTFIX9r0r7NcS3srK/qi68WE2/1dcka/VFbW3HfROp9Tmaj81NIHualfga328oF82QjF0NqtREYrWCJOVXu1DTo3op9AR0VXeQcNU6DV7IEmsuzdJWLCwUK7b1laP8WRuySD5qlL8hEB7z0cSznGuYq990sKaNpY00jWWMTciTjVljOLIQ6IWAnzWNr7x6MRc7uiEQFt5u7MKQHgmErMfCx2f8GOvRq0ttCkt3OBRdahqd35SAjcnsvMZqvqTHQPwlk68N6aI2nzLIZthKovWkptnbIGFfaWXTv+SIISUfeyxKFj2VPWqiGsH03ZnY2iXXa5B+UxUuFc1QE1/QkU0P6bQLvm2x3OZTpNGu9HtgUx6czWYsHwy5rdUs7KjW/Mx6skhn0p65L1sLwr5Q89kK+QnD74iEVabdaYdPSH3nNa0gcAIBbbwGuo2dgIUuFhLwa/6SLfVCtYhNRkDHDO0NljuoO/7yJjeRDKs3T17fJO49u2mzNR+8dacoGm9X/SXN+nxb0aVaL41MhxairNb3bmUJ50tmw5K8jJ+k7U7VnfdL3Ip92VUvX0yRyIYgmf3yr6cVhRtsff6lqHn3yiV+iarvvcHNe9EYaV7b8sHgW/ly0R4v0E+ZLFI/sZjHEmV5tN6dXJAB8zDFEwicQkC3WJuzp/RJJ/MQ0DaLd2rmCerenmivr41B+zSV+2d1ykysJizgxaNmrS31ENidQDHLoNSGP6L7rvME94uGXy50xynmOHxHvpX1pfWnZoY3yedTQr3/K/L5e2s7j/gmstkL66kcSWoue9e8zT8/f+WUfylEGqxgTbwS/w6gfbuvJmaG1HqvgwZrUoyvgmXKX//5R10cVxAxb3/oTrZ5d4qIhFoa1NbebpEGC7E69WL+F6YMplpJbSjIi1Df50eySH3GZTarlNZ5Pn/9AqpZ+l0hPNw0GzX8gcDpBPxM5ARyOv7hO9QGyAbS8P7gwAEE/CLzdbaR1akWmbDFAlQNFPXnECjeC7QIFG0oNvGHczW3gg7wWZsk8yXNlHypWKO7W/Fqw7z8VGDjKCRf1J3PO8idWndqLiOtiVdil+S+dKrgF42iGVJuVz8qzwLSsGNB9rd1ZjGrCUZmMUsX1rh5aLXomM4cI2+w6ffa/NXeymSReosI9rw1dRd+PwAyCEBgLwJ+9oV76l5doGduAn4Ize0p3n1BQGcSjZMvlNCkQQDCDThcOp+AzfTQb3v6F5uYBjVUIWgOH2tpDv+UTWhS+6iZVRPwjz7JvMZBRgol7DdduuorJent95XZNrvqlXgZtfUFL1A0QwJ2tajcKywKSMleBevxo7bskTUMRsr+okJdVSGL6ZIvhF5qrT6K5YaX1JBFugQ7nUIAAhDojoBurnbPa39h0p31GNQHgfBNXR9GYUUvBPx++usHkXpxplc7whwc5WvtXnFi1yYC2lds0pIad37MXmXe8r2W1k/xsHfQ9PG7wkEvne1i23cendNqYeCWDwY9xHSO/dt7IYu0nSEaIAABCMxAIJw9ZnAJH04noDMDucjT2ffeYVhhlu+te3esM/t0FNGZc+FppzM/MGcSAjbxme/bw6kZvV0VGjokYDOlQ8NqJpFFqpGhHgIQgMCNCISDx408x9W9CWiny8Mme6MdWF9YYXhA5uhY+mnYeK3maDPQDwHNfbKZGweDJvVGPTTvkIB9AzdWspUsUocDCZMgAAEInE3AP0LCAe9s+nP1Fx45mcs5vPmGgF9e7A/cfKOFNmsI6Oiukydn+DX8kN2ZQPh7VTtrv4c6zeV7uHsvL/Of8+vff7JI/ccICyEAAQgcTkC7E54fOZz17B2ElAFn19kD/sE/0hkfAB12OcxEvh44jDSKIXAGAe3TzuiMPiDwiQBZpE+EuA4BCEBgdgLhsDG7u/h3OAFtdnnw5HDW3XfgBwNJ6pPDFR4MJJF0Mn+6g8COBOxxlbFeetrRfVT1RoAsUm8RwR4IQAACZxMIx7yzu6e/6QgwoqYL6ZcOhQw1P9DzJcdvm8H/W3K0gwAEIACBFgGySC06XIMABCAwPYHwvglfc00f8RMcDGdXXmo7gXmfXYR8IsvL+WHicaTzmdMjBCAAgekJkEWaPsQ4CAEIQKBFgAN/iw7XviJAavIrbLM1In/RQ0TDZHw8/pDV7SEu2AABCEBgaAJkkYYOH8ZDAAIQ2ErAPyzAr2ZspUn7/xHw44r3mP5H5Ub/z8mLGznfmavEorOAYA4EIACB4QmQRRo+hDgAAQhA4GsC4XTB+yZfk6RhIMAzbgHIrT6GhYXnXy6PfpiPfGFweUQwAAIQgMDQBMgiDR0+jIcABCCwiUA4WmzSRWMIOAIhj0CC0rGZvxjeZSP6PYQ8rPYEpYegYAMEIACBQQmQRRo0cJgNAQhAYAcCvHa0A0RUVAgwuipgJq8OcSdb0U+8Q2j6MQxLIAABCEBgLAJkkcaKF9ZCAAIQ2JOAP1Rw2NuTLLr+Q8APMJDcgUB4Bo132boKengciR8s6yo6GAMBCEBgIAJkkQYKFqZCAAIQ2JNAOFHwh3v2hIuu/xDwbzaRprzDoPB5w8fjD0HvLeh+Sj4ef/iBpN4ChD0QgAAEhiBAFmmIMGEkBCAAgf0JhOPE/h2g8fYEfKaS8+r0wyEsKUS8w4jzsFiHQcEkCEAAAsMRIIs0XMgwGAIQgMAOBMJZgkcGdmCKihIB/3BK6Tp1kxAISwpvS3UbVyLVbWgwDAIQgMAoBMgijRIp7IQABCCwJwH/kAi/XbInWXT9m0B4PuXfF/k0CYGcmOAN2Z5DG2YlT431HCxsgwAEINAhAbJIHQYFkyAAAQgcTsA/IcJTA4fjvnEHIV/JU29TjgWyEsOFNdwCmJjDRRCDIQABCFxIgCzShfDpGgIQgMBlBPwR4jIj6PgeBPxg47A6X8xDopCs9BAhJmpDhAkjIQABCPRJgCxSn3HBKghAAAIHEgjnhwN7QjUE3m+fRSLFMN+ICA8ikSgcJcRhYhK4UQKHnRCAAAQuJ0AW6fIQYAAEIACBswn4Ux8nh7Pp36+/kLXkF3NmGgIhuKwnYwXX3wsejz+Eb6zwYS0EIACBqwiQRbqKPP1CAAIQuIyA/wqaI/1lYbhNx+GnlzmpThP5kELiR5qHi2yYm4P+pQW7o7GwDDf8MBgCEBiXAFmkcWOH5RCAAAS+IeBTSJz6viFIm/UE/Kjjpbb1/HpsEVJIhLXHIC2wKSeSFjTqS4QsUl/xwBoIQOAGBMgi3SDIuAgBCEDgfwTCgYEvb/8Hhv8fSyBkHHgC7ljcx2sPK8mgz7Acz2mMHsJ7bcN9u0AWaYxxhpUQgMBEBMgiTRRMXIEABCDwiUA4zH8S5zoE9iEQkg6kL/fBep2W0fMO15HrtOfwtOBYM5QsUqejCrMgAIF5CZBFmje2eAYBCEAgEQhHhXSdCggcRYCxdxTZ0/WGZDTvsp0egf07HDqmZJH2HxBohAAEINAkQBapiYeLEIAABOYi4E/yY33bPFcc7uhNOKbeEcEsPvMg0iyR/Jcf/u4w1t9rI4v0r0DyAQIQgMDxBMgiHc+YHiAAAQj0QSAc4/ltmj7CchcreKltjkiHZWS439CZIwpHeBFm6OW/dfV6vfxgez5/a998FLNI1rzR6giG6IQABCBwEwJkkW4SaNyEAAQg8A5fNUMEAicT8COQ7MPJ8HfprrdEwy5OoUQEfNbm8fhz4SQNlvilI3//kbNIGqgXuiCqFCAAAQjMR4As0nwxxSMIQAACBQLaVecNd0GaKggcQ8CfBo/pAa0HEvDh4+eQDgR9nepwp7jkiSQNM//w0fP5q1cpQyIp39RMkhTSdeOIniEAgckJkEWaPMC4BwEIQMAIhK92wy4cShA4h4DOgWP98Mo5cHrupYfkQs98ZrLNT9Lzn0hS78WblCWMQnooZJFIIc00GvEFAhDokwBZpD7jglUQgAAEdiagb3etsLN21EFgGYGQzVzWCKnrCehsXzzGX28fFuxKINwv/DNBu/ZTUKauC9feby0g/qo1eT5/lesMaSYvTBkCEIAABLYTIIu0nSEaIAABCAxAQFtzngEZIFpTm+iH4tSOzuOcju6K3Ty+4UmJwFURV7+1vJUEvNXKIhWveknKEIAABCCwCwGySLtgRAkEIACBrglob63ddtfmYtzUBJSJIKE5Spx5EGmUSO1op5+np01V3apqWaT3+79/JsILmKkapTyItOMwQBUEIACBIgGySEUsVEIAAhCYioC217bbnso3nBmNgA6K5//kymiourDXx4uQdRGSU4zQ22FKJxV/qGhfWzTYfJIodGH2eAFZqAKJpACNjxCAAAT2JUAWaV+eaIMABCDQIwHtrfmzSj2G52Y2hdPpzbwfzN0QrEv+YtdgyCYyVzkdu4OckJpRjz5JFIiaMV7AmycNJ+S8gmF8hAAEIHAfAmSR7hNrPIUABG5KQLtqniO46Qjoz22f1iSz2V98/rEoRMof3f8RojQvAX/7OOEOoqxlLWMlezzykFfSs7ckkjwlyhCAAAR2JEAWaUeYqIIABCDQIwFtqU/7bYseKWBTTwR0FLTjH4e9noLzjy1+6WD1+IfLzUphGBw9W5W4LHZkxoQcU8gi6beTgtjN4oa7EIAABA4kQBbpQLiohgAEINADAW3Keeijh3BggxHww5InXDocFXoqxCLFgbzDGJ1mkp+tR99HfIo5JJKUzwr1Zp5fRjR6GbenDRI6ggAEbkWALNKtwo2zEIDA7Qj4HfnRu//bwcXhDQTOPJduMPO+TQnQfWOfPA/3kaNvJX7syRZV+myRXbVLoV42SwMFCEAAAhDYiwBZpL1IogcCEIBAjwS0k+aFlB7Dc2Ob/Mg8+lB6Y8xfuh6iwwMdX3KcqJmSOMWUze6O6rGj0G9xKBZN0uNI/CT87tFBIQQgAAGySIwBCEAAAjMT8Fvw8BbAzG7jW/cE/BmPFGdX4SKF1FU4OjEmTNgTUjOv1+v5/LXRaIXaLax2VRrCY0qdIMUMCEAAAuMSIIs0buywHAIQgMAHAj6FxOMeH2Bx+XQCfnwWHzE43SI6fJ+fLAD6KARIL44SKeyEAAQgcDQBskhHE0Y/BCAAgWsIhNMgX8ZeEwZ6rRMIh9LagwZ1BVzZn4BP7fGM2P58B9cYXjQj+Tt4PDEfAhCAwJcEyCJ9CY5mEIAABDonwBG98wBhHonO3sYAOYLeItKbPWHOnvBeW28EsAcCEIAABN7vN1kkhgEEIACBOQmEZwrmdBKvBifAKO0ngCQI+olFz5aE7yd4V7rnYGEbBCAAgYMIkEU6CCxqIQABCFxMwJ/PeZ3t4mDQfYVAOJFWpKg+g4BfMXiX7Qziw/bBUBk2dBgOAQhAYB8CZJH24YgWCEAAAl0RCIdzskhdRQdjRICBKhTXFngQ6Vr+w/UeEknD2Y/BEIAABCCwhQBZpC30aAsBCECgUwLh9006tRKzIPB+++MoP9Z7yYgIuTyicEkUxuqUtONY8cJaCEAAAvsSIIu0L0+0QQACEOiCgD+Z8yBSFyHBiAqBkMKoSFF9FAHSAUeRnV1vmLn8QNLsAcc/CEAAAv8QIIv0DwtKEIAABOYgEDb3/AH1OcI6sRckPS8MrofPzyFdGIgRuw4PvfIU24hBxGYIQAACXxAgi/QFNJpAAAIQ6JpA2Nl3bSvGQeD99nlPDqJnjoiwVgD/TPgT9MWDbBMEERcgAAEIfEGALNIX0GgCAQhAoGsC/uECXmfrOlQY9z8CftD+r47/H0uAFMCxfO+h3aeAbRbfw2+8hAAEIHBrAmSRbh1+nIcABOYjEPb0ZJHmC/GUHvksEj+wck6IA3PWinOwz9cLA2m+mOIRBCAAgTYBskhtPlyFAAQgMBiB8IrKYNZj7l0JhOznXTGc53d+EOm8vulpLgKMpbniiTcQgAAEPhMgi/SZERIQgAAEBiLgvxbm4YKBAndzU8NBlKF76HgItB+PP/wG/6HAp1cessD8wNb0EcdBCEDg5gTIIt18AOA+BCAwFYGwlZ/KN5yZnYBPgHIKPTTa4YlFcnaH0r6J8nD3YVDdJO64CQEI3JMAWaR7xh2vIQCBOQn4wyGb+DljPK9X4RTK0zEHhTpwZqE4iPMN1fob0OPxh6F1wzGAyxCAwE0IkEW6SaBxEwIQuAUB/zQHh/BbhHwiJ8NrVhxBj4htSCHxzNcRkG+rM0xh3pS87UjAcQhAYHoCZJGmDzEOQgACdyHgU0j8lau7RH0uPxnDh8aTQ/6heFH+fr9DmpI7EaMCAhCAwJQEyCJNGVacggAE7kjAn8B5juOOI2B8n8MRdHyH+vLALxG8cNRXbCayhmE2UTBxBQIQgECZAFmkMhdqIQABCIxFIBy/eZ1trPBhrREIw5hk6I4DIz+ItKNyVEFABBhpQkEBAhCAwKwEyCLNGln8ggAE7kUg/KzpvZzH24kI+AcZ+NWevQKbD/Ykmvdii55MINyPmMgZETUQgAAEhiZAFmno8GE8BCAAgf8S8GdvnuBgWIxLIJw/x3WkK8sDVU71XUVnSmP8LYnXJ6cMMU5BAAJ3JkAW6c7Rx3cIQGASAuE9IJ4ymCSut3QjPDVDSnT7KAjrAz94vB0pGj4SCBOZv9f2kRgCEIAABAYiQBZpoGBhKgQgAIEygfCgQVmIWggMQsA/xcBTMxuDxmF+I0Caf00gpC+Zy1+TpCEEIACB3giQReotIve15/n8DRsOO0hY/X254DkEFhDwp26e3VgADJHeCfgh3butfdsXUsysD32Hazbr8r5uNg/xBwIQgMAtCZBFumXY+3PaHxhq5f6sxiIIdEEgbNM5JXYRFYzYRsDfCBjSX7P0GPltmq8x0nALAQbhFnq0hQAEINAnAbJIfcblRlblh+1tpxsOxrYL4ddebjQycHUxgfCsweJ2CEKgXwL+FkAW6bs4eYZ2D/1OD60gsIVA3uaxl9vCk7YQgAAEeiBAFqmHKNzXBr+3+Pn5WzwqPJ+//pBclLkvQTyHwPvtv+nlhycYEXMQ8HcHfg36i5gGgPy28RcMabIXAb+Lezz+cJ/aCyx6IAABCFxFgCzSVeTp9+2/Jv34xdTr9dIuhEQSowcCIuDnEW+sCAuFCQj49OjaZZ9jqu6YhhEgE8yIoV3w0/nrWxXDeOgxgPEQgMBMBMgizRTNkXzxR9+PKSQ5pm0xOwkxoXBzApoUtke/OQ3cn4mAv00sX/Ot1XL5mYjJF4+OlUFYKFxIYOPDcWp+oQt0DQEIQAACIkAWSSgonEpA30otTyGZfV83PNU9OoPAWQQ0I77+dvcsS+kHAusI6Ny4PA+ipOraO8s6y/qWDtx4l63vcN3IOk1Pm9GrUr1qeyNeuAoBCECgYwJkkToOzrym6WvStS8pvN//vAe3av8xL0s8uzUBTaXlx+xb88L50Qj4JGn715FC6mQ0R/e0V+dto/fFfXZPa9AFAUcg3LMWDk7fyimjCAEIQAAClxEgi3QZ+jt3rIPBdxA2Nv+uU1pBoEMCfm+9cDveoReYBIEaAT/C21kk3Rdu/lBeINaGVsNOPQSOI+Cn6sLx6ZscZxiaIQABCEBgOQGySMtZIbkbAW0IvtOoXfKd31n4Dh2tJiOgqcRLK5NFFneMgFZ7G+q1VClP32jA+DVh4RFdbSlA4AQC4bHBj8+Vh0XgBAvpAgIQgAAEPhIgi/QREQI7E9AGYove9olii2baQmAUAppKNh1GMRs7IbCKgE+L5ANnmAUmfM8vGDKKe3JYNboQvoTA8rRvHtWXGEynEIAABCAQCJBFCkD4eDgBfa20pSfbgtS+l96imbYQGIWAptLNX+EZJV7Y+R2BcOD0SvwU8MkmL3OfcgCVM273QYGn/RPwE7ZxCwtiPF7Xf2SxEAIQuAkBskg3CXRHbmrfv8UmU0IWaQtD2o5OwG+veehg9Ghif41AeBjBlv1Q6edCTc/c9bqxCsXc/uLd6ATyFM53sZAYtbE9uuPYDwEIQGAOAmSR5ojjSF5os7vFaJ5F2kKPthMQ0DxiYz1BNHGhTUCZkcfjz8/P33z+9AJtVVNezUDygXxKx3FqaAIhSRSensujmpvd0OHGeAhAYDICZJEmC+gA7mhnsMVW20zwLNIWhrQdl4AmERNh3CBi+XICIWfqc0ahfM+bQjiN3xPC8uGEZD8EakO3MeX7MR5LIAABCNyZAFmkO0f/Mt+17//aAg7PX6Oj4QQEwg6bQ+MEMcWFBoEw4HUHyYUbzoUMp0GSSxDoikBt9OaprZqu7McYCEAAArclQBbptqG/0vGNu4GNza/0nL4hsAeB8P3tHirRAYHzCLxerzCGtapvLNwwixSI3ZDAeQOXng4gEJaCn5+/oSaM8ANMQCUEIAABCKwmQBZpNTIabCegb5/Ca/BLNG9pu0Q/MhDon4DfVX8xifp3EAvvQECLuR/PG8t34OZ9DOdtUkgeDuUhCIQXtD+uAEM4hZEQgAAEpidAFmn6EHfqoDYKq34E1O82VjXslAJmQWA9gXD25ty4HiEteiGw+0NJvTh2ih3+hmi/O35Kt3QCgf0JaE/4sbB/32iEAAQgAIH1BMgirWdGiz0I+JPwwnyQ3zHz/MUeQUDHkATC0wdD+oDREHAEns/fMKo/niSLAnfLqAYIjihFCIxEYNUKMJJj2AoBCEBgXgJkkeaNbfee+UTSx92/TyF9FO7edQyEwPcE/NGRdOr3HGnZGYHtiaT73Br8DdEWhIVfxnQWc8y5L4Hn89dvAv19rV2+zzS/7+DAcwhAYAQCZJFGiNK8Nvqt8M/P3+fzN2yFX69X+JIqCMzLBs8gUCAQtt1MhwIjqoYl4O8I7ZNk8ep9jpfB/fs4PuzQxvC3befCLSyM5CUfGe0MJghAAAI9ECCL1EMUbm3Dqi0Fu4dbjxWcf7/DfAEJBCYjEEb4klOlZCZDUXMnI6pJUg+BTghokm4vsA/sJKaYAQEI3JwAWaSbD4Au3F/yA6s/P3957KKLaGHEpQT8FpzX2S4NBZ0fRSBnSfywb5SPMqgzvYEAh+rO4oM5/09gryePwmh/PP4w4L8eYeyiv0ZHQwhAIBMgi5SZjFSj+/QE9wb54jcN9ub8BN6NNKqwtVcC4X0fNtO9Bgq7diDwxc8k7dBr9yoCFlLJ3UfspgYWd3R+d/d1mRvf2iHl8/Jr2yIPAQhAoEaALFKNzDf1lvII/z00A6J7w2S3VdtefBMD2kBgXgKa70yQeYOMZ/8QCBmTj8fOf1pOWgp55Mfjz6EbjEkp4tbZBCyj9HH+Lhc424HB+/M7h8FdwXwIQKAjAmSR9gnGx5vfQVke3RsO0r8PnfVajOf6drSAwMwE/Doz2ZSfOWz4toGA7nF+8BfLd5gRwXFSSBtGFk0vILBXOukC00fu0q+iI/uB7RCAQF8EyCLtE4+wt6t93H2bq3vD7pr34fKtFgP4bWvaQWBCAuExhAk9xCUIlAiEkX/a7bVky5V14cmsyW76V5Kl79MJLPk1zNpMfzz+nG7v2B3qpAC6sQOJ9RDojABZpH0Cortd3tiFm2UW2GKB7g37qt1i0i5tySLtghElMxHwZ8jJ5vtMYcKXIwgsSSTNPSm0x7DC3M4eMYTQ2SGBrx9N4im8VdHUSYEs0ipuCEMAAm0CZJHafJZe1Q6vtreTwL6LuO4NtX6XOtCZnOHqzCjMgcCVBPwaMtl8vxIrfQ9CQDc7PxF8eeJJkX0fJGiYCYFFBPxEXlKeeLIv4rVSyC8gK5siDgEIQKBKgCxSFc2qC7rt1e5t/jmCVZrbwro31PptN+/2qvHs1jwMg8DJBDTTmRonk6e7fgiEWaDbrhUmuwl67Pfx1HtN+VYEwmP7YcyHjxNP9iOC7lfOI/SjEwIQuCcBskj7xF13uNq97aBFXGpr/e7j3ulajOfp3dIhBDoloBXm8fjD3/buNEiYdTyBxqttx3d+TQ/+Kyim/zUxoNezCCzMJXETXBUQnRT2fRlilQ0IQwACRuD5/J3mnVyySPuMap3xatmchYu4vSX+fP7+/Px9Pn/t34aJUuv7VUMrjDhYySI1gs6luxHQNLd54Sf73VDgLwRqiaQpyWRnR7yhTxkanDqOQB722mOrcFzv82n2W4j5vMMjCIxFwNa3OXbyZJH2GXu6sdWGhb5OrH2F0v4Gppa51L3B+tVH2WOFn5+/Y209zex9YoMWCAxOQKsH82LyA1S1AAAgAElEQVTwSGL+PgSKh8x9VHemJdzKx7qPd8YScwYj0N4VD+bMpeb6o8GlhtA5BCDw/wR0Nq8lDUbBRBZpn0hpq1ccEH7LW9wFeoHH448eJgqnx9xW9wYV7Il30yCrrJCb7+P8AVrM4AMUoxIC4xHwE7mWhh7PKyyGwAYC4aY55ZsaYQPA3N8wXmg6KoE80+2GWNxsj+rkwXb7A8LBXaEeAhD4TMBPyeGe8/DukUXyNL4v65gXbmz2bppdrW0B/T0yJ3r81azBD0RLPwUNXiA3/97hg1sasYM7QT0EBiDgp/Dj8SdM8AEcwEQIHEMgJFmO6eQyrWHiT5kmuwwuHY9GIE+HsNkezaFT7fX0Tu2YziAAgRIBf7RvpwhKrTuqI4u0TzCURaoVGjc8re81GQlYnshb3LgkMS+jys4LZJE6DxDmnUbAz19Okqdhp6MhCPgb7hAGLzfSu8bEX84NyVkJhFthbcM8q/tb/PLotuihLQQgsBeBcIsf9NhLFmmf8VAcDb6yccOTWO0pA5+zDM8T+XtDrfn7/dZ3tg0z9gGxk5ZBp9NO3qMGAv8Q0PrAn2f6BwolCPyPgO5u/6uY4f/+zp6/PZrBQ3yAwFcENN9JrS7n59eT5a2QhAAEjiPgZ6Xf549yTjcyZJH2GSEaAf5vq/nX2UwgDw4No5AeCmZJLNw4Vb+weVssdLrXRxkpSgcVMt69XEDPPQnobybqp8rOL/jJEpaX842hRwh0SEC31w5t+84kP+v9TyV+p41WEJiJgBJJMzl1qC8iFk4Q99zX4TUEeiDgHxAJd3xtaXqws20DWaQ2n6VXNQKKiQyfRgl5nHZD370kfaU0F/v1ksXmXuC48hdHcbN27W218TTWcd7p9vwxBN4GBU5xsYKXaZeP07DKkWC/Atc23l8tali111EIgirfS7tc1GDDL+jkIwQgAAEIQAACEBiRQHsvpKvbd5i1Q7K6+FjYrsG/iuGDNdwud3s4ahqWo6iFY7uGjyPBC9S2616mXd6uwY8lX27366/WwuG1Wbn2J9q9tgvLZJH2ga/A16aTn35e5mND2VeU1ED0OtXEF9TcV3ZbNmu7Nc8btjwEvpX+0KPistZl9bu7ho9jyTsSereP2zWsyiIdhIIsUjG4VEIAAhCAAAQgMCIBv39rlLdvq7bvcnfRUHRk+x51u4YedrlrX5cuDvjtKBrjMF/aHtDtGoocdglo1kwWKY+BCWsU+MZ0kox/HEmVjYbGS+PeSxYri3zVUfFqb5VmbW9WYc/dCGh+afpQgAAEIAABCEAAAiMSuNsuDn8h0CcB/3BJXkns9yv6tNxbxbNInsb3ZY0An+IJ6vyJVJeWNDRhSfr3tqSz0W9orq57LpizPVuIbRCAAAQgAAEIQAACEOiZgE4Kqx6X6NkjbIPA6ASKL9atfTrscghkkfYJgVI8jWxOcR1f0tBMlKS3WDob/Taae1VdlckidRUOjIEABCAAAQhAAAIQGI6ATgpkkYaLHQbPSkCHel8YzlmySPuETIOgkc3xeUf1qob+NTdd9QVJ+krdGxr9vt/vhWJe87Vlc/ZaG+gdAhCAAAQgAAEIQAAC4xLQEYAs0rhBxPKZCOTX2T4mAfp0nyzSPnFRiqeRzanJqN6/qhbMkkzQv/DeoARWo4vQ47Ufzd9rbaB3CEAAAhCAAAQgAAEIjEtg4UlhXAexHAJjEfBT8ufn7yhn8wyZLFJm8k1NLcsjXcrjPB5/wnDRpVomUgK5bRiI6s4XvIyv77lMFqnn6GAbBCAAAQhAAAIQgED/BEY8BfRPFQsh8DUBO+SO8hPaDTfJIjXgrLhUyyLlPxZeTBWpeRhSr9erkULyr6pJzD+s5O8cOQO1wr3TRckinY6cDiEAAQhAAAIQgAAEpiLgzwJTOYYzEBiQgL3O5k/rAzrxX5PJIu0TO6WBGoWQIfIdh2xRUUlxwOne8H6/i61UGR6A8r13WDazOzQMkyAAAQhAAAIQgAAEIDAEAZ0U+F2kIeKFkXMTeD5/xzqSN8JBFqkBZ8UlJWuKhYUjxi/0Xk8xf2TGqUn46JuP+Mql2b8iAIhCAAIQgAAEIAABCEAAAo6ATgpkkRwVihCAwFYCZJG2EjyivXJAXys3DY3009eaz2lIFukczvQCAQhAAAIQgAAEIDArAbJIs0YWvyBwLQGySNfyp/cyAbJIZS7UQgACEIAABCAAAQhAYBkBskjLOCEFAQisI0AWaR0vpM8hQBbpHM70AgEIQAACEIAABCAwKwGySLNGFr8gcC0BskjX8qf3MgGySGUu1EIAAhCAAAQgAAEIQGAZAbJIyzghBQEIrCNAFmkdL6TPIUAW6RzO9AIBCEAAAhCAAAQgMCsBskizRha/IHAtAbJI1/Kn9zIBskhlLtRCAAIQgAAEIAABCEBgGQGySMs4IQUBCKwjQBZpHS+kTyCgG97Pz98TuqMLCEAAAhCAAAQgAAEIzEfg9Xo9n7/273ze4REEIHAVAbJIV5Gn3yoBexCJx5GqgLgAAQhAAAIQgAAEIAABCEAAAhC4ggBZpCuo02edgB5EsiwSjyPVUXEFAhCAAAQgAAEIQAACEIAABCBwKgGySKfiprM2AaWQfn7+qvx8/rZbcRUCEIAABCAAAQhAAAIQgAAEIACBEwiQRToBMl0sIvB6vfQumzX4+flrNSSSFhFECAIQgAAEIAABCEAAAhCAAAQgcCQBskhH0kX3GgJKIb1eL2vn80qqXKMSWQhAAAIQgAAEIAABCEAAAhCAAAR2I0AWaTeUKNpCQI8dhR9C0nttoX5LX7SFAAQgAAEIQAACEIAABCAAAQhA4AsCZJG+gEaT/QnoQaSsWpd4ry3DoQYCEIAABCAAAQhAAAIQgAAEIHAaAbJIp6GmoyoBPYhUyxNZIonHkaoEuQABCEAAAhCAAAQgAAEIQAACEDieAFmk4xnTQ5OAfvyolkJ6v99LZJqdcBECENhK4Pn8tX+3Ktq7/ev1MsP49bS90aLv7gSYWXcfAfgPAQhAAAIQKBEgi1SiQt2JBBY+Z6TnlTgonhgcuoLAPwT0buk/VX2U9OtpPhNtqaWfn7/7rhjP5+/uOvugiBUQKBCwWe9nVkHoiqrX6/Xz87dDwwwGC8UVg4I+LybAsL84AHQPgXMJkEU6lze9/ZvAqtzQwnzTv3vgEwQgsA+BvbJI+6Z13u93MYukteXrc2a2k4ci9xlJaBmHwC5ZpDyVtgPQBN+uancNLBS7I0Vh/wQ+Dvsj1oH+sWAhBCYmQBZp4uD27lrx7NcwWreox+NPQ4xLEIDAEQS2Z5F2OZFm14oriSrX7lzVsJh+MhfW6sw2UwOBIQhsnLOaTbs7a5q7/bVEFordI47C/gkUh70WgeIttX+nsBACEKgRIItUI0P9sQR0X1m1C9TXj6taHesJ2iFwDwK2QdySw914Iq1h1mKyyyZ1X201m6mHwBAENs5ZzaYhnMVICEBgdwJaBHa5Qe9uHgohAIGvCZBF+hodDTcR0Il07X1FDTd1T2MIQGAlge1Tb+OJtGbvvpvUfbXVbKYeAkMQ2DhnNZuGcBYjIQCB3QloEVi729/dEhRCAAL7EiCLtC9PtC0ioJvKF48U8TjSIsQIQSAR0N8yS1cKFfqLbHp7q51FyvJZ6cIT6do/C6X1ZPkmtdHFF9qCp8ZZ3MJV/3FVROwXoMxyr4QyBBoENDEbMrqUhRtzVqP3+fytjXbNJnVRLEhV8eqWyuWTcXkvsnb5glNUnmlnMfWVL/mahWK+CeWrCKyKe21mZeM1BopNrNPcqljTsNAuFbsoqqr9cGFNmHoIQGAgAmSRBgrWJKb6nzdadSuS/zrNftdceihAYCACjfNY8ZKv9JPu4/RRQ0latlcfPTT7myy6pII/X2WFy8WWzHHpL3bqK/2OVjboHT3p8ZesLJfto9dpraxGOW5pqNlf5GbHgNCjdV20TVZRmJWA4l50MI9GX5NHY+1rGz/wNHRtSHuFskFWSfjx+BP+dmFRxuSlpzYfa7Om2DBXLpmMMs839+Wi48WFNDhuSorN7ZK6DvR87/YX6LyAEfYyDW1ZjJrLCSyJ+/v9ztP28fhTTNRqjOXRopmeO82TSzLF+WjyjS48WJlkldIcRrLuub4tZQhAYDgCZJGGC9nwBuseucWTXZRsMYC2EDiZgDZkud/iJVXq5GPfImruPB5/8obSX9UXknaA0UbQG6Bdoxe2SinXd6RWb3+fO3ylqX51VTU+ZeO7VlmeeslipVyQtf6PhZud6leWeLXyN/SurJA0+74kbAV1YccDtRVn36Pf2Uu5NQlq+TgfAQ3jomt5NKrGxpjGsIacjpdSqPXBhp+NMTWXQsm/328vafIm5pWH2eSHrqny/eqq6SkuTd4APyl8veHShMpq/cwqumbaMnZvrahKLBtcU65AaO6btd4w31dwwRP2ELxJQcbzoXwVgbVxV0B9Q91SzQuNMRU08jVD/SUr28DzHDSMrWBdh369Hl3KI01ipj8sAnLKj3ZvCWUIQGAsAmSRxorX8NbqdhVuh2sd0zYr38bWqkIeAkMQ0NzJ1hYvqdI2lKGVNoK+Xk3C9NR0sz2ib5LLXjhcDVtMXbV+81yWPe1NZ1EsV+YaGeALbbHsguSD/Z6D51mT999CB39zp95gyhMT0Ggp+pgHhtXYf/2oe7/ffkB6bWoS5NV1Pnb65laW8jB0pSQ3sX7DrPGZkdzE1xQ1qzKolXk+3WNrYJC0LrJtWjADJT9tvXmmIdCQklDvG1qSztupq4pUo0aXKPRDYGHcawPSj17vlMZDGMPqLo8iNfHDWLMmyPv60IUueT0aumF4SzjUe18oQwACIxIgizRi1Ea1WffCcEP6zh/dmcJt7DtttIJA5wQ04LOdxUuqLE43TUa/sbMtZlFe2pY8iy7hYKrp9z2agNUXJ3LDJClXd15zrlRNsaO2Nl3NLjTU6pI3zDTUMGb92pq3zZaFFGYioCFUdCqPFo2u4mjR8VIDUvpV4ztqX/WSSqYEPdIQhFVftNO8KF6SHmlQjc9A5baSl4XFNbCoJLf1nRb15NBILNvmtVlf7UVYGnIvXhXlHgisinvtvlAcgY3JbpfyKCrqUWVDXkNOSItjr1gp/Zp6UkIBAhAYmgBZpKHDN5jxuuftZbf2xHspRA8EuiWgrVi2sHhJlbWtW/jm8+Nmd8n8DS+vBVOLW0xlSYKwfVwyx4ue5krVFH/HRL1LrMgtuyB5aVBBl6RKkFUjYSuYv+Gqddo2O+jh4xwENISK7uTRaDW1s6iGn46LYRHIveQusox/byUM3Zr9tXpTXpwFod+ihmKlNdQlb2ERV15zVJPP0qY8U8o1ZoDIB3f00cS8kbqk8Omq7FeNhCl0QmBh3L+YiYp+9jQPP8nkS8WpYfK6pOYqFAdqVu7TsoxS0aMAgTkIkEWaI44DeKG70Y43kiN0DoASE29JQKM9e1+8pMrajJOAKQwfcy+NPasyQZKxQlDS3mKGtuFjUOU/ynLvabHS6/TCH7VJILugjiTjC0G+LawNd7BNrUyb1095bgIKfdHNMLr8NCzKZ4GsITRsCMg2kylKSqao1jfM5TALgoai5mKlGmYLJe/7ymKyTapCQXpUX1PiO5KwL6ivRkFK1K8Jez2UOyGQR0LRsI9iirWaa4SoRoWGtnxJmjWupEeXVKOCXQpNsnLd1Ja8GCvlFCAAgSEIkEUaIkwzGNm4G21xT18SblFCWwj0T6Axg4qXVBn2efJUAlYTPkpMhdqeVQ0loILaWqG9xVSrYiGo8h9lgPe0WKn3bqyL4tM9tYY1FyTvTVI5uNwW1obbO2KqtNAFheqIwpQE2gMmDwarqT2LtFcWKf/BJvUbhm7Nfsk3CkFViG9Rc7FSDa0vrzY/3SMNXkxGSlUoqJXqc1+5RsK+oL4aBW8bK4On12F5Vdx9ZIMvtTFWnOyNTvMlac6961IwpnarysolSRYpM6QGAqMTIIs0egRHsr/4x0o3OmDP0m9UQnMI9E/g434u7CYln7eG5qwEih8zENsg+l50BssbRBMOSj5uMfUHiXIhqPIf5Yj3tFhprcIZ2Lf6uOXNLqgjb5LKQb4trN6DSUWzP74aIxsojEugPWDC6MpJouy4NdEszhpCkyygWR+SsGZqGLo1+2VGnumqqb0+ZhYWNRcr5VH2JRNTUkatsoy/VDMm95Vrsh715f+alYCokMnI8eLfUih2ROU5BFbFPUwfb6FCrErTrLmseo2iorZsjzRneV3yyq1sl0KTrFw3tbxJyDqpgQAExiJAFmmseGEtBCBwUwIf93NhNyn5sM8TPhNQMkLyEgiFvGfViSufaky4qCHY87HfoCR/lAavuVjp2/pc0vKGeZesjrxylYN8W1iPSnl7pEoFKWmLSZ7CuAQU66ILYXTp9BiWAt/WmmjWZw1eWAr9SLNZLw2SN1O9pD9ASswK1m/DziCfPxbJFCvVtuismtgiZjJqYoWP1mYmua9cE3rxfQWMRclcKV++a54VUrOdwF5xr42x4iRqdJovNYaNLmUOdimMtKzcLwJBOOukBgIQGIsAWaSx4oW1EIDATQl83M+F3aTka1u3vOHLNWKtBxB8LybvayRvl/TRCjX9Vp9TUaF57WPR02Jl0CCnPKJ2w+yC5INy+5jlraYIrXhoL6q1E4U3uyhG5egE9h1d0qaRo5oiqOIEyUPa2poqafaVebSr3+2z3lsutb5S5aLl3kdrXkuQNR6myJpzTds2GVmzQQLtAitDm8/5V1fFPc8UGZxHlNUUm2Thhh5ZGCavTwCpuQrWKjQp9tvQL20UIACBEQmQRRoxatgMAQjcjoA/7XjnVR92k9q6PR5/8lFNV70qO4EEPSagS/5qbRfbrg/7Tj2Akw9v3rZGWb54zcXKoEToljfMu2R1FJTbxywvktlfXfL2FNWa5EexYlsqByKgIern3fv99vV+GGjq5dGlHKVX5fVkLMUBmYe0NSzW12aH+i3amS3JNUXNxUq1LVroj8rmb14tZW1xLRUldSTUPjRS0nZZYtkMr79WZmWokbmqXgFdGPcsJg1+5mqMhUpzszbU1cqPTM0aX2l6dCnTs0uhSbFfKQnCWSc1EIDAWATIIo0VL6yFAATuS8C2aPpK3H4UzH4Iwy55NNq6hY2dWkmPWvndqn7F7Pn81TEp9KJ6bXz9a2J5dyt5U649ZbFfs8p+CkQWFgvyVAr9yVCVpkpnM2+qKvP5/PWff9RvgOk7kowvZHnt4y1w+q0TkyweAos/QFM80PquKc9BwAaGjRYbjRrwebRIWPIGwY/2gEWzUguCXyLyAJa8Zo1XrummfmWSzXq1kh77DSBvlRYfXxnKguDri5USyL6ESyagSl+QtWHeqV5+WatiXxI21NbEaPvmEgurn0kGq3xDue8rvTzlSwgooAvj7seYvzmGsGpmZaeKw8/E8iUNmzB523c3axWaZOUfb6nZeGogAIFRCJBFGiVS2AkBCNydgHZ72j5aQYkJD0jCKoRWOcvjd41B2CtRL77Sy8uesMXM8h9VyUFJ5oLU+u5ypWq8qUX9QcCrtUu+RmqzYcs5SK1p8/qlJFhVDF/RBiqHJqABFgaAZqsfLZKptfLCwqJWoSAlvpUqa8JSa4UsJoFwyX/0PUreF2TGx0oJmP6iZmkrXjUN3rxQzq1qfYWG+hg0qD4X5A4rg0fReTnH0WqWxz1I+uhn34vKTSxfagx+Xcpd2KVgVVbuO7WrylZnndRAAAJjESCLNFa8sBYCELg1Af+tpu3J7PtJK3s02v/ZF/vawFkhPN5SbKgmtlNU121hb0/YYurlNWluqzKxjw8meE+lMFeqRr37r3zV0ApyNmx5ZZLkpVY1vpDldVUNrQtjZZWem3/QQ5br4S9pozAxAT8abQzYLMujRSMkz7Uwkj2u/PCRng+yrv2ALGr2Grzm8CRCtsHPAhmfxYJOZdBCLlXasrxO3cEXk1TD8LhH0COxj6aaQLuvhpLirNfTi2ZVUYaVIYSsn49LBk8tpsWBpPGTfWwMv3xJhuVedCl3YZdCk6zcGvonqpbM7twdNRCAQIcEyCJ1GBRMggAEINAi0D7qWEvt//w+z5dbHfzn2oXCq7r+6EgWWALQTqq57aE1xUO7elxotuQpTEbg4wAoHiyXz6bw/mab3irhj7Nprba2bUdf3cvajwG1NNxHsY8CRwNB/yoCS+K11xhbZdjRwsvXoqMtQT8EILCdAFmk7QzRAAEIQKA7AsUsUndWYtC/CVgWYMkZ49/t+ASB/ydQzCKBBgIQgAAEIAABCOxLgCzSvjzRBgEIQKALAmSRugjDGiP04tKaRshC4B8CZJH+YUEJAhCAAAQgAIHDCJBFOgwtiiEAAQhcR4As0nXsP/RsR339ASYr6PzPg0gf8HG5TkCjqC7CFQhAAAIQgAAEILCVAFmkrQRpDwEIQKBDAmSROgyKmaSjfi6QQuo2akMYphE1hLUYCQEIQAACEIDAoATIIg0aOMyGAAQg0CJAFqlF5+prOu37wtVG0f/wBDSchvcEByAAAQhAAAIQ6JgAWaSOg4NpEIAABCAAAQhAAAIQgAAEIAABCECgGwJkkboJBYZAAAIQgAAEIAABCEAAAhCAAAQgAIGOCZBF6jg4mAYBCEAAAhCAAAQgAAEIQAACEIAABLohQBapm1BgCAQgAAEIQAACEIAABCAAAQhAAAIQ6JgAWaSOg4NpEIAABCAAAQhAAAIQgAAEIAABCECgGwJkkboJBYZAAAIQgAAEIAABCEAAAhCAAAQgAIGOCZBF6jg4mAYBCEAAAhCAAAQgAAEIQAACEIAABLohQBapm1BgCAQgAAEIQAACEIAABCAAAQhAAAIQ6JgAWaSOg4NpEIAABPog8Hq9ns/f5/P39Xr1YRFW/JeAxeX5/IUIBCAAgYMIsP4fBBa1EIAABAYlQBZp0MBhNgQgAIHzCDyfv4/Hn8fjD9mKj9Bfr9fj8UfpNjt9GT39d8cjmXR+NMwEFMqF8ohB4BwClqr++fmrufNdv6/X6+fn79wrVVhkDJ2WAisYhI0wFQLTuZyqjJEGChCAAAQgMBMBskgzRRNfIAABCKwjsPCModTD8lPEOjsmkv75+ft4/JFDOk0VC9t5Sq16bBfMvO39tnvhas8EFs76k12wkbk9VS09J9t/JtWwyGh91mrgC7tMdlO4UJUlufwyeHIs6A4CEIAABI4mQBbpaMLohwAEINAjAR08lhgn4YWniCU6Z5V5PP78/PyVdzrOqeb9fj+fvzrrbjx8FvX7vkLZ5Dd2GnTycRQCa0fLmX5pkdk4OE2Pn4NHeyHLj+5I+sMiUzTAnsnaa76bnoXr//khEBkKEIAABCBwDgGySOdwphcIQAACfREoHjxqJkp44Smipmf6+nzWapzbLZG08bjb0F+kHc6fRRkqZyWwdrTMymFfv7Q87qu2ps2680txw4BdFpn3+51Xtpp5liX3b/U2JLkEAQhAAAKDEiCLNGjgMBsCEIDAJgKNg0fWK2F/dMliN68pUmqc2yW/hVtDf1ZrPRLETOYmNatGy02YbHdzl4m83Iyc0GkY0Li0vMe1WSSzcJV+hCEAAQhAYCwCZJHGihfWQgACdyew8G9yffyraqtOFxJWAuKj/nPitNYMkz/INlHy+hvn9qK8b2vf6lvEQ70+Zv2NEWI9bnxjSF1TOI1AI6beho9iebT45h/LtaGoafhRw/v9lrAWkyWtJKPmXw9jaZDOjwVzvNbjkon8sYvlAjlH0zCgcUk9fhw2xSxSgwkPPIotBQhAAAKzEiCLNGtk8QsCEJiNgM4DOgoWf760KObPP755KNeQSefz+atfTvVtvX5ToiZZpy7pGClVWVjvR4Q3v6REbYvvUNhVKdHHYkcbK2WJ11OsNIHGyyZFyMW/POX167eWVBmgcbrzoRmiXBznwXL/CziN0OuSL2gOBp320SRr08fSMV5be4AVfdEQ1dVgkmwoTorlK89ya61HMyPPKd+jbA4QiitzkfDaSnXkG8oMX2nltYtM7dfNxeRjFMwYTylbRQ0EIAABCIxOgCzS6BHEfghA4BYEdE7Q98b2C83BeZ15JKYabevtkuolGQ5vXrN6z610qpF+a6gmXk+4pB4lrBrfSgcYVWYzVBPMsLbh5CM9JxTEJ/Qlk4LB7/dbvtiJzgIkPTp1m0Jfb2f4EN8gH8zgY88E/LzQPA0B1UCyJKMfLV7S1/txlYefB9KYPurXa9NozGo1qr2dPjHqnW3YIA61vqTHK1llrWnWT+A3erTMlFyTZHEd8/bsWy66bI99KYKhR9lcDJ8fOdbQ9KiVPFUUTnY5uMNHCEAAAhA4mQBZpJOB0x0EIACBbwjoYNNorI1+kCmeMYqVoaE+Srj4rIGOFpL3Dy/4SitLmw4eOuPVTi/+u/1VbuqQkzUHw2SVmjQKsjwoyR+lROcu4fr5+ZsP20KRu1BDf0n686NYDVXZTmo6JGDB9eHORppMHkgaGL5JsdILhLLk8/SxS9k2NZEqjcM8RCXjV4ygUwqzDZoRRT2+crm1ensrr3VyJFiipcP3WCvLnSWFgKKmUwZokVHN2kVGDUPXsjb47rPeoUnNWuohAAEIQGACAmSRJggiLkAAAvMTsE18PivKc+3+izK5ueSloVGQcD5C+G+8/SlCTbJaXfLyOhB6+/OxTW29mLrIburwI5laQZrVpFHwltcUWv1aJSZf1C8aOadWO5+LattIrvZJwAZDcaibwTZoi7NS49k312hc6G9NflW/GoTekmyADA6D32wo+licEdKjLlZZ67NI2eCs3Oe/1GOjIKRLCgFFTa2syjqLGkyseMlnhXx31mR5FHxbyhCAAAQgMB8BskjzxRSPIACBCQloE58PNuatDhJF5+0g548NbfmgRMJeg5cx/f6MoSZezMq65LW1K+W1xJs2jl0AABm3SURBVLJanX+82vZ5qahk30ozQHkfPSygernm83G+0tujVqrMNbrkFXomXoByzwQsuP61r2CtTYdicJVh8VfboyUoVz7FazCZVf3Ki6zf12hqh+6seahUw5yikh7JrLJWXmvOSk8tYZR79E1OKAcDNi4yQZvZvzYKJ3hNFxCAAAQgcCEBskgXwqdrCEAAAksJaGdvP2ORm+l82Cj4k5gUZlW5RsJegxeTgCpzTb4UtMlySTZqdCkXvFq76muk/JyCzMvd5UsNaGoePMpKJGmFjwJBno/9ENB4sCBmwxTcRsEPfollVcUak/caTEx6GgVrJReyktBjTbJmgzXPrVQj/Q0jdcmbp0pp8AW76mtyj/7qCeWGAdmXhrBMtVaZia+RsE+u1QS8MGUIQAACEJiAAFmkCYKICxCAwC0I6Fv3vMX335/r2JALfou/5CwhrBL2GnTVnyJUqSaqUUGXgjbVS9Jc8I84ZadyjVdrV32NlJ9TkHm5O/mrJ49Uk4VVEzxq6LcmHwWkmUKHBPad9WsHQxhs4iM9jYJNOg3pj3OwJlmzwYzJrVTzhbXWRE5Jgy/YVV+Te/RXTyg3DNAl8VdNw7DMPNf45tKpXvxVyhCAAAQgMB8BskjzxRSPIACBaQmEP+ldTK/odYZcULaimPdpUPt4SJCAlOSafCkfOfxZRRq8mAn4vyvUdtMrlAFnFmRwsdNgnlwuCltlaNLW79OLDZ1c6plA+BP1edb7v3q2ZDoU39UqEgiDTTJWv6RfDWk/i6XHF2qSNRusbW6lGilfbq01MfkaJbsq5WvXUt9wr3J22WsO7rSFraE18SHLNb4L6fRNvABlCEAAAhCYjABZpMkCijsQgMD8BPypUrv2cFT4SEH7/o+S/pik7kIr0+bPtw39upS16ZLv1Pe11s324cdrVtfqolHIlntVviwlvlLlYJ5skEAoSEAJwbZ+ZZGWGxx65GM/BBR9RTOMn4+mfhwtQUNNf60+NPezWDZnGavJ3ll9uy+10oxQjTpqa5CYCiZ/UBZJypcUPkIzm7PL8kUrgNxpC/sfUxNSKanZI52+ibeBMgQgAAEITEaALNJkAcUdCEDgLgTsVRdt69fu4yW/hJeE1V1olc9pahIkPx4sTZV+Gzg0l9qFx5VsWFCoj5aby49yFGsW9q7Tl45w6s4K2bxc45vYVa8t13h54fKVlMclUJz1Pnvbdq09WnLb2mi0cbWw34WdaqyGRaZmg1mblUuP3Fll7cI5K+V+QfOVtXJxPalVLlxnssu+94yojbSord0kd+ENoAwBCEAAAvMRIIs0X0zxCAIQuAWBcJ5U2mXh0a54VKiBk3DxL8rrqm8ue8KZUPW1nwk3v/Rfr9N/T77QzfbhJyg/4mPjfGU++pSQ/sxcEY7kPVLpLwK53P0jkN5Zp40BDQDNpoXpBo2WhQxr40f9ypKGQo3b4hBVQy0jQadszj6qiZQUczqrrD06i+RN3atc5GDKBd/3pcqA2tMLl5ZEITTxPVKGAAQgAIHJCJBFmiyguAMBCMxJ4Ofnrw5R/o02VfoDQP7T4M/nr5cM6Ri7GgQ8R51SwiH2+fxtHEh08JB+09No4g0rZqzWulk7BnvvDi0LguHVE0+CELDrxPt4/PGnbsn7Sp147aofJApZyFId6izK9yXgA+pHvh8zGhj2PIsMsJGmj1aQsGn+eOxvTB+vyuuxfr2FYUhL2AyWpEasBMxmzaCQWq3Jq977vtxazanaxDF7vHI5aAvv6z//eIGjy3LZYO6+yIiJYVSAwu/0He0m+iEAAQhAoB8CZJH6iQWWQAACEKgS8EcpXw4NdJzwMlbW1l9NgkwWkKTU6jgR2hZPXGoVhKWk1qPkZUAo1DSHc+bHjoLaIz7Kl2KhSKDhXeZsau1AvryLIzxF5+4EigGtjYGicDApD60gED5qdIV6+1jssdakJqwpINtU43vR1awn2CbJUJ8bqqbYY+bs7WkrDwqD8O4f5bI88oWiMe0m2UJTqBXV69el3IoaCEAAAhCYlQBZpFkji18QgMA8BPwjP9q+h2dS5G3teJDPEvoK3XRmgawzPCtkDWuW+PezZLZ9W97u8aNa/1yGNBd1Fivl1wmFYJ4+5ufFvDHFIBYD5B3UAxfqRQ96eOWUhyAQHvSwmBbnWlHSnmXLYyYMrTYKP7qypD3zosHmC7nf2pyVpAxTjfUoG8J6ZQ7mES49weDl1sqRoMHbEy4F24ILQXj3j3JZllvhu0UmI1XyaO36v7unKIQABCAAgU4IkEXqJBCYAQEIQGARgeIWv9jSTk3FS75yoZhvYuVVJ6XlZuvEsrDJ1/Znj/qsWcXZjnlrm/TpOFaJwPKALnydaqGYDPhYWKVw4dS2TpVFkg35/VxdWlhYZe1CnUNPveUDTDQOYij9FCAAAQhAoGcCZJF6jg62QQACELgdAXugpvjMxe1Y4DAEbk8gZ5FujwQAEIAABCAAgYsJkEW6OAB0DwEIQAACIqB3slY9raDmFCAAgckIkEWaLKC4AwEIQAACExAgizRBEHEBAhCAwPAE/E97kEIaPpw4AIGdCJBF2gkkaiAAAQhAAAK7ESCLtBtKFEEAAhCAwHcESCF9x41WEJieAFmk6UOMgxCAAAQgMBwBskjDhQyDIQABCExIgLPihEHFJQhsJsDKsBkhCiAAAQhAAAI7EyCLtDNQ1EEAAhCAwBcEvvgjQV/0QhMIQAACEIAABCAAAQhAYAsBskhb6NEWAhCAAAQgAAEIQAACEIAABCAAAQjchQBZpLtEGj8hAAEIQAACEIAABCAAAQhAAAIQgMAWAmSRttCjLQQgAAEIQAACEIAABCAAAQhAAAIQuAsBskh3iTR+QgACEIAABCAAAQhAAAIQgAAEIACBLQTIIm2hR1sIQAACEIAABCAAAQhAAAIQgAAEIHAXAmSR7hJp/IQABCAAAQhAAAIQgAAEIAABCEAAAlsIkEXaQo+2EIAABCAAAQhAAAIQgAAEIAABCEDgLgTIIt0l0vgJAQjcnMDz+ft8/r5er+k5mKfP5+/0nuIgBBoEXq/XoLNelje841KNAAtgjQz1EIAABCCwFwGySHuRRA8EIACBrgk8Hn8ejz/D5Vaez9+fn7+rzDZPH48/PcdD5+QleT2OhT2Hslvbns/fcWe9We7Z2lKwZL74Vu2yIVq1vLQVHnF1rePzLYBaLTuP1BHRRycEIACBPgmQReozLlgFAQhAYGcCI54nX6/XFyeiL5rswlqH9kYC6/V6/fz8lYUqFB8T8wol+Xj8WXiQVkccvXaJ73BKNH6GGwCyXMy1FHztS5410tmYsDLgqoKMXO641oqTbfaLW6NrBVd2Ph5/fn7+FgOkRSwIN/Trkm+rSgoQgAAEILALAbJIu2BECQQgAIHeCdgufPlRpBN/zOyfn7/L7dF5Y3mTjZL5XFRTKNvsAavQMLSS7/Yskj8U5RNXaKvD54gPoAVf+PgdAY2u4Wa9LPeO23T4OPJ9EytbwyIETbHcqp+atY6b/JmpMcXrY9cSWLIASq0extQa+PGO4BfAM1H0M2ywBAIQgMChBMgiHYoX5RCAAAR6IWDb9+JRqhcTd7JDB5Wd9H1W49laudam+JW7jkYhOvnArGPVx0OUIJBFqsVi+nqNljCu+ndclu9iqp+euyjsXInm/ml2Wo+2uFm51rW9nReuKtx5oOY1UKtlvuTVCkLbHt+EMgQgAAEILCdAFmk5KyQhAAEIDEzANtN5mz6wSxXTdX6oXN+/2n/X/d2hZbnNOnE13FCsVWgIc2lWAhoqw816Wb5LaO42C5YvJrvgfb/f2xfAVRH/GFDTJp3evL1cRg8EIACBmxMgi3TzAYD7EIDAXQjknbe9JrDEf/24afvrX6+q+EM/7/fbOl2ux+sslvWyg3Sef4jyhlnvvmZJebnNOhrV1Prv6nPQa62on4+AhoqySJrIC51dNVtNedasTjVDs0yokeWhvvGxYer2WdBQHkzSchTqj/uoHoV3+WJyhFXW+1rNqyLeDqhU+Zfa1tqDPAQgAAEItAmQRWrz4SoEIACBiwloT6yjoAzSLlnnB13KrfzOW4kGnTeyBlMlPZIs/rqziVnmSE28wf6HV6Xq42tZ9i23ycs1FdRRUKiPkjyzULO2bcNym83rGjoNCYNvan0g2mZwtR8CtdgpxMUx4FtpgtjE1BizQrG5ua+GvkleItSXn90e4EI9vkkwwF9Sd77Sdy1rNeBVEwpZwOv0HW1ZKo2wuvZdrCp7e3zDjHevHn0va8tm7dpW8mVJQ+siD8j3+63Z4RdAnkVaQhUZCEAAAqsIkEVahQthCEAAAhcQqJ1DtPPWoUjG6fCjGlOievsGWx+LuSFd1dfdqgk7eLPEfvNC1soq2alfVJWexlHWLJc2OWIFr0Hm2d/6qTUJGg76aL2vVb7QZpEM/NWd6RH58FFiFPonoFgHU1Wfz8a6ZE300SbLwtmXZ5ZqNK5Mv0aXBLxJqtT0VE1t9MpTWa4aJZSLNtiPf2lNk36rMTvlvn9M0i55s31HZrDsl7D0yzy5JkusRvXBbDVcUhBnLyzN6tGg+Xovf1rZrF3bXTHiRSUCW7xqveu2opAVhamEAAQgAIGvCZBF+hodDSEAAQicRKC2w24cGPLBQ/vpcJ6REu28zSudSYKTRWNUmX/LWZfy0SsbGfrSiS4c82o69UW0ac7aVCMaSwpqtaTwseusRGaH0JjkkkOsSVoovRIzxtfk3qnpk4BGRTBPEzbPNQu3JrKmSc4RS0mYldZEGtS1VPmx5OfOWj3SXCyoO381D+aimG9i5dxQMnJBNX7NCRwUkVAvMwIEyedI+e4+lrP9S3oMa2boRY4vKfigBz35oynM9e2avHZJXm9EyuvAX5Ia1aqRd6qhAAEIQAACuxAgi7QLRpRAAAIQOJaA7YbDbt4OJ7Z19t1rt+0rTUNx/13caltlOBeZwnxJPQYLdSQr9mutipdkecO2YkNZsuMhSsYsKZjBSyQlo8NPg7Y4FGX0KkdgYq1yUNQ1hZ4JFMNns97GuY+sRr4qVRNGhblcU55TTl7eq9KYVI+CaZeKY7VxSc1luWq0kvi+TMyb5OVVLnpqV+WChNVRkcNCw6RN8t5sXV1YyPZbTdFx9bjjArjKeLNtoWsmJpuLA0ZXG163F8A2ilWmIgwBCEAAAkaALBIjAQIQgMAABGwn7XfzqlFBbuQaHY28Bsnb7jxstRuHgfy9sfUYNJh+01PsV9/Vy5JcyLapr+KRQ54Wjcn6d69pcCv2JQjFM6F+j1xe21t7wXcpCfUN+EVjqOyKQJ7IviaMNI0QuaCa4uwrjo2gU6re77dynao04eJE+6inaJI0y3LVaF77hhLzL6n5JlYueuovBRcafqlH9VKbeiagq95stV1YCPZLZ5js0tawXzLHFaz35frlTm0BzM8i5We7pCQwuRbFcghIQgACEBiOAFmk4UKGwRCAwB0J5NOL1ViWIeyqw6nDeBUrhTJs/bX5bhT8uSibZ5pV39ATjnAyyZvtZaQqSOrjRwFJHlGw3pdrXmWthD384hgwA0w+CC+3DclrCWj6yAzNemVVdEljQzVqXhwAdtVfkrxUFQvSr6uqsYLqGwXfb2iu8exnvfwNDX0X4ZLUmkzxqppLWB2F3iVgTfRR0FQTCo3eg2TtY9CwsMea/bVe9qoPfD6qNfnl1hbl82C2fovCH01CAAIQgAAEPhIgi/QREQIQgAAErieg71plit+s+7JOQZK0gskUj1K5iTbfjYJXVTvYqL6hp31+UEO5k2t0yXvaVhua7PjRzFuoMD/f8bGhkOpb9zw2pMSM8ZHSJQr9E8iR9aMrnJxzrDVUigMgNPe5G1NV+6+4SUA1VlB9o1A0SXpkuWq0RoWGQmR9/fz81bxQW7sUGgZTJayOaguIaZN80VRdlbZi716sUQ72L+yxZn+jo10uBT5tnVoAV/GxLvTsksZA7sskr0KR7aEGAhCAwDQEyCJNE0ocgQAEJidgG2I7I4UToH/FzC5phy0o1ry2WberQVi/wKIfePYFf1qrHWxU7/9AkldiZfWbC/kYkGtCq48CQX7fj4FkQ7lOUJ5kQ16XrAuFUpDleK2gJlJFoXMCPtZ2WlYQ7aPNdI0BP5ZUqSbeWbvqL3n5PElVIyUaZqqxgurVJBe8naG5z2f5Sx6Frzd5zab8e0aNhjLVKyxWSsCu6qOgqSYUGr0HydrHoGFhj1elTgKfmlP+HUk/CBvyuhQI6KN13fjv2o7UIwUIQAACEAgEyCIFIHyEAAQg0CkB2yvbPtg2yjqJaRutA1jeLluTXG/e2lV5ro24atoFb4CXVH2tXy9cLGdLck1o+FFADwhIsl0I+tsfTVVbxp+gFMSPTSRgXQip/92QcFw3SaXwvuhLnVK4hIBmkKa2D6IGmxeTnarUUNElafOXJO/FGmXrPWcravUNVeFS0RJT6w0OrV6vl3JJ/lKjYdHUYqUU2lV9LJqqq3pMpmG2hGuFYH+7R7+41RR6GTnbKKwyPvCp2aBI+fFcEw71gcDHBVBfh3zRV+iajxCAAAQgYATIIjESIAABCIxBQI8ehD20Wa+TRm0TL4Git7mV1SzcdhdN8oblZ6OKZuRKMyOcVBu+6NgWmgTNIdvS/hjatj9mkkHeW7gQb9DQcP9rydCQj50Q0GhRwRtm8642+1RfzAKorVdoQ2vhsDTh4kRbpccbYGVZ7i8tGfZFSo2GRReKlbLEruqjMjINyOF363zbJeVsf66RHhEoxkVi7RUvXF04Hkx55qNOVdiSQlICtO2gN2aJpGyjAAEIQAACSwiQRVpCCRkIQAACXRDQ4SEfS/ylYspGAkVP8tbfNvpFVVlD8dRnYhsPDGZYOAZIZ7ZEl0KTLHlQTSbpO/JnvFVnMykR6iXN20GXTgo9E1AQ86xXJsj+cl/wQkOlkeAIl1bN+uLcNBtW6Qlm19IE4pDlVaP5pZp2lqfoQrFSCu2qPjaeK5QxOXC++cdydlyrXG6rS30ugA1c2ZdajQFZcm9qh7Kmn3oIQAACEPhIgCzSR0QIQAACEOiFgI6F+bc//KVwMjTr81HEe2VXfY2OQPY+lL+U/662evdiVpYeO0r53Ie9iZCb+JriMSDoNPnn89efoDo8RHmz9ZZZ7Wt/xUvEBLmYMvDQVJYS1VAYjoCPuwaDvNAEybNeDfMlZWrCJT9EwzS3gap+lZ0pTjTpWbJ6eJ1WluX+Uh7MwSS90RbyC1oWzCPvsujljop+yWsvr0pb4jSjbZ5ms0Pbjx+zBuH1i+pkC6BRDeNHAyPfAYsYi/EtSlIJAQhAAAKrCJBFWoULYQhAAAJXEvB76GBH45JJ5qOI12BXfY3OmdqI+4I/iXnJoEEffdtQlkyxIOFw1fsrGTtT6WNocs5H673YlwxrFAS2IVM73+ZOTYl0ZgFq+ifgh3q2VuMkX1LD4gCwq/mSWkmzL/heVO8rVW7oyZ2qlRXU1tdbd76txGRJlvGrk8SkNtf4lJDEfMGa+JpiFxKzgjc7tP34saih4bvJL18lPhqwSkCO51YyrFHwoBaK5Y5UIw2qoQABCEAAArsQIIu0C0aUQAACEDiDgL6C9lttddzeMdvVYkMdnKRKhcZZRTL+EOUrfVmPCchIKxT/MrdvKHlfaeVsm3mnRw9ykxNqzOBiR/KlUVCA8pMF1uojMd+1NZFOf4nyKAQ068MjNma/ZkF2R5eKA8CuNi7lURqeTpJA7jrYJsmFA1KWe825rcS8/vy4ln+LyiSlVg1Vo8WwloUJGtQwLHFiZfJFzmrbLtQ0ZPetlzkWQH9bUZhqKGoA1bAmQD0EIAABCHxHgCzSd9xoBQEIQOBeBJa8fbaQyJYDVe5iR8Oy8k5qdCLtxB7MuA+BvWbrXnpq5IvJoyB8/jxSBvBQ9w9VHhhe8vEOi/wlYOkUAhCAwNcEyCJ9jY6GEIAABCAAAQhAAAIQKBPQ40JLklxlFdRCAAIQgAAE+iNAFqm/mGARBCAAAQhAAAIQgMDIBPQgkl6OU1JJb1o1CiO7ju0QgAAEIDA5AbJIkwcY9yAAAQhAAAIQgAAEjiNgf45NfzPOCsoQ6UEkezNLf8StXTjOWjRDAAIQgAAENhIgi7QRIM0hAAEIQAACEIAABO5LQAmjUCj+IPp9MeE5BCAAAQjMQoAs0iyRxA8IQAACEIAABCAAgSsIhPzR4/Fn+h+9vgIzfUIAAhCAQBcEyCJ1EQaMgAAEIAABCEAAAhCAAAQgAAEIQAACnRMgi9R5gDAPAhCAAAQgAAEIQAACEIAABCAAAQh0QYAsUhdhwAgIQAACEIAABCAAAQhAAAIQgAAEINA5AbJInQcI8yAAAQhAAAIQgAAEIAABCEAAAhCAQBcEyCJ1EQaMgAAEIAABCEAAAhCAAAQgAAEIQAACnRMgi9R5gDAPAhCAAAQgAAEIQAACEIAABCAAAQh0QYAsUhdhwAgIQAACEIAABCAAAQhAAAIQgAAEINA5AbJInQcI8yAAAQhAAAIQgAAEIAABCEAAAhCAQBcEyCJ1EQaMgAAEIAABCEAAAhCAAAQgAAEIQAACnRMgi9R5gDAPAhCAAAQgAAEIQAACEIAABCAAAQh0QYAsUhdhwAgIQAACEIAABCAAAQhAAAIQgAAEINA5AbJInQcI8yAAAQhAAAIQgAAEIAABCEAAAhCAQBcEyCJ1EQaMgAAEIAABCEAAAhCAAAQgAAEIQAACnRMgi9R5gDAPAhCAAAQgAAEIQAACEIAABCAAAQh0QeD/AKw+Z9OqBXXtAAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAABhkAAAGyCAIAAAB2kjLuAAAgAElEQVR4AeydC5LjOM5u7z4yvKvystLL8rZ8Yxp/f40CJZmSKIqP0zFRQ1EkCBzwCUnO//fhPwhAAAIQgAAEIAABCEAAAhCAAAQgAAEI5BH4f3nFKAUBCEAAAhCAAAQgAAEIQAACEIAABCAAgQ+xJDoBBCAAAQhAAAIQgAAEIAABCEAAAhCAQC4BYkm5pCgHAQhAAAIQgAAEIAABCEAAAhCAAAQgQCyJPgABCEAAAhCAAAQgAAEIQAACEIAABCCQS4BYUi4pykEAAhCAAAQgAAEIQAACEIAABCAAAQgQS6IPQAACEIAABCAAAQhAAAIQgAAEIAABCOQSIJaUS4pyEIAABCAAAQhAAAIQgAAEIAABCEAAAsSS6AMQgAAEIAABCEAAAhCAAAQgAAEIQAACuQSIJeWSohwEIAABCEAAAhCAAAQgAAEIQAACEIAAsST6AAQgAAEIQAACEIAABCAAAQhAAAIQgEAuAWJJuaQoBwEIQAACEIAABCAAAQhAAAIQgAAEIEAsiT4AAQhAAAIQgAAEIAABCEAAAhCAAAQgkEuAWFIuKcpBAAIQgAAEIAABCEAAAhCAAAQgAAEIEEuiD0AAAhCAAAQgAAEIQAACEIAABCAAAQjkEiCWlEuKchCAAAQgAAEIQAACEIAABCAAAQj0TuD1+n08fl6v394NuVF/Ykk3wqdpCEAAAhCAAAQgAAEIQAACEIAABOoReL/fj8eP/e/9ftdreKyWiCWN5U+sgQAEIAABCEAAAhCAAAQgAAEIzErg/X6/Xr/P55/H42eRgb2URCxpEU5+JrGkfFaUhAAEIAABCEAAAhCAAAQgAAEIQKBdAj5UtKYl37itkcnPJ5aUz4qSEIAABCAAAQhAAAIQgAAEjhPgg5rj7KgJgTwCObGkPEmU2iJALGmLDvcgAAEIQKB9AuwY2vcRGkJgLwHG9V5ilO+CgDp2F9qiJAQ6JaCBtvaNW6d2taY2saTWPII+EIAABG4m0Msj0/f7bV/C69cTLfF8/rmZIM1DoDECvQzqz+fDuG6s76BOYQJathbl8ielFrGQCYG9BK6IJXW0ku7Fdbg8saTD6KgIAQhAYDQCFovpZS+rjcLr9Wv/0x6dcNJoXRN7jhLQMDkqoHY9Kcy4ro2e9qoQsB6eLlJ6KFJFCxqBwLAENJQWE36LqwKBhZYhy0+fcDyff3xcST/yLYGPx48vEORvPDXx6qW1GswhltSgU1AJAhCAwD0EbBXsaCVLl2qFkzqy4h5n0+ocBMKeuAujN8Z1eqsLi1ASAl8J6BT6tSQFIACBDQIaSosJvzlUgSDNr5vv91vFQsLWI207w92NcNKGTBPS0UpHLCl0Hi7vJ6BHkUrcrxMaQGAOAraG+YW2R7u1nPeoPDpDoCwBvycuK7mytDFmp8rQaK4jAqxcHTkLVVsmEF5Ufzx+dKJ8vX59mGZt0Gnd9In3P/8p5/H4eT7/KJBkkt/vty+w+FNNCiQ9n3/8ftu//ZS+t9gscGJJzbpmOsXC2NPwVsKPt+noYDAEVgj4tccWS79MqpJ//9aK6ZYlLNOGmy1vG9JssQxLsgRaxRsHrCYNqUQCAn0R0IKowbio//a4tpHod7rbY3NjyH8+n+26i+qVzbRxfePEUtYcpK0RCIcxGwLpuuY7v50V0zL2IYl1XWtOI8uqSAdr1AZL+HpFZbycsPKqjI0UP+j8LUtrAdUtk6yVS2Nt0SLVIgEBCGwQ8IN9rZgGXSjg66avFykYZNXTuI+vnq5Za42aDrqbVgxKNnJJLKkRR0ytRhiTFugNK6uGKyvr1H0F4/8moA2r1p6wP7Z9rb+rdFj8lB8Sa4uZ9tx/a/SRSncNVc0nQTEuIdAFAY2gMBKD8mvF/LgOEvxlkGaXa4PaDuRWfW1CWBRYMJNxXRBmy6LWOrbX2cdxfK+23aMv6VdAdSFfxcbLYqPpEmYVP5//ljkvyt5Z8DmW9kPSdNM5U6qmtSznruEmxUhAoF8CGmiLLweZXRp6wUxfd3EY+gKhbpAcqqtiOsNIzppWKtBUglhSU+6YURkNKhs5iwhyyixWJBMCYxNIt5tri5ZfSrVKhcKfzycVuAbQj0pfRsJ9Zs10vgk1taItCGQSSEdQOk4XR58qhvIq/FWBjZK6FYR/lVmqAOO6FMmW5aib+QXLFiav9mJXV2aoK5mWsA6sTHv6YnWtCX/LN6r10SeUVv/0j3OkUhg1amJRftA/lOESAhDIJKCBtjGmNEiDzK91vxbwk4MXroo+M6TXtArFGrkkltSIIyZVwz8mCmttIOIfQ6UPeUJhLiEwA4GcxcbKpENmbTGz8tuDUWz1LFdPV9IcFfYJaZ6T8BUX0/peQEal9i5WJBMCrRFQH94eg2vjVAPK2yWZPnMxrRVZI1rFFiXrrn/7QyU3EtvWmVjGtcc7Q1rdb3sCV7G0l2oB8h1M/T98qOLzQ4u6FZpQl/blpY/dXaziy/vBEtwq+SGfSwhA4AABDeRLY0l+tglKLo5oywxzQqgozUN+m5fEktr0yyxaaZiF1XfNfm0Uwp5grTz5EBiYwNcFSavR4viy6uGWZW4sjYGnhrD/CiaUSS9VKyeRVg85MtOkba/QoS6XEGiKgDpzGJheSSuz1s9tFPjqkumFrKVtkQ3CdVremBnUSs6g3pAjxYLAoJKKkRiGwGLfS62zDrbYhdRR/dFRHSntQrrlx4u1uNiK+nYoLzkbTXhDVN5nrr3FEMpwCQEIZBLQQPMTQqirQR3yv9ZVgcW5yKQtCldmTiJMNUHJRi6JJTXiiOnU8Ev+rqGicFK6Zk8HEYPnJqB1aG0l01K3yMmGUqhrMkPmYnXL1EBWW7uG84bk/Fvp+wv+K4N8OZSEwO0ENI7Wfv1XLzWsDdJ0XEtmjnWLhS2z8prLuM7x10hlbPXZXkG04qwV07IoMurS6ZDRLRVWwm6FKqlwKy85obzdtVqSrCGcnm/X5Pu6pCEAgUwCGpjpWJOEtUH3ta4KLI56k78oXJk5CenZcoJYUsveGVk3hYQ2BuGa/Rp+a5uJtYrkQ2AwAhpHi9ETjZSNRBiAVjJkbkPTgrr4u6fbda+4K312WXGFJsiEwAECflAvRpQ2hrNu+c6vEZGpTDoJpDmZogoWkxWs+wWptiNK/t1W6WsxFdAQSHPUhG4pRwm7JSGWr/GlYpaQnFDe1/JVVN5n8l5SoMElBE4S0EBrMJakv9CqP9q4mDhJoE51Ykl1ONNKJLC2JMdyS9eaHRaX7aUa5EFgWAIaDjam/LsDGmUbiTCIrGTI/MpOp99GjnnSZ68hXy2lAAQqEAh/7NwPan/gzBzXmiIyNbfyalRvgmRWv66YxvV1TSD5LgKZvfRrMRXQ5J/myEbdUo4SdktCLF8jTsUsITmhvK/lq6i8z/RDO+RzCQEIHCCggdZmLOmARW1WIZbUpl8G10rDe3HdzTF+bUXPqUsZCIxHQGPKvxx0YJhYlV0DU61YIoft4uOXtcwcgaGMaOwyJAjhEgL3EvB/ccL/RODeQarhkGmOgkc2fKy6QktrQvwnaWtjWfnHgs57DVlTlfwGCWQ692sxFdDkn+bIfN1SjhJ2S0IsX4udillCckJ5X8tXUXmfSSwp0OASAicJaKA1GEvaUOmk1fWrE0uqz5wWPxrei+tuJqD8g2umQIpBoHcCYacbLnOssyr5A9OP5fy6UiwnkaN2KOO1Cre4hEBfBNLOnD/QzFJJyDdcA1O/7fJ1TlArqruR+CptUVU1sXiXzK4JZDr3azH1OtFQlbTX6ZYKK2G3QpVUuJWXnFDe7lotSdaYSg+Ta/J9XdIQgEAmAQ3MdKxJwtqg+1pXBRZHvclfFJ5TUep1kSCW1IWbRlNSA+mMYenyfEYadSEwAIEwsnSZ/xaADauNpTFQ8iulmgtl0ku9npCTSKt/zZEm+YZ8lUkBCNxCILwlpIPo1xeFpK2Gg3K+JlRFrX+twntJXxFRYJtA5uqzXcwvSdacOnO6HOhWqpjdClVS4V+b0NtGvom1dtfk+7qkIQCBTAIaaP7F3lB3bdD5uqGKXapAmCV84UXhqpi/iHuZDaaJJTXolPFV0kA6Y6oN0Y0xfEY4dSHQI4EwsnQOzF+xdg0r/XyJYlVaOJVzC8ZG1LjFdhodjIBGsRa7NGfb5DAtbBe2u2rCxnj+BJIj/HAZG9eNKHPYCiquEUgXlMWSG8V0S4NFsdfFP0+xMTTslpejqFD6joPkhPKmv/Vbb4vK+8wN+aEYlxCAQCYB7QYXx+bGoNMgTce7Na0Ca5I3hGum2ljO7t1FZ+K1YsSSduGicBkCGoFnxNkE0dFgO2MsdSGQEgibYw0rvzj5FSsseK/Xbzp8VN4KhypeB502fRlleh18rbJp+3Eor4AgBDhl20UaBC4iYG/qSbj/ySQ/WjVO7W/BqLydnH3Jz+fjR6W9PeTLr6XVxMYT3bW6J/O3x3Ww7mRbVG+HgDqqzd6a2NNBofOh7wzqsapopmlRCPk+zJRCsFqhitoN5Tea0HnSV1F5n/n5fGSC/QHH0HoozCUEIPCVgMaslpWwO1WBIEqD9IpYkp/rTIHwkr5lBpWavSSW1KxrRlZMQ/SMkX2NtDOWUhcCKYF0KbIRkf4RcQ03K+D/DWuqP3aqWNq0L5ZudrUbTm8tijqTKSXThD9jnGmCuhCoSUDDx3fpNGDkj52+pKXTcR3E5ljk542c8gXLpBYph3FdkHODonzwVE63hHf92vK3GPdUT06XJN1KUditUEUqhfKSE8pbMavlq6i8z/QL61pDoTyXEIDANoHFucJXWRtrGqRXxJJssId1WZoo4Sc9r3NraWJJrXlkCn00RBfX3RwEGmk5hSkDgVEJ2KMMO2qGh7fBZJX8WtjeXAhPhoM0/TZKyLdLPWBZvFs2U3bpodPhWaWsYkiDwDECGj4aqhty1P9VeK3/v16/z+cfK7YhULfOL9MSdSAhuzQRrdl1QDhVGieg9UW9evFMpZGiTrJol6SlQnQrrWi3QhW1GMpLTihvxayWr6LyPtPSdmvXUE2FkAMBCIiAxpR2ibplLyemI9RiPWvj3aprFC+OeiuzLcG3olPt1ype+UbSxJIaccR0atiwSR+f5oBQmPlY9ZwmKAMBCEAAAhCYloAemU5LAMMhAAEIQAACENgmQCxpmw93ryKgEOyBBu59XnpAYapAAAIQgAAEeiHAItuLp9ATAhCAAAQgcCMBYkk3wp+6aW1VD7xbpDjUxouFU8PFeAhAAAIQgMAhAnrzd/HXZw6JpBIEIAABCEAAAgMSIJY0oFN7MUkhoV2/g6AX7w8EoXohg54QgAAEIACB+gTOPOapry0tQgACEIAABCBwIwFiSTfCp+n//gBqZjhJgaTM8iCGAAQgAAEIQCCHAIGkHEqUgQAEIAABCEDACBBLoifcTEDhofRvmXvNtMe13+H3t0hDAAIQgAAEIHCegP1JrPNykAABCEAAAhCAwPAEiCUN7+IODFQ4SX/cTX8T0RL6Go6fb+jAnagIAQhAAAIQgAAEIAABCEAAAkMTIJY0tHv7Mc6/duQjRz69/eJSP7aiKQQgAAEIQAACEIBAWwTe77eeZbalGdpAAAIQaJIAsaQm3TKrUhsRpVmRYDcEIAABCEAAAhCAwOUE/C708sZoAAIQgED/BIgl9e/DES2w5ZwXkUb0LTZBAAIQgAAEIACB5ggQS2rOJSgEAQi0TWCoWNLeNUDfT7Xto0m14xdAJ3U8ZkMAAhCAAAQgAIHqBPaeI6orSIMQgAAE2iJALOnn8fhpyyc7tRl15SOWtLMjUBwCEIAABCAAAQhA4CCBUXfUB3FQDQIQgMA3AsSSeo0l2Q8E6tUqS3xzd0/3iSX15C10hQAEIAABCEAAAj0TIJbUs/fQHQIQuIEAsaQuY0nP558QRSKWdMPooUkIQAACEIAABCAAgSEIEEsawo0YAQEI1CNALKnLWJIPJH0+H13W6zjXt8R7SdczpgUIQAACEIAABCAAgf8RIJZEP4AABCCwiwCxpC5jSa/X7/P55/X6NWcTS9rV6SkMAQhAAAIQgAAEIAABT4BYkqdBGgIQuILA+/2+QuxdMokltRVLyuxeoRixpLvGD+1CAAIQgAAEIAABCAxAgFjSAE7EBAg0TuD5/PN8/mlcyXz1iCWtxpL8iqJgjV4FShEvll/rKypsct7vt5pIJX/NOVP3q/C7CvCN213kaRcCEIAABCAAAQjMRkCb897/xPNsjsNeCHREwOaZ5/NPeDWkIxO8qsSSlmNJis6ExGJsyEeCQnm7TPuKlqvP5xOqe/dkptVoZvkuihFL6sJNKAkBCEAAAhCAAAQGIKDNObGkAbyJCRBoloBO7q/XbxolaFbtRcWIJS3EkvRX0vxbSO/3+/X69TkG1EeC/F0rb30ljUBpufK/nL0of9FtIVM9MuR3fUksqWv3oTwEIAABCEAAAhDoiIA258SSOvIaqkKgOwJ+qun9wEssaSGWtBYAWuypiuP4QJJKqq+Eu8rf1ZbEhoR0CPldX/Y+tLqGj/IQgAAEIAABCEBgKgJ+cz6V4RgLAQjUJODfRNEpPsQKaupzpi1iSauxpByP5qw66iLeT77i+acfi0345npME0vq0WvoDAEIQAACEIAABHok4DfnPeqPzhCAQC8EdHgPiV70l57EklZjSemHaaKmhFYd5aQJdRF/SxWLREwWm/DN3Z62z/d2/ft4/Dyff3ZVGeCj09s9hQIQgAAEIAABCEBgQgJ+cz6h+ZgMAQhUI6Bf1NEpXom+fpabWNJqLMliGdtdyry+HXXSyuRFKfP8S0n+F5d8E02lvb0aKlckct4mK05GAa9dP5+mX+BSdUvkqxcq6rKmhPNWnJfw+Xxku0/scoevqPQuCfmGXNHzkQkBCEAAAhCAQCkC2gnsek6ZvxPY2Kr5ppXetSFRLZ84L2HXHvs8ivMSzu8P13Q4D7MFCThUA6S+OzZiSTaJ2RsVGxNFI7eIJS3EksJHjBu+3LVi+W7qYyvnu4LUOC+qHQlF3tiqY47475qUfR+QhF2xxfMSfCDymA4tS9jlDm++0rsk5LtD8klAAAIQgAAEINA4gV2bgUVbdm1HF7cTu3Q4L2HRisp71EUrdumwtkfdBXMRxS4Ji4ZUlrCGIr9nLlqxyx3nJaxZsQtmsw5dVGwX4XxvFixJLGkhlvT5fEI4ybyb9tQ1ry/me7f54eTzj6XV3LHqbdbqKJZ0LKq99qwj3x3nJaw9scnXoWUJPnr71SI50Sd2Sch3hwYsCQhAAAIQgAAE2iSg/cCuzYBq+cTXTYgvsLid2KXDeQleeZ/2em6nF3VIT1IbQs5LWNuj7oLpzVd6l4RFQypLWEOxwT/cWrQChx7uEryXFDpYE5d7AzS2dG18oWb9w69wobAkqCdtJDyjvar6umlaGqa3+s3pKJbUL2Q075FAGunu0Qp0hkBxAn5o7NrgFtfkgMCwrQybjQMCqQKBMQj4obHr+H3AfL85fzx+rm7ugIZUgQAExiDgZzYd5BVY6GjyGeq9pF37SLktZ8fp/e29K5fv7dZ+udpbNy0vW9Jb/eYQS+rXd2h+NQE/I+X8stvV+iAfArcTCIMiZ2W/XWevgN/A2JruNxu+JGkITEIgHRRXG+435zYMr24R+RCAwJwEdHj3ie62Lp/PZ6hYkv+K8qsz5LmvJa2LL5ZX5t5h4JervXXT8ofVSEW1k0MsqR1foEmDBDTqLZE5jzVoCCpB4DyBMBza/32BRZP9xsAsWixGJgRmIJAO6grjOh2DFRqdwZvYCAEIeAIjTTXDxpK23w/3zzoyH/3J6/7MpgehPtP3lbW0pBVZpbTirjXXYz6xpB69hs7VCGjyseG/PeNV04qGIFCZgF9MtRQWWVgrG7L4Q42Z+5P6qtIiBK4j4LfolQf14nzCMLzO10iGwJwEwh5+bxihKWijxZL8MrAx+2txyj+ASbL3tzL3flbtK57vEDLnvKh2JBBLascXaNImAQ18S/ipqU2F0QoCBQn4ZTSMhU5jSYvhpILEEAWBxgm83+9wxPJDu4Lyi7NK/kmhgoY0AQEIDEBAM9vr9bsRr+jC0tFiSf4zt7X4jl+oFv23mKla4a7y15qz3WHoDX65CrcOXKpHHqjbbBViSc26BsXaIeDnH4ZMO35Bk0sJ+AVUy59PdB1XDYOac+ylfQnh7RAIPd+P6Go/C7g2t4SdfzvQ0AQCEOiOgM0zz+efMSaWAWNJn88nLEj622ohf9GFerdWtV6vX1VMd3Uqr2XPV9SyFDq68os8PlXToZWuLzkYd+0+lK9DIJ1/Fqe1OsrQCgSuJrD92oKWwq5jSeGRGEvh1Z0K+fcSsD80rsG7lqgzqP3m3GuSbv7vhUbrEIBAvwSezz8jTSljxpLScJJfErafb6wtJBu1chbCcMDzrZwfDLLuvKh2JLCBbscXaNIygTSc1LK26AaBYwT8oqklby0RFtxjLd5bS0+wzMY6B+l7Tab12QhkhoZrDgE/z4QxOMCsMlsHw14ItElgsMlk2FiSfVnmXymyYFDOd4kWG9Iq8nz+yan1+XzsjSTtbvWCUtqVrQkrkN7dm7PR0F5R7ZQnltSOL9CkcQKarGzyGelxR+PkUa8CAX+60/K6naig1dVNpDHiwXafVwNEfssEdkWRbLDXMcfPNmEMsrDWcQGtQAACfREYOZbUlyfQNhAglhSAcAmBDQLhaM1bDBusuNULAX+uCz18+7IXA7f1TM3fLs9dCHRBYHvwrt2tY5ofdOnXpnV0oBUIQAACHREgltSRs+ZSlVjSXP7G2nMEeDXpHD9qt0XAn+jWzpYb+W0Zc0KbYCOvJp1gSdWbCRx4F8n3/zra+5nHvjbwOvCQpo4XaAUCEOiIALGkjpw1l6rEkubyN9aeJuC3vAyf0zgRcAOBk6dNGwI36H1Zk+Erm40/F3uZCgiGwFkC4ecmwlKVc1nt+7IQS+LVpLO+pz4EIDA6AWJJo3u4W/s4DHfrOhS/hwDHznu40+ppAuGnBnPOlhtlTqvTlgBeOWzLH2iTTcDHZTYGbM6tai8EeZ1lqNewmiZqnQQEIACBlgkQS2rZO1PrRixpavdj/CECfh+88acnD8mmEgQKEzj/toI/4yldWMsGxMk0S3CabcAnqLBMIOfvGof+nHNZrc/7NVQW+szH40f5JCAAAQhAgFgSfaBFAlq5W1QOnSDQMIHwdlK1TwMaRoJqLRIo8jlbegodssOHQc2Xbi12aHT6h4A2b+nYPJNTLZa09keWg/J4GwIQgAAEjACxJHpCcwT8vnnIg0FzxFFoLALho5hqu/CxKGJNJQI6vIXT2rHLUXt7OKKzMlbqnTRzlEDZD1dv/9X5MABHnWeOept6EIDAvASIJc3r+2YtD2t2s3qiGASaJRDO4Wx8m/UUigUCoevuvRy4q4eVcWBLQ5fgsncCoevuHdSNfFYW1O7dKegPAQhAoAgBYklFMCKkGAHtOfy7Fbc/kipmHoIgUIWAHz78cFIV5DRSjMCZN5XGjrD40yyvJhXrcAiqQuDMm0pVFPzSSFhV2Zd+4cVtCEBgDgLEkubwcydW+q/bPp+Pjyt1YgFqQqAVAv7YyS/Zt+IV9NhPYNcRdOxYkl8ibYBzoN3foahxPwGLF4foTFiz/OX9Gn8+6ehrQSt0gAAEIHAvAWJJ9/Kn9b8IaOug/bG2GmOfEP6iwAUEShBIN74aViXEIwMC9QhoIdAasZYYfqUIKHg7qV4vpKWiBNIVam1QN/KN2+fzCaNv+NmmqMMRBgEIjEmAWNKYfu3RKi3SfnPsdxuchHt0KzrfSEBv9tke3Y+sG7WiaQjsIuBXgY3Tpt3aJbnTwgECB9pO/Ti52tryhf68eNkIq3QuakQx1IAABCBwFwFiSXeRp92/CPgV+q8b/1zY3oKTcEqGHAhsEwj7dQbRNi7utkbALw22EIQIaTh5tqb/FfqkTHjQcgVnZF5HIB3FaY6GdlPR0rCkNqXbdf5CMgQgAIE1AsSS1siQX5WANg2LrWqTwbK9yIdMCKwR0NjZHmJr1cmHwL0EFjtwmjlb95a9lmBlvLeX0vpeAqEDW/WQqcumunc6+ey1nfIQgAAERiJALGkkb/Zqi56ybuwYbFfBWxW9+hi97yMQ9r4MovtcQcv7CGhp0KlSL+AoJyT2NdBt6Q0y3dqE4rMQCGNWG7+wVKmYCjQCKOipSakR9VADAhCAQE0CxJJq0qatZQK2Y9g+4mrrvF1suQFyITA3AV7Ln9v/vVq/0W+1IujAaYleTd2vdzjQsjLuR0iNGwiEQR36bbhrg7q1WFL4Ee5gwg1MaRICEIDAfQSIJd3Hnpb/IaCtw9dnO/klQQsBCAQC4cjd4O48KMzl5AS+9litCL7kVNAIJ03l7gGMDT128Q+0+eFs6QZXqxDL/rp9HcB3mAABCEBgkQCxpEUsZFYioPU4c6+gTUYl/WgGAqMQ0FjTIGL7O4pvB7QjxInWnvyHYotH0wHpOJMCgcyV1AkgCYFKBDLXoLRYm73aD721CaoSWZqBAAQgcB8BYkn3saflz8eOtfnLsN9kcBKmB0FgF4HwTDh/3O1qhcIQOEnAz/O2RqwJzC+5JmGAfEWHLdHmwXsAzphwkoAPvjwePxsLUCjZZpcOk0+bSp50GdUhAAEIfCVALOkrIgpcQsAvw7uiQtpkbGxELtEYoRDon4CGz94wbv+mY0EfBPzSYL306wLhgyl9GFlUywPEiraPMAh8JxCeZHx9hdAvVc2GabySj8fP15nqOyZKQAACEOiNALGk3jw2ir7aWBzYJejkcKDuKPywAwJHCGjcaRAdkUIdCFxG4EAX9VUu06tpwRrOlmBlbNpbUyq3t4v6Qd1sf/ZKPh4/zeo5ZY/DaAhAoBIBYkmVQNOMJ+Cfox54kqNnQbya5KmShkAOAQ0f29wziFvH3CwAACAASURBVHKgUaYOAb80WP/MXCDUq+vo2Vorh7m1Zgj6DEngWMxFtVqO0YQY2ZDuwygIQAACGwSIJW3A4dZVBLTvP7xF0Pp9WMJVtiEXAm0T4NjZtn+m1k5Lw95Ap3r1tPh08NbiOC0KDG+KgMbm3kH9+XxsQmh5mxfGXcuqNtUrUAYCEBiGALGkYVzZjSFaek8uujp1ZD647gYQikLgegI6cFri+gZpAQJfCGhpUOf8UuHv21b977y5rrQmHji0z0UKaysS0HA+ttY8n38af3n2pIEVXUFTEIAABMoTIJZUnikSNwjoCVWRzQE75g3U3ILABgGNRO2Diclu4OLW1QRChzy2QByrdbVp1eQHhvwYcDXyNLRIoEiHNCGL8hvJDEHwk09JGzEKNSAAAQhkEiCWlAmKYmUI6MFpEXHaqbB4F+GJkKkIhB3w5OfwqVzfoLGKaVrimIbvf/47VneYWkVIDkMDQ24koP2e9cnDS0z7zzkYdDd2M5qGAATuJUAs6V7+c7Wus2vBnYE2K4ST5upMWFuCgIbPyb1+CV2QMSkBPRLQeazgAjEhU3hO6PQGTdZ+T+O6QSVLqRSMPRw1K6UPciAAAQhUI0AsqRpqGvpctKW4SCwOg8DwBMIO+PH4Gd5kDGyNAJ2wuEcCUh60FCeMwK8EtDGzxPCdMNj7lQ8FIAABCIxBgFjSGH7swwrb4BZ/5mzvVgy/U+nDx2jZGwFeTerNY0Ppy0s0V7gTqldQRWY+gRDNnOE9nWAyO9L83kJJCECgawLEkrp2H8pDAAIQOEWAY+cpfFQ+R4BQ5jl+q7XDyZZXDldJcaM0gWnXlDCbleaKPAhAAAItEiCW1KJX0AkCEIBANQIcO6uhpiFPIHS8GV5e8OZfnQ4nW/BeDRz5RiB87TXPGzppEI0uAQEIQGB4AsSShncxBkIAAhD4QoBT/RdA3C5NID13Ff/8ubTKncmDcGcOG0LdEMGcJ5Bk3gsr6WzmD9GFMQICENhHgFjSPl6UhgAEIDAkATbBQ7q1WaOmfXmhpkfCoOZLt5rwJ2wr9Lc5X4ULM9uE3QCTIQCBqQgQS5rK3RgLAQhAYJXA5I+UV7lwozQBelppoqvyON6vouFGUQKhp00buAwceDWpaC9DGAQg0BwBYknNuQSFIAABCNxCIGyCpz0M3AJ/qkZ5dF/T3WFc12yatuYhEAb1zDGUgGKePoClEIDAhASIJU3odEyGAAQgsEwgvDAy50cKy2jILUGAH/EpQXGfjMCcQb0PH6UzCLBweEiBBr8E5+GQhgAEBiNALGkwh2IOBCAAgeMEwrHz8fhhH3ycJjUTAuGURVwjIXRJRng1iVcOL6E8q1BWjeD5AIRZLvDhEgIQGIkAsaSRvIktEIAABM4SCPtgjp1ngVL/XwIhosER618wNf6fKF4NylO2ET7pmvnrNvk/DDceyYgMCQhAYDACxJIGcyjmQAACEDhLIOyDOfOfBUr9zyeNUXK+qtkv4F+T9jxtsVgs+joMN9bQRUpkQgACAxAgljSAEzEBAhCAQGECPGouDHR6cfSo27tAeC+MVw5v90jvCoSICd9Ee4eG4Ubo3MMhDQEIDEOAWNIwrsQQCEAAAsUIcEgohhJBnw8vLzTSC3BEI44YQw0fIObVm9SnfrjBJ+VDDgQgMAABYkkDOBETIAABCJQn4M8Jj8cPv4JRHvE0EulL7bgaX7Tji641Ce/dsECk3gyI0gLkQAACEOidALGk3j2I/hCAAASuIuAfqxJOuory6HLpRU15OLiD1yWa8k4vyoQoCb1ozXE+dEu4bY0S+RCAQL8EiCX16zs0hwAEIHAtAb50u5bvBNJDF+LM2YLP/fmWGHELHulLhzCo+ZmkDfeFoBvhpA1W3IIABHokQCypR6+hMwQgAIFKBNJjQ6WGaaZ/AuEcRSCpHZeGt5M44rbjmvY1IRa5y0cBFz/CvYsehSEAgcYJEEtq3EGoBwEIQOBmAuHYSUTgZn900nwaheQQ1Y7r8E47vuhLE5aDvf4ipL6XGOUhAIGOCBBL6shZqAoBCEDgHgLhySpvMdzjhq5apc807q40nNS4wqh3O4G0zxAgznFKmAyBlgONMhCAQBcEiCV14SaUhAAEIHAngfBk9fH4uVMb2m6eAB2meRf9T8FwxCVG3IXXblSSDnMMfpgPGWjHMFILAhBokACxpAadgkoQgAAEmiPAKaI5lzSsEL2lYef8pxqvmfzHgtQ3Amlv+VaD+/9HAHR0BQhAYFQCxJJG9Sx2QQACEChJIN0N86J+Sb4DyeIXVTpyJs7qyFk3qsr8fxI+ryadBEh1CECgTQLEktr0C1pBAAIQaI5A2A3zI9zNeagBhdIzZwNKocIWAV4i26LDvX8IhJgjX2kd6BdhoB2QQBUIQAACrREgltSaR9AHAhCAQLsEQqSAcFK7rrpDs9A9Ho8fXl67ww/72sRr+3jNVzoEQQgkHesC4WEMGI9hpBYEINAUAWJJTbkDZSAAAQi0ToAH1K176D796Bv3sT/VcjjlEiM+RXOsymFQ0zfOuDdE5c6Ioi4EIACBFggQS2rBC+gAAQhAoCcCYUPM89WenHeZrvSKy9DWEBzeTmJQ14DefBuhV/Cm4XmP+XmSUXaeJxIgAIF7CRBLupc/rUMAAhDoj0B4i+Hx+OnPBjQuSoAuURTnPcL8KZdBfY8PGms1dAliH+f9E6bK8wKRAAEIQOBGAsSSboRP0xCAAAR6JcAZo1fPXaM3/eEarlWl8hJKVdzNNxaiHoQXi3gsjDLCc0WoIgQCELiLALGku8jTLgQgAIGOCYQNMd8+dOzL06pf94sq7/f79frluHXaRbkCrnNlrgaUa4PApTO8Deppf5g/jLJpObTR09ECAhA4RYBY0il8VIYABCAwLYHw1JrfZJ2zJ6RnzoIc1McKykTUNgFeMdvmM8ndEO8oO71bH5s2RhzmzLJsJ+mfmAkBCDRCgFhSI45ADQhAAAL9Ebj0vNEfjvk0Doei4q+nEUuq36eu9ml9i2hxLwGNOwUW90rYLj95LOnz+YSlk1eTtjsMdyEAgWYJEEtq1jUoBgEIQKB1Ahw7W/fQxfqFE1HxB+w6015sB+L/InC1W/9qjIvGCIRZvfig/nw+xJIqQG6sW6EOBCAwJgFiSWP6FasgAAEIVCOgZ9eWqNYuDd1LQIEedYDi+qiJ4pIRuE2AcNI2n4HvBtdfYSmxJF5NuqJfIRMCEKhPgFhSfea0CAEIQGAoAjrwXxdTGIrXKMbI3Za4wix1rSuEI3ODgMjLyxuFuTUMAbnbEhf9pNGlwnvxBUOsF0+hJwQgsEGAWNIGHG5BAAIQgEAWgTonkCxVKFSFQDgIHThz6m+0bdRVK1VsopG/CAi+je4rvnX6qz0u7iYQPP54/BzQyP5G28ag5hs3UQ3rJr+aJDIkIACBXggQS+rFU+gJAQhAoF0C4dcfiv8Gc7uWT6lZOHPujTKkveXx+Hk+/6RHKTXkMav63na9ENI5BMLnTtsBghyBlGmWgIaVAhzpeNxQPq1uchb7zOItdbZd7W6o1P4tzW8GhAmtfZehIQQgEAgQSwpAuIQABCAAgSME2BYfodZhneDoXS8v+APn8/lHrzCsHV/VlufEucvTuDot11hiMTRwtQ7Ir0BAoZwD48vXTQd1GiJJ+5JG+jyBJPNpGF+zmV+hY9MEBCBwKQFiSZfiRTgEIACBiQj4E4W9aTKR8XOY6oNBdgradfhRD0lr6ZYHqROmMq1YejpVARJlCZz0eFllkHYRAQ00hTbyG1IPSeOMEhtuhViSiqXTQr4a/ZbU1Mei2a8T0RwC0xIgljSt6zEcAhCAQGECOlToQDLn2aAw1pbE+WPP3pOPTozhYGn2qfP4u6piZQgk3dIX5AUb1wTybvHCdY1q6B2bt0NgKOipGcPn+yoqMO1iEfj7CdBDIw0BCECgQQLEkhp0CipBAAIQ6JVAOHbu+gCqV5un0fukc78eGv0J06CqRf1eL4GMW7qbfGc+wgu3eOGiRoNzd8UyFAdZiwT5ISz9NdJ1d626qoydCC6YnMbYvsY6CAxGgFjSYA7FHAhAAAI3E7Bzgv7ddTK5WXWa3yQgn+oouFk83lT1eOPfax0s/834KEcJ3SJRk4D4f3ViTa1o6zyBk55V9Q1N0ulCOZbYqDvJLWEUmUkMx0wIQKB3AsSSevcg+kMAAhBojoBtiPVvc/qh0H4C4bRz4M2Ur/1BTUg75ajugXYljcQZAuHVCRxxBmY7dTWyLLFXMY3QjYom2T9UCI3ydz/13qXIbPDkFgQgAIF2CBBLascXaAIBCEBgEAL68MF2xhw7e/drcOixs9/XY1J6LlWO/dE3k+APpb2D7Uj/In2gI3uHV7WIQzVCN3Clw1ZTgarzNbRH8Xj8MMtt9ChuQQAC7RAgltSOL9AEAhCAwDgEws6Yo0LXrtXZzxLHbJGQter25ouPPKoXWRVd8nsiawyvzpcTz/SEq5VEfg6BIi+aaUiutaiIlR+z1nksXCIJfuCvSRs7n8E1tn+xDgJDEiCWNKRbMQoCEIDA/QSKnFXuN2NuDXQU1DnHnwl3sdGhce2Ruz9hmmRVUUPqVMohUZNA6A+c/2vCL9iWRpbG9WHh6bD1otSQzwxVVGZtZvB1B06LQ+AzsMmYBgEI9E6AWFLvHkR/CEAAAo0SCMfOYx9GNWrbNGopdmPHmzOxA98f0oCUGvJodbhSpoSc0UTSSBwgIKdw4j1Ar4UqGkTmwZMzs0ZuGglSVwm30p4jIenM0AKxajrII5ao1i4NQQACEDhGgFjSMW7UggAEIACB7wR0ltAW+XsdSjRDoLj7dGIMx1flh5OkFPBIdBIOB1RfhvSlBOQvG9fE9S6lXVy4ZmNLnBxHGo+Px4/vCeokPtNsWWxX5Yvb25FAzXiLiDoyBFUhAIFJCBBLmsTRmAkBCEDgHgJlzy332DBrq1f4Lsj0l+mZVier4AHVCvlc1iEgv+CIOsALtnKF71KZ6hiLv5Rnd8N4l5CQX9D2LkR5dIv0urACJSEAgUkIEEuaxNGYCQEIQOAeAv6pte2S79GDVncS0NHOvJa+XLBT3n/Fg+TFg6WVVsn/Kv+T8p0qvMoUSnJ5EQG9RVK8e1ykMGKNgPlL/5YK3GioSrL9MbLF4Wll0qbVqRZrTeLBQHJmFJN4HDMh0DUBYklduw/lIQABCHRAQCcEO0IUjEp0YHyfKvpgjXntiiPN+5//+iQ0u9Z1esjslEvbH6biNJpTpMGLxBbRrQsh3k0sl124DCUhMC0BYknTuh7DIQABCNQj4B9W2/Pqem3T0n4C+Gs/s+lqhBco+B6n8R4Q/EWQoll/hUAtsblmPYViEIAAsST6AAQgAAEI1CDgn7USTqpB/GgbeOoouenqha5CeKLZHkAgqVnXLCoWRtZiGTIhAAEI3E6AWNLtLkABCEAAAlMQCM9aw1/ymgJBD0Zy5uzBSw3pGF5hu+JbyIas7VMV5t7u/Ja6rDsTUBgCEJiBALGkGbyMjRCAAASaIBDiFHwU04RXnBI4yMEgmUsghJNyq1GuFoHgIL6ZqgX+VDt47RQ+KkMAAlUIEEuqgplGIAABCEDg80mftfIWQ1P9InxYwSdLTXmnWWUIQTbrmg+zbsu+2dQtDCtm401a3IQABO4hQCzpHu60CgEIQGBOAmk4aU4ODVrN0aVBp/SiElHIZj3F6y3NuuarYmFY8ejlKzEKQAAClQkQS6oMnOYgAAEIzE4g7I953NpCh0hjfJxbWvBLLzrQf9r0FJNtm37J1CoMK9bKTG4UgwAEqhEgllQNNQ1BAAIQgMD/EeBReWtdAY+05pHu9AnnXn4N7XYPph4hQHy7U/YqEKKBeHAvQMpDAAKXEiCWdClehEMAAhCAwAIBDjkLUO7LCscVnn7f54q+W6YjNeU/HyBmUDflmnxlwlqJH/PRURICEKhAgFhSBcg0AQEIQAACkQC/zhOJ3HQdziqPxw+Pvm9yxQjN+vjF4/HDnwy7y6khrsegvssR59vFlecZIgECELiIALGki8AiFgIQgAAEvhAI4SSOnV94XXM7HP6vaQSpsxAIg5ov3W5xfBjUTK23eKFUo2FM4c1SYJEDAQicJ0As6TxDJEAAAhCAwBEC4Y0Y3t4/AvFcHVxwjh+1FwgQyFiAUjErDGreNKzI/qqmwpi6qhnkQgACENhJgFjSTmAUhwAEIACBcgQ49pRjuVtSeNxNLG83QSqsEOCrnBUwNbJD3IHXWGpAv74N71Z8ej1vWoAABLIIEEvKwkQhCEAAAhC4iEA4dhLRuIhzEEsULwDhsiCB0LsY1AXZbotiOt3m0+/dEPrv1xA0hwAERiJALGkkb2ILBCAAgS4J+Ceu/F5vHRfCvA7naVsJ4SR+OKlCT0iZ85PbFbBXayJM2tXapSEIQAACawSIJa2RIR8CEIAABCoR4AhUCfS/zfDywr8k+P8LCdDNLoS7JDrEGggkLUHqOC+8msSXbh37EtUhMAoBYkmjeBI7IAABCPRMgGNnNe8RuauGmoZCdIPT73Vdgin0OrbtSA4Dqh3F0AQCEJiTALGkOf2O1RCAAASaIxB2yRw7L/IQnC8Ci9iUQHiTgi/dUkRFcuBcBGP7QoKjWSXbdxkaQmBsAsSSxvYv1kEAAhDohkDYJfN7vVd4Ln0p6YpWkAkBESB2KRTXJcJLSYQYrkN9r2Qm8Hv50zoEIBAIEEsKQLi8kMDr9ev/F/aXey+fzz9eGjunCz2HaAjUIlAknGQzQy2Ve2onPYfwiyo9+a9PXUv1Ot5pWvN/2D6xHVoDNUb+ybihbZ7HQIEVEIDA7QSIJd3ugmEVsONcWPPCjueiS2uaM9KwfQvDhiYQJo295yI7uA5N6LhxJ9keb5iacxMIHe/AK4cmYW6Ky9afZ7ssl9xWCaTB2XxNGUf5rCgJAQjkECCWlEOJMrkEXq/fsK1Jo0Xp+0S7zorhXaScFnlJIdd/lINAGwTCvLFrirC6bdjRlhZnqLZlCdp0SCC8crhrUNvheVeVDgkdUTkNK/AU7QjH3uqEnXbm0FCt3sxFXwhAoF0CxJLa9U1Hmr3fby1R/riisFE1W97vt0WOvBpKZy631bSlIQhAYJHA4QOSJqJFsTNniozNhwdeDJmZHrYXIRA6YeaKrCBUZvkiqnYh5PA82YV1KLlNQDtbS2wX/nw+Gn2Mo6+sKAABCOQTIJaUz4qSCwTSrUxT35eZMlpBOUQtuJAsCDRJ4MCw9dNRkzbdppQnY9MgLy/c5oy5Gw4H4K/HWt91vxaeDe2BSXI2RGPb60fT9uhQQPbx+NkuOTYxrIMABIoTIJZUHOlcAv1K1vjvYnpVWUrn6qZY2ycBP2ZzdsC+fJ8WX6W1J5ND8io9kDs9AX+mtW65jcR3XRZuz2ovSV+X9BgEQh/YMIpxtAGHWxCAwBkCxJLO0Ju9rl/GunjK7R/ize487IdA8wT8DPN4/Gx/luX3yo3HtSuD92925JzeK6tHc7MRCEN1I0IUuu5GydkY+k+WjOf29DghnxlMDgNkbR/ut76Px89asRmIYSMEIFCcALGk4kgnEqgdYV8rk6nNrnSinoqp3RIIm+C181IoRixJDg+HDQ4SIkPiLgL5fVJ7DFbt4KwQZ2fGC3zmufRrX7o+pmONrjJP38BSCNQhQCypDucxW9FuJl3A2jTYL6t9xb/a5IlWELiagB+zdp5MR25ahu2y/OJPGl/f7VItEhC4lEBOtwxl+DZTHgkzXi8bMOlPoiCB0Bn8U9JwS5HZgq0jCgIQgACxJPrAcQKKJbX/zDD9S3PHzaYmBCBQl4A2wZYIjYe7i2VClUkuwxRNiG0Sv3dhZggVhYBI2nWJJcmtAZ3yScxJIPQHe9yyFkhiFZizk2A1BK4jQCzpOrbjS7bdXtjzPZ9/Xq/f9N2BW3DY33HjqHkLfBqFQCkC6bZYM0zYRmuwl2q6XzkBWjir92sXmo9BIPRP//VlesvGtX/nYgwIe61IyWgm3CuK8sMQCL3i+fwTcrQsWmIYwzEEAhBogQCxpBa80KsOFkX6fD7pWz9auiyaU227Y82tHS9tJyq1e+WO3hCYj0AY1BYZCYFsTTs8ek1/mrfaJDxf38Ti4wT8mNWwDYNdZYglBTIEiI/3vLFqho6hIZMmGERjeR5rIHA/AWJJ9/ugXw3SoEy6bi3mFDR54zDpm/bLZ6p2QX0QBQEIXETAj2j74CXk+MuLdOhFrEfBx0G9eG1CPdMVPM3xnXlCRDI5JaNbJCYnkPYNP2p82m+GJ4eG+RCAQBECxJKKYJxUiK1ewfj3+739cpBf1Xzaam38m//gxcTa13bpwrmodrCCSwhAoDUC+dtlveDQmgl19ElB1WmXViBwgIDfBnxNH5A/TJWwBeKlpGE8e96Q7Y/a/LBKt8TnW0cCBCAwMwFiSTN7/6ztmUEZhYfCTsgvb+fTauXrpxyZap+lQ30IQKA0gfw5ZNodc3qo+DollvYS8iCwg0DaYzf2AzvkjlWUAPFY/jxojR7W2o53Y6Ss3Zp2ZTxInGoQgMA3AsSSvhHi/jqB80GZsC4qHpSTWNfry53zan9pgNsQgMA1BIglfeUaEPHywldiFLiXwMbvLabn4XtVvav1NNxGgPguX1RrV9vgdBScySGWVM2DNASBSQgQS5rE0ZeY2WlQplO1L3EhQiHQPIFjD2Dn3DHb5OZPGs27FwVnJGCPkXxHzUzPCOvzCQHiOSe32Vy/K8aaOXz47bzZehH2QqACAWJJFSAP20SnQZlO1R62G2EYBBICx+JHfj894XGLlxeSfkRGQwRsUIewiB+zOemG7KmlSiA24cxWi3SL7RyOuq6NJvpPi25GJwj0TIBYUs/eu1v3ToMynap9t7dpHwKXE7CxubYJ3pU/4Y450JuQwOUdlAYOEdg1crcLT9irA5BDHqBS9wRCNzh8OeEI6t73GACBtgkQS2rbP21r12lQplO12+4LaAeB4wRer9/w7P3wRlkVZ/udIF5KOt7/qHkBAXufovi4nuokzKC+oGN2LDLtD1rv8hNTjaCOnY3qEOiHALGkXF/pV6L5yUMh6zQo06nawk4CAiMRuOhXIR6Pn5EofbUlnCW+lqcABC4lcEWAeLZfewmRuNni45f2z36F2w42TPj5l8SS+nU9mkOgTQIXxpL0NwhCok0QX7XS9M1ELFadBmU6VVvYSUBgSALFfxhiSEqpUenDah54pJTIuYtA2aDSPBsw7TkVJrjLg7TbIIEQZ1Qn+ZqYZwQ16DVUgsCQBC6JJX2dy6xAXzOa1vW+1L6013YalOlU7UtdiXAItEOgVFCpHYsu1SQcKnh54VLaCD9MoEhQaZLuTYD4cDebqqIOJpnHrtne7JuqM2AsBO4icGcs6dKI0vuf/wpi1ZRNLElUOw3KdKq2sJOAwCQEzn/+NjwoLUw6SwxvMgb2TiDttOq9OYnezc/RP3Bg25kDbc4ye1dJ+tKc/QSrIXAdgWtjSWt6h8dTZR80aQ0uO2Nq91NW7BqiLvI7Dcp0qnYXXQIlIXAFAU2/mt4zE1co045MXl5oxxdospeA/fpB5kD2xfY21F153jTszmW3K5y/RHKEud1ZKACBwQjcE0syiH5zUPB3UiW27Iypmbqs2K77U6dBmU7V7rqroDwEzhPQJKxJ/mvifKMtSwhAWJtadha6rRH4OopDgTU5w+QHexnXw3j2UkPCchB6kS7pTpd6AeEQmJDAnbGkz+fjH7+UmuAumjE1TZfSc4DeZky6M6RTtbvjjMIQKE5g7/v8A/8KNS8lFe9dCLyLgPZX2r9tJMbeg/ldMb9uc1eH7LTdnHE09vDp1HGoDYGuCdwcSwrhpCL7fm1Bys6YmqPLiu2693QalOlU7a67CspDoCwBTcia8BcTA0/Xwd6BLS3bc5DWLAEGdQgQl/39h2b9jmJlCWyPI1aKsrSRBoEDBJ7PP0UiHgeavqLK/bEkv3YuznH2N33s0/rn848lUhYqph22CluV1G2q4kumki1Hs7NX0iTr37SJVJoKq9FdtVQ9lawc2aXCXmcVO58wJuflVJbQqdqVKdEcBBonkPOO0kVT3+1keHnhdhegwEUEvo7rgSMs2r4+Hj8Dm3lRz0GsCPiDle9UvOkmRCQgcCMBO4cOM8nfH0sKryZ5127MhumEqFhPmDd16Q8VYSOuMpbwJaWP5NvdNd3WYo1r5a3FtVqfz0ftBiXXfmFqzbSNJmTj3oTptrfW7eU7Vft2bigAgQYJfD15NqjzSZXCajLMduQkFqqPRGBj57O2+ena/DCoH4+fnKeMXZuM8lcTWDwOLB5wrtYE+RCAQCCg4/8AQ7KJWJLfNHjWyvfv1/jJ0a+1KpzGXCzHe0tlvGRlLq7ikq+EPTgyCb7udnW9jpTzx+z89kIVjYA3x6AtFvbaFt+BmXDvsi7SnardBVuUhMAtBPzsF2bjW/S5tNHhDbyUHsI7IhA2MOr5HZmQqapMs0S6wcuUQzEIeAL+xKQ+5guQhgAEbiEQxqYPaNyiz5lGm4slBZqLC6o/NqTGa7pcrGvl7SuwtK7fuIS7/pZFkYKqXqvFB8Vr+qg/pQVkS1Dm8/lstB5uWWETtahYKjwzp9OgTKdqZzqFYhCYlsDiO0rpfNgvH7/K2JQ+knX9+gXNryNguzXthZS4rsX6krUJvGKfVt8cWmyNQOhgramHPhCYkECIKiwGFnrB0lwsKY2nLKLc2E/oVqaoIF/VQ37werhrl77MYoHFTNVKFTZl0vxUjoSsvXy0ZlcqKj/HGs0v30jJTtVuhB5qQKBxAprr8ufPxi2SegObJhtJQGCRQOj8i2U6zQym5Wz5OrUUte8i4PvYXTrQLgQg4An4Ual0j/N/r7GkjdDJSX9IcnCn8tOfavI9Q+H/UN2XSdPSOdyy/BxRkrD2mFr650gLxQZ3awAAIABJREFUaqxdmsy1u83md6p2szxRDAKtEdA8vD1dt6b2tj68lLTNh7tjEwhvHQ5jrJ+s+MntYdzamiF++WhNN/SBwJwEwuSvg3x3G1diSbEDr8VclL/9mVhmsdCqOtBa/nYAKGeRUJltUUGB7ctOgzKdqr3tC+6eJ6DBq/HYXcJ+rf88igEkrH0a051P1xQuOJMP4O5tE9YY9pJvP8u49qBo2/bB7g4wS2/3Orw8WI9tyhw7uzal0klldLTZHlYt32XbdrIP9Fv963L2ev12sSI0F0ta7BP6I/eLMbxQRVNGzlZbklVLiVBdLg/5ofXP5yMJ6S3LsX1hji2+zMYfYvO6+V8TD2lT7Kv+a2qn+dZumt94TnG15fFdbOU1VbdEPj3fPbyQfAnndVhbyPN1OC/BDzrPYZc7fMXx0jXdgUMr9J/tRxre3efdsSbh/PiqI2FN/wpuKt7E+5//FsV6p2+n14Dscsfi6rNLwqIVax/pe4uGDxMbGW/ydrp3h8q68xuS8xLObyfW3CEzcxLnx9eahPy14/AIlYHn3fFVwlqBNeWbzf8aMlhzqGh/Tayx+lpRBVqQcN0I3bV+nXfHooTF/pk/ZuWpyonWY0nhreZFygGZymx3i/Bn1FRLiVBdQyjkh9Z9Lw+3cjZAocrn80l7W6qAdJPyG4mCndLaTXVuPKe42orZfV0MPBnFMVXdEr7Mdvq8BHseEhRIO9i2Gmn1RiTku2Nt87cxjhq/pT/7uLdTtdwl8h0arGjcWfnqmVsX/1ToxiC9aIQedof0qSBh1+KY74gbS4a+LZgbHSC9pVo+scsdi6vPLgm+aZ9OtV3MGcmzts3zEIqsobvccbtD7a/EBAh2udgBFjMXragP86QVayhwqMAaovR8dOPMfL7pxS6tzMW+vatLnF87FnXYNb7OS1izYhcKdSSf2CVh0ZC9EnI6cBevJjURSxLNEObwBzwdjWxc+W2ERpolNJ43+rdatK/TvaskOVRfyw+tr8WSvC32JaSXL51TaTZsVEAJ32Wlm+5uJHy7i83lZ1q7+eUbKdmp2o3QG08NDR9NMn516SgdRr2fIsbz2i6LOnLitqr4NN/v/kHUNtXG7/rtCr+now6wuJVv3JVr6jGu5VYSEPhKwMa+bXjWxlQv+Wzbvrp74AJhcQ+doeBp/WqG98eSfJDFg9MBb/EZrL8bGMkZXpov452XLuGSHKqv5XvJlpYCuuVtDPGytSqq6xPSwZrQLeUrp07C2q3TVsFWOlW7IAFEGQE/MBfnmb5A+ZmNM2dfvkPbsgT8WFhcc8s2d6m0ME0NMFNdigvhEIDAwAR03rFzUDipdWd4MCfnI9/ubEThNQIKF/iEPdVeq9Jm/v2xJD+QPCORXZwp1mr514IWK34tIMmh+lq+19nS0ly3VHdtmkirqG5IeFGS5jND+Usvrd1Lm7hCeKdqX4FiZpkadEoMQEO2WCJMYgMYiAkQ2CbgV8NhRkFq1DYE7kIAAhAYj0DY4egQ1LWlwSi2bV17M1/5dFnv7s+3ydibY0n+gVt4eKjRlb46FD77kjGWUMW1AakC25JDdXk95IfWF4stZvqKUslnrqX9E1crI/mVJ1Zrd03PZvM7VbtZnt0p5j9+0dCrPHYuguanAl5NuggyYpslEPq/je7tJbtZW7xifqdkRi3uXnwV0hCAAASGITDPtm2MvegwHe86Q8J2ZePva12nQynJN8eSfFjE74084kVTNwrocLi4g9yoaA2pQKiu/O1xLou8OVJp0Rb/qtRaAZ+/qImaCGr7isXTpklxsVcL7FTtq7HMIH9tOzJS2MXPD/0+5ZihN2JjQQKh22tBHOmLMO0uzLqC9BAFAQhAoE0CaSTdT+9t6rxXqzC3h1cr9kqjfBcEfDeueXK/As5tsSS/80uHjZ87UsT+bhrZ8ZJTZL5uKtnXDXf9rbXtqS/jm/bThM+39PbdtPxiK16ID2Ol1QvmmCYFBdYR1anadeAM3IofOH4St3QY711z8LMB4aSuXYnyXwl8/ZOsXyX0UsDvXkYKf/fCHz0hAIGaBDYe/g22bQtz+9oZsyZ82rqUgDxe7cB+qTnXxpLsh/TNAP9HN/xBLg0kWXlfxrOWA1QgBaRbOh8q4V8CCsN1+wCmg6iKeZlhO+sVDl/keXu/2pL+BJevEgyX1XZ6DDqIf6h15rLToEynap/x1Mx1v25HbOD44TwALj8bhIluAOswAQJhYQ0d3l+OxEr7EBk4knXYAgEIQODz+Uy4bfOHO5ve6QkDE7CgQTin92vvtbEkbXfWEtvnN0Vt0up+1KX0FyuqmK+7ITnopj1ciEYtSlBbSiyqZHUtYGRplf+6UU674LZdJj8Y5Zs7kO40KNOp2gccNHmVzO1IOvQG4JbOBumMMYCZmDAnAS3HNng3/i275LVAO+wl/NOpFtRDBwhAAAKHCYQH8xtz+3gPycK6xtx+uBe1X3Gwnck9saTX6zfzYBO2TfZet9XVFLPYadKKvlh60PJfgpjk4GkNcpOzKGH7p7NSlfTaURCuJtIqnoC3SOmN87OaU+GTCVP7pJD61TtVuz6oflvcGAWaN0KiX2PXNA+zB/uSNVDkd0RAa2UYv2uXYR3vyNI1VdO9R+Zuak0g+RCAAARuJ7B3bk9/4eR2E84rECCMt36dR4SEBglcEksqbqdtEw+I/Vrxa4GvjWoL+7WkFbCZYtcEocnlWK3rJlxTLNPwdop1qnY7ABvXRENyV6Jxo46pFwjsmkCOtUgtCFxEQOtg6NXbl0P2+RTFRcwRCwEIQKACge1pfO1uBcXqNxGMra8ALUJgL4E+Ykl7raJ8HQKdBmU6VbuOT/ttxX4RLCzDmZdDHjg/nw+vJvXbn9FcBHZ99RCG/JDv7PBqkvoGCQhAoGsCaWQ8zOEbl10bvqZ8CmStJPkQaIQAsaRGHNGlGp0GZTpVu8suUkXpM0dN26aMGktKf9xtYEur9DUaqUog3VVvnCsWb1VVt2JjhJMqwqYpCECgMIHzc/vAmxmeAhbubYi7mACxpIsBDy2+06BMp2oP3ZWOGHc+hKTD58CbEs6cR/oWde4jcOYFQ41oJe6z4/KWOW9cjpgGIACBogTYtuXgZNuWQ4ky7RAgltSOL/rTpNOgTKdq99c/rtG44F5EB84hP4Tx+GWpJfwt0hBogUDZEJI6fAumXaeDzLTEwDHx6xgiGQIQuJTARXP72NMd4aRL+yTCyxIgllSW51zSOg3KdKr2XH1rydorokiTxFbYlyx1KPKaIHDRScP/bdYm7LxGifB20tjnq2sQIhUCELiKQLr3CBHww5fDPwIMczt/iveqPorc0wSIJZ1GOLGAToMynao9cUeLph/efKxVjA2MeB1s58w5opP7tslm5tBRz1zO0MlTaH13ArSHAARGJHBmJl+sOyKkaFMwfIYVLSLgugcCxJJ68FKrOnYalOlU7VZ7wW16vV6/6TkqLL2Zl7fZULHh9PHg8I/1KtKlqWIE7DWl8Eg2cyCHYpPsvAMrHl8X64sIggAEihJg27YLJ3P7LlwUvosAsaS7yI/QbqdBmU7VHqHHXGbDyc9kLtOrLcHsS9ryB9pkEDhz9pgklpT+uUbCxBk9iyIQgMCdBGxuD9uS8Dxg4/JO1Su2HQjMs6hVZExTZwkQSzpLcOb6nQZlOlV75p62y/a9G5SpHuOHfRv7kl1di8I3ErB4sc3eYXu9djlPSIW3Dm/smTQNAQicJHDgmcHJFjuqzratI2fNqSqxpDn9XsbqToMynapdxmfTSEkPV2sHzqniKSmWec7b0/T9wQ0NG+u1cf14/AwO4m/zApapQuR/k+AKAhDokkCYxDbm9tmm94CCbVuX/XtcpYkljevb6y3rNCjTqdrX+3OoFsLSu3E5VSzp8/lY//dAhnI8xgxNIA2G+p4c0kOTWDAumD/bzLZAhCwIQKATAsztG45K4RBO2sDFrcoEiCVVBj5Uc50GZTpVe6iuc7Ex4elWGj3xh64JT1wBCK8wXNwfEV+GQNpvw0j343q2B9efz4fzRpl+hhQIQKA6gTB7M7cHDwQgbNsCHy5vJEAs6Ub43TfdaVCmU7W77y4VDQibkvS3aX2BCWNJKZCKzqEpCBwk4Ift4/Hz9Sc2DjbTc7UUUc/WoDsEIDAFgfCcwJ4EpJma36aAkhgp8y0x5941oULG/QSIJd3vg3416DQo06na/faTmppvPJkPT3W0Ks+5Hm+Aqukv2oJAJoEwfvVUlvNGABhAzTm/BSZcQgACLRPQfsxHSdJdioq1bMt1uoW5XYvgdS0iGQI5BIgl5VCizDKBToMynaq97ANy/yawsdau7UumPWttsPobKlcQuJlAOnj9r0WshZNuVvq+5nXisoRndZ9StAwBCEBggcDGVoS5PfAKc/u029eAhct7CRBLupd/3613GpTpVO2++0oV7cO2I31ok55I7UuZKtq12EjYw7EvadFJ6PT5fN1Ah55s5acll050hJOm7QwYDoGWCaSTVdCWud0DSXExt3s+pG8hQCzpFuyDNKqje1/2TH7M6MtZ+dpmLrHpvmTmAEomtHwvUBICxQmEMZvGiBd/dnrC39725HOg+fKkIQABCFQmoEOEbcsX5/b05x0nn9sDkDVolV1JczMTIJY0s/fP2q5loJe5zJ+cieWfdX9j9b++uSB980uqysAJjWJhGdhYTOuOgJ+0rYuumUBPDmQ0oi0xc9A8kOESAhC4nUA6t29sy0Nw/Hbl71UgoOvlCHYvNFq/jgCxpOvYji85TGctb1Xf77c/aTDzDtY7wz5j278d9ds6btpFr45KtAKBxbeNNg4bn88n9OTJGYaJ7vH42aY3OS7MhwAEahLYFewOs1lNPdtsKyx2LZ+/2gSIVgUJEEsqCHNGUT5A0+zDz1TJGV01tM27NiWfz8d3CdZgT8NIDt1ZMK4bAgd6pp8KurHzMkU9jcl/G+4yxgiGAAR2Ezgwt/squ9sbsQLT+4he7dImYklduq01pUOA/PH4eT7/vF6/Nz4Ffb1+/cKjOfderVpz3Bj6hO6XExvyz7hyyo8BasOKMFi2X+zakMMtCJQicKxP+tmglCb9yvETnS2CNy7K/WJEcwhAoCwB7cktkbkNU62yynQqzS92duzq1BDU7p0AsaTePdiK/uEjMs34lrDQksV3iu9lTexa8Mgr0Aos9ChH4NiB09q3vpG5iSmncqOSwr6k+Dht1GzUapLAmSCIVp8mLbtBKQHhvHEDfZqEAAT+JhA2G/nPrrQu/C1v3is/t/Pm6bz94G7LiSXd7YHh2regUjjhh/kuvfTBJh8bCum04kaOZA7HGIP+j0DoZvk7Eqtv+xJiSepPYYcHGZEhUZlAmNj3dkXryZV1brY5HcCM6t55slm7UAwCEOiOQJiO9v5RNuZ27/EUJk8BPR/SdQgQS6rDed5WFFp6vX7DSTWcFk5e+qjTvLhnsrzIImrdZiZsW7YWQbrVAPcgkEEgrBTHYh97jygZenVcJCDdG5vr2HJUhwAEmiFQZI9xbEVohkFhRU4+Ui2sDeKmJEAsaUq3N2O0DwDtTTdjBIrcQyAEHw+fjniM4/0X9iUcyD0c0hUIpIeNY40yrgO3UhNmEMslBCAAgUwCRYLazO2BdqBKrC3w4fJqAsSSriaMfAhAoDwB1s7yTP+VCNt/SfD/tQmkgSSODaV8ANtSJJEDAQgcIBCeVB1+/neg6bGrMLeP7d/2rSOW1L6P0BACEIgEeMYeiZS7Dhs+Xk0qhxZJXwjQ974AOnebafMcP2pDAALHCYT557ggai4RAO8SFfJqECCWVIMybUAAAgUJ8OJMQZiLoiC8iIXMSwnwcPVSvJ/PB8JXE0Y+BCCwSCBEOngpaZHSmcywbYPwGZjU3UWAWNIuXBSGAARuJsBxqI4Dws6PT43qYJ+5FbbCFbzPm18VINMEBCDgCYS5nR/08XAKpsO2jXBSQbaI2iBALGkDDrcgAIG2CIRAEjuS69wTUD8eP4STrqON5BDjYBN8XZfgXHcdWyRDAAKBQJjb+Wo+8Cl4ybatIExE5RMglpTPipIQgMDNBMIpiOjGpf4IW0Aid5fSnlk4Pa2m9zlv1KRNWxCYmQCzTWXvh8WUyF1l/nM2RyxpTr9jNQT6I8Dru/V9xr6kPvPZWqSP3eLxMJ3eogONQgACYxMIz/94IlXB3TCvAJkmPAFiSZ4GaQhAoFECrI53OQbyd5GfoV2eWt/lZcjfRZ52ITAJAZ4T3OJo5vZbsM/cKLGkmb2P7RDohkB4is7PqVTzHNvBaqgnbIjedaPTA3wm1Rt9QdMQGI8A27a7fBrmdr50u8sRk7RLLGkSR2MmBDomwKsx9zoP/vfyH7V1Hp/e61n438uf1iEwMIEQziBUXdPXzO01adMWsST6AAQg0DSBdFFsWt1BlQsPGPnV80H9XNUsYpRVcS81Fs57PL5egkQeBCCwj0CYWPiZpH34CpUOK2whqYiBQCRALCkS4RoCEGiHQBpIIopxi3dwxC3YB26Uw0Yjzg3nDU59jfgFNSDQKYEwtxOhvsuPbNvuIj9bu8SSZvM49kKgJwKcc9rxFr5oxxe9a8Ietx0P4ot2fIEmEOidAPNJUx4krteUO0ZVhljSqJ7FLgh0T4BVsDUXhi/d+AWE1hzUiz6hI/Wi9qh6MtOO6lnsgkBlAjxzqgz8a3N45CsiCpwkQCzpJECqQwACVxHgwHkV2RNyccoJeFT9H4HQhYhIttAtcEoLXkAHCHRNgKh0g+7DKQ06ZTCViCUN5lDMgcAgBDjbtOnIsC8hENCmm5rVKvQffkqjHU+Fx9ftKIYmEIBAFwTCHMKPrzXiNfzSiCNGVYNY0qiexS4IdEyAla9l5wXvEE5q2VlN6cZPaTTljqBM8A7nwMCHSwhAYINAeE7ABLLBqvKtMLc/Hj/8EZvKLhi7OWJJY/sX6yDQH4F02evPhtE1vuutsdfr10eyXq9ftkQd9TXvu8fjh8NGa74Lp8Fqb42932/f9PP5hwh1a30DfSCwQSDdtrE0b+Cqfyt1UB0dXq9fv21jbq+DvXIrxJIqA6c5CEBgi0C64LEj2eJ10736bkpbVDyLkMRNvWBfsz5YQCBpH7uKpevH+0KLGtc8PK/odpqCwCkCfthWi0Gf0ni+yvWX4NAr/CUb+5E6ILGkkbyJLRDonkA4VxAmaNajlT1l2yD/ItL7/ZYO7Eua7SemWBoKxGVtuqy+pyyw6F9E0pmH+b/NToJWEBCB+jOGmiaxl4CmVgvr+Fl3r6ic8vYWkm9FezYCjjkAeylDLKkXT6EnBMYnENY5FpvGXe6fMj0eP37HcIXmi9EH25pw5rwCeEGZlbtKQc0nFFV5Hl4c1zqgLt6d0CmYDIE2CfjoAC+ctukjr1Xw19XbNt+0paVA/aZTZcgpQoBYUhGMCIEABAoQ4MBZAGJFEZXPnIuWSYfFu2S2QEA+0gBvQSt02CAgT1nilk3/jU1vkOEWBCAgAsztQtFL4naXSYFblpVe3NSXnsSS+vIX2kJgWAJaYHSMGdbUgQzTI6a7Dn7qNgNBHc0UjWhLjGbeiPbotSD5rv77QXdNKSP6E5sgcAmBsAHgBeFLKJcWeq/XtGcjllTasbfJI5Z0G3oahgAERCAcXdiRiEzjieC4+j+Xq31J46CmVS9sW+uHJKYlf9Lw4Lj6czKxpJMepDoELiVw+xRxqXUDC79326ZuMzDh2UwjljSbx7EXAi0S0OrCmwstuuebTnp5ob77LJZU/6D7DQn3/0dAkT7rGLipr24RxnXlx8jWOsHHvvoM2k5C4N54xCSQrzPzFvfx91Kuc+i9kokl3cuf1iEwO4FblrTZoZe2/0Yn2oGz8im3NL8x5YUAMYGkHt0cnFhtoCkK2SM0dIbA8ATuDTQPj7eCgWFuv26B1mTObq2CW29pgljSLdhpFAIQ+D8C1dYziF9K4BY/ao9yqWkIP0DgxvDiAW2pskbgLj9y6ljzCPkQuJ1AWO6rhZhvN3wwBeoEBLVPs+aezz90mME6ErGkwRyKORDoiUBYYx6Pn560R9e/CdTZl6hNnXL5CkZM2klU7gztGD6eJhpo8unVNtpJ9brn5Ffrj3wIDEwgTAiM0359HVx59e9d+m/c2O33221SzYklpUzIgQAEKhHQ4cQSPKyoxP2aZipHBukz17ixgNTKPaGAxojYJFBzolbn2dSImxCAwD0EwmxwjxK0WohA8GaFTbhm+AptFYKEmC8EiCV9AcRtCEDgIgJaUbSYXdQQYqsRqPbquxripaRqzs1vSCPaEmwZ89G1WbLa42stCrzs0GZPQKvJCWiEMrcP0xO0m6rjU7+aDMNwckOIJU3eATAfAvcQ8MuJLWAEBe7xRNFWK7jVN0GfKeq9MsLCxpSgQBmsd0up4FY1QZ+529u0D4EFAhqhtmdjnC4w6jPLHKp/r95ZqaE+aaF1JEAsKRLhGgIQqEBAa4kleHOhAvM6TYTnlmW/iieQVMeJh1vxDrKhfVgUFVsjcOmkrWMqB9TW/I4+EPh8PuncfnXEAezVCFR2rpaSagbS0KUEiCVdihfhEIDAAgEdGwgkLdDpPyuEk0odDv12h11sg93kIr83aOmcKvkBaFN3qWGoFYGHCnN2Laxun4DO/2zb2nfWAQ01CZt/S23bUk38OpLeJadHAsSSevQaOkOgYwIcODt2XrbqYV9y/syp/cd1W5xs4yi4QEAO0pHjvNMXmiHrVgJXzN6aK+gwt/qWxiGwSkCD9OpAw6oG3LiegNZuS5yM7L/f71SC/1Nu6d3rTaSFSwgQS7oEK0IhAIFFAuEoUvYDqMUWybyLQNiXnFEjjVME4XZ5pgnqniQQPMI28STPZquHwXjS0eGMGnoR47rZboBi8xAIQ/7qvxw/D9jWLC3raL/bf71+X69fP9vzULA175/Rh1jSGXrUhQAE9hEIR4WT55B9bVO6LgG/kzh5JkxFhY50Un5dMAO2ljpoQCMx6V8CYfT9m33k/4OoxcsjcqkDAQgUIhBGJdu2QlxbFFPQ1+muwAtv0Xh0OkqAWNJRctSDAAR2EghLC88ldvLrr7h/DPV4/Bz2uL0sbY+2Nv7tD9AoGvs94uPxw2FjFMcu21Hw8fXGcNatZSXIhQAErieQDvbr26SF2wik7j7z6bF2brYVtCn9jMDbuNDwJgFiSZt4uAkBCBQiUHaJKqQUYq4lgNOv5duG9FIRwzasQYssAjg9CxOFINAzAZ7/9ey947r7h0OHHwEeb56avREgltSbx9AXAn0S8IsTby706cMjWofNKL+QdQRiw3XScGHDyqJaSQJM6SVpIgsCjRFI53beKGnMRVepE1xPOOkq0KPIJZY0iiexAwINE+AhdsPOuVw1vH854psaCDtOfpP1Jj/c0yzev4c7rUKgCgGCxVUwN9pI2Lbx3XqjfmpDLWJJbfgBLSAwLgGOHOP6NssyOkAWpg4Lsd3s0GklVQ4dgMfXJeEiCwL3EWBo38e+lZYJJrbiieb1IJbUvItQEAKdEwgLUufWoP4RAmk46YgU6rREIHy9yHPLlpxTTxfOnPVY0xIEqhBI12u+bqsCvq1G6AZt+aNhbYglNewcVINA/wRCIIkDZ/8uPWgBPeEguFarBYe2qiZ6XUsghBT5QbRrcSMdAtcTCHM727brkTfaAj2hUcc0phaxpMYcgjoQGIhAOGbwBcRAvj1iSniFgR3qEYht1GGL2YYfmtCCeb4JN6AEBEoQCMOZ6HAJqL3K4NWkXj1XV29iSXV50xoEpiHAIjSNq3MNpUvkkmq7XIgJEiNu2101tAtdgjBxDei0AYHSBFijSxPtXh6xxe5deL0BxJKuZ0wLEJiSAG8uTOn2L0azL/kCqPnbeLB5F92jIBP+PdxpFQLlCBAULsdyHEmhV/D0aBzXFrKEWFIhkIiBAAQcAdYeB4PkXwToG3/h6OqCp9ZduauqsvSNqrhpDAKlCYTnBLxdWBpwr/KY23v1XC29iSXVIk07EJiGAAvPNK4+Yijd4wi1NuoQB2zDD41qEc6iPL5u1E+oBYGEAIM3QULGXwTCm6d/3eNibgLEkub2P9ZD4AICYcnh6dYFjPsWGbat/LpnF+7Ea1246V4lmfzv5U/rEDhGIIzcY0KoNTABNgADO/ekacSSTgKkOgQg8BcB3jr5CwcXKwTCzvX9fq8UJLsVAryU1IonGtaD80bDzkE1CCwTYG5f5kLu3wRCP+E58d945r0iljSv77EcAsUJhEAS3zgUJzyMwNBVHo8fwkktOzfECNhEtuyse3UL5w1WgXvdQesQ2CYQ5nZeE97GNfNdtm0ze3/DdmJJG3C4BQEI7CMQThFEB/bhm6x02MJy5mzW/3iqWdc0qBjnjQadgkoQWCTAaF3EQuYagbAZIPK4BmqqfGJJU7kbYyFwIYHw1RJvLlzIehTRYV9Cn2nQscFH7B0b9FGDKoXloEENUQkCEAjP/3iiQ5f4SoA+8xXRbAWIJc3mceyFwCUEWF0uwTqB0NBzCCc15XOeWjfljo6UCT2HM2pHvkPVSQjwnGASR5c1M8zt/EBBWbw9SiOW1KPX0BkCbRFgaWnLH11pQ+dp2V0h0kdEoGVntaZbOKkSJm7NQegzMwFW3pm9f9L2MLfztvJJnr1XJ5bUuwfRHwL3EwifM3BmuN8lXWnAvqRNd+GXNv3SkVYsDR05C1WnIhCm96lsx9jzBJjbzzMcRgKxpGFciSEQuIdA+nTrHj1otWcCYV/Cr7a34ExeSmrBC13rEM6rPL7u2psoPwyBMDB54XQYz9Y0JOwQajZNW00RIJbUlDtQBgKdEUgDSUQBOnNhG+rSkdrww39acNj4jwWpEwTCeYNT6wmWVIVAAQJhbifCW4DplCLCto25fcpe8D+jiSVN63oMh0ABApwTCkBExD8E6EvtdISwR+THNdtxTXdSmC/8AAAgAElEQVSa0Je6cxkKD0yA8Tiwc+ubRlyyPvMGWySW1KBTUAkCfRBgFenDT/1oGb5044e37nJdcMRdatDuGARYKcbwI1YMQIBnNgM4sSkT6FFNueMWZYgl3YKdRiHQPYFwPODt1u492oABPDK93Qm44HYXDKkA540h3YpRfREI2za+buvLfW1qy56hTb/U1IpYUk3atAWBQQiweAziyPbMCJtdYpSVXcSZvzLweZoLL7vx1uE8rsfSFgiwbWvBC0PqELZtxCiH9PKGUcSSNuBwCwIQWCbAqWCZC7klCLAvKUHxiAzIH6FGnWwCYeHIrkdBCEDgLIEw+gjmngVKfUeA3uVgTJckljSdyzEYAicJpE+3TgqkOgQCAfYlAUidS15KqsN52lYIVk7regy/l0C6beNP7t7rkcFap4MN5tBd5hBL2oWLwhCYnQALxuw9oIr9dLMqmP9qhEDSXzi4uIYA3ewarkiFwBaB8Hhmqyj3IHCIAHP7IWwjVCKWNIIXsQEC1QiwWlRDPXlD9LSaHYDgXU3aM7dFT5vZ+9h+C4GwmPJG0i1emKHRELLkO8oZnP75fIglTeJozIRAAQJ8oVAAIiKyCbAvyUZ1tiCozxKkfjaBNJyUXZWCEIDAPgJh28afs9iHj9I7CYTAJeGknfy6LE4sqUu3zab06/UbpqfH4+f5/MMkVbMnpAcAnm7V5D9hW3S5Ok4Psyvzah3sM7cSuhzn25k7A7ZfR4BA0nVskbxIgG3bIpaxM4klje3fvq17v99hxxkentslJ586bg6+AHsd7JO3wlb46g4Qdn6c6q8GjnwjEFZzFhQ6BgTKEghz++Pxw/O/soSRtkgg7XiLxcgchgCxpGFcOZoh4Qzpw0ZhD2qXo9nfmD3BHez7G/PPyOqE8U7fK+vsgLescKRBYI1AWFMej5+1kuRDAAIHCIS5naXzAEOqHCNA3zvGrdNaxJI6ddzgaoeo9toSGDajPHK5rluEheG6hpAMgZQA3S9lUiQnTKFrM22RthACgUAgjGu6X+DDJQQOEwi7aF5KOkySigcI0P0OQOu3CrGkfn03rOZ+DsoJD/lvr3LKDwvuGsO8O2zrD+RrSCN1lUCRTvh+vzmsesR+5rRfoPN3SUOgAoHQCY+NUD7MrOApmuiLAIHavvw1nrZhbj82S7Nt66JjEEvqwk1zKakJKD9moSrHZqu5+O60VmxtawLhnfwoXobA+X74ePwcO6mWMaAxKUXCc43ZhDr9ETjfD01Cf5ajMQQuI3B+ubxMNQRPROB8QJM/stRFdyGW1IWbJlJSU09+IMno6GMNjosFu4uoyi8FhSMKArsIqBNaYtdIt731riq7dOuu8BmY3RmLwi0TSMNJ+dqqbn4VSkJgbAIaFJrk926nx+aDddUInOyKdgBh21bNX4cbIpZ0GB0VyxNQ5OLYyy96FFNesyklnlwGpmSG0RcSONwhVZEttblHU6UdNo7Ntxd6GtGTETjcIVVxMmCYC4FVAgoh8eXyKiNu1CKgY93ezYYqEkuq5avj7RBLOs6OmsUJaF947MjHibGsR+QOWwOY0MviRdoBAtpe5O9LNC3wh6IMuAdiGI/NtwfcRxUIrBGwrqh/c5YbzQY5hdfaJR8CwxBgbh/GlSMZErplznStuZ2fJuiiJxBL6sJNsyipfeRhg01CzlR1uIlJKvqp3KhOYjhmNk5As0TmYPc9uXHT6qi3F2AdrWhlcgJ+nGauOOrJrPiTdx7MNwIaEZZgXNAxGiEQeuZXrXx5uvFXXLcXIJZ0uwtQ4D8CNn2c+eDCXqVh6vmP6dGUn8p5MnCUIvXKE9h15gwPxMpr05vEAIR3tXpz4Mj67lp0/GuzrPgjdwtsyyOQzu28cJpHjlKXE9jVOcMej+n9cvecboBY0mmECChHwLaSZyYOm4POSChnTceS/DadQFLHjhxU9bDV2Ig+h548KI9cs/K55UqkHATKEcg/b4SezIpfzglI6pXArlBsr0aid7cEwmZsbduWrgJM7+37nFhS+z6aRUPtDs9MHCbkjIRZcK/bKUfY1mRtxl8XwB0IXE4g7EsWH8CGvfXk7+CkW7RFaJd7jgYgsE4gZ/UJZXjasY6TO7MQCAsi27ZZHN+VnWFLtnhSCz2Z6b0LDxNL6sJNsyhpE83i/JKJgFhSJqi1Yuk2fa0k+RC4l0DYlwRl0h3J5LGkgOvMNBtQcwmBggRC0DN01HD3/J6hoOaIgsAtBNJBwXOCWxxBo9sEvnbUxW1bWAK2m+DuLQSIJd2CnUaXCdi+8MwTFZuJmHqW+X7L/TrRfxPAfQjUI7DRXdOQqM0t9ZRrrKWwRTszxzZmGeoMSCB0V7+gh5CoLgekgEkQyCOgUWAJAkl52Ch1A4Ewt/utSLqjs/7s5/8bNKbJDALEkjIgUaQWAa2Ihxtk6jmM7vP5hBM4M/gZmNStQCD0WL15pJkkJKbt0nCo0BtpoiCBxR6bjncVK9g0oiDQEYF0UHSkPKpOSECTtiW0Kwv5ulSBCVn1YjKxpF48NYWeilgfe66iqPax6lMgXjdS9DSDg3GdFneaILDYadO9tbr0nJsSzavGwT8JbMKLKAGBhMBip9VAThOJADIgMD6BsAIyt4/v8v4tDDs067Qh08/wc27b+vIzsaS+/DW4tppNjq2Itvs8Vndwshnm+bmbn7vLAEaRJgho0ggdePFywk1JOGzo1a0mnIcSEFgnsDiE1zLXxXAHAsMSCCFXnv8N6+mxDGPbNpY/P8SSBnNo9+Zoitl76tMWk9X0QCcIOxLicQcYUuUuAqH3aipIE3tnlbssKtVuGkhieizFFjlXE0h7bzqilXO1MsiHQGsE1PktMdvq1po70GcXAbZtu3A1XphYUuMOmlE9TTH5xx5VIQhyoMekW/Z88geaowoEyhJIO3DYZOtytt22JkYOG2W7HNLqEAgdWAM5TdTRh1Yg0AiBMDTY+jbiF9TIJ5BO44s5s23b8gG2U5JYUju+QJP/CGhC+TqJ+GMkq+l/BPekRNsSe6pSFgK3EXi9fvUaY+jDa5df55PbjLmg4QBnKtsvwInISgTe7/fr9RuOymsjWvmVlKMZCDRAwO97bQjw/K8Bt6DCdwIH5nY+zP+O9e4SxJLu9gDtLxF4v99+K/l8/klXylDm9fpNyyzJJu8vAp7z4/EDw7/ocNEYgWMbER045wk3h0DSPIY31mFRJ4vAsfiRxjUrVxZlCg1BgEDSEG6cyIgDj/383E4sqf2+QiypfR/Nq2GYTTYueeR+rJcEpGA8hpFaFQiEvnr4soKqLTQR+DC0W3AKOqQEQtAz9Nv8S3p4ypacIQmkQ2ZIMzGqdwJpR82fz0PJ3lEMrz+xpOFd3LGB4c2jMLnokk3kMR/zdOsYN2rVIXD+VQVNET5RR/l7WwkvG/JS0r3uoPVA4Pxjaj+iLc02IEDmckgCbNuGdOtIRp18eTyd23kvqf3uQSypfR+h4Sc9VdpmlA+yznSOMGWzFz8Dk7plCaQ75tBdD1+W1bNBaenDwAaVRKVpCYRA5+GBHCqyfk3bo6YyPAwfnhNM5f3GjU33HmGWPnzZuOGoN0UsyeIOmb+nY2GLzMJ0oMoEbKqq3OiQzbEjGdKt4xlV/BWG8RB5i9IYHAF3z4d0IwRso3X4aJFWJJbUiGdR4zoC6Vn9uraQDIHDBIq/msT0ftgXdSpOEUvStiOnO2qyzilcx0m7Wgmv8Dyff0aKixFL2tUZ1gpz4FwjQ36zBAoePpu18bxixIjPM0RCZQKlDh6V1aY5CNQkoLOJnWh4I6kmfNo6RqDUs8BOz+PHoPVYi1hS9Jrm6+76rjRX7Mwnxlh4iCXF/nro2ncM/gLOIYRUuo3A9kQX+vbi5W2qX9xwSubiBhEPgWIEzgeLi6mCIAg0RiB9/teYgqgDgS0CJx8YdHce32Ix4j1iSdGr2o731XfDkcmCweM9oyaWFPvr/uvxesV+BtQYgYDm6jD7fb0cwfjEhvSwwddtCSQyOiCQ+Tc30mHegW2oCIH9BJjb9zOjRosEDs/tY7wM0aJLCulELCmC1Pmkr1jShtp+y9WXUdE3nw+xpJTJrhz1E/WKXdUpDIHWCKgn5yd6nwYXXRCG9mIZMiHQC4HQnzNHdy/WoScE8gmkYyG/LiUh0BqBtD/nTO+tWYE+ngCxJE/jf2n18r7OGxbujcb8e61XUfoy6l/1//t/885/16R2ElBPsLm79/6w03qKj0lAk3bOjuTx+Bmv2wcCPMQbs6NPZtWBh9iTEcLc8QnwUtL4Pp7Swr3T+5SQujGaWFJ0lTblI503/GoUDe7qmljSGXeFk/ZIPfwMFuqOQSD/g/zBer7WLA3wMRyKFRD4fD67fkcJYhAYjEB4/sdzgsH8O7k5+RGlwb7Zfz7/jGQRsaQ4kLUvXztv2E8R+X+jiL+vfUlLr3Ug2zP5dq18kcVjjGMGsaS/O9eOK3YkO2BRtFsCOVuTIjNqI4T8cwKb5NfWl0YURg0IHCOgvZk2M2mCzn+MLbXaJJD2+Tb1RCsInCGQ9vN0bvdH4zNtNVLXTB5mwSKWFPuV+nTacXUr7eVRyj/XG+VT4f7zOpPmD/+L8ndlSuddtVorbEhb06p9fThwtu8jNCxI4GtEqWBb94ryy8Tj8TNSmOxesLTeJoGNbdWQn6+26QW0qkCAbVsFyDTRDoHtbdviqbkd5fdqotE9xp6NWFLsANqphI4rx9t+RW8MrW1f/Bbfv5qkmE6QH2JJvvrj8RO13H+tdvdXbagGsaRjzpD3LTFMLPwYDWpNQmDjq7cxCGi10gAfwy6sgMAGgY2v3sbYl2/Yzq15CBQ/BcyDDkv7JeDP2trYWKJfoxY19wO895WLWFJ0sXbnIdajPh0r/PM9f8hUF1nsH7objvS+aWsu6BBayb/U4CwlML/psiWJJR3gqf5mnWqxTx4QSxUIdEFAs5/m8LUHAF2YIyVTu8KCopIkIDAkAW2Z/NAe0lKMmo1A2LYxt8/WASa3d4a5PbWx3xM6saQ4YOXd4NRdwR3tbIIQa2ytCeXvaisasHQtyYv6LNVoNM8MaVS5JtWS69Unm1QTpSBwLQH1/+Kz67V6r0sPQ7v3uX3dUO5AYJVAGAVFXuJebYwbEKhFICxYtZqlHQg0RGD4URAMtMuGHJCtCrGkiEpbk7A1Nx+HzFj5n+s1Cb6wOpDPVMXiP3ux2Jxvupe0IepF2xb0DE+3eCmpBaegwy0E/FjofSDwUtItXYhGGyQQxgJvcDToI1TKJxD68+PxQ5fOp0fJwQj4c3HOAbwv83U2D4nX67evUU8sKXY8ddzQa+Xprw7WiSWKdteLZdR0wcXDL0vBIqfObUlRvTpxm4UnGtbf9fO/t7UrrW4mvLuqUxgCgxHwI6Jr0zSiLdG1LSgPgfMENCKezz/npSEBAncR8IsU0/tdXqDddghoRFw6t3892p84zK1W9ad+LWFKPJ9/btFqVd31G8SSIhu5NkRe1JvttzY2HGz9YLvTS5pvXk0XfE9bDbX5HH7vbGXm7K0VXOmZF0lr5O9qyLtbEoLrfT5pCEAAAhCAAAQgAAEIQAACEChIYNcJTodrr8B5CV6a0rvEFjnV7hVCLCkS0wk/dV7addIyn89H7s9JeAlqOgQUoorZ117h7EpNFzRErakoR3tvflXSu1sSgut9PmkIQAACEIAABCAAAQhAAAIQKEjg/AnuvIRFc3aJ/Xr2vKIAsaRIVSf8Refprvd3eEfJ3/qa9s174T7/WNoHkoKGxwS2UMsQtaBJHR0OvIFFFQhAAAIQgAAEIAABCEAAAhD4SuCWY7I/9afhAr5xq3PQzm1FHsr5zkshmG3poQf4wtbcYijKF0vTXmZ6d1eOrMgxeZfkewvPFku6lzatQwACEIAABCAAAQhAAAIQgEBBAopOhAS/vV0QcjFRu2I08ujX5r1Y/2lSvoTQhBcYbu26LCVnV6N1CptpddqiFQhAAAIQgAAEIAABCEAAAhCAQEECChf4REH51URN8Y3brtiKPJrjA73+004syf/htlve2cvhdrgMsaTD6KgIAQhAAAIQgAAEIAABCEAAAjcS8KEJizwc+J7pRv1901PEknx4ZcNVmcU8Pt8VlL+YqbsbicMVJdNLGC+Q9Pl8zEDZSwICEIAABCAAAQhAAAIQgAAEINAFAb258nj89P5zNFPEkhSDMM+tBVkWXzLa7pE+dqOSPia1q38sSpPYrwmv/5qNX4U0XoBYUuMOQj0IQAACEIAABCAAAQhAAAIQSAkoULArSpDKaSRnlljS5/PxoRb7RXf54PX69XcXAzHP55/wTpO6gv/AzWT6qFBa0WJbaQfytaRbZsLrby2u/Wr9onWZrdxejFjS7S5AAQhAAAIQgAAEIAABCEAAAhDYS8AOs12fx73JE8WSQjjJv13m04uu9VEeX3jjRScf3EmrWI73RHh5KtzavtxWL7QeImLbklu7SyypNY+gDwQgAAEIQAACEIAABCAAAQh8JfB8/lmMNnyt2GaBuWJJn88nBFbC5ZqTNoI126GZID9chrq+lTVNFvN9xdBEehkaXRTYbCaxpGZdg2IQgAAEIAABCEAAAhCAAAQgMAmB6WJJ9vpPCL6ET94Wff9+v/2ncPYdWU5Y0YQrpqMP0NJWrIkcZUJdX3Ht0zbl5+gc5LdzSSypHV+gCQQgAAEIQAACEIAABCAAAQjMSWDGWNKcnh7DamJJY/gRKyAAAQhAAAIQgAAEIAABCECgXwLEkvr13YyaE0ua0evYDAEIQAACEIAABCAAAQhAAAItESCW1JI30OUbAWJJ3whxHwIQgAAEIAABCEAAAhCAAAQgcC0BYknX8kV6WQLEksryRBoEIAABCEAAAhCAAAQgAAEIQGAvAWJJe4lR/k4Cz+efx+On658PvxMfbUMAAhCAAAQgAAEIQAACEIAABE4TIJZ0GiECKhKwP4f3ev1WbJOmIAABCEAAAhCAAAQgAAEIQAACEPiPALGk/1iQapyAvZREOKlxN6EeBCAAAQhAAAIQgAAEIAABCIxNgFjS2P4dx7r3+21RJP3Ll27jeBdLIAABCEAAAhCAAAQgAAEIQKAfAsSS+vHV3JpaCOn5/OODSnMjwXoIQAACEIAABCAAAQhAAAIQgMANBIgl3QCdJvcS0Ndt9i6SLp/PP3tFUf4KAu/3+/X6tf9dIR+ZEIDALQRsUD8eP7e0TqMQgAAEIHAFAdu2sYu+gi0yITAVAWJJU7m7S2Nfr9/0N5L40q0pXy76qCkNUQYCEDhAQDPtgbpUgQAEIACBNglo29amemgFAQj0QoBYUi+emlRPrXbpwxO9nTQpmpbMlpv4E3stuQVdIHCWALGkswSpDwEIQKA9Atq2tacaGkEAAj0RIJbUk7cm1FUnmTRIoYUwvTUhqHtNxhf38qd1CFxEQDPwRfIRCwEIQAAC9Qlo21a/aVqEAARGIkAsaSRvjmaLlrr0pSQzlVeTDrjcU329fu0nqOxXURb/NJ5+MOXx+Hk+/4TInT65tzOnFdj44SS7pXaD/htqhJJcQgACnsD7/dZ8qAGoHzLzJS1ttxQqSoekCfEFNoanGgrzg29r8VaqGDkQgAAEICACfm7XHkxT7tq2LV0OJNBm8lBAq4aKKfG1rY26EkICAhAYlQCxpFE9271d/u+1LS6Wn89HZdaCTd1TKGqAokg6H1pCGANn5YfynvaazLUf65VML8SstJ1Nml+UAcIgMBoBjal0nNrwTMeUThGhip8Bwi1droWEJNML8bN0yB/NDdgDAQhAoDQBzauagfVUz3LCvLq2JfOrgBcV0mvqr23PpF5QY00O+RCAwHgEiCWN59NBLNIStW2PFs61E8529Xnuiufz+Uer/uv1q/wQ/dEB1YPV8zG/L/l8Pru8sFhYzUm3eVyDpRA4TEAD5/H40VBN3zny8m3I+3nAD+EwAHXS8BIW014TX0DN+UzSEIAABCCwTUDbM83tfq62ydlLWCu/OAlrJ+YlrKUXp3dlevXWJJAPAQiMSoBY0qie7dsuLXLhYLNo1eLyuVhy2kwt+SEGZEAE0POxzHSLIFG+sPyVlvfFlJYQ+dd2RbpUSRIQgMAGAQ3edOxolPlRqcxU5uKQz48lmUATonnGqusybZQcCEAAAhBICWiu3pjb/SNAlfcTvonVLd+Ktm0+cyMtIZrP2bZt4OIWBOYhQCxpHl93Y2m6Ym2rrvKPx0+66G7XneSuNg3pJsM/5vI0bJfgc5ROj5fb8lXRJ3TmlPu0QfHFSEMAAhsE0sHoC9tdP+ptqPocldcoVs7n89mW70taWsNZ7zAyLaeUyIEABCCwTWBxQlaVdGbOKe9n/u3yasgn/KMLbeF8AdIQgMCEBIglTej01k3WcpWvqBZF4hGL0NJtRyhmBZSpA6H9pGL4N3WQ+PudiqStJazRVNpaefIhAAFPQOPOZ/q0FfCjUgeAMKjtMswDB2JJik1rXPvWvW6kIQABCEBgjYDNxmvzZzr5+yk3nd7trpeWSljTxOezbfM0SEMAAp/Ph1gS3aAtArZQ+d/+yNTvcMVM+V0XE5w1K6yA7mqToYqLibS836no7lrCt7Kr4ppA8iEwFQGNoDWrrYAfXIsDOWR6abrlM7+mVct/gvG1FgUgAAEIQMAI2CzqZ29PJp38/ay7lvbSUgle/kZawr20jfLcggAExiZALGls/3ZmnV6HOXYCsRWOV5NSr2vtT29ZjhXQXW0yVHExkZbftbfw7ubjRMEkAYFMAhqna+WtgB+ViwM5ZHppuuUzv6b9E/KvhSkAAQhAAAKBgM29fvb2BdLJX3P1RsJLSyV4+RtpTe9s2zYocQsC8xAgljSPrzuwVEvgsSVKsQm/XnZg9vUqCuxaU1ZAd/duMlR+F3lpFVqXGiQgAIENAhp3a2WsgB+VNtZ8zlpdy9cg3S7m70qrvW15IaQhAAEIzExge/7UNCtEe+fqVIJEbSTUiiU2SnILAhCYhACxpEkc3YGZetZx5sUiCTkWjeoA0yEVt7GkWwpF5TJbk4T8M6qpZH+Y3DYlZ/yeqSfFIDASAY3TtXFnI8vftXHnc7aB6OSwXUx3pRK/vS0mJCAAAQjsJaA90mLFdGbWNm+xfJqpbVt6ay1HTWh6Z9u2xop8CMxDgFjSPL5u2lKtase+bvO2EZjwNCwtvIsLv/YHvmJ6CvV3Q1ryM8+o/sCpH+vl7z0FqlxC4CsBnSjS6LlGmR+VGqpfJVsByc8s788/UmBx2skUSDEIQAACExLQXL0xt/sNs8r7CX+Dm8pvlPG3wnyuy1Q9X4s0BCAwPAFiScO7uAMDtSYVOXJIWuaC2gGgEioqYBQgK99vSvbGd7QpCcLXFE8DVVJjrQr5EIBASkDTXQjFakimf8fARt+uoRqEp2pYThp4khrMxmvQyIcABCCwSED7Ih+v8XN+2LZpBvblFyXv3eMt/k1PqbfWBPkQgMAMBIglzeDl1m3UgpSz/uUYI4EcYIQr7D+057BTol2qsCWE8fH4eT7/6K/MpqdTv89Q4SDNLqVGepQ1HdL8RTlkQgACRsCPUz+ubcymo1Vj0AprXJucQFXBIBvX4ejiC0uNMI1LQsj3dUlDAAIQgEAgEOZqTe+a28OEHMprbrdJON0Pe4HpSuGVsek93Z5JAtO7x0UaAlMRIJY0lbtbNFYnjXSdO6OuVrgzQsarK9riY9jtMrVXxdJEKBwkr3lTctICkhAkcwkBCHwloJGlhJ48b4w1FVYiLaxblljURIM3nG2ssFVMJS+KIhMCEIAABEQgzMA2x2rKVTEl0vLKURlLSMj2FK1i6Ry+cSu0xSUEIDAqAWJJo3q2G7u0FJV9rKGH5Oni1w2aaxR9v9/2tMoDt53EYoN6tGWPrexyo6QV88J9YUnzmUqniukWCQhAYJtAOrhsdl2cAzUPPJ9/9Nbh4rC1kiq2qIOkbUhYVGNRGpkQgAAEICACmts1wWrnrDI+YeU1adulL6D06/WrYhKuu5bQ9B7y7VK6Ld4lEwIQGJ4AsaThXdyBga/X79oadkb7jeXzjNjx6m5vSsazF4sgMAmB7afNk0DATAhAAAKDEVh71WgwMzEHAhBonwCxpPZ9hIYQuJaAvcPFWwPXUkY6BOoS0G9n1G2W1iAAAQhA4EICmtvZtl1IGdEQgEAeAWJJeZwoBYHOCdhbyun7X/oYML3VucWoD4EpCCy+gKmXDdNfS50CCkZCAAIQ6JyAbduCEQokZf55zVCdSwhAAAJlCRBLKssTaRBolIDOlvb3mBRCsjelCSQ16jbUgsA3AvrYwX6qzF8SSPoGj/sQgAAEGiXgt232w0aa3pnbG/UZakFgPgLEkubzORZPScBvSrQdsQSvSU/ZIzB6EAJhOPvLQSzEDAhAAALzEdjYts0HA4shAIFGCRBLatQxqAWBKwjoL24owRtJV3BGJgRqEtBw9omaCtAWBCAAAQgUJ6C/ocbcXpwtAiEAgSIEiCUVwYgQCEAAAhCAAAQgAAEIQAACEIAABCAwBQFiSVO4GSMhAAEIQAACEIAABCAAAQhAAAIQgEARAsSSimBECAQgAAEIQAACEIAABCAAAQhAAAIQmIIAsaQp3IyREIAABCAAAQhAAAIQgAAEIAABCECgCAFiSUUwIgQCEIAABCAAAQhAAAIQgAAEIAABCExBgFjSFG7GSAhAAAIQgAAEIAABCEAAAhCAAAQgUIQAsaQiGBECAQhAAAIQgAAEIAABCEAAAhCAAASmIEAsaQo3YyQEIAABCEAAAhCAAAQgAAEIQAACEChCgFhSEYwIgQAEIAABCEAAAhCAAAQgAAEIQAACUxAgljSFmzESAhCAAAQgAAEIQAACEIAABCAAAQgUIUAsqQhGhEAAAhCAAAQgAAEIQAACEIAABCAAgSkIEEuaws0YCQEIQAACEIAABCAAAQhAAIYBUwQAAALrSURBVAIQgAAEihAgllQEI0IgAAEIQAACEIAABCAAAQhAAAIQgMAUBIglTeFmjIQABCAAAQhAAAIQgAAEIAABCEAAAkUIEEsqghEhEIAABCAAAQhAAAIQgAAEIAABCEBgCgLEkqZwM0ZCAAIQgAAEIAABCEAAAhCAAAQgAIEiBIglFcGIEAhAAAIQgAAEIAABCEAAAhCAAAQgMAUBYklTuBkjIQABCEAAAhCAAAQgAAEIQAACEIBAEQLEkopgRAgEIAABCEAAAhCAAAQgAAEIQAACEJiCALGkKdyMkRCAAAQgAAEIQAACEIAABCAAAQhAoAgBYklFMCIEAhCAAAQgAAEIQAACEIAABCAAAQhMQYBY0hRuxkgIQAACEIAABCAAAQhAAAIQgAAEIFCEALGkIhgRAgEIQAACEIAABCAAAQhAAAIQgAAEpiBALGkKN2MkBCAAAQhAAAIQgAAEIAABCEAAAhAoQoBYUhGMCIEABCAAAQhAAAIQgAAEIAABCEAAAlMQIJY0hZsxEgIQgAAEIAABCEAAAhCAAAQgAAEIFCFALKkIRoRAAAIQgAAEIAABCEAAAhCAAAQgAIEpCBBLmsLNGAkBCEAAAhCAAAQgAAEIQAACEIAABIoQIJZUBCNCIAABCEAAAhCAAAQgAAEIQAACEIDAFASIJU3hZoyEAAQgAAEIQAACEIAABCAAAQhAAAJFCBBLKoIRIRCAAAQgAAEIQAACEIDA/2/HjmkAAAAQhvl3jQm+1QAJ5YMAAQIECCQEfEmJmZUkQIAAAQIECBAgQIAAAQIECFwEfEkXRiEECBAgQIAAAQIECBAgQIAAgYSALykxs5IECBAgQIAAAQIECBAgQIAAgYuAL+nCKIQAAQIECBAgQIAAAQIECBAgkBDwJSVmVpIAAQIECBAgQIAAAQIECBAgcBHwJV0YhRAgQIAAAQIECBAgQIAAAQIEEgK+pMTMShIgQIAAAQIECBAgQIAAAQIELgIDlrMsW9aIGZsAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAABhkAAAK3CAIAAAAXt7nAAAAgAElEQVR4AeydC7Irqa5tXz9WuFd7NWu7We6WX9zSvbNU4pPkH8hxomIfDEJIAxKUyrTX//vyPwhAAAIQgAAEIAABCEAAAhCAAAQgAAEItBH4f21iSEEAAhCAAAQgAAEIQAACEIAABCAAAQhA4EsuiUUAAQhAAAIQgAAEIAABCEAAAhCAAAQg0EqAXFIrKeQgAAEIQAACEIAABCAAAQhAAAIQgAAEyCWxBiAAAQhAAAIQgAAEIAABCEAAAhCAAARaCZBLaiWFHAQgAAEIQAACEIAABCAAAQhAAAIQgAC5JNYABCAAAQhAAAIQgAAEIAABCEAAAhCAQCsBckmtpJCDAAQgAAEIQAACEIAABCAAAQhAAAIQIJfEGoAABCAAAQhAAAIQgAAEIAABCEAAAhBoJUAuqZUUchCAAAQgAAEIQAACEIAABCAAAQhAAALkklgDEIAABCAAAQhAAAIQgAAEIAABCEAAAq0EyCW1kkIOAhCAAAQgAAEIQAACEIAABCAAAQhAgFwSawACEIAABCAAAQhAAAIQgAAEIAABCECglQC5pFZSyEEAAhCAAAQgAAEIQAACEIAABCAAAQiQS2INQAACEIAABCAAAQhAAAIQgAAEIAABCLQSIJfUSgo5CEAAAhCAAAQgAAEIQAACEIAABCAAAXJJrAEIQAACEIAABCAAAQhAAAIQgAAEIACBVgLkklpJIQcBCEAAAhCAAAQgAAEIQAACEIAABCBALok1AAEIQAACEIAABCAAAQhAAAIQgAAEINBKgFxSKynkIAABCEAAAhCAAAQgAAEIQAACEIAABMglsQYgAIG9BN7vv/bfXkVH9zerPp/P0Yr/R9+pys8wGJ0QgAAEIAABCGwj8Pl8+jz3Zdg2v+q9TlVeH5pWCECgfwLkkvqfIyyEQO8EXq8f+683Q82q9/vvGYadqvwMg9EJAQhAAAIQgMA2Au/33z7PfRm2za96r1OV14emFQIQ6J8AuaT+5wgLIdA7AYuuXq+fywxtfNXo1LDvVOWXkWQgCEAAAhCAAAQWCSirctIDqtSAxlBHhqUa9tecqny/eWiAAATuJUAu6V7+jA6BGQhcmUtalcFZJbx2Jk5VvtYY5CEAAQhAAAIQOI+AsioX5JI0Vos7q4RbFHqZU5X7gShDAAIjEiCXNOKsYTME+iJALqmv+cAaCEAAAhCAAAQOJaCsCrmkQ7miDAIQGJgAuaSBJw/TIdAJAXJJnUwEZkAAAhCAAAQgcAYBcklnUEUnBCAwNAFySUNPH8ZDYBeB9hxQ/ftci3oUgbWYK+HsDzDVLQn6U+G0JnSxj96G0hPIiqqW7um4pjCtz9aY8Ov1UzLP/tJcxcisWiohAAEIQAACMxHQiVw5Ls3f+om5qEcCjfQq5/gqValwWlMySTZkIy4fSGQ1LHZPe5lti3NhHeVIyTwTkxnpcNRAAAKnEiCXdCpelEOgUwL+eK6cwVmx9McgSxrsT8mqVYVUg2HKDvf7+8dHM1KiQiUiMRkT+P39oy5WMM1hhko2pDZ75VKytrt1TG1LhzPJz+eTCr9eP0E+a0aQkc0UIAABCEAAAvMRyJ6YaczQeGJKLGhYG+pkrdI5HgIV/7E0QTLs+/1+Ph/fxcrp6V+yIbjmoy8/+trupja1LRuG2UByyrsT5LNmBBlvNmUIQOBwAuSSDkeKQgj0TkAn9Pv9V/+lp69yFl4mG5fopPee+6BBGiSZRjYa7vf3j+StbOGRVZoGL5OqkhkSVsEreb1+Uq+tUgaIVVYyfS1obffv92uO24iCoLBSvoQYMVjoxaREMqqpsPIaKEMAAhCAAARGJxCO/vf77+/vn3AO6nxcPDEVD/iEy9pQJytvmo12CAZklR80zIs3zFwOStKIwrp45eIQ+Ei5H3RtdxvIB0hmZzYMU1zk5W3uPASR9AGhZtxbSxkCEDiPALmk89iiGQKdElCoUbHPAoU0gZKNKhQTeIWlUVJhBQRpuOMVWrmkNpX8fr8aK9UsR3xoklUi84JkoyX17mkgpXguwJeeUB9sXjVxoS8fIQABCEAAAnMQ0ClfcWfViSmFPhgoRQIKP/zo0lA/x0tvA3lVviy1aUTh8zK+S7as8MO3SrmvzJbr3UMYppAm1HuDQ1YrDGqEU5nSjITufIQABA4hQC7pEIwogcBIBEoHsPehIpOe01bjv81uwUcpWgrKFX+kMYE3ycrp6KmMaky4ZIbGlXypYJI+fFSiKlRmNVS6p1GUNHueiq5KvmjcwFb1UtsC2feiDAEIQAACEBiOQD0OMXcWT0x/xCurosr6EEG5sieL5/jmXJIM85OlcbOtWUlfKa99ZbasgXyrumdHN0S+SUrqsUqFfKXJG0YZAhA4hAC5pEMwogQCIxGww1tfH8uabjLZpjQFY8I+92FnuY8PvKqQW5E9XqZUNuGS5tCrLtwSsvgXxcOgdeVmif2MQvDXmqy7hybjs01WWY+ulDCSKl/ImuEFKEMAAhCAAATmIFDPYpiPdrBm/U1DnVThqlBH3RfP8c25pKwjjc+i9DW0EJbI7JJyq9/W3fj74MqGW0y3VcgrtKsbTCsEIHAIAXJJh2BECQRGIqCDNj3FzQ2FDiZQ+lc+SyCtUVNasOhBY/lgQnrSguk5SjirLftrjtmfRkor7VeNFIN6r4PNakp9TFNCdWFpkFilEMxQXwoQgAAEIACBmQj4szj9pSSFH5UT0ydWJK9jtN7RWlPhFsIa6xDhkjbVB0f8oJLxlVZW07buSpkJkYIfX5OOK7EwbviY7UglBCBwLAFyScfyRBsExiCQRgDe7rQ1nND2UV3UmtaoKS1YrKCxFkMHU256jhJOtcmeksHBx2DJ2u4+TpVmxUmqkTGqyRYkVikEg7N6qIQABCAAAQhMQCCchv4ErJzXvpcgSF5KvFipnApLYaWgsSoyaloUzgqUDA5hSbavopSsEhmmbFHQKQFTLkRS62sk7AvZcUOll6cMAQicRIBc0klgUQuB3gmEv2Lr3yhW6GAvLZf+lYc6v0ON/+MaqRJ7zduPpe6Vgo21GGeYhkXhICBjwgPMNNzJRjx64St8f7DSvRRgmWHiYB9LwqlYSls1LW/XSyEFCEAAAhCAwNAEdLLbSapDUPU6H7MF+e7lrdIUtoQ6ihkWz3HTrLE0eqWwKJwK6I2tEE2F2KOUDNrZXb6YYd4GM8DXSNgXWsh7ecoQgMBJBMglnQQWtRAYhoCCDB3eqmn0wQ51HyE1RgM+TNHo9UHbNSt0q2g2bRZZ+kxQsCENd7LKLbryWTnTU+nuoflBzTDV2MeS8FoxyVOAAAQgAAEIPIGA//a6+bs21JG8gooNAcniOb7BNhlWmkcTUHAieaXV1DHEHj5Ik4yCpW3dpUfKxTMbWXl5lVeRVy8KEIDA4QTIJR2OFIUQGI+AJUHS4zwNFLK+pZmOELhke6ky7a6mtLAqgKgLK5yyUfTRc/BNoT5VntYsdi+FlabKu19S7mUUhzVOXOjLRwhAAAIQgMCsBJQEkYN2sDaemGmQsCrUSbvLjLQg4bQprVkUDvGDfcyGH9bkh0iVpzWSb+ku4WwuqaI87ajsmG+iDAEIXEmAXNKVtBkLAp0SSHNJpVdssg6kcYkitpB/yXa3sV6vn5awwMZqUavESvYXstUqVYpgVCNrs4OmlWmNacjWW2U2mJNtMkB/h+X1+qlHvasmzuunDAEIQAACEJiYgCIT+bjqxEyDBClMwwYNoYKEF89xJVlKEYJ0WkGGZTWrVb1K4UcqmbUkK5aVLFXKElPl6YlSPSCUWD0i0kAUIACBkwiQSzoJLGoh0C+B7I8BhRBE57T9EIA/rd/vv/6jEh8h6PEZIh8oWGzhNWgsSydJ2H7RyUv6lIqZIeEsbguYFCyaKv+iu7fZm6FB3++/ciSMlWaIJKnufqxsd2+Ad8GU+xpvnp8C+30HSUos/GZTil1dKEAAAhCAAAQmI5AejgoG5Gk4MXV2Z09M5VD8aa5zv+XMlQZ7xKXhgqn2B2EVwGRjIbmgfI0skXlhOHVRvc/XqDKEJapXdw9NlRJb7K4uslwGW5Mc8UhTCBLzEZGhCwr9iJQhAIFjCZBLOpYn2iDQOwEFARam6N/06C1Jpi8QSUlwXie9BFTwEYz18oGIxNKxUqvCoP6j6VG84tWaZkVyFRssmpEq6bcazy21TdmxUvcQdQXl+mgFn5kKvnhHsmaYfIo9DMFHCEAAAhCAwAQEshFIeJbmszbhVE3DD0Up/tz3j7gWNdhwWcPC87xUbRjUT5AZZgJZ5WnfrJiCBy8vr/2I9e4+sMl2lypvuSpLMVs6I1kzbBZ8UOQ1U4YABI4lQC7pWJ5og8AABHS0K+7xcUNwQDK+UJIJ9fbRd1Q5K+lfcapIBvtLqqTNBEIvH+t4DVkxVXpJszCgk6S3X5Vp95IZ1t3LqyxtGiLYYJJq9QUpoQABCEAAAhCYm4A//qxc8jeVTE9nHb77z1yp0riLOrMC5o5pk4B0WkH1wfesWNpFprZ39+hK3bOW14fwaiUp/d6dksvqRQECEDiKALmko0iiBwLjEVh13K4STll8/vlfWp+taXmgtM2eRjMaxbLGX/aKdQsBey28ZCf1EIAABCAAgbkJtEQUItBysEo4LawNHhaHW6tQJi1qNslGMakNhZ3dg7bSx5YZDN90K6miHgIQOJYAuaRjeaINAhCAAAQgAAEIQAACEIAABCAAAQjMTIBc0syzi28QgAAEIAABCEAAAhCAAAQgAAEIQOBYAuSSjuWJNghAAAIQgAAEIAABCEAAAhCAAAQgMDMBckkzzy6+QQACEIAABCAAAQhAAAIQgAAEIACBYwmQSzqWJ9ogAAEIQAACEIAABCAAAQhAAAIQgMDMBMglzTy7+AYBCEAAAhCAAAQgAAEIQAACEIAABI4lQC7pWJ5ogwAEIAABCEAAAhCAAAQgAAEIQAACMxMglzTz7OIbBCAAAQhAAAIQgAAEIAABCEAAAhA4lgC5pGN5og0CEIAABCAAAQhAAAIQgAAEIAABCMxMgFzSzLOLbxCAAAQgAAEIQAACEIAABCAAAQhA4FgC5JKO5Yk2CEAAAhCAAAQgAAEIQAACEIAABCAwMwFySTPPLr5BAAIQgAAEIAABCEAAAhCAAAQgAIFjCZBLOpYn2iAAAQhAAAIQgAAEIAABCEAAAhCAwMwEyCXNPLv4BoE6gff77+/vn9fr5/X6+f39UxemFQIQgAAEIAABCIxF4PP5vN9/LdR5vX4+n89Y9mMtBCAAgW4JkEvqdmowDALnElBcRS7pXNBohwAEIAABCEDgDgI+i2TRDrmkO+aBMSEAgTkJkEuac17xCgJ1AryOVOczXCvB8XBThsEQgAAEIHAqgc/no8dmnJKnor5MOfN4GWoGgkALAXJJLZSQgcBsBBRdzebY8/zRQ9fnuY7HEIAABCAAgSIBzscimgEbLHB9v/8OaDsmQ2BaAuSSpp1aHINAhYAdyRUBmkYhQKw8ykxhJwQgAAEIXEnAzkeyD1cyP28scknnsUUzBDYTIJe0GR0dITAqAbIPo85czm5mM0eFOghAAAIQeDoBsg8zrQBmc6bZxJdpCJBLmmYqcQQCrQTasw8mmeqVhtfrJ20t1VgckO2yOUSQzqza1JJGyxvFNHo60FE1sqSkcFHg+/22yJT0Uw8BCEAAAhAYkUB7aGGSqY865dtfbtKBm+1SGigd2tfIjMZQ5/v9qkvWDFMuU+tqpcqbdHjZRqlYuyggrytKDjcbhRB4OAFySQ9fALj/OAKKCXxB566O6s/no9/n9oz8L1lKw+/vn/TXEBWj+FyGupi8H8Wafn//+OFK5bSjLC91kT2y4fX6SYdrFBMcr00YZYO0qUYFNfleqvx+vynqYK0fOpTTUbyAWilAAAIQgAAE5iOgw9SffcqYqDXEJ55D4ynv8xdpZKJTWyPKnjRq8qNbOVVo3X3YEHqVuoThUnuyEdEGCMEe8RF8E/COpKMEawUtFMTh8/lkPUqNoQYCEDiWALmkY3miDQK9E3i//+rYfr//2n86tnW6S8Yf/6r8/f2jvjradagbAp3rVrAu0vB6/ShXYqrUpNirgtJ0yobgVOiogSxUUi8zScKNYrLz9fqRKkEIxguCRlFBTZ6bKs0Ycc7qD9xkjBRKm/QYKNlAAQIQgAAEIDAfAZ9c8CegearD0Z/7inZ8pQ5Wf/QrZDJtCpxUkH5FHSr4pqAnnQUTlg31UCfkxXwvuRYeU3kyVpYN3l+pyoYiAYI0qKBeqlGCSR6lQ3g41mp6vM2S0RDSE9zxQ1OGAAQOJEAu6UCYqILAGAQUyqTm6jy2XI8XUHSlw1utijmUxQgxje+i0dOHYGry8hplsZA1Q2anHnmFa8VCzsjHZ1kIfiwry9msfGqtvAtwpCcdQrOZNlEDAQhAAAIQmJuAHYL+kDV/dW6mccj3+7XTtnLK+9SM0iKpKp3a6YFuhqVDtEyH1Aa/VF9Re1KoIwjBJHMnG4qoMlgrC0N9ZQjNZnb0FqTIQAACmwmQS9qMjo4QGJWAzt3UAZ3u6ZFsTWm9T6P4AEujpAGBmkJapBIrpKamNQpBvJGKrtKxvIZGMfHxfVWWEtXIU9WooCZvrSpTaCU46iLNKlSmTDIUIAABCEAAAlMSKB2COjd90GIE1JQFolPeH9wKDNIww5rSA70+SnZoVWZDHVWmY6mj0mRpbsvLKNhI4ZiYIPheJdQlbRVoJTilISSf8vcWUoYABM4gQC7pDKrohEDXBHTuplbqdA9NClNKR3XaUaP4kMvUqimMoreZ0i6pZKjxr0D77qXgI3RvERMEr9/rSf1KaySvJq8tW6kuWSPVRWIqaFL8EGqlAAEIQAACEJiYQPbQVKRhX1QP7luipJSR0YHrT1UdtUGV0iheWDLWSx8bC6VQR4aVgjTTXwLiR98Q6rR4GjJTFWjyxVtVGULy2d/uDEr4CAEIHEuAXNKxPNEGgQEI6NxNbS2d7pUupkQCipnSGg2nJtWoYE1SovpsQXpkdoiTJJDtrsoDxdoN0KDe2WxlsNPL+5hYYiooIgxWSYACBCAAAQhAYFYCpbOvctSWugiRCfjMSFoThMOpba3WS5KVgqzVQFbwatXUoqciUw8q1LFkgDcpCHtiSgyFytBFH62QDioBvSpl3zSsJ9TUiwIEILCfALmk/QzRAIHBCCguSe0uhSOVLqZEAook0hoNpybVqGBNUqL6tCBT04K6VwbyCg8UC7FORbOaZK2P4XylTLUuoUl6JOYLahUl30oZAhCAAAQgMCuBcCLLTZ2M4TxVjiOtV9/0ME1rgnBWm/WSZKkg5WnBq1VrSY8PMCoyjWI2XGqAr9EoWduylaGLPlohHdQLSGFdzHehDAEI7CdALmk/QzRAYDACiqJSu3UYh6ZKF5OUgCKJtEY61aQaFaxJSlQfCnoG9X7/9Q+gQgxRGcgrPFCs3QAN6p3NVspUa/XyjWGf1KY/DirlFCAAAQhAAAIzEQgnslzTmRjO095ySY2hjswuveZjjstrccgWWsRSsGmNlFtTsC1bGbrooxUqQ5jA5/MRsewXGINCPkIAAvsJkEvazxANEBiMQCVQKJ3ulS7mvM5vZXbUJY3V1JSCs6a0i5fUV7c0llpDqFEZSF0a0zEtYqlhFQPU5J3NVspUa/XyLVaF7oZIlRQgAAEIQAACUxIIIYF8rBy1pS7WV6e8/0El6xJyJSZf0WZNMiktaKzFUOfiXFLWsEVPA58KNLkTmFSG8JI+oxTiJS9GGQIQOIQAuaRDMKIEAiMRUBSVGl053euneNpRo6RnuZpSA6wp7eIlK91TI1PDvCqVDxFLDUtrNKKavLPZytDFy6/KJfm/4SKdFCAAAQhAAAJTEkhDAnOzctSqKQtErf4grsQPJQNK6RI/qMbylVZO1UrYG1bqGNI6a8U0lu+YmqTWLJ9sZeiij1aoDBEkle2q0wi9+AgBCGwgQC5pAzS6QGBsAtk4wFyqnO7pm0eioCZ/bGsUX2ld1CQNKlhT2kUCleyJ1Pruss0/RfTarLxfLBu7ZCu/36/qw2vYWRdkbRaOukisUpCbFRmaIAABCEAAAhMQKGUfdG76aMH81emcxgxqCrmYSuBUMmBPLilrvLctfY9JU6kYIPVOMv6xUyqmgQI6afZ6vKp2aCU4FZhh0JKRQYyPEIDAfgLkkvYzRAMEBiOgQCS1uxIS6Wx+vX58pKIAIgQWGiXUV5JBakq7eFNliY9yNFzIzkjYfipImu0P68qRbWKySqN7k6xVSG3oz+djwllu0iM7NUQJjiz//f1jvx4lp8Lfx60r9wNRhgAEIAABCIxOoJR9qJ+GOp39ga6jNoRASnyEXImhKxmgXhXCGtGbIctDqBOyNv6nJC3asYGkc1VEJCM1ujfJWn2TBTDv918jKZ7SI/ez0NTq5b2D5p3CJO+gPavTiAqHgio+QgACRxEgl3QUSfRAYBgCOvJTi5X4SJvC2zSStEJ6YGsUnffSqSbVqGBNaRcJWEGBgjfDB0leXukbL2xlHw+1i6V6Um0ywFuljjauffTOioyvlKoSnEDD+mbHTaNPKacAAQhAAAIQmIlAesiad/Wj1qctdGpbwccMAiUZ1ahQMqCULlFHK4TD3bT5wz3IK30jk1RQkHZSqFOC5ofz1sowX6myteqjFbzjXiBLyZ6uBQ18hAAEDidALulwpCiEQO8EFEWlhtZPd5OXjAqpHr1Ek01eVAwopUvSITS6FSyBospUXqGbZOoPxOpickFi2eyPmZEKW7319R0l6SvlSwWOzPDApU2tWbXSTwECEIAABCAwDYH0kDXXdDhWzkTJLB6gEki5lQxQQJJ2CTVS7lWpMgjbx0bLpUSFVFujKnWUKisYXimRmNyvh2Fe3spSZfolEMYtqZU8BQhA4CgC5JKOIokeCDyOQCUIu4yFf5G7cVA9navLN4q1Q2hUWLeq0mpP/7ICZw+dHZRKCEAAAhCAwOgEPv/8714vNoQ69i75otmN4UF7qGOPEhfH3SNQodHozp7R6QsBCHgC5JI8DcoQgAAEIAABCEAAAhCAAAQgAAEIQAACNQLkkmp0aIMABCAAAQhAAAIQgAAEIAABCEAAAhDwBMgleRqUIQABCEAAAhCAAAQgAAEIQAACEIAABGoEyCXV6NAGAQhAAAIQgAAEIAABCEAAAhCAAAQg4AmQS/I0KEMAAhCAAAQgAAEIQAACEIAABCAAAQjUCJBLqtGhDQIQgAAEIAABCEAAAhCAAAQgAAEIQMATIJfkaVCGAAQgAAEIQAACEIAABCAAAQhAAAIQqBEgl1SjQxsEIAABCEAAAhCAAAQgAAEIQAACEICAJ0AuydOgDAEIQAACEIAABCAAAQhAAAIQgAAEIFAjQC6pRoc2CEAAAhCAAAQgAAEIQAACEIAABCAAAU+AXJKnQRkCEIAABCAAAQhAAAIQgAAEIAABCECgRoBcUo0ObRCAAAQgAAEIQAACEIAABCAAAQhMT+Dzz/+md/MoB8klHUUSPRCAAAQgAAEIQAACEIAABCAAAQiMR+D9/vt6/bxeP+/33/Gsv8Nickl3UGdMCAxO4P3+a/8N7sey+c/xdJkFEhCAAAQgAIHHEPh8PhYDfD6f6Z1+jqfTTyUO7iHw+/vHckm/v3/26HlOX3JJz5lrPIXAYQRsn329fg7TeImiz+fz+/tn1aOGQT29BCeDQAACEIAABKYlMO4bCu/339/fP6tSYLe8i/GobN2018k4jtl6q98IKOwnl9Q4seSSGkEhBgEI/EtAW+2/VSOU9LSh3di7PLW0l43ebi2SEIAABCAAAQgcQmDQXNLn87HgYcOTs1VdNkP2EY6iLPtW0ar812YD6PhMAi1XtC3OtanYZ/I0r8klPXn28R0CGwno7N/Y/6ZudoqsetRwvac66q4f+qZpYVgIQAACEIBAdwR0HF+TYTnQf4sfVuVlrMs1niq8sTdExNnqD+SAKgh4Alpp16xzP/TEZXJJE08urkHgLAKKA84aoBu913tqI9ojEeKqbhYChkAAAhCAwLMIPOrO0+KNa+6xsy996M3xa2x41lLG238IPOqKvmzOySVdhpqBthPQ7x+rsF0XPY8gcH2G5Qirt+i43lMfRZFL2jJn9IEABCAAAQjsJvCoO88rc0mlmbk+4ipZQv1kBOz+UflKvRCX/uR86Te8VC8y/teX3u+/6WuA6pKOIiVpQbe6KqSa01431pBLuhE+Qy8T0LmSLfi77mVdSBxHQNMhlVbTOCOrhC2Y00AqnBHkyS85ohqNe2XBRr9yRMaCAAQgAAEIQOD7/aZhhmpa+KwS/n6/pT9DfkYckuq0GgU/LQ4eLpNadfgQKHwmAS2tbMEve122vtLvBgZQYl6h7+LrVV6EL8lQWOx4owC5pBvhM3SNQPYqDZdW6dyt6X18mzH0+50hqf9YY+ilifh+v0rzq7KUQc/OaSpser7fr/91Rj9vjXp8FyurY6VJXtjPKulj2uWCGqG4YCyGgAAEIAABCMxBoHLcK2hJw4/QSx/tpQPFA1Yo/faiD13UJRWWcn+b6mOzRj3Z+bJxvTYTy+o0DqUuWf0nVQrXSfpR+1gCWlrZgr9SdGH6Sn+R2u1JVs/r9WNXkzaZVCzddjQplV6v10+6h6jjvQVySffyZ/Q8AX85pW8GWo2uz+z3rvN6qXXP2QIM7Z6v10+pSfUevmX0wqSke6XmVC9tqiYIm/KQpdLQ6rWoR11UkI+qsYJ0Bl98fehyzUehuGY4RoEABCAAAQjMQcAO0HBDaK//lJrs0FcXxQxWr+/FKDZI7+70WC6EE+mtoJSHLgZflRpU8umg6XxlHZROM8aCKLmc7ZJqPrXGbEij0FMHRfkTCPjV7te/1fvbEF1o2geMj6/XxfL553/aEEyzPloO2r7pprVdWt6hlyZF42qBDwIAACAASURBVCpRpaZOCuSSOpkIzPiXgC6nxSSRv8DCNf+vOkr/JaBg4r/V/3m9KMC0HdCHL9oTfaVP1Yd6m6lQGdL8skfK031zlR4pVEELRjXeBn+WeF/MHt8llL3Bi+XANqgKHxeHDvJ8hAAEIAABCEBAj6PCmasQKHu8WqWCAcUMaTSiSFXCxjxo0ERYvb+N9MrT6KiuJzilUVSw7kHMKtOx5Ev9ZX9vsNypFGRMY0FTE8xu7I4YBBYJaA1X1lhJRvW25sOFH1rTq8wLpKOrNW3y9yl+A1l09jIBckmXoWagZQI6SOrnmVfku4QL24tR9gRsHwwbljG3kMI3ZTc4RQ8pc8mnI6bCekLoR5RyX2nasjv4YpMsqdiW7vvt27cMbimkTsm8tGAK03pqIAABCEAAAhCoEMie+Fap0NF31wmuSmnIRggm7890k88KS5UCIdWk94emuaIn2ySzs5GVhpMBqXw99pYGgaoXvP6WslJaWQtbNCADgToBrWF/2YYuJRnVly4TLxB02kddL+nolUt+sW92rCsrySVdSZuxFgjoIEkvs0pPxQTpeVzp9eQm2+88ZNVoKxSftEZhShZ4RV46fUGTrkrttqpRwZr00RfSLJhvtXJqmxZPKXapGJPqP7ym4u/hY6EQAhCAAAQgMBOB9AxVjRV8IJTWKGbwYuJTks8KK9hQa0V5qlmDSo9qsoVUg8VIlSRU2iWr+aRK+VWx8KShUfscApWLThBKMqrP3vv4x8+lNVzSoMWvzUHGqKC+FRkJX1wgl3QxcIYrEtB1UroIiz3dzz93eI1VzL6rSahlgAUZ/otdyq1YeBEmxSpL+6m1SrmGU69sQfJqVY0VVF8p1BeALJHmtEZNYdBQf81H8/SasRgFAhCAAAQgMBMBO0MVGNg9m32001+xjYIBBT/+5lAaPBzr4psqwYmaJK8RVWPKVa8u2YK3JC1bF685rQm9FgWC/IEfW+6lDxwOVY8loIvLXxqBRklG9aV7HwmUlEsgaFC9fgc2W7jxCg2IwkdySQEIH28j4K+lDUbYNRauzw16HtLFcMlZ/zHsVuGjdbHKEm2vzUdj6pUtBGNS5dleobK0g5tyrTGNldaoyQrSH+qv+WijXzMWo0AAAhCAAARmImBHvAKD8NGfsNlgQJXS4OEEbf6VbUUOaUGqSspVn/b1Nd6StGySGku2+ZrQK+0SBM77KL/OGwLNEPD3I5ULQRdgkFF9entibCUQOoq8BIIGX69roVKQwk4K5JI6mQjM+Oqy2cZiZ/dtg47by3DZfuef1GmrtYd12uD8kzoFJWE3FA1Tro9Skk20q1LypalUvbqkhWCndFpBlqg+rVGTFTRoqL/mYyB5zaCMAgEIQAACEJiAgB3xevlIr2Cba/bRwgY7bSVpAooQsjeH1uqbpCQNTlSjKKWkXPX+L7ipuwr12TFLUtt8TdCQdgkCJ320WUh/3fyk4VD7ZAK6uCoXQklG9aV7HwmUlEsgaPD1dhlW/i0pv3FaySXdCJ+h/0Ng/zG2X8N/DJr6g3YuJY8U3yhVpKaw60kgrTdmNhHi58dSZaWgPTTIlOqDWOVjaklaE7q3DCqZlsKqY8AUBpP4CAEIQAACEIBACwF/jNpf7FYvCwDsUDaxcEArQgj1psF3t5qsEg0XCiXlpfrQvf4xtSStCRoWBWSYSS7+G/RnP5JIymKh8iQCWsPZK9oGLcmovnTvI4GScgkEDapXprhS8DdrJ1Faq5Zc0lpiyJ9CQBfSHu2LB+Ee5ZP11bfTVfAO2nRUJkUxhO+lsrXqo3JPjTtgRbk1NerxBlg565HpzG79ghP2/aC5sumnTauMT0mGofkIAQhAAAIQgECJgGUr7CxO/wCTAoDsaauYIRshKFLS0FYTXm5SayhUlJsxjXqCWvsov9Sq4VTjC2rNemqSn88nDWkqNV5/Wvbx1aq4KFVFDQQaCbSs85KM6kt3BBIoXUQSCBpUP+iFQC6pcfkhdi4BXUh7hjElpWt4j+Yp+yrUSKMrkQwP8cTB+obdMLTq4/f/fhy9MTCqKLegsFGPN8DK2WWmx2KpvJpKnqZdjq0xFMfqRBsEIAABCEDgIQR07lsheF0JhPyr2dnAUpGSdCo/0nJP6A2TBiuoqUVP6Gsf5ZdaZVvqi5rSaFDdjy34ETf7eKxJaHsCAV1Z6VUg90syqi/dEUigpFwCQYPqSx1lW58Fckl9zsvjrNKFtMdzUzLopbjH8W19xTz7NXUldLI81Zod2lp9k+IG+/6/Dx3e77/+o15iClutaQt6/BCpHt9qZbnsm6TToigz5v3+6xNJWWO8kpPKKcmTBkItBCAAAQhAYEoCiljSB1GKCrKnvFqzgZC1hiZFDvbCjnjaSz36uJio8np8jJTq8TpVNpdLtilnZNrER/XSc0bBB12l34TyLp9hAzqfSaB+RRuTkozqs3vF4hXtBVINugZHnBdySSPO2oQ26xLd41v27NyjcO6+Yp5uanqTKNtUT/eoNdDz0YM2TSuE8E6tQYN9bNeTdpfLoamk09eHLtd8NBTXjMUoEIAABCAAgfkIKKgIuZXv96tTPm3y936V1rRJaSCNq4IXVkDiKz38ip7FVIuNmGrO6rQYrNTFm3RIWTQqhdTyQ4ZGycMJ6Hov3d1UrnpdsKW+EiitXgmkGnRhhhuiIeaLXNIQ0/QII+1Q2ePqZQfhHiO76lshpi0va7AigEprpUndrRAk1Rrq/UfJ+IIXyJYbnQpWhY9ZzSdV3jj0SR6hFgIQgAAEIHAlgZajP3v7p46V1kqTj0/SV37qyo2PZLyq7IiBp8lnJYNOyVi9PgaFB370vpTKF5hxoEeoGoiAllzJZl0gYRGqPs0EmSoJhI4aSAJZDTIs26ohpK2fArmkfubi6ZboKtoGQpfotu70uphAaatdZUbjy96rdB5i2KoREYYABCAAAQhAYD4Cn3/+t9+vlm/xrxrlKMNWDYowBG4noJtN+0FY+0ULb5VuJ8PtgOpLuR4JhI5SLoGsBr2aZBaGr39aZUmzhrilQC7pFuwMmiGgq2jDpdLy1mJmSKogAAEIQAACEIAABCAAAQhAYHYC/oZReSXvtDI+4W5U9dlMUOXLcVLerkGGhUKf34Ajl6QppnAzAX95rzVlTx5q7VjIQwACEIAABCAAAQhAAAIQgMBYBPxPztvrP95+a03fBFR9yDGprwRKP2cmgZIGU2U/268bW72gVFIrA+4qkEu6izzjZgj4KyfTXKja1qugjGoIQAACEIAABCAAAQhAAAIQgAAEagTIJdXo0HY9Ab3O1/ginxJJ2T9sf739jAgBCEAAAhCAAAQgAAEIQAACEJibALmkued3SO+UTip9JVVetUuqCwUIQAACEIAABCAAAQhAAAIQgAAE9hAgl7SHHn1PIeB/OMn+imr4Zql945Q3kk6hj1IIQAACEIAABCAAAQhAAAIQgECVALmkKh4a7yPgU0X+/aNQ/v390+2vkd0Hj5EhAAEIQAACEIAABCAAAQhAAAJnESCXdBZZ9O4nYO8fheSRPqa/sb9/RDRAAAIQgAAEIAABCEAAAhCAQA8E/K1fD/ZggydALsnTuK78fv+1CyN8e+s6CwYcyYgNaDgmQwACEIAABCAAAQhAAAIQgMA6AuSS1vG6Vppc0mG8tdBb/gBZJZdkTXx1K50YckkpE2ogAAEIQAACEIAABCAAAQhMSUC32LyB0eH8kks6ZlK0yhvzHaVckv/Z6Zac1DHWD6Klke0g3mAmBCAAAQhAAAIQgAAEIAABCBQJ6C6bXFKR0X0N5JKOYa9VboXFtV7KJamevEk6MTBJmVADAQhAAAIQgAAEIAABCEBgSgK6y168v57S/c6dIpd0wAQpAaQ/Pba41tUlSPr3kkLTAYYOroJc0uATiPkQgAAEIAABCEAAAhCAAARaCZBLaiV1hxy5pAOo+xSSlntdbymXZL34C2VZeuSSsliohAAEIAABCEAAAhCAAAQgMB8B3VzzmkWHk0su6YBJ0RL3f8P+8/lUVNdzSZWOT24il/Tk2cd3CEAAAhCAAAQgAAEIQOBRBHSjPWsuqZ406HyuySXtnSBlhV6vn+/3qy+p1Ze7etXF9ho3V39ySXPNJ95AAAIQgAAEIAABCEAAAhAoEpg+l/R+/x33D7iTSyou3MYG/wU366IVX9FQySWpeyXN9Pl8NK7krZBNbWo4Lzzc34kz4ytUaYIABCAAAQhAAAIQgAAEIACBOQjo7rVyazy6p+bjiA6SS9q79rS+lcRR4qayICoyUpjtXskiZVeh3pOS2lCQ2XtBnN/fLD9/HEaAAAQgAAEIQAACEIAABCAAgZsJ6NY1e2t8s3EHDe/fERnLTXJJu5aAUkL2BTfTla0Mw0gmXS71C0atKpjm8FHDqd5b+P1+VZ8aoL69Fczm3qzCHghAAAIQgAAEIAABCEAAAhA4nMCIN61rISgzYM4OdHtOLmntXP9HXhMfpnxx0Zc61rM8/iWjMKKZFSqV48x+nU2to7yaRC7pP4uPDxCAAAQgAAEIQAACEIAABOYlsHhbPYHr/h7f/B3lF5TIJe1aflrcQYvSNNkkzvf73ZZL0nAt2R+/KLPyEigZGZy6/aO5f7sZGAABCEAAAhCAAAQgAAEIQAACZxPQ/W94Z+LscS/Wr+yB/H29fvrPKJFL2r5OlItJV7ZSReGbZRpMAmlfLaDQVOkitb4geV8Zyhor1F/wUebJhpMKAeMFru0c4v3+y38QgAAEIAABCEAAAhCAAAQeTkB3iMPd0626JazfGnfrO7mkVbP8H2FNefatn/q6V990ZZQ6qj473H8s++eDydffOZIZafezazS0/DqpkBI+2zV778z2/cbJMpOsy0kcUAsBCEAAAhCAAAQgAAEIQGBEAtl7umyibcP9V9CzX0PW2tJN6Ofzabk1fr//rjKsNNyB9eSStsPURRgWX8gIZLM5Wi7pOvNqvXGq95WVsuRbCr2ty6xf5ki2qbfKyvzWTW2ZLGQgAAEIQAACEIAABCAAAQg8h0B61+x/N8ZzyEqWbsF017ZZg+/oy6UR0/qsDV6VL3d1204uKZ3Nphp9wc1PbamcatSKSde6lIQm1afasjWSbylkNfRWaY70ZtXh9rTMFzIQgAAEIAABCEAAAhCAAAQeQiDcGh9+C3a7wvo8/v7+6ZAAuaSNy0bJoPqsW2s68eqeNklhaFJ9o8WSbyk06rxXzBy514ahRw8rISywoV3DeAjsJKCrg+tiJ0m6QwACELiXgPbz0o+W3mseo0PgXgLD3U/pip47QlNyQP76Qre+k0vaeDnrt9azX3ALX3NLp1/LJW3SuglNqm+02OSDksa+fYqZR33aNopVWrfzLY9RpgA7eyOg3ZgdprepwR4IQAACGwjYZm7/dvVlkA2+0AUCxxLQjcCxak/Vpit6prvalJimRv5aoXOvySWlU9lUo2muSPtblCCmpnR9SHNoUn1QVfq4Vr6kp59686gfe0a0JP1uJmHWiPOIzYcQSC8HHmIfAhYlEIAABG4koBj79foJsfSNVjE0BG4n4LMVtxvTboBuaee+nOWmCkP4Sy6pfSX/K9k+x5IMd+w659JVoi6hSdd/qP/XrP+W1sr/t3ePn4xMj5YNZZPWnlbaUOZjLAQOIPD5fLRD6kLgruMAsqiAAAQgcDeB8JzgbnMYHwL3EwgXxVgBj+K0xlvg+3GvtyDcnWX/ctd6rVf0IJe0mrK/GkOGKNWllRFWf6n++/2WLhh1eb1+FscNP2vfIp8a31uNkenNqhHtCXfRA21YI9LG5t4I+L1U+60Vwkbdm+XYAwEIQAACLQT83j5HDNziNTIQyBLwt666NAYKeEa0OTsRlUrdmr3ff8fassglVaY13+TvQ/ISrtZfva76KyXplVy5YLTOGtNJLfIDrVcj4zFS3kxAy8wK6TrcrJmOEOiTQOldJH8tDLQf9gkZqyAAAQj0QEBh9ljvX/SADhsmI+BvRX3AM1DkL7MHsnntKjIfR4xCySWtnevie0MlRboA/PrQIZdeFZJPm9LtwP46oP+pb98rlQ+/FG5jlSzvrX4sa3ujF+xJ14Zfn0GYjxAYmkBLFontZegpxngIQAACnkAIcnwTZQg8h0C4EHSPOVaOVWb7m9yZJvH9/jvud0TIJa1eimsXdDZtlK00Uxb1SyBbCJeZBsoKW+VqBDd1GMvamyCtGDYsibByVihCFAIdE2jZA3UtdOwHpkEAAhCAwAoC2tiJHldQQ3QuAuEq8B8HCvtl9kA2z7WOat6QS6rRSdv8bUnamq1RF59xVGV6VSxeMPVn7Nm3SzSclKsw0NcyzeYsZCo3EEgfVmQXzwbNdIFADwTsOY/2usWC36J7sB8bIAABCEBgMwH/Ow/8jc7NGOk4LoFwCYQoKL0D7dZTWT6Qzd3CPNwwckmHI71U4efzsa+tNY6q77iNmDWwraTRU8RaCIQkI/fSLdCQ6Z9AWNiKQuoFYpT+ZxYLIQABCDQSCAcBO3wjN8TmIFBPJL1ePwPF/AreuIo7XJzkkjqcFEzKEyCXlOeyrza8ncQ2vQ8nve8kYLl1xRxrCyz+OyePsSEAAQgcTcCfAgPdOR+NAX3PIhACe38VhPIoXGQ2cVqHU0YuqcNJwaQ8AdtK8m3U7iAQnl2wU+9gSdcbCOxMISlGGfFtzRtwMyQEIACBQQiE8GYQqzETAtsJtCeSBvrip+I07lC2r4zTepJLOg0tio8mQC7paKL/6tM2bQU263/RUOqYwNpfRArrPHzs2FFMgwAEIACB1QT4mttqZHQYmcCqRBK5pJGnuiPbySV1NBmYUidgN351GVq3EUiPH97R2EaSXmcTODZ/5NNJZ1uOfghAAAIQuJiA3+T5mtvF8BnuSgIhc+pXfqk8ypNj2T+KwVfO++1jkUu6fQowoJWAbSWt0sitJKCd2grs1yv5IX4RgbBQD/x4kQMMAwEIQAACVxEIN9hXDcs4ELiUQFjn7aHRpVZuHUzucG+yFeGJ/cglnQgX1QcS0C7JY6UDqXpVvJrkaVDunID9ScrwWxiKNrYVOncZ8yAAAQhAYC0BRY92LvDO9VqAyPdPICzyVSFQ/95hYecEyCV1PkGY9z8EQpqDUOCkZRHuzEnbncQZtccSsLzSquApFeZh17GTgjYIQAACnRDwGz5bfSeTghmHEPh8PiF096u9pXyIGSh5MgFySU+e/WF810apwjCmj2aoCNsJRNQ12gQ+3V77m25hGbeEUyz1py8d/IcABCYlEE6ESb3ErccRCA/aW0KdVIbg53Hr5miHySUdTRR9RxPQxvf553/+49FDoS++AvZ6/fAWGMtiUAKr3lcinBp0ljEbAhCAQJ1A+AYQUU0dF61DEAgZUt0crS0Q/Awx3T0bSS6p59nBtq/2Sn3fSjGBasB0OIFwFB2uH4UQuIaANpCwpNOPhFPXzAijQAACELiegN/ziR6v58+IBxI45HUkXREEPwdOzTNVkUt65ryP4bXfLr3Fuj9kB/RYDix78nbe8BzvQLyouoaA8s6KmSoFNpNrJoVRIAABCFxPIBwH1xvAiBDYTyANzitRTXvTfsPQ8GQC5JKePPu9+659MNzm+Zigdx+GtU/wrRCmYFi3MPwpBPwuoTUcVrX/yAp/ysrATwhA4JEE2PAfOe3zOJ1GNX5J7ynPwwhP7iBALukO6ozZQMBvmqm4WrkDTOEcUpM+/eDVpEPAouQaAnp70QIs2ygqwdY1VjEKBCAAAQjcQsAfCoSOt0wBg+4hYD8B2f6vX/CV4IffRd0zKfT9fr/kklgGPRJQIqPytXbtkuQ4TppCEbZDqDIXJxmAWghsI1BautpY0rhq20D0ggAEIACBIQjoGaTt/0PYjJEQ2EwgjXNKNaRWN0OmI7kk1kCnBHQrWM8T2bZIjuO8WdREgPo8yGg+lkCaMArbSDacOtYGtEEAAhCAQG8E/ObP/XNvs4M9BxIImdPP5xPiea6FlPb7/ff39w87Q0qmXsN7SXU+tN5AQDvg4vWsm0bSSSfNkwjr1Am35SeNi1oIbCagtWqFdBtJV/Xr9bN5ODpCAAIQgMAQBMLt9BA2YyQENhDwgZBukXR75VutvGGIybr4yDDrGrc/WSy8l1TCQv1tBLTTae+rm6LIIL1jrHektZGAZkRnT2NHxCBwPQFtCLZcS9tIECOXdP1MMSIEIACBiwn428XX64e48WL+DHcNgRC3+3UeLgEF9iRKvt9vKW60eo/xmnkcZRTeSxplph5hp9/j2vc1bYVc5yetknAsle7PTxodtRBoJOA3ENsWKtuI9g0rNA6BGAQgAAEIjEvA7/wEM+POI5ZXCISnZalkECCvmiLyNbZpcI/pmfgyuSRPg/LNBHTGr7pifabjZgfmHV5TY4V5HcWzgQmsWqV+3+C9pIFnHdMhAAEINBNg529GheCoBFpioSCz6rZrVC5b7TZWICrxI5dUIkP91QT8OwWVtwmyZmlP5FLP8tlf6Wfn9frhad5+pGg4lkC4Q2jZCvyjuWONQRsEIAABCHRIIJwUa6PNDj3CJAh4AiFcL8VC6a9xeyWV8vv91/6rXDufz0diFVWhqaLWmoJ86WNlaDOsYnlWJ7mkLBZVkksSCgo3E1A+aO1F/v1+/da5ofvNng8yfIjASufTIN5g5lQEfFaoPdfp942pcOAMBCAAAQgUCCja5Ks9BUJUD0wgxOp1T7xw/e4pzT3ZdRR6+bBKF9rv758g9v1+bej3+6/ldyTsQ7h00OyTbOsrnV6VxvWe+iE8H3W0ytBFrewbHhq/vR1o8PE2AroV3Jyh0DWf3Whuc2yugTVNtqWCeq7pHdWbNHZR9LDokvaNRUkEIAABCEBgAgIhkpnAI1yAgAj4lEdLlK58TeX+S5GSpVH04o//fQAfif3+/vEyZlIIzEynNFsXXZtmuXU0VfIrdUpiliQK8jIsDPF6/QSTNITB1NtVVu+dCh0F/5kF3kt65rz35bWu88pG1mLxUXpaxnqmjAhrw2U/feZK6MprrUYrrN1GFNB05RTGQAACEIDAGQR0+2pHBmHMGZDReQuBEKW3h0OWxMnaHPI7WZnv9yux9IJSk++ryzDkhiScvj2kYC8Mka0PKHyX0tDS4+3U33drhxm6T/+RXNL0UzyAg3b1ht1km93ag/yusU0VvbIEtAWX9txsLyohcBIBXfJ7thF7inWShaiFAAQgAIGuCCiASe9Xu7ITYyCwikAI0df2TdMlysjU79E0bqrB/w6Jb1WX9H5Nl2epyetRrie1UEMEeXXx71WVKlWfKlmFd2JhckkTT+4YrulWMN0ytjmw55Zy24hP66UpA/XTpr43fxXlKPLozULsgQAEIACB3giEMKY387AHAtsIKBY6KkmqdEz9Hk0XVEnMDPPpGGlOPZUXaZP18noquZ7KENmm0rip8alhT64hl/Tk2e/C98MvUW0QYa/pwtspjBDh0rY7hZc4MQABrcDDt5EBnMdECEAAAhDYRCCEMYSLmyjSqTsCPig6ZFVLYd3VRTFdcdKT1qipos16BddMPlT6n+KWZhWyo5fGLemXtocXyCU9fAHc7L4u5lIme5t9dtmnrztu00avlIAeQYA6hUPNNQS0e5SO/2vMYBQIQAACEBiLQHinNb0LHcsdrIWAT51YUHTIjVVjfLUopoBNM5XWqKmizXqFC9bkQ6UHIs0qZEcvjVvSL20PL5BLevgCuNl9O87T63+nWab2kG10pyUTd9eeawVoTzzXHbqmOMCWH4njDucIkyAAAQh0SyDEMN3aiWEQaCRwxpKWzroNi2KK2aQnrVFTRZv1CreNJh8qySWJ59kFcklnE0Y/BKYlEN5OSvfxaT3HsVsJhEfK6R92vdU6BocABCAAgQEI6JaVQ2SA2cLEKoEQF1VlVzTqGqn3WRSz+wX/2I9cUh3pQK3kkgaaLEyFQF8EwtFFNNbX9MxrjaIWK5DEnHeq8QwCEIDAWQT88zDOkbMoo/cSAkrNHPWr22a11NYvkEWxNFpTlxSPYry0yXoFY1LlwfiSHv6OW0pmQw25pA3Q6AIBCPwvAR0Gla0fWBA4kICP/o+NmQ40ElUQgAAEINA5gfA8rHNrMQ8CFQIKwl+vn5BqqfRabPLXSOW3LOpiCtv8cLp98JVWli9pE7mklMntNeSSbp8CDIDA2AR0SNju719hHdsxrO+PgI9XbL31ZyMWQQACEIDAGAR013rsHfgYzmPlLASUlzkjLvJB/vv9Vxml9/uvT1p5Mcl8v1/V+8r6jxnpqkzn55Zcklww973XqYUPrCGX9MBJx2UIHEkgnGHhldEjR0LX4wkowrACJ/rjVwQAIAABCGwnEAKY7YroCYH7CITQ6HBDgn7/0Y/l60M5jdZ06XkNVlbftOmWXJJMrRiWmvqcGnJJz5lrPIXAWQSUs7d9lleTzgL9bL0c58+ef7yHAAQgcDCBcKyEVycOHgx1EDiBQHhfO83aHDLm5/MJob79yEC4ZMIFZTcFWZMkmZpXSdlYr6CwNEpliGxTZdzge2rzk2vIJT159vEdAocR0BZc2tMPGwlFjyQQoiV+6P2RqwCnIQABCBxMwEcv4R714JFQB4ETCCgtYiv5hBGiypA/is3/fP78879s07iV7A/ZuSOXlMVCJQQgsI4At/rreCG9kkB4KMSJvpIf4hCAAAQgkCEQDpeMBFUQ6JiAT4bytYCOJ2pa08glTTu1OAaBiwmEZyMcaRfzn3i4sLRIJE0817gGAQhA4EoCnC9X0masYwmE57hER8fiRVsLAXJJLZSQgQAEmggQkzVhQmgNgbCoyFGugYcsBCAAAQgsEODNjgVANPdKIARIvZqJXTMTIJc08+ziGwSuJxBeF+chyfVTMNOI4ZkbfyVwpsnFFwhAAAI9EAhxSw8mYQMEWgiQBm2hhMypBMglnYoX5RB4iOj7yQAAIABJREFUIgF/tnHz/8QVcJzPYS2RmjwOLZogAAEIQOB/CISXOzhoWBZDEGDdDjFN0xtJLmn6KcZBCFxNIDzi40tJV0/ALOOFOIm85CwTix8QgAAEOiIQXoAll9TR3GBKmUCIkVr+vFpZGS0Q2EiAXNJGcHSDAAQqBHidpAKHphYCIbh/vX6Ik1q4IQMBCEAAAmsJhKBlbXfkIXA9ARbt9cwZMSVALillQg0EILCXAImAvQQf35+32x6/BAAAAQhA4CICvOJxEWiGOYhACLN5me4grqhZTYBc0mpkdIAABFoIkAtooYRMlkAI6/l2W5YSlRCAAAQgcBQB/5YHd+ZHUUXPSQRCmMSL2ydxRu0iAXJJi4gQgAAENhLwkdnr9UNwtpHjw7qFp218u+1h84+7EIAABG4gEG7Ob7CAISHQTCAE2M39EITAwQTIJR0MFHUQgIAIkBQQCgrtBIiQ2lkhCQEIQAACRxHwpw8vehxFFT2HEwjR9eH6UQiBdgLkktpZIQkBCGwh4IMzXk3aQvBJffxq4V22J808vkIAAhC4mYB/NYlw5ebJYPgyARZqmQ0tVxMgl3Q1ccaDwNMIhB9OIj572gJo99eHR5ZUau+LJAQgAAEIQGAPAX8G/f7+2aOKvhA4j4CPqwmqz+OM5hYC5JJaKCEDAQjsIsDLJrvwPaNzeGebn0l6xrTjJQQgAIGOCPhwpSOzMAUCjgCr1MGgeDMBckk3TwDDQ+AJBEgTPGGWd/ron7O9Xj88E97Jk+4QgAAEILCWgD+JeONjLT3kLyDA23MXQGaIdgLkktpZIQkBCGwn4OMzMgXbOU7a08dGLI9JJxm3IAABCPROIBxGvZuLfc8j4MNp0p3Pm//uPCaX1N2UYBAEZiXgX8rlZ5VnneUNfvHa2gZodIEABCAAgTMI+FiFe/UzCKNzDwG/PvfooS8EDiFALukQjCiBAASWCZAyWGb0SAkfGJFkfOQSwGkIQAACvRDw7328Xj+9mIUdEPh+fbzETwGwInogQC6ph1nABgg8hUB4e5wnfk+Z+LKfYUkQuJdR0QIBCEAAAqcTCKcSgcrpxBmgjQArs40TUpcSIJd0KW4Gg8DDCfBq0sMXQOq+f8hGIinlQw0EIAABCFxJIAQq5JKuhM9YFQIhl/T5fCrCNEHgGgLkkq7hzCgQgMC/BEgf/Mvi2aXwVQICo2cvB7yHAAQg0AUBopQupgEj/kuAZflfHnzqggC5pC6mASMg8CgC4aEfX/l+1OzL2fCE7eJl8H7/fb//tmSvPp9Pu7C8owABCEAAAoMSCMdTy0kxqKeYPQqBEDnzutwoEze9neSSpp9iHIRAjwTCCykcij1O0pk2hUh9cyIpRFctT+3C2qv82neq/Pf3DzcVZ64LdEMAAhDogoA/TQhRupiSZxsRoiZCkWcvh468J5fU0WRgCgQeRSDc0hOrPWf20xzN5qgoRFc++k9/fcmPa68aST5NZkn49/dPEN5s7XOmGE8hAAEIDE0ghChD+4LxExBQuGKFCTzChTkIkEuaYx7xAgLjEdC9ug5IbtHHm8VNFmvGrbAnjWi5pEYNNlxIGykbFZafCYdKu7sIGjYxoBMEIAABCPRLQEdD9izo124sm5FACJgbY54ZSeBTdwTIJXU3JRgEgecQCLFa+iLJc1A8x9NjJ920tcRVGjcVTlNaVpMuSCl5znzhKQQgAIFnEtBBUPkq9DPJ4PXFBBR72Jq8eHSGg0CFALmkChyaIACBcwmEJy2v1094DeTc4dF+BwEfne8P0O1FoRY/9IWFVFhRmjVpWaZZp+/3a/Znm1LN1EAAAhCAwKAE/GnF66iDTuIcZiuAIZc0x4TO5AW5pJlmE18gMB4B3cYraBvPByxuJhDiof3ReXtcZZLZHJCSR+aH1mQ2s2kuZPU0Y0AQAhCAAAR6J6CzwI6P7InQuw/YNwUBRcj7n8BNwQMnOiJALqmjycAUCDyTwOH5hWdi7N9rpWwUFe0PzU3Vou+6JShJmh7LEMm8rPCiqmwvKiEAAQhAYCwC4cziEcJY0zeNtYo6LDjZHzhNQwZHeiBALqmHWcAGCDyaQAjX+KbblKshBEP730gySsr7qPD7+yeNtDR6ia11J5dU4kM9BCAAgQcS0MlihQcSwOXbCYQHrrfbgwEQ8ATIJXkalCEAgdsIcFjehv78gU9KF1qG6P3+a//5oD/kqsglnT/JjAABCEBgQgL+ZEkfVEzoMC71RCCETz2Zhi0Q+B8C5JJYBxCAQBcEwnnJ20ldzMpBRvhY/NRv+38+HyUl/fcRyCUdNJOogQAEIPAsAjpTTj28nsUUb5sJKHp5vX7CQ7JmHQhC4EQC5JJOhItqCEBgFQF/ZPI++Sp0PQtfP61KXQmLbFBNKFgXvuMWsPARAhCAwMMJ6PggLHn4SrjFfcUzpDJv4c+giwTIJS0iQgACELiIAK8mXQT62mF8JHRNMKTQX68mqabkOrmkEhnqIQABCDyZQIhMnowC368n4CMovmJ5PX9GXCRALmkREQIQgMB1BHTPr+PzurEZ6QQC/tsBl72hrVW0NpdkgVp97ZlyXjU/YbGgEgIQgECPBMJB1qOJ2DQjAUUjVpjRRXwangC5pOGnEAcgMBmBELRx0z7u/IbHua/XzzW+pLmk7/droZiyS94SyVulPmafAVb0eJ2UIQABCEBgDgI6FGz/zx4Nc3iKF/0QCBFUNnrpx1oseSwBckmPnXoch0CnBMLxyY9wdzpPS2bdOI+K+33spRxlarjJK2spy3139eJeQigoQAACEHgIAdv5eZbwkOnuwU1FMkQdPUwHNpQIkEsqkaEeAhC4jYBu5hW93WYKA28loNzNxcG3XzzedoVlyhlZq+r9o2YtPF/5/X7NqaDBj0IZAhCAAATmIxBOtPkcxKPeCCgOuez3AXojgD1DECCXNMQ0YSQEHkdAd/h2mnL3PtYKCNOXfcFnv0f2S95S/vl8NG52wehmQF0q8kobKZ0kYdXsdwENEIAABCDQPwHt/xaTcAr0P2VDW+ifil3zR0uGxoXxNxIgl3QjfIaGAARqBELodtmv7dRsoq2NgH+edt7EhVH8x6yZ6YpSl1S+JKw8VNqFGghAAAIQmJWAzgvu7Wed4n78ChFIP4ZhCQQCAXJJAQgfIQCBXgiExzL8cFIvE7Nkhw+4z4u5P5+P3jPyI/7+/qk/MU57leTTFZh93WmJB+0QgAAEIDA8gXDQDO8PDnRMIAQqHVuKaU8nQC7p6SsA/yHQM4HwZOa8N1x6hjCWbSEAuib5Yt9uWwWqlD/KKlklnNVAJQQgAAEIDE0gBCScC0PPZufG+8Qlb0N3PlkPN49c0sMXAO5DoHcCt+QmeofSq33pizy9WopdEIAABCAAgRUEwgHHHf4KdoiuIUDWcg0tZG8mQC7p5glgeAhAoE4gRG98062O68ZWZupG+AwNAQhAAAJnE/Bvi/Ci9Nm0H6s/PEN9LAccH4IAuaQhpgkjIfBoAiQphpj+EP1c8+22IchgJAQgAAEITECAF0YmmMTOXQgRL6+/dT5fmEcuiTUAAQgMQIA8ReeTFCJsHth2Pl+YBwEIQAACawlwn7+WGPJrCYRoip/lWgsQ+YsJkEu6GDjDQQACGwmEd8t5VrOR4zndmJ1zuKIVAhCAAAQ6IhAOu44sw5QpCLDAppjGBzlBLulBk42rEBiaQHhWw1eo+pnNMDW8lNTP1GAJBCAAAQgcSCCcdwdqRhUEvt+vzyXx0JQl0T8Bckn9zxEWQgAC/0sgxHCcsj2sjDAp5Ph6mBRsgAAEIACBkwj4L90Th5wE+ZlqQ0D1TAh4PRYBckljzRfWQuDpBHwM93r9EMbduyBC3MMbSfdOB6NDAAIQgMDZBPzBx+OTs2k/Sr8PcYlvHzX14zpLLmncucNyCDyUgH8B+PX64YcJ71oH4VdImYu7JoJxIQABCEDgSgI+DrlyXMaam4BfVwS3c8/1NN6RS5pmKnEEAk8hQAqjk5n2D9Berx8ez3YyL5gBAQhAAAKnEvDHH++PnIr6Ocp53+05cz2Tp+SSZppNfIHAUwj4Rzd80+2WWfdBj03HLWYwKAQgAAEIQOBiAv4EJJd0MfxZh2NRzTqzc/tFLmnu+cU7CMxJgFeTbp9X/1SWl5Junw4MgAAEIACBywiEIOSycRloYgL+KSlfcJt4oidzjVzSZBOKOxB4CgFyGTfOtH96RiLpxolgaAhAAAIQuIWAv/Pn707cMgUzDRrCqplcw5e5CZBLmnt+8Q4CMxMIkRzvmV8z2eF5LD+5fQ12RoEABCAAgX4IhJt/XiTpZ2pGtMQHtESzI87gY20ml/TYqcdxCAxPgKTGLVPoIx4ext4yBQwKAQhAAAL3EggRCPf/907H0KOTlxx6+h5uPLmkhy8A3IfA8AR8aoM/JXb2dIavFvIk9mzg6IcABCAAgT4J+PCDJyt9ztEQVrGQhpgmjMwSIJeUxUIlBCAwDIHwbJCvXJ03c+HRGZm781CjGQIQgAAEOicQzkQernQ+X32aF4JYXnDrc5qwqkSAXFKJDPUQgMAwBMIjHU7iM2YuBM08gz0DMjohAAEIQGAUAuFYJPYYZeK6spNV1NV0YMxaAuSS1hJDHgIQ6I5AeKrDq0lnzFD4dhsvJZ0BGZ0QgAAEIDAQAf8oi2NxoInrx9QQXPVjGJZAoIUAuaQWSsicReD9/qv//Hm8pyyFVjjLdPR2RiAcxttCutfrh+eK2YkNz8224c1qphICEIAABCAwKIFwOA7qBWbfSMDf8hBc3TgRDL2NALmkbdzotYWAJXfCPb/fQ08tK8e0xXT6jEAgrJ+1WSFbmWt7jQBmr4289rWXIP0hAAEIQGBGAuF8JISYcZJP9CnkIlk/J7JG9TkEyCWdwxWt/0fg/f67mDxSlscKG3688PP5BCUhrRA+/v7+Yb/+vyma5/9DSLfqm246zjcsv3kIFjwJlw/XToET1RCAAAQg8DgC/ojkvZLHTf8+h8Mt0j5l9IbADQTIJd0A/QlDfj6fsD/aWWtJnIvvRS3NVLKH3MFMC1IpIcV2Ld75JFSL/KNkwoVDoPyo2cdZCEAAAhCoEwiBR12YVgh4AgpW+Y0Fj4XyQATIJQ00WWOYaq8Ihc3x4uRRnVRq4aoXWOrKab2dQIjqWnIfPl1yu/1dGeCzbHZRk3vtaoIwBgIQgAAE7iUQDsquIt57yTB6nUCIV4mv6rho7ZMAuaQ+52Vgq3wWqfO/Gj6QqQMviDtMXzWz4Sy/w95+x1xFsl83sAwCEIAABCBwGgF/VpJLOg3zbIqJP2eb0Uf6Qy7pkdN+mtP+4cwQp6k3mAcCp62LqxX7aX29fuqvJvmXkjrPfl7MMUQ5dYwX28ZwEIAABCAAgU4IhOOyE6swo3MCpCA7nyDMayFALqmFEjKtBHSaDpFIMq9GtLl1Ph4sFzJEpQUZxMglacnourBYh0SSyFCAAAQgAAEIBALkBQIQPtYJhKeedWFaIdAtAXJJ3U7NkIb5+88hXvPxvxFeSjcMORMY/f2GPFE6v+Egt0AQct/vNyUzxOXM3EEAAhCAAARuIeADYJ6+3DIFYw3qF0waoI7lC9Y+mQC5pCfP/vG++53RvlvU7S1o+gvcbOXHL4hbNS4mRPxTRJVvNbmXwUXDClwavUwMdkAAAhCAQJcEQsjRpY0Y1REBH2h1e6/UES9M6ZUAuaReZ2ZMu0IuSRvl+/33/f7bw15plsgwX+CGecxFV7M6XZAmHWI+vwxq6p7RFt7n4vnqM6YdLyEAAQhAYBcBH0vwlfldKGfvzFKZfYYf5B+5pAdN9gWu6tb9+/2qHHbM398/ltC5IHejgcLtsUwyG+zjBfZcMAUMEQiEqbfMiBZAWnj4MkizbD2kgMOc8hECEIAABCDQG4EQ93J69jZBndgTAq2Hh52dTApmbCZALmkzOjpmCOgcVZtq0pv2UKMuOwtBbemj37tNxtfstIHu/RBIV2Ba4xfJw5eBR/F6/TycRj/LGEsgAAEIQKBzAiG64ADtfL7uMo91chd5xj2DALmkM6g+V6f2x4DAfpxIreF+dfGjf5Wp8iW1RT16TSmYZx059QOWaT6GV5Pq6+TJyyA8K+MV/WkuARyBAAQgAIELCPgAg2+IXwB8xCFCUDqiC9gMAREglyQUFA4goGxRXZdSS+/337Cl+mN4T9mnnxZfM7aBnpxEqM/X6K1piqSytB67DHTxGhyC4NGXPfZDAAIQgMDFBMJJevHoDDcEAR+CEmsNMWUYWSFALqkCh6bVBHSIru753w56gaixsJgt+q/6+IlcUiQy1+dV77I9M5eUptt2XlNzrSC8gQAEIAABCCwTCIfpMyOKZUwPltCNErceD14FU7lOLmmq6bzdGW2Rt1uyygA29FW4hhC2d9/8w5/G8jMjvwDnmRCGWNgYCQEIQAACPRPw5ylvnfQ8U7fYFr6NcYsNDAqBAwmQSzoQJqr+/dttY7Gwg5/757FmLbV21ftHPtrz5QdGfiGyeSCBdC1RAwEIQAACENhAQE9VLbTYoIEuExPwASf3HRNP9HNcI5f0nLm+wlOdoFcMdtwYtrOzpx9H9DpNh+SP/NH+tB+cDi/kv14/fLvtuuXLSBCAAAQgMBeBcKoSW841vbu80V2ShZ2EW7to0rkPAuSS+piHWazQLjmWQ+SSxpovszYkgA78OCKNzTYHbkS9m0nSEQIQgAAEIPD9fsPBChMIGAHdJdkKAQsEJiBALmmCSezIBe2SHdnUYIrt6dxFN6DqSOSMN5KedrqHx6dPeyero9WMKRCAAAQgMAuB8M3xWdzCj70EfJKR3xPYS5P+fRA4MZdkd3r2bx/OYsXpBMglnY6YAXIE3u+/IXTzB/bacm6ECevSRBKvW084zbgEAQhAAALXElAwbOEHjyqvxd/paCHoYlV0Ok+YtZLAWbkkLpiVE3GFuP1lq1Ozezo+r/DnuDE47I9jebMmrcC1+SMv/5ADPmTfHuL1zQuU4SEAAQhA4AEEfFDBGygPmPBlF0PQtdwBCQiMQOCsXFK4o2Mb3bkY3u+/e14Z+Hw+12xhmved/l7cnVzSxcAvGE5L0cdzjeUnZFUCnye4fMGqYwgIQAACEIDA9/vv3zW2wAMmEPAhKEEX62EaAmflkuyC8fmLaZBd7Ii2nm37TrhjlLaTvNBwJ+k/Sa1h2Ub4JJNQewgBLUit/JbC9CshYCHXf8hiQwkEIAABCEBABHy8MX1cIa8pZAmEuCsrQyUERiRwSi5JX3DzVw7b6Lb1oaNoA0DP//f3zwWpPY24zdm7ehnkDYTvMphxVxGwb3fqUmoprNI/lrD2Z3HY887jWL5jLQQgAAEIQOAaAgqJX68fntlcw7zbUfwtGLcb3U4Thm0gcEouSbunXS3cqG+YGHXR/d62rcfD17yc99eaNITsH6LgKQ1hMEZuI6CrabGwTf8QvYLv2zaWITzFSAhAAAIQgMCNBPyBe6MZDH07Ab8SiLtunw4MOJDAKbkkJV/NUF0/B9r9HFWit23r8U9ClOghlxTWj0HeRjio4mPnBPxVoIsrLXTuxWbz0peSNquiIwQgAAEIQAACFQI+uuAV4AqouZtC6DW3s3i3gYD9NeoNHXvockouybZOZTF089a+jfq/OGZ/d2zxx6cl5gslxNL/+/tH8iXh7/cr+YoLJT3qK/2q0ehqUkEyOockbANJsr2giSCXFKAZZHJJAcusH9OfotdVpsKUiyFEM6/XT2VDm3X28QsCEIAABCBwDQEfeE8ZV1yDcfRR/DLQ3fHoTmH/sQTsm7AjhuXH55J0wWjT1A2Mair067d52Y4aUfeBKqQj1vWXMlYaIlUokzSoaqygvvZRL21J3gph9ahXENPHMErLR6+zRX6DjIbY0PfGLka1Mrk32sbQ5xHQctVlpcKUiyFsPgQ05y0tNEMAAhCAAAR0B2TRBUCeSUCxJc/wnrkAWrxWiF7KRbQouUXm+FySWHh/dBX5yrSsvpK3d3DsY3rnU5JXfUjQhD1dbxJJ3gYKvfyf9qzcYcrm4JfuV8PoYdCwv6iX1IZCGKXlo9fZIr9BRkNs6HtjF2NbmdwbbWPoUwmUksvpbnOqGRco17WpneSCQRkCAhCAAAQg8GQCOnNfrx/izAeuhBB9PZAALrcQCOtkoL3i+FySbZrhTkyAKmh8qiUrFlI8Xv73909otS+m+cnz8llhbffB+KNySZY8CspFpvRXHmRVlol3cLHsx1oU3iagIbZ1v6uXQd5P+C77GXcngWxGaafOrrr73c9We7oHdmUwxkAAAhCAAAQmIKDA2A7fCTzChVUEdB9HMnEVtwcK+6Vi5SHuTA/OJWnHDM7rTiZkUvxCEcHGmxzJV3R6/XoPKNgmGRmfXu1qKvX9fr+yRwqtoL6p2lQg9PVqK0OnvbI13pKswP5KDbFf1ZUaBrpir8TytLG0em09zOS+dj+W+kzTii8QgAAEINA5Ad0Bcf52PlNnmBcCy8Y73DMsQWf/BEKsbjtGKXvQjztn5ZJSD0UkbdqQMfEXZ1ZhWlk3wOQlE36dWsNVEjrqG4ZW36DTi6lvqr/S5DW0lFssadFTkdEQFZkOmwxyCr9DUzHpbAIHXnFnm9qoXx6xzhuJIQYBCEAAAhA4ikA4hY9Si57+Cei2yNZA/wZj4Y0EwmoJ+0a3d6kH55LkdjoTSralLHzOPm1NVX2/X2mrJGh8R01P/SUmiQW1qq+YV/K9pW9FRmorQ3tPK2WNEryrdFnbpCHWdrxX3iDvJ3yvF4x+FAG/vegCnKZwFKU9erRRzEF1Dwr6QgACEIDA3ARCUDG3s3jnCfggp34H6ntRfiYBnw/xK0fl7E/63M7qyFySbg+y9+RqTRMZlaYSIGEtCYR6yWdt88KS9JWysNI927Hxt5Yq+qW2MrQ3tVLWKOkUVHqtatIQq3rdLmyQ9xOWI4obVukUPU26FaR2sXCehlWOBPs34M1qWLVuNQVB1SJDE1jc0IPa4T52MqHDcasY3LK0Suuqpa9ksjZ0MqEycrGwf7PaeY3bjypmYS4aLwEmVCiYUKHIrkyuUF1rArVY2H997dcQnl7LiwdO6P5rfP907Ndw5YQGa/2a0UIKhcWLQgL7p6Okwdup4bKF4KB82a8hO1ypcv+Wu1+DfA+Fks1pfWk6gkL72NWXJY/MJWW9zVaGRebxpXCzNVKbbU0rJR+GbpSUhZXuGiLobOlbkZHaytBhxNJHjbLqnrykLVuvIbKt3VYa5P2E5eDn87G/Erj2atffFvQFqV0saFzffZVfJQ2rHAmj28f9Gg5xZJGhBLSYdQ0OXXi///7+/tHU7J+OzRqyZ/bQbFdtIJoCX9Cqayn4jipvno4DNVx8hZY2qxaGkpH7vqDWloLvqHJLR8moly8woaIhUC0F9fKFlo6S8R1VVmtLIbsymdBtMNXLF1pmQTK+o8pqbSkcMqHhjFv7Z79leSi02G8yWS8u3rTt+XpwYZUNh2jIojjjCg3Rjp+sFILVeJl6OevFKpglDWegqPiSRVGRT5uyjqzyYr+GrBcbpiNsFOnHDl9NOiyXtOq+K7zm5/umSyRbI7jZ1rRS8ovzKmO8ZLYyjKIhQn1L34qM1Hp7whCNHzUKuaRAzCDvJxzU8nFoAtmjpXRa9F/fyVzoKVb/xFos1P5c+kOcnWDHDAhAAAIQuJFAJa1wo1UMfSoBIoRT8c6n3N+n+8XT+V3qYbkk7ZL+0XeIxSUTchmeXePKEOK18ov5Amn2GU1ZWOmujsGklr4VGamtDB1GLH3UKIF/SX5DvYbY0PfGLgZ5P+EbXWBoCPRPQImk87ag6yFoi369fvypcb0ljAgBCEAAAn0SUHhMwNnnBB1uFTN+ONLpFfo8iWLLDl9EChNxWC5JPlduyP2NhBfz11uwr/RRw5UEQr3k/bhBxj5K0rfKwkr3bEd+L8lj7LZsc1eZ3G4txzAIjEJAu6hdbqOYvWinP/vZQxZxIQABCEDgmQR0m8B7rE9YAD42mOn52RPm7i4f/RZhu8QQTyiPySX5m4T6BAiTj7l9d19fUSU9jddnu7wk/eiysGJetiO5JI+x27LNXWVyu7UcwyAwBAFtoaV9cggvskYG17IyVEIAAhCAwMMJcFg8agEo2rHCo3zH2Q0Ewv4w0D3p1bkkn6b1oHXJhZ9S8jK+7Ik3Ju00REVeMmEKNVzJPAmkuS01BZ1Zd1KZkkm+e2NZlqRGNmpYFNMQi5JdCRjkFH5XRmIMBAYl4N9I1YY2qC+p2cG7VIAaCEAAAhCAgCJkOwcrNyOwGp1ACAy4vxh9Qi+w32dIxlowx+SSdHuw6LzfSf026utL+Ro/keEq9aq8mC9rkkr6JZD92Qv5mI4VjPGD7n8vyVsVNK/96CGv7dsoryEa5TsRs8ldXL2dWIsZEBiIQNgetZHOdLnJKSsMNDuYCgEIQAAClxHwh8VMh+BlAEcZSHdDNuPpneMojmDnZQRsqYy4LRyQS/K3Ci1Xi3bSwMtfePYD3l6b/Yy3n1Ev/3r9hL+vaX+DyWv4fr8a2vRL2+fz8Smb0MvEvIDGslFMrQSk1gqyM/jrxSoyajIfrVfWQq8wW/aqsgL7KzXEflVXahj3Ar6SEmNBYAMBbYzafue73LTvmWvb9ucNbOkCAQhAAAIDEQiHxUCWY+oqAj7gqdz9rdKJ8MQEbGcYNHo8IJfkd8aWaa7I+yZ/Haoc9C/Khws45Iyk1hdCF43oU2Ze3sqW6lJZvfa/l5Qdt2SkHzcte1xp6yE1GuIQbZcpyU7cZaMzEARmJVBKJPnM+AS+h1162/48AQdcgAAEIACBOgF/BzHorWPdQVpDSAAQCCwSGHorOCCXpG1xkZQE1CVlV0n3lL6bpvyF1KqQ6vfJHYlZYfEGIGubrJIZQU+pXjS8SaGvyYRdafNtmCzh95I8fL2wloWZYLnDAAAgAElEQVQfJPkIAQi0EMjuln7LnexyC1mzFkTIQAACEIDA0wj4UFx3EE+DMLe/foonC3Xmnji820bggFzStoFbetk3yNqvQ8lnU0jpiPYyUbt+abCOjaOo1/5C+kW//TqP1aAN9Fi1Z2trTCaebQb6ITAHAe0DPnkUyhs23p7hBJevPx16hoNtEIAABCBgBMLjYbDMR8BHOwQD880vHgUCXeeSgq187J+Abqj6N9VbSC7J06AMgT0EtAn4cCpb3jNKh329j5NlyjqkjUkQgAAEBiXgD4vzvigwKJwJzPbzO4E7uACBOgFySXU+tK4joNvIdd3ulrZ9n9u/u+eB8YcnEJ64+ogqLQ/v7X8d8A7yzYX/suETBCAAAQj8LwG+Ez3xUiASmHhycS1LgFxSFguVGwmQS9oIjm4QGJ/AqkTSfA9jtftZKDn+fOIBBCAAAQgcTyAcFjzIPB7xTRqZ2ZvAM+ydBMgl3Ul/vrG1jY7lmt37cZyPNWtY2xWBtYmk+XJJgQD7SVfrE2MgAAEI9EOAt1f6mYsDLeGNswNhomoUAuSSRpmpMewkl+Tn6dQU1anKvReUIbBIIMRPPkqulOfLtgRnF7khAAEIQAACDyQQDs0HEpjSZR8D8FX3KacYp1IC5JJSJtRsJ0AuybOzQ+WkG+ZTlXsvBi3rrzrqzzWqkPXI5BUHLM7a+/1XseCicHbEOSrDyzgC2FiYA4K80AZo7vMHXESGAgQgAAEIiEA4Op8cRYjJ6IUQADCno08o9jcSIJfUCAqxJgLaSZukuxGyG7/D9/2T1Bq2U5V3MzPbDTE+2X9TpSGqU69sLqAk/MBnUMqmidjaQjoXQ9eEtXH4ljI0HIyHAAQgAAER8MflA+MHcZimECKiafzCEQjUCZBLqvOhdR0BckmelwUKJ91PnqrcezFo2UdpoZx6JAFr0jLO/qaPhG1mvfBJc50a3EONd1xM1hZ6cORYGwKBY5WjDQIQgAAE5iAQztA5nHqyF5z+T579J/tOLunJs3+87zoaj1d9pkY7AA5PBJyk1kicqvxM2BfpNj4tg9miDU8F9YJJWBVa4f6VJQkHJS2jDyojDsZ5878B76A0vNmBjG+iDAEIQAACEDAC4bDwQQWIhiOgOJDgfLi5w+CdBMgl7QRI9/8Q0NH4n9ruP5y09Z+k1nCeqrz7GVs28PX6aczsGMk0jNPryr6phF0r3wsvWzmgxOfzERmjseff+XJJ3+/XA5nSwQGXLSZDAAIQ6I4Ah0V3U7LVIAWBNqdb1dAPAuMRIJc03pz1bLE2056NTG2zrf/wuz6v1v+08+/vn/f7bynp4H/U2RIiWUmv3HvU2N1+iNo6ett8vVershc287K+eDPMX2m4oGDrsGVCKytWTdKjmqwLpRnJCo9YGabe/N35b2O+byxcWiftCc2xHMRaCEAAAhDYTyA8mNmvEA13EfCx0JSBzV1gGbd/AuSS+p+jkSzUTdRIRv/fewRKGRxlvJILwuIPm9frJ00SBQF9TG2Tcm+t5EOh1P37/Yb3cq1j6SAMcY9G8TZkFV58U23AU6+9nVY2j0qSgUZd2AYtoUuHHqumtIa1BjYXxuLQaK2n0dgFMQhAAAIQeBSBcLCmMeGjaIzrbIh7SyHluA5iOQQqBMglVeDQtJqAzsXVPW/tYDd+h+/+/n7y9/ePogRRStNJ6Ts+St+ou6HK2ryh++v1I8f9cahKzYwsCU3+ozSESutbz7PYay/2YtTiv4GGjLSCEbb3oaQqyNjHLEZJagZbhDWt6j5NoXFqvL9aLWJYKvhe05S9+/5amMZBHIEABCAAgf0E/MlYj5H2j4WGkwgo/LPZPGkU1EKgTwLkkvqcl1Gt0n46lgO2+x9+y6cQIavZWltCh6x52cos9qykVfpEkvVVMij8CTPNbD2JY7fQqb9Sm7XQKjWEbKsU0iG8Zn8n75Wkvaw1rTdt6us/loRlv7fksWWhs1fS/MdQLvEcGp0Ww8Vv5A0NDeMhAAEIPI2APyxC3PU0FOP666OaKUOacacGyy8gQC7pAsgPGkKH4lg+2zFw+AFQV9vOyiSDeXXlnn+lezZw0aHolTQOZ2K+o8qLGgREBlQKgYZGsYLPkQUloWPdKvWVWq85DCr7Q/0DP4qbFcLPUYfWMCPT4PJuTuMUjkAAAhCAwLEE/GEx64F4LLHetPkZ7M027IHA2QTIJZ1N+Fn6B72dtmPg8CO8rlav6lTe9LHvZ2Vf9qkrt2VnX02qdF+bS6qYaiOaVdlFnzUjK3l4pf/R6PAiWB2jtYpSXXjQxX847ZA5MuBa7UKqQpiRM+y5RaccrOQfbzGMQSEAAQhAoB8C/k3qwwPRftyc1RLFfryGPOsU41edALmkOh9a1xHQlrqYdFin90xp3eUefoTXUw+65Q7jlv7mehArKV/VXVmSANiUq1J3xarJFiRWKQQvsnpOqtRE+8VpppaskiNmUl1Yi/8k+0dRKw6Gy9PWFAisFUZxbZWdgcOqvghDAAIQgMBDCHBYDD3RPp4pBZNDO4jxEKgTIJdU50PrOgL+XtHfQ67TcqG0z7wcfgbYAVNRmwro8ZT/3ejsGz1p3+/3q+72KsTia02PyiVlk3dZjFqA1ipKdWGFg+r+zIJfhEInFH6LEN7KNaKOwxWCp1P6ONykYDAEIACBDgnoNEz/JEuH1mKSCISDXvUUIPAcAuSSnjPXF3nq7yT9Hy+7aPjmYfz3nuwUb+7aKlhPPaSpDQUTIQ1nSYpwL5oqVy6jvXt6q2++BSAyrO55o1hJSeMfC7MEWfCxpDPUp9CyeTrrpRBB5CvCSuRJOAz9nI9aBpXvdvldoiI2OjSPonStje4j9kMAAhCAwE4C/kwkitgJ88ruCrz5gtuV2BmrKwLkkrqajkmM8Xur7t47OR39qzq60zvJNvmenVelKqxV0FJjrCnUp8rTGq852710f2uqZLZsq2dwJKaOqwrqbqPX/w3uNA6UItKgqQY1aSzVpMJpZjArM32lEBnqyoLxoXNpHY6Oq53G6J5iPwQgAAEIbCaggNCOzs166HgxAR+pKla82AaGg8C9BMgl3ct/5tHDfZQ2XH176xrnLXlUMubUrd9cLv20sN1Lq1UWpiaZZKg35b4yrTHCle6le3hT5Seo7oskSzZI4MaCYrWQ4DCbQ6XeMwqISg5q+m50sIehV2WI3u+/kk/59+DOThu05ErLZqd+ukMAAhCAwBwE7JjgsBhoNhX42awNZDmmQuBAAuSSDoSJqgyBsNX6w9KXfU4ko2VN1fUjlqzzDqYy1irHZbZq1CVIWn1amdaUJPUSTUiUhBH18fv9VszLivnKTsrGJ3U5Wy9/g/ES9tMkYV8ZOj7ko/i0f3PNusyKzgNJ195DVgVuQgACEIBAnYACCTs16sK09kCA872HWcCG2wmQS7p9Ch5hQP3loLAdh4/qGwp6oyHIVz5e/EqUWWJ26qej/K99+3tL/wqD3tHwL26Em21T7isFRN39WF5yQy7Jm/d+/9UQNilaxBIz1Kq3bJR6+frDy/atdRkZfhgrtUE2C5G46a0xGSnh7ISmytXxCQXBSRdnxX3rlaKudBmoSVelMRnIckyFAAQgAIHLCIRc0sPDicuwbx5oW8CzeTg6QqBbAuSSup2amQ3zv7Ic7rXsjuuQf5V7uutI1t1jCBGsXskIzXRJTPWSVDJI6Y/v9xsONo1S6e6TWalyX2P6S5PlCWfNkDFB5+EfK6NX/jyKEJmddWuzwhXlh/vYrcKwPFbZOWsuKawWf8Gu4oMwBCAAAQjMTcBHIBwWnc91ONw7txbzIHAeAXJJ57FF80YCPtOkfNBiYeNgZ3bz7+yYU7+/f+rvRmXFBMQba8p9EsfSPXqVSaNXupeCFfX1I1pZ2uxLTHr9J0iaBksuWLk0Vuh4yEeNKCMXR5df9QmSeXLQCqp/csHHwbPmhjbML1g2QKMLBCAAgacR2PM85mmsbveXk/32KcCATgiQS+pkIjADAhCAwMAEwjO6xeTdwK6uND2QWdkbcQhAAAIQeASBcFhwjHY76+EVeGaq25nCsAsIkEu6ADJDQAACEJicAA9USxNM0FkiQz0EIAABCHgCvO3iaXRbDlm/bu3EMAhcQIBc0gWQGQICEIDA5AR8BMwzujDZHg7f/gtw+AgBCEAAAkaApzJDrATO9CGmCSOvIUAu6RrOjAIBCEBgWgI8o1ucWh96LgojAAEIQAACDyQQDlMezHS4BpijDicFk24kQC7pRvgMDQEIQGAGAj604r2b7Iz6XFL4yfysPJUQgAAEIPA0Anwnuv8Z9wEPf8O3//nCwrMJkEs6mzD6IQABCExOgETJ4gT76JN02yIuBCAAAQg8k4A/T1+vn2dC6NlrJqjn2cG26wmQS7qeOSNCAAIQmIeAz5IQ+JbmNTxtLolRDwEIQAACTyYQjlTeY+1qMYSjnC8hdjU7GHMLAXJJt2BnUAhAAAKTEPDP6IirKpPqQZF0q4CiCQIQgMCTCfjDglO1q5VApq+r6cCYHgiQS+phFrABAhCAwJAEiKvapw1W7ayQhAAEIPBYAuGweCyHDh33aT6eCXU4QZh0PQFySdczZ0QIQAACkxDgDxi3TyTvxrezQhICEIDAkwn4nAVfc+tkJYRDvBOrMAMC9xIgl3Qvf0aHAAQgMDABH+/yKv7iRHpcPNJcxIUABCAAgWcS8K8mcbZ2sgaYlE4mAjO6IkAuqavpwBgIQAACwxDwcdXr9UO8uzhzvMa1iAgBCEAAAhDwxyt/+rOT9eBPcAKeTiYFM24nQC7p9inAAAhAAAJDEvBxFW/ZtExheEOeYLQFGjIQgAAEHkjAv8f6QPc7dJkZ6XBSMOl2AuSSbp8CDIAABCAwJAEfV/HgtHEKgdYICjEIQAACTybA05quZp+zu6vpwJh+CJBL6mcusAQCEIDAMAT8G/h8wa192gK39o5IQgACEIDAcwiEw4L3WG+cet4pvhE+Q3dOgFxS5xOEeRCAAAR6JMAj022zQki6jRu9IAABCDyNAO/CdDLjIa/XiVWYAYEeCJBL6mEWsAECEIDAYASIcTdPGOg2o6MjBCAAgecQ4JlNJ3PNqd3JRGBGhwTIJXU4KZgEAQhAoGsC4Rkd796vmq1Ab1VfhCEAAQhA4CEEwmHBUXvLvDMLt2Bn0FEIkEsaZaawEwIQgEAvBEJo1YtZg9gR6H0+n0EMx0wIQAACELiOAN+Jvo51eSSO7DIbWiDwJZfEIoAABCAAgXUE/PvePCldx+4faQ+QP4G3ASBdIAABCDyBgD8sXq+fJ7jcm49MQW8zgj1dESCX1NV0YAwEIACB3gmEJ6W9m9ulfeE5Z5c2YhQEIAABCNxMIBwWvMd68XyEgIeHZxfzZ7j+CZBL6n+OsBACEIBARwR8aEtctXli/KNOMG7GSEcIQAACcxPgsLhxfn3A83r9kMu7cS4Yuk8C5JL6nBesggAEINApAR/XEldtniQfofI1t80Y6QgBCEBgbgL8Nbcb59cHPHzH8MaJYOhuCZBL6nZqMAwCEIBAdwTC+97d2TeOQZAcZ66wFAIQgMBtBPyDB16NuXIawjHNG8RXwmesUQiQSxplprATAhCAwP0EfFBLXLVzPvwDT2DuhEl3CEAAArMS4LC4ZWZ9wMNLSbdMAYP2T4BcUv9zhIUQgAAEeiFARHvgTPhvLpBLOhAsqiAAAQjMRMCfvHwn+rKZ9Wc0uaTLsDPQWATIJY01X1gLAQhA4DYCPKM7Fn14f/5Y5eNqe7//2n+Hu/D5fE7SfLipKIQABCDgCfh0Er9U6MmcV/bMzxsFzRAYmgC5pKGnD+MhAAEIXEfAx1U8Gj2Eu0fKq0mGVEwOIeyVKBnqKykvElhMwK1K0pk2boYXsSMAAU/AvyPDYeHJnFTWefF6/dwb8KzaYCXMHnvSwkBtIEAuKQDhIwQgAAEIZAj4uOr1+iGWzTBaXxWorlcwYQ9yST1MqmV8NBel73f4+1sTruwMq4R7gIANEOiHAIfFxXPh96vKtrbHKg1R0h8m3UKvUpIovOlsKbCS8B6z6QsBT4BckqdBGQIQgAAE8gQU9NgdY16I2pUEQvBXCihXah1bXPmLw91QXH645pkUfj4ff7H//v4pvZckMZPRx/RPTfl1HrJU9z7wn2ni8GV6AtobeZxz9lzrsDgv4Am7YuqRdtTFDfb7/UqbdmytFtJJKVtqDiRALulAmKiCAAQgMC0BxSW3v+89GWLAhgkVkFC//6NuD/armlVDuCGpuGkwQybId/d9bU6DsKaDWx3PijIESgSUXLALqiRG/X4COobOC3j8EOljpOz2WNpgv9+vaQt7qS2YsPHuh4MGCHgC5JI8DcoQgAAEIJAhoLDG4pU07sn0oaqNQGDb1mlmKUXYhzsp1IdrnkZhO/zSVpBqEPZ03ygpmYYnjkDgQAK6lLhwDqSaqrqAs2ZQhWCG1adfLs7WZyu/368cCcr5CIEDCZBLOhAmqiAAAQjMSUARiYUsczp5k1eBbXq/faxdpe8rpaPoJzzPNikMnYbFZvOiGRIrSQp1GNE+LnZPexmi8Cg4FbOaRp4yo6TnvHo99F70SJKpMYKsWdDLFBXhtIkaCEAgENB1Z5ukLrEgxsedBLSJGefF/XDtcNoSNaFhKlWf1RxmX8JBifUNwlmFVEJgDwFySXvo0RcCEIDAIwhYOGL/8r704VN+Hl7T7H9MQWNV5lGxqYTTX/FUU0qj8l59pZf0eBnF3KpMzQ6/7yPJNLDWHYLGMjLpKNmfI/HdU0SpYRpFHWVb+r2JrBcVnVJ+YMHMS7mlQ5hHWfNERnoqaiWcDkENBCCQEgibVSpAzX4CfqNO3wzaqV+bnu2Q2e2xssF+v19bA9pgdb5kc15BeKfxdIdASoBcUsqEGghAAAIQ+JeAQp9s0POvHKWtBM67PbAp0wzaOy9+uBB9StKSHXpHRrG1ly+tBwkHHlKuIDgI2Ed1NzvTXxINKQyLpGXq+/1XDnprSy/8b+hujiwaZu7IGMmbhR6CyHgZ4xCczRI7pFI3JKbN80z1l6beJDWDJeZeYV2Vl6QMAQjoOrULJ2xx8NlPQLvxSVtTUBs+mv3ZSrmmNeCFSzmvICwlFCBwFAFySUeRRA8EIACBOQkoFrH4Zk4nb/UqEPZZhp122ZSlf1fLJzj8EKpPb1HUJHmrCdaGQFzCPq2QKvdisjk1W8rDoL67lVNrvQGpfKipdw+GyapQrwfIaX0YzlxOsVh93VmPa7EcxvUfbRFaCinVE2yoG6buLczrqryFlCEAAf3KMhfOSYshHMfptrxn3PTQzM5jtlLjykKrMWFySeJD4WIC5JIuBs5wEIAABAYjoEgl/WLOYJ50bO5JkE1t9t0WjSgqilBD4sAElDFRq+SlQbkDCfumdETfqrLEskF8NsujvipkDcgarC6+UO9e4Sk4/nuFWUc0nFmV1VlpUnfhaimoV1rw3d/vv2azf8nLu2bCvsYrlCqth9J9jm6MS6q8WsoQgIDPUNuFBpNjCWj7OjzgsWMlbPXZvTRbKTfDQSaDJeALQdg3UYbAIQTIJR2CESUQgAAE5iSgQKQe3Mzp/IVeKRy0wlEjV2ZNI2oszXXpxj7VllqrmhZhDe0L1rGUfZCRvku2LEvU2t5XOQ719WmRLJ/U38bhTCyrs1GDN3JzWdhTS9Qk5amzahI6m8FFF+qqvFrKEICA34js2oHJsQS03WV/NW/PWNm9rr1SQ4dNVQZLwBeCsG+iDIFDCJBLOgQjSiAAAQjMSUCBiMUr9Tcs5kRwiVcncc7GqeZQ+oJPPSTV83D/WDVdFXqWG4bOvumTRbtoRtAsJfqJH2kICSlBVhdfaO+eZlsExzelX2fww6lsYv6XkmRJ3WBpOKRg0PzkSq3MkHelKbAu4u/ve6UtFOqqgjAfIQAB7aVcO4cvBu11xvbAgMc0pxtsdhKzlXJWRlqNCYfDriSsegoQOIoAuaSjSKIHAhCAwIQEFKZYYUIPu3HJo9ZN+07rTGdWW4hHw+sk2XHTLiFdYgI2XBD2TVnlqhQH1YRC6pTGUl8VfF+J+Uqf71AvFbykuld4+iZT4mu8NpU1VqUg4fMKdWtlmxnQLixoJcvrqkq9qIfAkwnoelTu/sk0DvRdj1iM8FGalf5LFWY3wGyl+oZNVYtBAr4QhH0TZQgcQoBc0iEYUQIBCEBgQgIKgI6NqyYkdYRLivkOpF0JSTWcbK+HpD7noi6mRM9aLRC3Vi0ee7Rrylse8y6aEZxS9B+yNiYmU7P2632i9OsMle5hIBvCUPimYKe3xJdNrPRekr2j5OVPKtettVY9+m4RtlWRLrNgv6lqWRihIx8h8FgCuqy4fI5dA9ro0hNhz0BhvvwooWwniFX608SPbtp07EqDl1E5CKueAgSOIkAu6SiS6IEABCAwGwEfAClwmc3JnvxRULj4l78ara6EpJpcqdLoqgkFy9qElWC9TDI8JPeje7GgNnxcNMMELPsgL9JkRDqihDViSHipXm9p+Rp1z4b41uqbzABf47Wp3Cgm+VCw7o3/hr7+Y90M6bcu5mxYCb7J34lVNAupt4QyBCBQJ6CNq3Jx1TXQmhLQdmRU0zMl7dJY8/l8/DeXfdnG0rMEf65lN1idTTpZZHbWYFZI4xwhtpkAuaTN6OgIAQhAYHICFoUQi1w2zQoK/a34ntErc6expF81ClLVZIWsNksw6d4m9FWXdo+si16BCTbISG9SVtj0+O6hb+lNJa852z34aDKm3Delw3ltKptY6bZBYqWCvy1ZLJeUCEXJDM2jadB0pwrltW5s9OJYSbg0aCpPDQQgYAS0T6YbHYi2EdBOdSXSsLWa5ZUNVrkkbbAS9qePCJh+CaueAgSOIkAu6SiS6IEABCAwFQHdE14ZV01FcL0zCgqPYp6NU80uza/M9KOnoafibMl7Pak2a5UB7W9aWZfwipMGlUKvP80lZe1JK9Ma71RQK+FsyG6tvkk867kSiaXM5fUFhYoZNvXBC5uIUCklvl7cfKWyV+0L4wIIDAGBgQhoq+Qi2j9r2ruM6n6FjRrCiaZemlx/LsjIsJdmhfUN7iCsIShA4BAC5JIOwYgSCEAAArMRUHTS/kbJbAju8Mdj3z++afMJDunUHb5q9MDTevl6CWdVVWxWx5CX8cpD2WsLw6lJXVSzKOmTF+ou81Z1D8KmzVSFppJ5MsAKEgv1F3/MmlFCpHpvpCpLHLxwdjgvQBkCEKgQ0BXEGV2h1NikvcuoNvbaL2bDhQ3Tn1a+SUb6SrMhqydbud9mNEDAEyCX5GlQhgAEIACB/yGgx1/EIhcvCL3+Y+R3jl6ZPkWlfgg/7/oFB0mWHm/aKNn7mcW+fnQry3G9DvN+//VYghl+dPuSl73TZPX+oa6M8YPWu/uQXd19pVRZa2jyPI2PfPGSXsxjN681xNkFb4a+Lmd8AnOz5P+3dy5IsuI6ux1IRc5q17B2DiunlTf+1j1fq+UHBmwwsDpO7GOMrMeSAVtJZgmd+awc+dBMUugEQWN9gkYHiH4I3ImAv6yyV+idgh0di25f2QfZOOt2J0zvmf6jnXCDzeZak0FPkMqte1w4aH4gAWpJD0w6IUMAAhBYIKB1iS1HFqQ53Y9AIJ9dYrZbq6xTZSjVplM2vKLExmoVnq0LLA4PDph80CxPUhO+AmJittRO7Soub7E+3L9OpeHZpNjZyimFkDpm1Vth9JK/v3/SkL3/fdufzyd1IxtUe4LkYar5yNDkBg0I3INAuHfdI6izovB33SPvS9nHgSDooSP3KnfjMB9K3xOXchoQ6EKAWlIXjCiBAAQgcCsCWriwHDk+r/PA//zz3/EEgsVGNyqL7KAwe7hzeFZn2tmyS3m//7aIpco79tgfHmpX2O5wu2S7dSQh8EwCvj57zB3slpxDyWbCGFfdNlcJTxgsLl2LALWka+ULbyEAAQgMJxA+3WKFOpz4fw347YF/L+a/UhxBAAIQgMCjCfgiSParT4+m0xy8f+ay4GnGhiAE/o8AtSTmAQQgAAEI/IeAX55Sy/gPmkMOAn+WtodQxwgEIACB6xHw77Fez/s5PPYMealnjpzgxWUIUEu6TKpwFAIQgMAxBPy6io86j2EerJCCAIRDCEAAAhBICfh3avjsJ+Wz2MPTdhERAhCoEKCWVIHDKQhAAAKPI8BLMTOk3K9u2R7MkBF8gAAEIDAhgfDIntDDyV3yT1veAp48Wbg3IQFqSRMmBZcgAAEInEYgLEx53/uUTJCFU7BjFAIQgMC1CPD7hnvyxaN2Dz3GQoDfS2IOQAACEIDAfwj4z+h4I+Y/aI498Ingw9Jj2WMNAhCAwGUI+IcFT+1VaeMbgqtwIQyBlADvJaVM6IEABCDwUAJ8wjlP4lnjzpMLPIEABCAwLQFertmcGl+G4zObzRgZ+GQC1JKenH1ihwAEIPAfAixJ/4Pj1ANycSp+jEMAAhC4BgE+BNqWJx6y27gxCgKeALUkT4M2BCAAgUcT8J/R8ar86VPBp4OPTE9PBw5AAAIQmJOAf1jw7G7MEdAaQSEGgQoBakkVOJyCAAQg8CAC4bPNB0U+a6jhU9NZ3cQvCEAAAhA4k0B4WPBHMxaTERY8fFqzSAwBCGQJUEvKYqETAhCAwOMI+MUo66pJ0u8/OCUpkyQFNyAAAQhMRcA/vl+vHx4Wi9mB2CIiBCDQQoBaUgslZCAAAQjcn4D/sWdWopPkm6RMkgjcgAAEIDAzAf/Bw+/vn5ldncE3/2zlW4EzZAQfLkqAWtJFE4fbEIAABDoT8CvRzqpRt5VA+Ox0qxrGQQACEIDAnQnwsFiVXb/gofS2Ch3CEPAEqCV5GrQhAAEIPJQA66ppE+9Tw/ti06YJxyAAAQicSIAfAGqHH+puPFjb0SEJgUCAWlIAwiEEIACBxxFgDTpzynkVf+bs4BsEIOB+w20AACAASURBVACBSQj4Dx5416aSFJ6qFTicgsAqAtSSVuFCGAIQgMANCbCumjmpfII6c3bwDQIQgMA8BHw5aR6vZvMESrNlBH+uS4Ba0nVzh+cQgAAE+hDw6yo+zOzDtKsWEtQVJ8ogAAEI3JOA/2SIr25lc+w/nmHBk0VEJwTaCVBLameFJAQgAIEbEvDrKv6W8JwJDjma00m8ggAEIACBcwn4hwW1pGwuQJTFQicEthGglrSNG6MgAAEI3ISAX1e9Xj+fz+cmgd0oDHJ0o2QSCgQgAIFRBMKvH44yc2W9/j1fFjxXziS+T0GAWtIUacAJCEAAAmcR8Ouq1+vnLDewWyfg08SnzXVWnIUABCDwWAL+YcEzPUyD8MFMOMshBCCwlgC1pLXEkIcABCBwHwLhM0yKFNOm1v8KBtuDadOEYxCAAATOJRDKJbx649PhC20seDwZ2hDYRoBa0jZujIIABCBwBwIsOq+SRTJ1lUzhJwQgAIETCfARUQk+j9ESGfohsJkAtaTN6Bg4kMDn83m//7b/b6ArqIbArQn4z+j4gyaTp9oniw9UJ08W7kEAAhA4i4B/WPAeq7IAFqGgAYFeBKgl9SKJnnUEfJ0o3Ny7HP7+/pEJ3u9dlxukH0OATy+vlWq+5natfOEtBCAAgVMI7HkB5/f3zy2XzSx4TpmKGL09AWpJt0/xXAF2qRNtVjIXC7yBwNkEwnLzbHewv0Ag5ItXkxZ4cRoCEIDAIwlsfljYwFsy28zkljQICgK9CFBL6kUSPXkC9m218HF6thjk3yTSK0W+YQZ8T7adVe47zdAtP3XJ54BeCBQIhAuzIEX3LAT4WHWWTOAHBCAAgbkJhHVvi7O2JLjrt91Z8LTMAWQgsJYAtaS1xJBvJRA+AdBTzdeMWnVtlVOxKTxC5Awf7G9Fy7g7ENCFwO8pXCWdPmVk7SpZw08IQAACBxMIi/BF61on33Vh7J+ed62XLWYZAQh0J0AtqTtSFH7DA+z1+rGazgyvApkn/oli7pE2CDyNgL9OWVddKPv+9jXDTfVC6HAVAhCAwEMItL/HqiqSPVxuyccveFj23zLFBHUWAWpJZ5G/rV3/TJr5B/zsy3d+V3bblBAYBHIE/KV6188hc3Ffvo/EXT6FBAABCEBgPAG/xC19YuQfKK/XT0lsvLNjLYQwxxpDOwSeRIBa0pOyPT5W/zHIJT4w/3w+esCwnR4/QbAwCwF/qfJVqVmy0uZH+Hy1bRBSEIAABCDwLAL1h4VfAKvqdNeVsALkpaRnXQNEO54AtaTxjJ9kQc+tCz2Nrujzk+YUsQ4hoGl/488hh4CbQ6lfFl+iaj8HNryAAAQg8CAC4UMjvzIPp/RMueUDxS94Xq+fW8b4oGlNqJMRoJY0WUIu7o6/X18lFD1B/VP2Ks7jJwS2EdC05zO6bQDPHeXvtNy4zs0F1iEAAQhMS8A/6/07yKFfh9MGsscx/8T0EPboZCwEIGAEqCUxE3oSCPfryTc54f3eyb3tmSd0PZ6AFo58RnfFueDvtHf9eYsr5gWfIQABCExFwD8srIyiH3bwywBr3/Vp4iNlqT/V/MSZGxCglnSDJE4UQnho2e3b/nTaPF6mv7otP+dxEk8gMI6AX1fxGd04zkM1+yQONYRyCEAAAhC4LgH/sKi3b1lnCd/mu24e8RwCcxKgljRnXq7qlWpJ4ZUfPb1+f/8cX1qy4pF8kzP2SzF6zNzyIXrVmYTfwwhowtuFwLQfRnqs4vDZ8lhjaIcABCAAgTkI2Cp68V/9KlB29etXwmrfcj3gn5W3DHCOWYkXzyVALem5uR8RuZ5YUv5+//X3cT2x1FB1Sc9FPf+kpKWh4daoG7XfiJEhc4ZnTAtnZK5OQBepTXtdBVeP62n+k8enZZx4IQABCHy/33Dz13J6f+OWeD0WFjy3TDFBnUuAWtK5/O9mXU+4bGBW5fG39SPbKjalvpkb1JJSMvTcj4C/6O764wj3y1o2IlKZxUInBCAAgdsT0HrbPwh2tu8HLVC6X4BEBIHTCVBLOj0Ft3JAd+2WqFTc6VtjCmpbPLGnL7WkFlbIXJoAX3C7dPqC8+Hty3CWQwhAAAIQuDeB8BTYU0u65RrY87llgPee3kR3CQLUki6Rpss4uaqWNE9U1JLmyQWeDCWgK9Tm/FBbKB9NIGSThfJo4OiHAAQgMBuB8CDYXE665RPE07hlgLPNRvx5IAFqSQ9M+sCQ9UgbaGOAampJA6CickYC/jM6/oLbjBla4xNvma2hhSwEIACBexIIT3ZfQGlv36/Uoi2JQbhn7okKAmcToJZ0dgbuZV837muFRS3pWvnC280E/LLyfgvHzViuO9AnlOLgdfOI5xCAAAT2EAgfLYRHQ8vh/X6X2kfNr0PumV2MhUCFALWkChxOrSZALWk1MgZA4CgCujxtgXW/heNRICeyQ04nSgauQAACEDiPwM5y0nmOD7HMw3EIVpRCICFALSlBQscOArp379BxwlDbWvOaxgnoMXkgAf8ZHe+wHAh+oKmweeAmNpA1qiEAAQhMTyA8FMJzv3I4fWTrHAzf+1s3GGkIQKCZALWkZlQINhCgltQACREInEAgrC8pOpyQgzEmWTGP4YpWCEAAApckEB73lfqRTt1vSaDQXq+f+0V3yXmJ0zclMLCW5C9jvkxx+vz5fD7v99/3++/QXFBLOj3ROACBLAFdm3ZnHnofyDpA5yACZHYQWNRCAAIQuCiBteWki4ZZcpvHYokM/RDoTmBULSlcxpSEu2euXaEv6qk9KCPKe7t7M0galkFMZggQHyCga98aALkTAZ9c7mN3yiyxQAACENhGQAty/4AotbeZmHZUiH1aP3EMAjcgcFAtid/P3zlXtr1PFG6m4REyIimyuDPeg4cbGfZgB2PH3JEE/OXPVD+S/AG2fHJH3NgPCAETEIAABCDQl0D720l97Z6ujWfi6SnAgecQGFVLssvY/47Dc5j2jVQ3xLXbPw20hn3BzWfk9frpvuugltQ3+2iDQBcCujDtbtBFJ0qmIuBv+FM5hjMQgAAEIHAigbDy9w8LtU90r7vpUEFbu3vq7g8KIXBvAkNqSbqM/QaGi3nbTNKNfi1Ag58dNS4v0rwt2LNGGeQsq7Ncwi4EOhLwS0nmeUew86gixfPkAk8gAAEITEXAPyC0rVCj++fK58Yegj3XGaxD4PYEhtSSVFCwn3e1u9XNblWHzQzd6zfsACs/r6sc9c2L1B7Gp4shg7yBcBfrKIHAaAK6jbxeP6Ntof8UArr3jnjh9JSIMAoBCEAAAr0IhAqLXxXcbPXrQ+u7x+mVC/RAIBCobNiD5ISHQ2pJuowtYN2/Joz/3OS1WBfM7vd6ae6YF+1nOuo8QJWh6E74AM8xAYFFArrSqTIssrq0gE80d7NLpxLnIQABCHQnoO2Yf1i8Xj93el5oG8LCvvv8QeE4Au/339/fPy1lgXE+bNbcv5bkv+BmbunCbrxbfT6f7P2uUl2WiXB/zGalpL/invRXZGQ6JENjrT9rPVWrUVIbGsHKhkMp3DC2NERulwTm7DcUaRbm9BavINBOQDdkJnk7tItKhufmRaPAbQhAAAIQGEQgPCbutzAIAQ7CiFoIdCdw3Yuxfy1J1QS/M28HpOE2JPybzVyQ8YfeBxtb118qz2tUqlAuya56gkU7lFhoBM2yGMR0GKxsOOyoStbltnou0TAUIQWX8BwnIVAnoEvSJnldmLOXJhByzQ3t0tnEeQhAAAIjCGjxr8adHhYKijXPiMmDznEE/NQdZ2WE5v61JJWEvbsC5DvTtsZK3v76mB2m7yWV5NUf3ktKP6LP/nWzMOr7/WqNXrnhyucQl8YG63JSA71djdLZ0AhWNhxK4YaxpSFyuyQwZ7+hqCR3TrfxCgKLBMJ9ZlEegesSCI8YbmjXTSWeQwACEBhEIDwpSh+iD7I+VG0IbagtlEOgLwHtoG1P6msCfQ1119a/lmQIQt1HgCqrW38LyIoFrF4++yXDinw49f1+g7YAusX/UmlGY21TVyJT+ikTqc0yCX62HyrevmoVbLsnM0ga5L4oZogLHyCgG8id1ouktUTAp5vfWS9Roh8CEIDAwwn4h8VtVr/ag5S2VA9POuHPTEAbc12b2eLGhCF0riXpMg43JgEKlRRPROzSQo8XU1vyFZ0S/n6/+nw++CYZOZ9uunSqNPb7/cofKbSGxqZqU4Ew1qutmE5HLfaIRiPtRYUmoGAb5ScRs9z1JTxJaLjxZAK6Hm2G973Ynwx22tjJ+LSpwTEIQAAC8xDQvuxOnzpoI/Z6/bDgmWey4UkjAe3N/Uyev6LUuZYkCik1cUlPbaiY+BVzVmHaWXfA5CUT7q0yVyk3aGwwrbGVmpe4pfqlNj0VDLUftrjUrs1LSrPvnL9tkDsSnj9kPHwCAd09rPGEkB8eo98elD69eDgiwj+LgP2kwD3+ZZt61izCbkcCel7c46rUBoQFT8dJgqojCYQ5HNbw0+5SO9eSLOxs0cQDConxpxqf0OLbSLZdXpLeSXlYMZcd2PhbSxX9Ulsx7V1dbMvWiLK9lC+6MZWAQe5F2JJuz+bG+Ww0So/zdlafzyerZL+G/YHs17AqQVkO+zWsimJcOloSqmWiTe/f3z+eyapA/EC192vYn479GlZFcW5ClXSlwDcUiD6ZsLxrlG/4gWpLg5cstTUqNEryaf9+mMG0DlNbpZ79PuzX4J8XCuH9/rs/Hfs1rLq+WlBoPXP1hv395hIfn0e196djv4aSw9kLpCWh2YHqVOyhIYHFxn4f9mu49xUanhdXvzDlf32qhwlph/uvr/0a6m6H62X/3C5paA9knIYQbP3wTgnVHC411i4P6ui6nO1ZS1LYYdNiOfY3rDBNVYAIbwNVIpStiow/JfnFC1WS3kl5WBmugd7ubLUkv730AQafNx8K1GYNpwy03FWSu9YrcVirU7PIN9qty64f3n5Z+ekaNKwKJIy1w/0augSyE+aqKPwbl55Juw97NJQmQ690rELhw/ftdhSlcHZqWBXFnnTITx++2jrb0tAo31AgAVT2Pu8Hqi0Nm32Y4Qpd5cMlEro5HVMlNExLzbqrN7KQs8FmJUvJzWLZr2HV1ZGN4mANk1yhWRT707FfQ5d0+H1BduJdsTP74NPldu+EKszFRpbD2jeas9Nj/9xedN4LZANZ5cN+DVkOXa7QrOb6DPdwDmgPqSVlw/adIcE+hY0xS9ta+WA6HS7NXlIe+s4wVgNDf8vYiozUVkwHi5VDaVs1vysKwykFEvonPzQsXQhbpOKwVqdPkNrt9GRXY62xX8OqQIJ1O9yvYdWkHYRiVRTnroOzWVDnqkA0yjf2ayCh4tl+hZYmlU+H1JYWhV5Aba9h0R+NCo3FgRIYdIWumlQlmHKypREI2GHLQMlkNexPx34Nq2BWElo6lQ38cp3KoxrZePenY7+GXglVpPVGlsMqHya5QrOB7E/Hfg2rYGajMA2Xu+gqDtfnpJ3Notifjv0aeiW0BcLkHx43htAroYOmRJeEprN9FZwDhLvVkrJpSOO3nvAlOD+2MWZpXiu/eKnLGS+Z7QymSy61jK3ISK33J5huPKy8GtaoYVFMgSxKTiVgkPcTnioonHk4Ad06+IMmT5sJpP5pGZ85Xi08sl9DuGKnIrILLSxoZ84FvkEgS+CKl2HJ52yAdELgEgTqLwlO+yPc3WpJerhmv+Bm17xkQqFOBYjQX0m81soVGX9K8ov1Akn698fkYWW4Bnq7vu5bGVvRL7WV4cFi9lDwh657FEjWh2k7DfJOwtNGh2MPJKArkblN9h9IgJBnIBCWxTO41MsHLcys4ZeLvUygBwIQgAAEHkVAW/XwiJl8f9qtlqSwKwH7hYUX89uexkkjc2vlvd3s2KxmeVgZnh04SS1Js3NoIckHm2U7baflrpLcaT3HMQhkCeiSt7mdlaHzrgT8o7b0Nbe7xk5cMxCwn6bWouh+r0aGS2zEXzKZIY/4AAEIQAAChxHwD80L7Uz71JJUall8sUiYfFHDP5Ub9/N+p9SS40YPJebd8yWSinsKLfgjnZWxFRmprQwPFv2hZxuC8mK92gqkl8Jj9Fzoij0GCFauTkD3jcV78tUjxf8sAT8BmANZRHSOIPD5fPzyTPNw2wJmhIe9dIYwD1hf9fIcPRCAAAQgMBsB7aDtuXmhZ0qfWpKeqYuRe1I+i1pwNH684/UsGjVDMlFa0/iyS5Dxp7zbakt5umqXq0GnxtZrVdLcGKZX693eMNyramwr2Eb5ScQMciVBk/iJGxBoIaDL8H6vA7SEj4wR0LOj8akKNwjsJKCloJ97N368hjBZQuycPwyHAAQg8FgCeoC+33+v9b3pPrUkPVAXH6W+uhGEBbFx4evlWwol3nSaJH82q00xpme9J91rSX5buOoCW4xolbZGYXnbKD+J2I0Xu5MQxo0jCfg7UrjNHukGts4lwDQ4l/+jrOvRr5VSaNyShl9lWbzp2vKWgRMUBCAAAQj0JXDdh0iHWpJfQ7Rg1QojbHK8HpPxAtbj9dfl7azXkP5tUWkLqtTvG0HGNPtOtf2o+jtHktTY4LAf7gmkYlKlhjgvNlq0SW29oUDqYrOdNUQdOcwWIP48ioC/5B8VOMF6Arob23zwp2hDoBeBMM38zce3e5mbTY+Pkd8mmy07+AMBCEDgEgTsSXoJV1MnT6gl+ZVHcMifCk9oO1wrH6oDpW/ye1thiCymH0CFUXI+aCj1S7MvGIWx3+83azcV89q8Qu9kqb2oLSivHCrYisyEp4xMRw4TxohLDyEQ7hgPiZowUwLMhJQJPR0JtCyotOroaHc2Vf4FQMpJs2UHfyAAAQjMT+Dzz3/z+5n1sEMtacNaQUPS94Erq5P0y2UWkuoXUqtGqr9SZ1ksJWR9k1dyI+gp9ft81GXClqBlsSKFQlFpBIe9Y2vbsrt24LnyBqcjh3PDwfqTCfiNDVP6yTMhvIrLZHj4ZOgYfnYtdMwao2MUHVWF2LMrz47mUAUBCEAAAhCYhECHWtK4SD6fz/v9t30FLPnGB7kpb9evSG1goxWN2t9YRWO/uQ0aqCVtgMYQCHQk4Hc1x9+jOgaCqv0EdEPmV9j3w0SDfRTnq9X+blNpb1hlXYt2+oEf995rZRBvIQABCEBgG4Gpa0nbQmLUiQS0dTnRhw2mbRF8+/XuBjIMuRaBsJ27lvN4O4KAnxIj9KPzCQTsgzo/l1a1n/BsDSU2vbH+hOlBjBCAAAQg8FgC1JIem/ohgVNLGoIVpRBoIBA+G3/C/q2BytNFwhb36TiIfyWB9/tvmEKrqkgmvNLmVcUDGe7AV00kfkMAAhCAQDMBaknNqBBsIEAtqQESIhAYQkBXn21p+JLFEMpXU8qsuFrGzvd351tIoaTyev2cH9IhHoRq/uv1w034EPAYgQAEIACB0whQSzoN/S0Na99yrehs7cuniNfKGt4GAmELF85y+FgCfmJwl3vsNGgM3M+WXu1G0zcQ0xLI0HG53SCnhAABCEAAAhUC1JIqcDi1moAWUqtHnjpg0LJv6G+0D1V+ajYwvpGA3/jxax0bId5xGBPjjlntH5Me337CdGn393VWjbyaNGtm8AsCEIAABIYQoJY0BOtjlWoxei0Ctlzu/hHiILXGdqjya6Wvo7dWoWucCfrDkR0d2KxKl55NDL5bsZnk/QaGuXG/AImoIwG7B9ptpMu/jbfTjiGcripwO90fHIAABCAAAQgMIkAtaRDYh6rVpuVa8dvKr/uSd5BaYztU+bXSl/W28nuxjfKV+aB5rj3D+/333PJNiDcbI53PJBDelahM7GfyIeoSAasrhXuLbnqNjQfOt3DF8ZZoaYLRDwEIQAACVydALenqGZzLf+2x53JryZtBdZlBai2aocqXgF3gfGWfk3qvzVLYO2X3ABL+/f0T/sjRieUkH+8DN29pTunxBPz0eM5vIXsCtHcS2Py+0jNvR3pM8KTeOfEYDgEIQAACMxOgljRzdq7nG7Ukn7Ohi8ihyn0UF20bnxbnbdKGspE+WA4bIc1wXzaScFDSYr2LjLyyqL1vXfSj5OoEmCFXz+BU/n8+n1ArsTtP9t9wC50qkKHOBBqP5TAUMsohAAEIQOBcAtSSzuV/N+vasVwrMFvzdV/qDVJrbIcqv1b6st6+Xj+NlR0jmdZftFnyp0rYNfO9cNaxEZ1y1dwbYQKdlyagcmdpAl86Opw/nkC459i8yv7b/cF6fLDbLIaL7vX6OeXpsM15RkEAAhCAAARaCFBLaqGETCsB7ahbB8whN2h/lapNe7IAhPH1+iktxCuqWoandk1h2p/tMeGKe9/vV26UQshq7tJpplvsysnUrk5Jj3pS4e/3W8lIVr5jp9JRz0hHi6i6HAE/Sfia2+XSN5XDuhOGSZU9nMrzg50JoPQoOdgNzEEAAhCAAAQGEaCWNAjsQ9Vq5XSt+G0F3H2d59Wmn+Jm35oRQL8o//39k36e6ZWL9trhNjD1LTVnkqWvNgT5rBtBRj6PaJgDLQk1yWwu9Kmy9FSEv9+vYZTwiLiyOuVndkpkh9D5QALhMn8gAULuRSDMpewNX4+wXkavqCfcnHk16YpJxGcIQAACEKgQoJZUgcOp1QS0plw98tQBgzbhplbLbvupZiHKfgnLOu1XTv1vnabFjqzPa4f7Csjiz0j7ZXHw0GdP8UpGPYeVkwxyS1kni1Hh2Fm9xFEXVmY1/JiG8Jp7xxjFyuUIaH7Wp/Hl4sLhgwlkJ1K4C+nOqZvnwU7OYy7gAsg8qcETCEAAAhDYT4Ba0n6GaPiXgJZN/3ZdoTVoc+XX06GMIlCL9Q5VcIJko8/14Wk9S1uCUL2SntAf0mtxpTKKN8j7Q8l4bqV2oOH1+K/X+eHZIXWMGm7668LyPzgz+lBO8gW30aivrt9PlfQivXp0+H8AAd3lbC75WaRnh59mlE70gY2weGgHpAwTEIAABCAAgXEEqCWNY/tEzVpoXit4W+Rlaw17AklX216bVt6+M9s2yeBeu8+V4dlX7rXk9c6YksVFsI0NhTPTUzllApo8cqDSCDS8q/bTRelbYFkHrLOkTQ74EErC8j84M/RQRs3VobZQfgMCmtJs8m+QzYND0CcKmkXegfQsNyXjk5LJPiI9TNoQgAAEIACBSxCglnSJNF3GSe1sL+PxP47akrdUI9gcS12t1peVZaV9TaxSDKr7/Pl89M21IJndDFik2VPWWXHVj80Sy0aRlezeaRwshFAOs84ARw4EFHXhUya/Ua07pnBoQIAJwxzYRkAPLN0V08eB7oGSoWQp2p4JWISFBgQgAAEIXJoAtaRLp28657WULG3Op/P4+9USubvPizv8rEDp962De9mx33/C8dtFrV+zw0srWhulZEmJerINiVUawY2snkGdSrTfApmrJa8UiLlUF9bkH+R/Vq08zL5ilh1C55MJaJam3299MhZiXyQQHiuhKK/hQaz0iJH8cxp6AOmm7Z9Ez+FApBCAAAQgcCcC1JLulM3zY/EblfO9afNAC7tSQaFNTUaqXnrI/hV5D1COZfVkO9cOLy30TblCkifqyTYkVml0h5z1pNRpjnkf0h4/VoFYZ11Y8L2GoW25Z42htlB+GwJ+2twmKAIZSkA3N02ekrl2yZKGG/cHOP5JdOOoCQ0CEIAABG5MgFrSjZN7Tmhaa87/S8DhDaDuHxIaisp6MQhoofn7+8c7Y/1BTxhrbyRZp/1UkNJfGT6olqS/4JY2fFzy8LBGCi3t8c6Ip3XWhY1z6eN6r7ZX2/wJTvZSjp67EvDTJtxV7hoyce0kEN42qt/lgvBO03cazqtJd8omsUAAAhCAwPf7pZbENOhMwP82jfbe51YQQoSph4O+H6TwgwM6NAGDo1VmukyvFIP8VtBW8KuGD6olKcBVDQvTb3QrbR94u5U0I5UCkPyRrYpw9i2zdsc2SMo9P4s26GHI0wgwc56W8Z3xhglTemp4K/7W7ftpb4AJNAhAAAIQgMC0BKglTZuaazsWXvnRytJeVDm4tGTFo3QNZ78YMs6ZtHLhkyp/rFOHqlxI2E6F/lR52uM1Z4eXdgWmSg60F0ps4DakSlP6NlPas81EikglPB+s5+brjBVhIdrmWGp9sYcP/xcRIZAloGmcXg5ZeTqfTCDMFn8/rGPRDaou9sCzImMXYPrxzwOZEDIEIAABCFyUALWkiybuGm5bdSCsnGz9pH/1t9tVL9gWm4Zbo27Uvn83etuvGEMdxwK0szpVqSUFyexw1TKkUBgrw9trSeJZh2Zicy6OFYLIeJLBZ+2gAk/l1HOQcFASDPU9lCfzf5m0b+Bo20/AT57STWC/FTTcgMDmqaK74g0g9A1BZMTWP0362kIbBCAAAQhAYCgBaklD8aL8XwKq9Wj9dHBDDvzr0+CWBajyiq0XwxtbcsGvL7WyfL//qgKSLWr4TklquLflJVV4Km0jzXP55n+MKZThjKokFUX4zabv9/t+/5Vjkh/RsNfNZC58pTH1QT4LkbiltSEJ6zetJNz+if3+qFV5tEylQe03gYYbE2D+3Di5vULTvU5P6rX3GdPQy5876QkXYOlBfKeQiQUCEIAABG5JgFrSLdN6jaBU3PEVEy1bNzfCi04nsrAQrIyShqNihDxM15cqi0iVhK1H5Y9Q7pE5o1EaXlrCpvKmX+Uq6beG32OkOxAJp6UZhdOrUbFeqfWUyGe9ygpXlGeV7OwMidipjeFPIxAuE38beRoK4i0RCDeZbXfv9DFXMve0/vAc2Yb3adCIFwIQgAAEZiNALWm2jOBPnoDqEaXyR37Yqb3ms7kQFo6lKLJi6vTRmPKwCZSkcPlKVjq85Ib33I/y2mQi+GDyOusbQdW4Q29U7bq5LLrKEKm1RkVyxClvPct/hFF03omAn0Kl+8Cd4iWWVQTW3g9XKUfYCACZmQABCEAAAlcnQ1dKswAAIABJREFUQC3p6hnE/ysR+Pzz36LHjWIlPfatrtLZXv0tJYxjPKlE1OJkGO7fsQqn0sNVwunwbT1hB7Ihxm12GXUnAuGtkzuFRiz7CYTpwVsz+5GmGsLrgQe/3Jr6Qw8EIAABCEBgLQFqSWuJIQ8BCEDgTAJhm3emK9i+LIGwj6UiedlM9nc8VKspJPVH/D+NATVvCP4PDP8PAQhAAALXIEAt6Rp5wksIQAACRsB/O4ltHrNiMwEm0mZ0Nx4Yioy8LDM61+GzAW7po4GjHwIQgAAEOhKgltQRJqogAAEIjCUQPsfmdZKxuG+tPcylW8dKcK0EfIXR/mpn60jkNhGgeLcJG4MgAAEIQGAKAtSSpkgDTkAAAhBoIRA+xG4ZggwEsgTCJpa6ZJbSozrD7YUpcUz2w5XIN92OwY4VCEAAAhDYT4Ba0n6GaIAABCBwEAH/1gA7vYOg39eMn058uea+eW6KLFQ0mA9N1DoJhSoe8DtxRQ0EIAABCIwlQC1pLF+0QwACEOhFgC8l9SKJHhHw5SR10nggAT8TeDXm+AkQ+PNRwfEpwCIEIAABCKwlQC1pLTHkIQABCJxDwNeS2Gmck4PbWfU72M/nc7v4CKiJgL+3vF4/vBfTRK2rECnoihNlEIAABCBwBAFqSUdQxgYEIACB/QTY9u9niIZAwO9gqSAEOA859HOAQtKJSQ+J4AODE3OBaQhAAAIQaCFALamFEjIQgAAETiYQfs3kZG8wfxcCzKu7ZHJjHGECvF4/vJ62EWWPYeGHkygn9YCKDghAAAIQGEWAWtIosuiFAAQg0JGA/8iaDUZHsKjy77sxtZ42H3z2X68fJsC5E4DS3rn8sQ4BCEAAAqsIUEtahQthCEAAAucQ8Fs+Xhw4Jwc3terLlHzN7aZJzocV3oIh+3lMx/am5aRj7WMNAhCAAAQg0EqAWlIrKeQgAAEInEjA15JOdAPT9yPga0n8Aa/75bcSkb+r8FJSBdTBp8jLwcAxBwEIQAAC2whQS9rGjVEQgAAEjiPgtxa8O3Ac98dY8hOMbzk9JO28lDRtotNXk3gXddpk4RgEIACBJxOglvTk7BM7BCBwAQLhtRG2+hfI2dVcDGWFq7mPv6sJUK1YjezYAeGS5COEY/FjDQIQgAAEmghQS2rChBAEIACBswiETcVZbmD3xgRCZYF65Y1z/f1+Q3maOsWc6fZvC/INxDlzhFcQgAAEHk6AWtLDJwDhQwACsxPwOwp2fbNn67L+Mc0um7p1joe64ev1w/en1hE8SppMHUUaOxCAAAQgsJEAtaSN4BgGAQhA4AAC4Q0CXhg5gPkzTYSZ9kwIT4jaFw1522XyjIerks8SJs8X7kEAAhB4GgFqSU/LOPFCAAJXIsAX3K6UrSv7Gl6CoGp55WQWfQ/3E2oTRVLTnAgXJu+RTZMZHIEABCAAgS+1JCYBBCAAgXkJhJcI5nUUz65PwE82aknXz2cmAp9iXkrKAJqyi6xNmRacggAEIAABaknMAQhAAAKzEgifSLO9nzVRN/ErvLRyk6gI438EQn55Kel/YGb///Ag4NWk2ROGfxCAAAQeQ4D3kh6TagKFAASuRiD8WMbV3MffixEI843a5cXyV3U3rUdUxTk5FwHqgHPlA28gAAEIQOAfAtSSmAgQgAAEJiXgv9rASwSTJulebjHl7pXP/x9NWkjib7ddLtH+2uT7iZvTp4r5Zg2VgZYjqvAVRJyCAARuRoBa0s0SSjgQgMBNCITtH8vTm+R17jDC6w9zO4t3rQRCWrmZtIKbSS48Efim27bkUEvaxm3QqPf7r/2vpN/OWpHu9/dPvQj+fv/VvY67XAkp/RDoS4BaUl+eaIMABCDQh4CWvLaK6qMULRCoEgizjuV4ldY1TvI+yzXy1OBluDx5WbWBWRQRw3iixzHvJa2i6G9N2YEqDHnJ7LRPK602JCuctUUnBCCwjQC1pG3cGAUBCEBgLAG/eGJLP5Y12h0BP/FYiDswl2yGzRgJvWQWndMqhbBVdlRWNAVwxZhmUUsKz+sWYOHWlA4xgd/fP+Kp3L1eP15ehSS9uPT5fKRfw/0Q2hCAQC8C1JJ6kUQPBCAAgW4E/JopLJu62UARBHIEfC2JuZcjdKW+kE22VVdKXsHXkNOCFN15Anq25k/v66WW1M5vcRqbQFCo9PlbmTqDsEyEfg4hAIGOBKgldYSJKghAAAJ9CGht9Hr98CpBH6ZoaSagJTi/ydLMbEZBfTJvCeVOMmOS1vuktzBI63p4Xz1bN4xdHGIZ8WWOxSHPFNCtqZQO609vWZr8/lQJu5TXf2XpmSkgagj0IkAtqRdJ9EAAAhDoRsDWRqUVUjczKIJAjoCW4Py5qByea/Rp06WbyTX8xssGAtqKn/uM+Hw+7/df26hb2xzz30vKRmPCmpnpry+bgJQHJam8CdRHmYxubjoUzJLa7/f/KlASsw94suWJUjoah3sHPCLfH1D4wMXT+KceejcWc5Q11KXT14lCOqS/RPL7/SpMEy5psLMVPbJFAwIQ2EOAWtIeeoyFAAQg0J+A1ka2DOpvAI0QqBIIZYiqLCdnJBAyyPtlMyZpn0/aUZ+4W7ZHlVV8gj+lN2p9iSQdovKHJrB//cSA6fmYvv6jU9KTMpbM9/v15SE5k1rUqdBIHTCB0B9G6TCIqUpipSuJqZE6ZtFlowhfTxZPabNGSWfKrVePPLEc+XTIhGTU4xsaYhos/BSmDTHh48P0DtOGwL0JUEu6d36JDgIQuB4Bv9pjDXS9/N3CYz8JS8v0WwR6zyDC9pLbyP3SrP22LtVKAWVQ+NqohxcY/fQLpuWtv6v492UUhSSDBpUS0lldGuI1aLgJyw1f5Aqa09ejFKC8NRNBp3WuHR6KIz7R8lYRyZNwyh9KQ+i0sSFYabaGXvWyd6Pq/wYaQZUdmlFJKh1eONspAZ21cLLMU2H10IAABPoSoJbUlyfaIAABCOwioHVSfYW0ywaDIbBEIMzDJXHOT0Qg5C68oTCRo7iyj0BIdL0osM9UfrQc8EUKE83WONSpUoLXa488H4X1BGF748lO+eGqmPjOtC2fsy/r6WwwmurJPqCznelYvYIUuNnw9IJVaOFUo7eGPdj6fr9Sm/XQOmVCvlUaqYmg2bT5FEu/l8x2SkBnzVyduYQ1nAYEINCXALWkvjzRBgEIQGAXAa22bYW0SxeDIbCVgLYZ9ZX6VvWMG0UgJM5v20aZRO95BMLz4uB0VzbqOuXrCypDZIFpiM6mRRCb3vZ2TCgG2fBFAqkVmbNG4x3P9PjoShWioN8O1w7Pomt01cSybixq6PheUpZ8e6f81xBqSWJCAwInEqCWdCJ8TEMAAhCIBLRkDN8aiHIcQ2AwAabiYMBD1GujtbhLHGIepccSCOkO762M9kXWU0M6pWqLelJh60kFrEca9ENCqiVlT5X0l6wE+dSNIFC5MbZcdNKfPuIrw2XUO2OdvifbroilhLMa9ncqap8yJTTMWwln7eqsqapAK+nPqqUTAhDYRoBa0jZujIIABCDQn0B4pyCsuvrbQyMEygTCKw9lQc7MQkC7LNtfLb6jMYvf+LGDQLhOj0y65lvW/bDJrwubhsUhFqy+n+WDtbGL301bdCMr8Pl8AufgatZ/Ydk53CuXTnMgVGF0Vg2JVRoHrDSMns+XeZilne1URDpLLUlMaEDgRALUkk6Ej2kIQAAC/yGgRZIt+/5zjgMIHEsgzMYD9hvHxnc3ayFfi5vMu8X/1HjCJxDhm19DqWjKZa3YU0z3jbqwaQhD9K0x6fd/Hs4/JQVBkqXGohupgKpIv79/9OPT1qnoSv77vxa3bbgC8fGKzOJlbqPq/4YoZLFXQ0g9ASMptgK7+DKRtJnbFlopBAn3igU9EIBAIEAtKQDhEAIQgMBpBPyCL/0E7zS3MPxUAkzIq2Ree2mlbPEFjauEhp8tBJR3a7QM2S9T36ibJ9rk14XNmTBEhZhs1cArtLZsVULzo7JiQUBgwwWVtZj6L23bhnsPTbl65Jh6so1GsexYe/9LVZ7FRohROgVBzlQaeumsVCZT+cn0Z4t6Ml0/KzEaEIDAZgLUkjajYyAEIACBngTCbrBlWdzTPLogkBDQqt2W/sl5OmYhEDJFJXqWxBzlR3h8HPN2kmoE2SjtpqEHmTxUTxiV1Wad7/dfDdco9egbZKVahoYsvvMSqldyKfVZjnnlIWS9PbR5eKpcPfKtHrXENHBVQ8Mr1R+dSsNctCX9QTIlKQGZs56SBjtb0SOFNCAAgT0EqCXtocdYCEAAAt0IaElkq59uelEEga0EwpzcsFXYaplxKwiENJU+z1+hEdELEjh+Gshilla6jVcVIFv+sHpoWgaVHv8FN7PoTzVOe/mcvZv5+pQvPKXC2Rde5I+ApD12qnG49KgslfakxLyMBqYhBLFTDpWOYN3609CUIB9OCXJJebDFIQQgsIcAtaQ99BgLAQhAoBsBWw/Zv+kSqpsZFEFgDQGm5RpaJ8hqc6VMZTfqJ3iGycMJHPx6Wn2vbhPS7/kln742Jc/T2WunssWXyqkSe+9DeM6+33+l0IZLOEjqovPRZas22Qd6+3AfhanyPSX3vIyviKVsg+TxhwohmK4jCnVDy1r4u3jSHHIUDHEIAQjsJEAtaSdAhkMAAhDoQEDrnnT93UE7KiCwlYBNSP27VQ3jRhHg1jGK7AX1hskQttzdA5K5rObss0x3Eu+bOrPbflnxQ8yiP5UdmzpmQ/xAk5EPoSShfulXT5DM1pJkSMPV0zLc+292fY8s2imZSCW9z15D6oM/e0BbNFJbOqW8K4pUWKcMQjo2HUIPBCDQhQC1pC4YUQIBCEBgFwG/9Ek/s92lmsEQ2EGAmbkD3vCh+vReW6kJXz0YTgEDjoDe0bApEV6ocYIdmro5ZHWZAypwmEw6YzV1S67KimoKMue1qbPeMG3mVWCVddhb966q35tLNXgPNwxPlfse+5nqbBRhFZF1w/wpYQ+GBh1mMZot/QyWuFkje4uTnhbhQbGgFgLPJEAt6Zl5J2oIQGAuAmEBNJdzePNsAn5yhp3hs8GcH71PTbrTPt8/PDicQFo1yO69u/j1+Xzsb3tltdmprHUNtPdi7Ke1s0qsc9FK+33JTMsr01x3w4b8/v7Rn7T3f+DMu50Needw6a9AaORpGqz2ZO12bnKjb0Oel9TKZ2socVn5IJyVoRMCEOhLgFpSX55ogwAEILCaQFj9rx7PAAiMJBA+8h1pCt2tBMJNI7yG0KoFuTsSSOfGHaMkJghAAAIQOJ8AtaTzc4AHEIDAwwn4vfq5L5w/PBGEXyLg33+pfzJc0kB/XwLhiy3cN/rivbo2/0xJ//zZ1aPDfwhAAAIQmIQAtaRJEoEbEIDAcwn4jfrp75w/Nw1EXibgt6ZM0TKng874dNjd4yDDmLkOgTBJuGyvkzo8hQAEIHAZAtSSLpMqHIUABG5JIHwf4ZYxEtTVCTBL58lgyAXfbpsnNbN5El5eo5w0W4LwBwIQgMDVCVBLunoG8R8CELg2Af/pMWv9a+fy1t7z9twk6fV3jNP/pPckTHAjSyBMFX6dPUuJTghAAAIQ2EyAWtJmdAyEAAQg0IGA/+iYWlIHoKgYQ4CJOobrOq28lLSO1+Ol/WXLDyc9fjoAAAIQgEBnAtSSOgNFHQQgAIFVBPzrHqsGIgyBIwmEdxyONI0tEfC3C15KEhYaJQIUH0tk6IcABCAAgf0EqCXtZ4gGCEAAAhsJ+J0hf4lpI0SGHUXAT1feoTuK+r92wjsmpOBfNLTKBNJyUlmWMxCAAAQgAIEVBKglrYCFKAQgAIGOBMISn51hR7aoGkEg1DJGmEBniUC4XVB6LoGiPyUQrlwmT4qIHghAAAIQ2ECAWtIGaAyBAAQg0IFAWN930IgKCIwkEL7mRvVzJOyo278Uxo8oRzocLxEI84eLdwkY5yEAAQhAYJkAtaRlRkhAAAIQGEHAL+75oHgEYXR2J8Ck7Y50UWF4I+n1+vl8PoujEICAJ8As8jRoQwACEIBAFwLUkrpgRAkEIACBdQR4xWMdL6TnIBDm7RxO3dwLX7/j97ZvnuyR4TGRRtJFNwQgAIEnEqCW9MSsEzMEIHA6gbAn50WD0zOCAy0EmLctlDrK8DpJR5ioCl+s5ptuTAkIQAACENhDgFrSHnqMhQAEILCRQPiIeKMWhkHgcAJ+6rIXHY3f0+alpNG0b6+f0uTtU0yAEIAABI4kQC3pSNrYggAEIPB/BMKCng050+JCBMKrDRfy/HKuBtT8qtrlMjihw+Hpw++4T5gjXIIABCBwFQLUkq6SKfyEAATuQ4AvCt0nl8+LhNl7TM7TPT/fhD2G/O2tUKO8fYoJEAIQgMAxBKglHcMZKxCAAAT+JeC/t8K7Bv9yoXURAn4C81bdoKR5yPzttkGQH6s2zC6u4sfOBAKHAAQgsIcAtaQ99BgLAQhAYDWB8LoBi/jVBBlwNoHwXsPZ7tzQfiDMXeKGOT41pPAYolh5ajYwDgEIQOCqBKglXTVz+A0BCFyUQPiK0EWjwO0nEwhzmEpH38nAOyN9eaItS4BplsVCJwQgAAEItBOgltTOCkkIQAACHQiENw46aEQFBI4lEF5qoJbUEX9gywsjHdmiyhNgpnkatCEAAQhAYAMBakkboDEEAhCAwHYC/tPg7VoYCYFTCfhpzJ+C6piKAJY6XUe2qEoJ+PnGj/elfOiBAAQgAIEKAWpJFTicggAEINCZgP9yEAv3znBRdywBvwvlT4x1YR9eWuQW0YUqSioEwttJTLkKK05BAAIQgEAgQC0pAOEQAhCAwEACfq/IGwcDQaN6PAEmc1/GYVfPt9v64kVbiYC/kF+vHx5MJVD0QwACEIBAIEAtKQDhEAIQgMAoAv6lJL4WNIoyeo8iwHzuS9q/50UhqS9btNUJhLlHOamOi7MQgAAEIGAEqCUxE6Ym8H7/DdsVW/FY/9Su4xwEEgJ+vc5XCRI8dFyPgJ/S7D/35C+8G8L9YQ9Mxq4lwDtxa4khDwEIQAAC3++XWhLTYF4CfpdSas/rPZ5B4L8EQlWUjfd/8XB0SQJhVl8yhgmcDhh5aXGCnDzOhbDK4gn1uBlAwBCAAATWE6CWtJ4ZI8YTSD8is+/wpwtuvggwPhtY6EMgzF5+q7gPVrScSoBZ3QV/eCmJbXwXqihZRSBdd/GQWgUQYQhAAAIPJEAt6YFJnz1kv6D5/f2TXVW/33/94jsrM3uc+PcwAuFT34dFT7i3JeAnNrfiDWkO9TgYbmDIkC4EwlTki5ZdqKIEAhCAwI0JUEu6cXIvGZpfyix+Jvb5fFRRYv19yXw/xmlfIeUP5Twm7Y8IVDdhKyqtipnNqn/kvV4/AFk1fxDuTiBcztsm5LZR3WNBIQQgAAEIjCZALWk0YfSvIOBX1YuFJOnV0ofli5jQmI2An9t8MXO27ODPHgLb5rZ9EvDwm3YoMXNn2DMPGduFwP45aTeELs6gBAIQgAAEJidALWnyBD3LPX1Xor2QZIA2D3wWX6I9j4CmKK8enJcELI8isHZ6a7/68PdJPTcKSaNmJ3rXEwgzs12BLu32IUhCAAIQgMB1CVBLum7u7ua5PtzesLvQ2Id/yn23OXGXeLS8tgX6hhl+FxLEcU8CejnUZng9SN2uH/7XygI0Hl71acPZIwmEZ1Z7oVOz+khvsQUBCEAAAmcRoJZ0FnnsRgL6HCyeaDveObzNCFIQ2ELAb54fvn/ego8x0xMIM7xSLdWNuqXqNH3c2x0MxLgtbEfJyDEEwqVauahl3w9RJw0IQAACELgxAWpJN07uxULTKmSb31qar/1+3DZzjIJAOwF9VPvw/XM7MSSvRSC8xVDadoYLoSR2rdi3eRtQ8FLSNoyMGkcgXNSLryYF+XGOoRkCEIAABOYhQC1pnlw82hOtQvZQsI36k/cne+gxdhwB1Un5C27jIKP5XAJ+kqdv2fi/uSnJx9b99cmHUJybO6xDIEsgTNRKxVNLOKZ0liSdEIAABO5KgFrSXTN7sbi0ZNnjt33SSy1pD0PGdieguW2L7Mfun7uDReFUBCrzPN1n2rUwlf+HOZPS4J5wGHwMrSXQ+AJdEEuryWvtIg8BCEAAApcgQC3pEmm6v5Pah+wJ1ZRQS9rDkLHdCehz2ifvn7tTReFsBEKJRPdh3dvDhVB5x2G20Pr6E3bdAtXXCtog0IVAuK6z33TLXuNdrKMEAhCAAAQmJ0AtafIEPcU9rUX2BMx7SXvoMXYEgbAQH2ECnRCYhIBu41Y2CpM/1JIeWENJgfBG0iRTFzcqBMJ1Hd45Smc1n5pUYHIKAhCAwM0IUEu6WUKvGo6WI3sCsBXMA7coe6AxdigBvwp/7IsYQwmjfCoCoWBUOXxgGSW8kcQNYaqpizMVAv5B9nr9+KlbusYr2jgFAQhAAAK3IUAt6TapvHwgWpFsjsQ0UEvaDJCB3QloVvOr293ZonBCAmHP6ed/aE/o/FCXUjJDzaEcAn0JZK/fdFZLrK91tEEAAhCAwJwEqCXNmZcnerVzCbJz+BOJE/N4ApqW2Z+ZGG8fCxDYTiD7x9f8lN7T3u7WNUfyUtI184bX/5+AXh7XVZ/26FT4HhwQIQABCEDgrgSoJd01s9eLSx9w+denG8PYM7bRBGIQWEtA09JW2GuHIw+BGQjUd4x+99je3nCTnwHFZh/CrYCd9maSDDyRQDqNK5f8iX5iGgIQgAAEDiNALekw1BhaJqB1yaqf0vBbnVUDlx1CAgI7CPg3Efjq5Q6QDD2fgL/N6ka9ufGoyyFFx3Pq/AmNB5sI+Ida/fLfpJ5BEIAABCBwMQLUki6WsHu76z/1alxt+2X60z7rvvdkuEF0fql9g3AIAQLtO0k/+dP2o2pJAdqjYueSuROBVV96ZZ7fKfXEAgEIQKBEgFpSiQz95xDw5aTFtYgvJC0KnxMPVp9KwO+fqXI+dRbcMG5/i/aTfFX7hlwKIVFIKoCh+xoE3u+/2y55lmTXSDBeQgACENhHgFrSPn6MHkDAV4h+f/+833/DO0qfz+f9/uvX6EFggFOohMAKAn4O8xfcVoBD9AoEwvReVUUy4StE2cHHAIqacgemqBhPYHP9yN8KqCWNTxQWIAABCJxPgFrS+TnAg5TAqs/BWLKkAOk5l0CYwOc6g3UIdCcQZrjfQ7a0u/szp8KAYk4n8QoCIhBm7J5DFmaiSgMCEIDAjQlQS7pxcq8dWss3839///BG0rXTfFPv/Utz/M2mmyaZsL5hnjfuPB+yyQzlNl5K4oKZk4C96N148baLPeQyH5FTlrUjqKITAhAYRIBa0iCwPdWGr3Q9aklqsYdFub2AzeO25yRDV1cCfsHNkrorWpTNRWBDOWmuAMZ4E55ZFJTHYEZrBwKDaknM+Q250cphw1iGQAACEDiFwOy1JKsarP33TlWG7Er9lLlyulF7yp7uBg5AoE4gbCPvdDuqB87ZZxIIE17boVLj9pTCzyS9Xj/cBG6f9BsE2L2odAMmB4ege+bBdjEHAQhAYDOB2WtJurGuatzmRQC/RrdfobbfnN6c70sPtDlw6RBw/gkEws3qCSET48MJpNWTcBX4w9uzCp8A3WZBcvvEEaAIhD9v4q/f9ra00WgkILaN8ohBAAIQOJ0AtaTTU1BzQM8VFqPf79do1HhxDgJnEwibaq7csxOC/YMIhJmvh1do3P6KCIWkR30n/aCphpmjCLT8bGW4wP0hr+OtTZTorR2IPAQgAIGzCMxeS8py0ds6916VPiTMbIqznfaUzZ6iEwKTENBla9OVxfQkecGNYwiESoq2Rmrc+6mdFtS4Axwz8bAylMC215TufbGPAK775Ajl6IQABCAwggC1pBFU++jUppTnsQG1p2wfuGiBwBgCWgsyXccARuvsBMIlEA7v/Th7VLCzT0T8601Ai9Iwz0uH977Ye9P9P30iOUI5OiEAAQiMIEAtaQTVPjr12OZ5bEDtKdsHLlogMIaA1oKv1w9fbxnDGK1TE0jfzfEXxY0fZ2ngvJQ09UzFufUEVn3r7cYX+3pyTSN0q2ySRggCEIDABASoJU2QhIILqiUVzj+um1rS41J+tYB1zdpcZSV9tQTibx8CaVVFe6QbXxSKkUdVn2mEllkJtP/Ft1kjmNQv3UMm9Q+3IACBMQTe77/X/fDptrUke9T5Zev7/Tf7R9AkqT+U5kelc8b0eBn1mIaW2aAhasiQ98eeK5IpTTUvYO2SD1IuAZO/xAsULNA1SWjMSSD8WMycTuIVBA4gUCon6dFzgA+HmUiDvWWYh/HE0FUIhI9PVApR4yqBTOIn3CZJBG5A4GACtorwtYWDHdhj7ra1JD3hvt9vWOeJV+jXTdwapYxKLNWsU5XSjByTsBrmWEXg9foJXlVCCJJBuZ31W19hmbZhoKZ1D8cgoGv59fqBBgQeTiD7eLolE3/hp4/pW4ZMUBAwAvVvvWUXoqArEdCdpCRAPwQgcFcCdvnbWynXivH+taR0OasMqWrj3+vx5ZXsR4u61wfNfmDpp1Jk0ZabZtcU6onrZWRLDYl9v18v6UPIClvUGpL+VQ5hmbZhcU3rHo49nIAurtLl/3A+hP9MAuHJeD8IIcDKJ0n3i52IIGAEKhUlELUT0Oq9fQiSEIDAPQiETUS2BDFnpPevJWmd56swSka20xeJJKmG7vWmOSTbT4Wg3J+SNjWCHl8qkoxvKK7sylVng1r5IIHgpDcxW5ta0mwZwR9PQNcULyZ4LLQh4C+Nm9HwqwV7QoVn7s3iJRwIVAikH1K+Xj9cERVi4ZT2F6GfQwhA4PYE0uVEdoM/IYf715K2FSAqN3SdKu0YvYBPueo4jeUbyXslastKVpvGhrPqt+HhrJTP2TCf5/QNryCgS5IvuDEZIBAI6OoI/Vc/VFzWuNYj9erw8X9OApdeZ56LVPeTc93AOgS2NjAYAAAgAElEQVQgcAoB3QF84xRPVhl9RC1pw6ci/lkYgC4m2I/1ptXfuNyUfHDAv7JUqVnKTz9cOq/4NRyLyIdDGwKTEPBXFrWkSZKCG/MQ0KtJ87i035P0U0T/xN+vHw0QuCgB/0BsXPFeNNK+bmfX7X1NoA0CEJiWgL9z6m5QenNlnijuX0uqVFsqafDpDGLKbuUBmZXxOltWnJIPDny/X63LKz5Ixg+XztNfPPaeCNeIRgWRJ0P70gT874Wd0vZT1/9FyFOcwSgEJiRg18iEjm12yV/19vHMZlUMhMDNCGgJygOxPbO6pVx6PYbzEIDANgLpB1S6J2gFtU3z0FH3ryW1lBI+n4/d60PO7DAkQDIVzVmZMEUqw82iqi3Bge/36/WXnlJ6kPvh0nn6qxNiXvI/7beo0/56T0vZziPq0hb8xSx7cz47SvGqTI3TsCoQ77za+zVUUJQCl3UaEIAABCAAAQhAYH4CfmVo7ZLPqWSpp7RMKsmn/fs1hH2QgkptlXr2a/Cfx8uBta9++IFqD13lpkD2p6OkoT2QUjr2a0jjrfRoz6VcrE3ofg3etG9X3A6nSunw2qz9fv89ZW8bHNbh02tJlb89oeQJljXUX7lUKjJhvlb++J9mVXDA15JkqNLwfkpnZVuempukx2KcxJm6G+Ls4deH2NlsHlsGmozsBj37NawKJFi3w/0aKpO2FHjWEzohAAEIQAACEIDAnATSNVvJz1Sy1FNaJpXk0/79Gkr7l9RWpSeLoiKfnsoGsn+Nul9DZZXbGEUXDfsD2a8hjbfSsz+h+zVkp2WXdKSaqSVVJkPrKaW8MllbZHw9VW/hmhMans4DJbVivS7jlUsyLTFKLOWiUS0NP1w607i82JxtC3ZO3/DqXAJ+YrdcFMhAAAIQgAAEIACBCQmcu6DCOgQgcAoBX5dI70uVt09O8VZGn/tekt98Vuo4ac1F2d1cSzL66StRyoo15GHo93X99FS9RzrTuOoDZzhr5GfwBB8gAAEIQAACEIAABCDQi4D2F70UogcCELgQgfDVJd0QKgWHGaJ7bi2pnqFKzaU+0JLaIhMk0+92yod0orTrD2Olk1pSIMMhBCAAAQhAAAIQgAAETiGgtf0p1jEKAQicS0B3AN8416UW69SSftKXkr7fb6XmogRXyoQtMpYe/z5bUCgf0kS26w9jpZNaUiDDIQQgAAEIQAACEIAABE4hoLX9KdYxCgEInEjAFwTsVrDtL9EfH8JDa0mLJZWKgO71ofTjk9ciI/mSsHyQpBo6tbYktHmgTJ/YMFAnOoBpCEAAAhCAAAQgAAEIdCeg7UB3zSiEAAQmJ+B36L+/f7JvuswZwkNrSb74l5aE/Nm0WKN7fTpQOW6RWRTWrJKkGt7DVWVL6UzjkvJpG9SSpk0NjkEAAhCAAAQgAAEIbCagvcNmDQyEAAQuSsAu/2l/YLtC9aG1JP/z1a/Xf77m5ss02eKF7vVra0nv91/7n8+H/50t3++/Zxf67dBXhbIz7/3+m5aZ/Kis2pk7s+mY2WF8gwAEIAABCEAAAhCAwCIB7S8WJRGAAATuRMCKD5XCwszBPreW9P1+fR1Hd3Br+IpSyJ8kKynPyqgz20hfZlPdJzigQwlkFVqnhK3hh4RT8x9mI5rfbTyEAAQgAAEIQAACEIBAhYAW8xUZTkEAAvcj8H7/TesAVwnz0bWkbDlJ31Es3dPVv7aW5Os4UmJ/vi07gSRfn0wS8zqtnU5NL1xXO+FZC2pCx3AJAhCAAAQgAAEIQAACmwloGb9ZAwMhAAEIHEzgkrWk7owOLlKooNM3ED2EKkWuvhYP1nZwmg6ODnMQgAAEIAABCEAAAs8koGX8M8MnaghA4IoEqCVdMWsP9Zla0kMTT9gQgAAEIAABCEDg1gSoJd06vQQHgXsSoJZ0z7zeMipqSbdMK0FBAAIQgAAEIACBhxOglvTwCUD4ELgiAWpJV8zaQ32mlvTQxBM2BCAAAQhAAAIQuDUBakm3Ti/BQeCeBKgl3TOvt4yKWtIt00pQEIAABCAAAQhA4OEEqCU9fAIQPgSuSIBa0hWz9lCfqSU9NPGEDQEIQAACEIAABG5NgFrSrdNLcBC4JwFqSffM6/2i0h+/+/39c7/oiAgCEIAABCAAAQhA4LEE3u+/9r/HEiBwCEDgcgSoJV0uZQ91WB/XvF4/D0VA2BCAAAQgAAEIQAACEIAABCAAgQkIUEuaIAm4sERALyVZRYlXk5aAcR4CEIAABCAAAQhAAAIQgAAEIDCKALWkUWTR24uACkm/v3/Ufr//9tKPHghAAAIQgAAEIAABCEAAAhCAAATaCVBLameF5AkEPp+Pvt1m5n9//1gP5aQT8oFJCEAAAhCAAAQgAAEIQAACEHg8AWpJj58CcwNQIenz+ZinvrqkzrmDwDsIQAACEIAABCAAAQhAAAIQgMB9CFBLuk8u7xeJXkEKP5Ckb7qF/vsRICIIQAACEIAABCAAAQhAAAIQgMBsBKglzZYR/PmXgF5K+rfrfy2d4ptu/0PC/0MAAhCAAAQgAAEIQAACEIAABI4gQC3pCMrY2EBALyWVqkVWTuLVpA1sGQIBCEAAAhCAAAQgAAEIQAACENhMgFrSZnQMHEhAP4pUKiR9v98WmYEuohoCCYH3++/7/Zef8UrA0AEBCAwk8Pl87OYz0AaqIQABCEAAAhCAwH8JUEv6Lw+O5iDQ+M6R3l1i9z5H3p7uhc3bSgH06YCIHwIQGEBAvyE4QDcqIQCBWxGw2wULlVsllWAgcB4BaknnscdygcCqClFj1algim4I9CTQpZZEYbRnSgq6gFwAQ/clCfSqJXFdHJB+IB8AGRMlAnqj//X6ycowP7NY6IQABEoEqCWVyNB/DgGtiRs/M1l8Lp4TBlYfSWBnLWnn8EciXx20QS4to1erYwAEJiCg5+Y2XzS88bG7zQqjuMMzB2YgYPMw/bFR5ucM2cEHCFyOALWky6Xszg5rRZs+5Cph6z2mVaMqCjkFgW0Edi7Fdg7f5vPTRhlkaklPy/u949Wjc1uYGk4taRvAxlHc4RtBIXYKAebnKdgxCoGrE6CWdPUM3sp/bfPWrmg18FY4COZqBHYuxXYOvxqtc/zlXnEOd6yOJKBi0DYjGr72ybvN3GNHcYd/bOovETjz8xJpwkkIzEaAWtJsGXmuP1rObni9iFeTnjtvukZufwupcUOVCleWYhKuKK8M91Hu+ZtNLW5kbdV/Q0Eu1cVk3Zvo2zZPKm4Y5Pp7SQf42TdqtN2AgM26ytRVjLrcdDPR01MyanjhknINl0IND43Nl4YGLpowi3K75PMqMVkP4fQ9NCsVnS13eFNSj7piglO9CLTMmcZZGlyqpHhxCnlVFQ/NsbWzqGV+egdoQwACEPh+v9SSmAZTEPA/e7T2+WcBaIu4bfgUFHBiHwHNgVRN9pTtoGxvo3KkJEs1TVulScwapsS3zYfP55Nqfr1+woYqaNNhENOWTwKv10/LhG90Q9wa5dvFvMPW/v39E6L7fr8SkydqKHb1fL9fn0EJSEnQr/60IZ2pknrVSQNpPJmApk2YcsbE5ls4ZZ0mkN4igrDYZq84f0eSpK6OMNt/f//4O4Y8D2Jh2mftlu6Q3ofswPQGqCE+Fu9SaivreSqWsi1ZN3NZ8vJEfupmZT2plUbIMpcNXGe9XdpDCZRmrE/o9/v1S1ZNj3BxmZ82Ud/vv6lmTdf0VDb1Zih7aZt76SySCQ9NDnsP1ekbfhRtCEAAAlkC1JKyWOg8moCWYnsMd1GyxwHGnktAa6DUjewpLfJs5lh14/3+q4mUrsP8CjLIa5RfBcqEPkKUmF+b2llzUmpt9alYNFCqFJRXJXnfaHTDhmRjNA1eZ6OY3LYtnI/09foJhBWRN2RtcyBscRWXWRE66fH6g2lhVL5kwp/yGlKv6IGA39ppLnksNhvDKevURVSfuqZNwv5S0sw3hcGu1PrJ76e0bT51kXp5qZJdf9bMeVWS9w1dobqmZCu9a8mQ3Rk0JFR/GsVkyOMyt9M7j2pDIU0Wi0b50ATcDJm33qgCNMi6vXiMkpEJRZ0tTHgHaHcnoBz5OWOdspWdftm82xBdApbiME/sCvKnNBPSi0ti/gKRvByzCVZxSUPMw8r8VNQ0IAABCJQIUEsqkaH/OAJ6fmtdtc22f5Ru08CoSxMIKyQfS/aUJl76do/mUiheSE+Yq15VdjfindEiz3e2bGbSxaXsBlUth1k3FHhqy+tcKxZwfb9fWfe4hNfbsnY2UnUGb+VemtmKCTvl/UndoAcCKQHNw+zkyc4rzcN0imYvDd0fwlT3l1K4WaV++uvCn23xP72Es3F5taW2AvQC3rfUliTXiqW4SsFWwlGy5IbSkZalpD81XTKhIdn5443SHkdA0zJNnDcqsXSW6pSXV3KDWgmnU0jzLZjI9vsrIpgomZYe76emNJMwYOEQAhCoE6CWVOfD2eEE9CAMT8FthvXsDM/gbdoYdS0CpRWSFklhr1WfLVrqaWklefV4PvWzXlJz3nfKyVS5NGdntUWdPRX0h8OsGxb14sXYKGa+pRGF7wjIsUoGBUHC/n2QNHzJB+sVE5tJepdoP5BAabIZiuxVYJ3ZC00Xpr9fad6mU123Di9fyoJua16g4r+dyvpZOeWVp20F6E813lLkf5aDFAqXenxDSnxnNk0mkNWmztQT8fT6laZwR6rfx4IGDgcR0JzMTnUZVWbTJPqHmj+rIek8KU0hDfF6NH9SDyVfMaEQpCe9XVQuAT+cNgQgAAFPgFqSp0H7BAJ6mvaynV0m9lKOnpkJVOZS9pRWYNmg0sXl4m6nZSlmr7ibZLBbGl7307wKi86gOT0suWE+pEvSoKFFTABL2kyJX9GmPbKbhZDttCE6FchUTNgpvloi5jQaCZQmmw23eZWdh6FT5qTQrh1dSuk20oZIXhrSRvg6mxfQ8NQfO5X2+52zV7XY7nLnyfoj08JVElO8GqINdnZI9qaR7TSFWf0VE5Ln5uMzcmRbKSg9rcwZLS9LYunFLs1pOJUplOppmT+piaz1kt2s0VQnPRCAAAQ8AWpJngbtownoOZddwG3zZoTObZ4w6mACpRWSFmG+bOE/DS75GRQurrQqAlLlG8FuabgfUmo3XkHZ4XJD1456so2OYiFkuZfazRrNdmpsUG79LSZMRnpoQKBOQPMwexlW5mFW3mz5UXX99VuZxmrmp9NbMqk/YVT2sA7HhxOGa6AcUE+20VHMPPHxpj3yQW6rp/RMkYAN0aE1WkyEH4cKGjgcRCCb4tTWolg6RdMeqa1oy06VbGfj5S+jlalb0u/H0oYABCAQCFBLCkA4PJRA5Sm7xw99drRHCWMvR2BxZXZKLUmTXO6pEQiXVnKSrzT8piiotcMWNyST1aDOjmIhZAUoW2pkjWY7NSQot/6KifDTM2zqRJJGnYDmYfYyrMzDrLyfqCZQ11/aTKZ/HEqTv3QnTP3xQ0rtRjjpcA1UgOrJNjqKmTM+3rRHPshz9VQ25CZjQ7y8hnijEtC7VDaQF5RE5phGNsWp6UWxdIqmPVJb0WanwlTJdpYuf7OStV6yW9Ivh2lAAAIQSAlQS0qZ0HMogfDHqrrYtpf5u6hCyYUIlFZIWsSXdlClGIPCxZVWKqCyZnZRGOymw01AbtjXQ7L/ll65Nw2NbmTXncHJ+srVC7doCyErUq/H2llt2U6NDcqtv2LCBMIOvPStIlmhAQHNw3CZG5nKPMzKp6Pq+rOXpGoT9kedlCOpUo8fnvpjzvs/PZbef7yq0L7KnUfPiJSAToXHR/1OYmcDjexM8DLh5lO/q/uBtHcSqGdTyhfF0usr7WnRlp0q2U5//UqzGlnrpShK+qWNBgQgAIGUALWklAk9EIDAJQmUVkilzUB2meUjN4WqJiyutIKAtnPplsAkvS05mW5mTDjsZMLYyqHCXHRDkhVt9ZWrH7ioTQJyrBKphNtNhHTYwIoJr9mHmWYkSHL4cAKanNmpUpmHWXmDaaPs0qjr93NVibAiju5d6pcq9fjhqT9Z5/3YSrv9Bpj1KtXcSyzrWCVSOxXuwNlO+WxndWiNigkv6StKvp/2OAL1bMruolh63VUmbUVbdqpkO/31Kz/VyFov2S3plzYaEIAABFIC1JJSJvRAAAKXJFBaIalMEzYD2WWWItdZ7a/UIxnf0P6kRd5c9cPlpIbrrOyq5qJTLY1FLF5J42qyi1jqWNoj3wRBPfU1dIlnxYTXbG3bGKQZSSXpeTIBTc7sVMleLNlOMUxnadojYf/dTHWW9MtVSfrrKPXf5NOalB9eamdtmbC55weWHPYyuqjDnTzILIplHas4YKeC0WynPLGzOrRGxUSQ1NMk9HM4iICmRHoJeIuLYmmKNcTrsXZlCqV6NKtTDysmsqdKdrNGU7fpgQAEIOAJUEvyNGhDAAIXJlD6PoX6w2ZAy6zsTildb2l9H/QYMlnRUk/6A9NSf2klJ7tZP4Py9DANxGSybiiKet1qv5g0CJffEvtO/xejAvlsCCKQ5VmioVG+YU4GZ7wAbQhU5mdlSmseprNLs9qfynYafN0f/NWRnfzajnrJei1Jyus3hOw0kM/hbLY/e0MIAz3P+s1Q2lIxWfd4veZgVKoCNGUwyNuhnQ2nSkkJYn5GpafoGUFA8/z1+qlM9bqYpor3UPPNd1q7MoWyUyXb6a/f1ETWesluSX+qlh4IQAACIkAtSShoQAAC1yagZZN+Nfn9/mvLO53yEarz9frxv3Va+YqBFosyYT/OpcWZ+v1+wO9nvFHvjN/M2I+I+a2ORoVfP7F1ZGXt6xeaLW74tbL9MIo56ds+NItXrtbFFK8wepe8q8JoCi1BBllKvLzvVDu7MvYkww+r+TngldfxyhyNJxPQHcBmkU0tm+e6BXk+kg83H83PULnw9wdNVF0d0iYTusQ0e/1tLSgPV/3nn/9SVenVrQtfwr4htf4yLwUoYQMizWbUR6Fg/c2wLiavhMW7ZGflmMfrMxigyQ0p9w0763t8Bi26EKOElanUScnQ6E5Ac8OePjbl7EJWpnwSfdXJz17NVfNQ8yp1uDKF7JS3q0Jw6PSPqtRE1nrJrgjYCiQEkiqnBwIQgMD3+6WWxDSAAATuQ0CLJN+wtZf1+FC1zFLDj1I5ww/Rei5ImrB1+qVeKlaS9CtCjfKmS06W/PRjpdA3pNA7nHVDo7xODddZNRrFwt7MRklJaIh8VrnvVNs0hOikR/qDvPrVkAANCFQIaML4hso9YR6aTOUiCvJm12v2bemRe+rxYpWbTyomVekl44W9WNr2kmp73/wQ3y9ha3ga+8Wyd55SmMpgGCUPfQhq21kdWiP1vNSfRh1UcTiCgHKaNry59Kx6/ES1IUq612BtjSqdCtpMPnT6R3aqJ2u9ZFfCJUOpfnogAAEIUEtiDkAAAvch4D8etPWQPtq1Qx+qVk7hw8b6Qip9EUkfj9vHen6pV/KnZEIfDKbe+iWjndW/3qIPUO21buiDcZkILwuY5kYxcfbaKj4HCPr414YrKA/Ed6pt8qmhQKMei7TRgECdQJhXdsloloZ56CdnmPC6n6Tm0itOr0GlV0dQa9eRLsbgT7gHhrOpXTOnV3hSV62nxMSGh+qMvfAoDyWTLZe3iOm91KCq9MJFyVvZ8mFKp+9U287qUI2QFOuXfunUTU8DaRxDIDvV03meTVm4akJyU/+V7tKpoNDkQ6fuMOnVVDpVsevnZ2oo9ZMeCEAAAtSSmAMQgMANCZR2Cz5ULQdDpz+stMM3QSqStqSrC/iz9oa57wntVab92A2rwxaStgn0hkrtdgca7ZYMLfZXGI42vegbApcm0DJ/0m1hZUKmNFZdR+3CLXeqVX7K81U+2KgWjCPuPO06Fd3aRoVGY9RrLSK/gUBLLrZdDhucOXJIZX4e6Qa2IACBSxCglnSJNOEkBCDQn0C2ltTfDBohAAEI/JdAWkv673mOIAABCEAAAhCAwOwEqCXNniH8gwAEBhGgljQILGohAIE6AWpJdT6chQAEIAABCEBgfgLUkubPER5CAAJDCFBLGoIVpRCAwBIBaklLhDgPAQhAAAIQgMDsBKglzZ4h/IMABAYRoJY0CCxqIQCBOgFqSXU+nIUABCAAAQhAYH4C1JLmzxEeQgACQwhQSxqCFaUQgMASAWpJS4Q4DwEIQAACEIDA7ASoJc2eIfyDAAQgAAEIQAACEIAABCAAAQhAAALzEKCWNE8u8AQCEIAABCAAAQhAAAIQgAAEIAABCMxOgFrS7BnCPwhAAAIQgAAEIAABCEAAAhCAAAQgMA8Baknz5AJPIAABCEAAAhCAAAQgAAEIQAACEIDA7ASoJc2eIfyDAAQgAAEIQAACEIAABCAAAQhAAALzEKCWNE8u8AQCEIAABCAAAQhAAAIQgAAEIAABCMxOgFrS7BnCPwhAAAIQgAAEIAABCEAAAhCAAAQgMA8Baknz5AJPIAABCEAAAhCAAAQgAAEIQAACEIDA7ASoJc2eIfyDAAQuQeDz+bzff9/vvyO8Nc2DlI9w+EidQ+GY8s/nc2RE2ILAKgJDZ+lQ5avCnE1Y9/wR94ehymcjiT8QgAAEIHBRAtSSLpo43IYABOYi8H7/fb1+Xq+fEW6Z5kHKRzh8pM6hcEw5VbzuCW2vUGhT3d2H2ygcOkuHKr90CnTPH3F/GKr80tgbnecO0wgKMQhAAAJ7CFBL2kOPsRCAwP0JNH7mrKX/CCJDyyUjHD5S51A4bKRbUvn5fH5//7Sw+nw+ypc1fn//lLbiWeHG67HF7cll2iNtIb852KHKN3s1w0Dd80sTeI+TQ5XvceyUsTvvMKVL6eF3mFNSiVEIQOBmBKgl3SyhhAMBCHQjoE1vi0Yt/VuE18qs8mSt8qvLD4XDRro+Pfweb5GV37nZWwPK3e/vn2BIF5QVm1Srer1+SjvDoOG6h8LSGMIi+UY9WbGhyrMWr9KpKUotaVzKet1h0hwpfQ+8w4zLF5ohAIGnEaCW9LSMEy8EINBKYNWOTgvTVu1r5FZ5skbxHWSHwmEjXZ8iNu1/f/+oTpTu2aQhC1NFIl8h0tXkO7/frwmnhSeZuEdj7ZTOgu2FYqjyXk6eokeztDLnNzs2VPlmr44fyB3meOZYhAAEINBOgFpSOyskIQCBZxFYtaPT0n8Eo1WejHBgZp1D4TxkI21hbsiyvV5kA+usSheI+v2GvJRTCW9w9UJDSuGXQqiTL41q7B+qvNGHOcU0G/3U7eXqUOW9nDxAD3eYAyBjAgIQgMBmAtSSNqNjIAQgMCmBxh/dXPxN31U7Oi39BWVRvyTN4ff7b3gLQwJ1TzS8fUtjvpXMya41FEhdfyP2oHz/YQpHQOrKfVwlFJWNdMvw1AHzLe3P9iiQknvf71duVGSyyn2nhel7NrQrrPRKUXYKhQzWX3GqW9ngdschykVd56JYAFLX9v1+UyaNF6M8Wbz5ZBPXMjx1fs5LIPVzsUf3fMERkMWLUZe2xgZzqXIvIEOl4V7Y2hqSnsr2yMPs2W06K6paTqXz3I+ylxazQMIFdd07jI+XNgQgAIEZCFBLmiEL+AABCHQgkP6wwuv1k64ss2LhWzNaeoZGqk1+a+mvbbMfG/TbKA0JkqkVCcjc9/t9v//q+0ESyIZshkxtOqSy7Sl5uOhGNl4/qmNbse8nn6Iw5SEjJSyl4RZsO/nsFE1/JyjrRupDC2oLs0WyIpNlJXk7m3VPgZiwDrPClR2jbB3fyF6MYdrYZt44+H99mL4/tCtBmWTpAg9uBMjein1XMRjyynVKOWocbgNnvgQUWntDEKwS51FY22fW1JYu7TRHXrlcKk2hbCnQfLByc/Ctcn+W3TDEx5J1o6JT/u9smEspK1NrZ72fMqeJZz2KsSJcsiKdNCAAAQhA4Pv9UktiGkAAAjchoLWvPlBNt0b6QNJqLiZpA/1S2Pd7yezS0/BpeaplqynRoddvQ7QylsMKIRhSv09V+3DzTdvdRXNh+2E/Tapw/CLbRycBcyyN1zvfsS045oy89f3B3Ov1IzFzu+Sz9fuQ7TWQVcNV5AqI0vJQIG/y8tBHIfKSUU+YPH5UqW1hls429mdZ2VhdHSVVfqy1X6+frPCiquyooZ1yyc+KkNzKncdLKtcCovxWQjBhTQC5IZLpxXjwJaDwLRy56mNXgBL2916DLBldU15GajdcAl5zY9vnPeRL5IMnNkQ51T3ZovB2pdzffKxT+fXDsyk2vD7XQpTKe6QpVfmWzU4pXo3q0hDkVJtwpafscxc/Vt7WhbNn6YQABCAAAU+AWpKnQRsCELgqgfpSUlHZIjKs7/UlkbB9ra84pdMaciDdHfnFdxgVDkuS7Z5oq+A1y7ewf5C5Un8aS1ZtiaffBfmBfnGv0OqNMNwf+oHBEwVY8cRUlSRNefvw0hQKhNdmxMcrekGn+oMPYWz20MLMnmrvrLBSvCVtfqy1S1EsqiqZGNdfd9js+gC9J9mx2U4/KrQln16wuiG0z+EgWfI8+FC/gtJaiRwL01j5Df3BnImlMhoe5P2hx7XY9gNDW7asWBPOKsDQnx5K0pOXct+ZjvUFoCCp0MJdUeZK/UFPMFqaDzIX5Dselkwv3voCzLqrEu7oOaogAAEI3JUAtaS7Zpa4IPAsArb+S7cWnkJFRstHv7yurzi9Zr+W9Roko+V7fZnuNwYaWyp1eQG1taNTT903Be7l5W02Fkkuruwr6ZBdQa43ZDRtaGDWW8WSDgw9JhkSVIkxOzxUQCq+iYDXYz5UuJmwqc3G2+6wt2ujfM+GdsV0Nlhvwo+1diAp4UVVkjysYQ5XsmY+lwRsuM9mnUAaV8UB3RBKPL22LpdA9grKxp6GKW+z8t7VFJrOVk6ZjOy2NKQ2bWgqZr1VLAFIqicrKeXbhuupkfXNAvea5YOfh6mrlZksh+saUp3tPWiwZigAABfBSURBVKnbGivr6vENnbWQlXcvo7aE1UMDAhCAAARKBKgllcjQDwEIXImA1n/ZX46wSEzGL6AVoVbS/mx9xamxXnlpwyb92ZW9abAfocjWPlo8seHi4N3LdlbcrizZvVoT8z1qK171jGvU4ciTyg7Hk/cTQPux0Bli8cPDBKj4lk2KyVdcNdMV8tn5ExxODysKU+FSjynJssoG6/X4sdYOJCW8qEqShzXkcDZ2FXNLZ9MKjhQ2huDppUNErDKv/FfPgp915WbOXwLtw9MwW1w1izY2DVbl+OBGVnJnp7wt2bLMVu75NjeyerKdqcOWuGyOsp2mIT1l5uqu1mey7rQlGqnza3tSt6VBuNTjGzprvpmeC91hfCy0IQABCExFgFrSVOnAGQhAYDsBLRDT71OYUi9Qavt1sGRafNJqtSRc0aZTvuH1qN93qq2zvqGz2gCUls42SvKLgZikxLzRtC214xoyWjJhAj6zlRCCWGmspyoHrOHd0CnfqXaQrwtr1E7yjcPNmUBDPmQblSEymh0YanZ1DouqSibG9csl8zw1pIgqDY9aYqmqbI/Jew1BrCQQPM+KZTtN/87hyru8NVulO1UqJvm0UaEhPTsbCr9kSwKpodTh8NjS2KxynfV6gqSdCp3miQ33pyrC3nlvrtT2av1YpTsMDDKVw4qTApIdrrPmmxyoC2fP0gkBCEAAAp4AtSRPgzYEIHBhAvpc1FaK6Q9vawVZafh1sMRaoGi1WhJOtdmH+eoPDa9Hp3xnpZwRNmN130y5NNeFUzH5lm1IflxDdksmTMBntvTXlMJ2TpsfP9Z+Hluv/8i6Gt6NbKcE7Gw4DLnTWTWUICnPNiQfGo3DTWcIPKgKh5UhMhqG6NCPVTg66xuLqrzwYW155QORdUVUaXjUEpOGeiNr1A9JBcZdAj6Q0hUk38yxcLh4CYhPpRHckImODSW9ZEsC3qg6U+e9Hon5Trvnl24+QdL0h07zxJT7UxVh73zqc9rj1fqxmgxhSJCpHFacFK7scJ013+RAXTh7lk4IQAACEPAEqCV5GrQhAIHLE/B/2ib8Eq2tIP0fwfF/T8fa/msg9RVnIKXVaujXYdDmK19+8Z3VE8amf+1LVrRe9z1ZnRIw5TqsC6diKUPfI/lxjRROsGUCgizyodpogUvMlISxnrxNJNnKcqv7ZmeloS4sMRnynNO25FsawZOWIamMKQkATUw+p6Osx8ba1VfnYKoWv4xTMjS0X2H6cHRJDrrzSH+WvMcrAfm5/xLwN0xTKytZ04G/gVJnPfWpWDrt1eMd08C+DWEMIcuKBNSjMlD4LrYF7vVorO/U8JC4dHh9VqSZymqQ22qYWPtM1sAujYqTwpU1pLNXv8Nko6MTAhCAwIkEqCWdCB/TEIDAKAL+U3fZqKxEJeMbJr/4IbkN0WrVa/BtrcKtU7uCsOfJ6kk9KQ3XFsKbzuqUgCnXYV14rZjkQ0NWFFq9EYb7Qw30nb5tAuJs6NJihLnkd26C6Tvrw8NsqftmZ+VqXVhiQqee/Y3gyTaFpsSz8nrsrLKQnhI6BVgRLlnxas9qy39FVCeT+mnyGp4KhJ5F/R6+r6UGPV0ugZCaum92Vm7Y4WLgjWJSGxoa3tIIY/2hEh1ClowJ6FYj8unENk+8nlS5hkuhDKXDs/cuyaeJzmqQvBqNYpLv26hbt7MpW6HQvBLbirDPRd8o0AYBCEDgTgSoJd0pm8QCAQj8S0Arb3WFlb36Sw1bm2oBWhKzfi1Ps2I6qxVqSbkkvZ5UOO2RvJ3Sof8qnO9UO5WvKNcoLdAVkT+12Lbv9+klgsVGRWHd25Snyadum2ToT4XTHvMtNSREpSlkqnxoJeVeRmqzG6Eg2XiYetI40IvVnbcaXMBrw22gdsi6civCHWP3IfRqq9RrCm1uKMBFKwakNG3S4XXyQZsmaoq3yyUQ1Lb4pogqvknGGqZ22zRYvNt4gWDXHy56G2KXvFfiw/HoJKzOtEd6gqGSTsmbKmlefEaEge0zWQO7NLJhSvOj7jCKmgYEIACBcwlQSzqXP9YhAIFRBLQjlQH1NO5AbOXauKPTQj+7zk5VpT3mZ7Y/7Ux7bLjcUNSL+wRT5eW1E87GIkmJNfLUwL4Noch6a2f9rintMX+y/Wln2uOHh9liwqFT4dtZHepPUIXvZnoBaxv5bLypcEtP6knLqCBTImNimpk+F6WQxS1Mre6BhxB6HerSMIW684TYS+YUfkkg9Es+1Z9iT3ukLZvBtDPtMQ3Z/mxnsKhDgTr+EpAP7Q2RzHqrs1KY9tgp9fv0pZ1pT2W4Ks5eZ/DEnxL5+l1FYn6s1I5u1OdSiY8uRn8zMVVp4q5yhxmNGv0QgAAEGglQS2oEhRgEIDA1AfskWS7qO25hZaxlZSqfLo4lbD9OkQrInOo1WolKWAvcUFDwyk2PfLZlrleuha86s8NLttSv4b6RmtOG4fX68b8KZNC0Ivdi4ec/7LUjb2Vc2/y3GPUzIuF3zb11ofOBqFOJsyFSLg2SzA4PWU4TJz3a7PmegFTOpNPVNPvsmJ6QCK+80jZtFYGWUymrMErofFwKxAuLQzahIu+HnNgOWdDl5m8+ij0I260jROQ1tFxKYmgXrGkr3U/E1m+k/c/MKTuGNE2rYpHb3tbicJ8pU+57FLv9EL5MjL4EvA+NbblqQBR4iYbI+4khJeGH/9Xv1RqukDh1StL8TxOnuEx5kFdaPXm9QKqxEgsz2SSVL8l3bFQiMivyTaGlGE3S50LXi4SHRtERCKogAAEInE6AWtLpKcABCECgAwGtArWwLq07g4A/DH6kOoOAPzRh2/B4nWprdWujUuUmqX4vLyWyKDGdqgyXsIb7hg30PSqNBeUyIWFpzkpKbGhD/pec8SQroWm497Y9ZA335oTF61Rbnqun4l6oUsmcTKjhHfCaK+2sJxX57ClTUrFe8TlVqHBCo6I/VXJMT/BQh8FV9aeNIKk6oyTrgZhYOkrDg371h4YS5M2ZjNcgsW3DU+W+56xLIPjQcigOFfJBTyAmtuqXvJR78hLzDUmGW4SUS6caNsRrtlNebWhrbCXYUA7zQ7q0KxGZfo/C+59GWokiK9zFf5RAAAIQuB8Bakn3yykRQeCJBLKLyOyni/5DY7/cDJ+yGsSgtkLWr8716aj0Zz3JismiX9FKj3dAkjprQ+zQD5ekH662yevQNzRQJtLdgn+jwYvpjRKvcETb+59FmhrNiilYL2/KPUz/tSzF61+D8sIS8DrV9p6r0/5UXOphylMOy4o1vANebaVd8qQyJD3VYl2vA8hn/45G0LlKOIw97DB7P8kG5SeJwi9BC7HXwzElJhNmTtaTxTnszWU9DFbsTRlNyMXhEvCeq/OUS8Bbb2z7eEO+7AWxVE9JzDj4YpCU+8u5fbhqJX64/DHllVPyR9n3j7BVM1lG9zfkTEVVCVF2yCrhrAY6IQABCDycALWkh08AwofADQn4VW89vM8//9VlbGPTrtNryy7WvYC1G8XSgV2Gl9T6/sbwdwbiLe5pj06r+WYbqj1+toy9FvmWiERvkHC72u6Sjclqv6U0zuQ0kMaBjWKpfuvZObykNvS33FWOuRiDY9nDxi+ZNoplTbTPn9Lwxv6W+XzMHGh02Iu1OC/5VcIaRQMCEIAABKglMQcgAAEIQAACEIAABCAAAQhAAAIQgAAEWglQS2olhRwEIAABCEAAAhCAAAQgAAEIQAACEIAAtSTmAAQgAAEIQAACEIAABCAAAQhAAAIQgEArAWpJraSQgwAEIAABCEAAAhCAAAQgAAEIQAACEKCWxByAAAQgAAEIQAACEIAABCAAAQhAAAIQaCVALamVFHIQgAAEIAABCEAAAhCAAAQgAAEIQAAC1JKYAxCAAAQgAAEIQAACEIAABCAAAQhAAAKtBKgltZJCDgIQgAAEIAABCEAAAhCAAAQgAAEIQIBaEnMAAhCAAAQgAAEIQAACEIAABCAAAQhAoJUAtaRWUshBAAIQgAAEIAABCEAAAhCAAAQgAAEIUEtiDkAAAhCAAAQgAAEIQAACEIAABCAAAQi0EqCW1EoKOQhAAAIQgAAEIAABCEAAAhCAAAQgAAFqScwBCEAAAhCAAAQgAAEIQAACEIAABCAAgVYC1JJaSSEHAQjcm8Dn83m//77ffz+fz70j/X6/z4n09qkkwBsQ0M3nBrHUQ+DOU+fDWQhAAAIQgMCFCFBLulCycBUCEBhI4P3++3r9vF4/7/ffgWYGqH6///7+/llVArtopAPgoRIC5xPQzed8V9Z48Pl8fn//rKq/n3XnsRrW5e7ta7KBLAQgAAEIQOBoAtSSjiaOPQhAYE4C2s5da7/x+Xw2bM82DOmStYtC7hI7SiBQIqDroiQwZ//v75+1d5K18jsDt2qXGfX/XusmvxMCwyEAAQhAAAKDCFBLGgQWtRCAwMUIaDt3uW2G7ZFmfi/JvsLDXu5ilwTuHkVAN5+jDPaxI7fbbz52EzjsHqt7jr2XpOLXFd8/7ZMztEAAAhCAAAT6EaCW1I8lmiAAgSsT0L7osH3OibQO3tF5ttZ+AuQT84vpaxHQBXIttzd4e/CdJ/vlX1WUNvjPEAhAAAIQgAAERIBaklDQgAAEHk1A27knlDkO3tEZW5te1JIefZkRfI6Abj65k7fqO/jOU2I3iRsl9+iHAAQgAAEIXIIAtaRLpAknIQCB4QS0nVMtadUfV1olbH9JLfvFkBG/EZvqPHErRS1p+FTGwNUI6OYjx+1+kr1FSEYNu8AbhSuaV+mR9UpjqjuP9/PEG6B3gzYEIAABCEDg0gSoJV06fTgPAQj8H4F0JyYu+jpDutEKo3Rof5bINhv69/f3j3T6Rva3XVNhKffeqmj1/X4b9XjTapf2RVmdxqE0RDrHNQyFj32cLTRDYDQB3SJSQ3bzSe8G3+83XID+/qBbljSn9y6zZX/AUWLWSM3Jlr8h+AtQ1r2qklEfpgZ6bfLNa9PvE8kZr+f49iRuHB84FiEAAQhAAAIdCVBL6ggTVRCAwGkESnsD7WfS3Y7t2dSvfZF2gPahurZ26SZNf0PNdkomL4t+MyblYYjxUqf9gW2vJzWaIs7GLp2v14/UKuTskFTziB5DIewjTKATAocR0KWdTmndCoIzujbVLyW6Qv1NQIUYyX+/X39fqt+pdLFriFeoznCX8DLerm/LbR+7okvvPLLl5b3Cw9picphFDEEAAhCAAATuR4Ba0v1ySkQQeCIB26WELYrf1bxeP4GLbSdU8dG+6PX6UacN0RYo9AcN0m/93qJXnpaH6npCULKihg0PYtaZ2lIs9b2id1jhVBpyZrFhmoO3i6MQgMCcBHSTCVPaX0HZU/7alLDvtNcVddH5m4/kfafxMXlvURrSO5vpCUZL706m/OVG1lzwTcL1O4+37j0vtb3p1MNsj1KWPUsnBCAAAQhAAAKNBKglNYJCDAIQmJqANireS+vM7hy0M5G8NKQ7q/Q7KdrwZIWlSrsp9fgCk5m2UxU92VNyu+JbunW0UYq9sg3zDku+0vD+1NumuWK6PpyzEJiNgK4L75h12s0nzHY75Tt1uemOIVU65eVTDUHe3zTkntdg8nJSw9WwU16PTqmR+qae7ECdTT2RTt1a5Xa9UVfl1apt9fSsh5KhAQEIQAACEIDAIgFqSYuIEIAABK5BwLYc3lf1WMPvOtKe+j6nJO91yrSqVzpbUW6nJCkl/q0E35m2U98WN0vpkFTtoJ5KvIMsohYCQwno6pYV32PXmk6p+Ot7vLzv94UVf4tIdWqUbj7qMeG0ip31RKP0AqN60obclm8alRbFbPiJdx5zQD6XPEzDpAcCEIAABCAAgSwBaklZLHRCAALXI5BumfRlirCB0XZCW6DSnk0UbIiXl7lKQ/JZi6a8Mlyn5Ea2YWKypS2i7wkD0yFBYNxhSnKcLTRD4AAC6dXtJ7lda3JDwurxNx/fqXa4WqXB+kv/huFpLWmtHilUQxp0q5EzkgmNEEs4O/owdXi0RfRDAAIQgAAEbkyAWtKNk0toEHgWAX0kbmHbtiFscvypsLmqbzOCNtVrtHfKNmS9ojw7MHTWE2nCsiXffE/QkA4JAuMOU5LjbKEZAgcQ0KtAuuL89RUmfDg093R/yHrrtfnCk/WX/pUqCagnGJVAthFG+UO5HQIPt1Y/xExI3p8a3VaaKu6N9gH9EIAABCAAgTsRoJZ0p2wSCwQeTUAbG/vygpWWRMQO7ZTtZ8LvZWh4dp9jZ/0pKbE/opT9V1+jqChv0aMoso10e5b2hIGLAkG+42FKsqNyVEHgFAK6itOvploJQ3cbk9SdwbzV/SHrfLhaJZy956hTqmx4WkBZq0cK1fAarLNkS0NCLOof3fCFpAB/tGn0QwACEIAABO5KgFrSXTNLXBB4IgG/UbG/SC0Ktu2xYpAXCwL6Wpz6reGHW09WSRilw3TTpVOr9GiUb6Qa0h4v3/Likhw2VYv/Bv2Vw5RkRZhTELgKAbtG9N5QWne2QCTm49Ll5jvVtiFSWBfWKDV08arHGmv1hOGK1N8zS7Y0NsSift+QY9JWaQiL1xDaKiSpohcEOIQABCAAAQhAYAMBakkboDEEAhCYlIC9fPT7+8d2I2GboW2MNUIM2sCEUSaWKrSexs1JRfkqPcFnO1RcOitz6vENnc1GapKfz0cvOLQ0vP5626xXTNeHcxYCcxLQm4/p7UVzPr1ULRZdktnQ0lFpT3agdZpw+l6Sasqb39OR27qc0x7vmGo6kvdn1V5181l0XkYb79VygwYEIAABCEAAAnUC1JLqfDgLAQhciYDfyaR7J23A/AfpCs+PVacadtZvgbRFWdzMZD/Al+ZVejTKNxSXOqXTO2xndSoLQRrGNVKS42yhGQKHEdDETq8sf+r1+knvGCaQ3rLM+fQCt7pVVlUab6WWpOJ7OqqlR27rPuNvL6kGuS35VKZvj/yhkNQXLNogAAEIQAAC3++XWhLTAAIQuBUBbZzSzYN2Ptk9m85m9zl2NpzyWyN/yj5X9zvGunKvx48yPYvpSbea3+9XOrWzNW3io/5F/X0FsiT7mkAbBE4hoIvLX8XmiU7Vbz5Zt9MLXCUSu4q9ufSmIdOp8ooeexsxHeJ7sre1ee48cs8oZd+v9OHQhgAEIAABCEBgFQFqSatwIQwBCMxOQBsnX9wxp7W1SE/VXx3S2XSgzKUNL1w3rS+bpEqyO8+QAxvlzZlAVpspLA0JmkccGorU2xG20AmBIwnoikuN6lR25uv+kA7UzSEM1BBp9g2vR/2+U+12PRqihsYG32QxNEryUtixIVvBh3DY0SKqIAABCEAAAk8jQC3paRknXgjcnIC2EP6zesVsG4mw87GzGlg5m576fD7+c3i/UfHCdeX2t5+yen5//2QDUUSlrWZWp7SZLe+hVzi0bShOMT00LpRDwC6r9I1IFaNLLwPq/pBlWLprvd9/W24auilllXvfJCmL9ZuP3E4vZ50yVfYbdnpfMpUv+ba5PzgQQtPhZv0MhAAEIAABCECAWhJzAAIQgEAfAp9//tuv6/3+W9/CrTXRy7G1dpGHAASOIdCrOtNLj0XNneeY7GMFAhCAAAQgcAoBakmnYMcoBCAAAQhAAAIQgAAEIAABCEAAAhC4JAFqSZdMG05DAAIQgAAEIAABCEAAAhCAAAQgAIFTCFBLOgU7RiEAAQhAAAIQgAAEIAABCEAAAhCAwCUJUEu6ZNpwGgIQgAAEIAABCEAAAhCAAAQgAAEInEKAWtIp2DEKAQhAAAIQgAAEIAABCEAAAhCAAAQuSYBa0iXThtMQgAAEIAABCEAAAhCAAAQgAAEIQOAUAtSSTsGOUQhAAAIQgAAEIAABCEAAAhCAAAQgcEkC1JIumTachgAEIAABCEAAAhCAAAQgAAEIQAACpxCglnQKdoxCAAIQgAAEIAABCEAAAhCAAAQgAIFLEqCWdMm04TQEIAABCEAAAhCAAAQgAAEIQAACEDiFALWkU7BjFAIQgAAEIAABCEAAAhCAAAQgAAEIXJIAtaRLpg2nIQABCEAAAhCAAAQgAAEIQAACEIDAKQSoJZ2CHaMQgAAEIAABCEAAAhCAAAQgAAEIQOCSBP4fE66GDTLH/zQAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAABmsAAAQACAYAAAAOdm3FAAAgAElEQVR4Aeydh5cURdfGv//jfRWQjIDknHPOOSfJWYKKgKiASjAgJiSDZCRLzjnnnNOSswKi1nee2vcWNT3dM7OzszuzO0+dM6dT1a3qX89099RT99b/KSYSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIGoEfi/qNXMikmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABBTFGn4JSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCCKBCjWRBE+qyYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABijX8DpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAFAlQrIkifFZNAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhRr+B0gARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggSgSoFgTRfismgRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQo1vA7QAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJRJECxJorwWTUJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJUKzhd4AESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEokiAYk0U4bNqEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEqBYw+8ACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACUSRAMWaKMJn1SRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAsYbfARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARKIIgGKNVGEz6pJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgGINvwMkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEEUCFGuiCJ9VkwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkADFGn4HSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESCCKBCjWRBE+qyYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABijX8DpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZBAFAlQrIkifFZNAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhRr+B0gARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggSgSoFgTRfismgRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQo1vA7QAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAJRJECxJorwWTUJkAAJJIXAlStX1CefjNCfNWtWJ6Uo86YzAjNnzlBffPF5WGf1/Plz8z26detWWDZYiARIgARincB3303Q97pw75Wxfn6B2rd69e/mPn/16tVAWXmMBEiABEiABEiABEiABEgghghQrImhi8GmkAAJkEAgAnv27FZvvPEf/fn44+GBsvJYOibw6aef6O9A+/btfM5yzZo1qnHjRmrPnj1mf48e3RTy/fPPP2bfv//+q8aNG6ttNGvW1OznCgmQAAmkJwKlSpXU97lcuXKkp9MK6VyGDftInzveGfbu3RtSGWYiARIgARIgARIgARIgARKIPgGKNdG/BmwBCZAACYREIJbFmr///ludOXMmpPNgJncCp06dcj9g7b18+bIqUCCfKleujHr69Kl1RKnPPx+tO+dGjvxM7z927JjKnj2rqlixvHr16pVP3kePHqm6deuoLFneUpMm/exzjBskQAIkkB4IpLRY8/DhQ3Xz5s2YRBXrYs39+/cVPTtj8qvDRpEACZAACZAACZAACUSZAMWaKF8AVk8CJEACoRKIRbHm8OHD2pujYcMGavToUaGeCvP9j8ClS5c0P3jEDB48KCgXiDQYKT1r1ky/vM+f/6k6deqoihYtrB48eKBWrlyhMmXKoObPn++XFzsQSg9iTeHChdS9e/dc83AnCZAACaRVAikl1ixZskTft6tXr6qWLPktJvHEqlizcOECza5q1coKodqYSIAESIAESIAESIAESIAEfAlQrPHlwS0SIAESiFkCsSjWbNmy2YRaoViT9K/OiRMnDL8BA94LaGDZsqXqzTf/q6pVq6Ju33afa2b//n0qa9bMCnM11K1bO6iAVqdOLV3/lCmTA9bNgyRAAiSQ1giklFjz/fcTzX2bYk3SvhVff/2VYUexJmnsmJsESIAESIAESIAESCA+CFCsiY/rzLMkARJIBwQo1qSDi+g4haSINQhvBq8a51w1x44dVWPHjjEfzEeTI0c2BSFm+fLlZj/yIIyanbZt26ZttmnT2t7NdRIgARJI8wQo1iTOcRdLc9ZQrEnzPyueAAmQAAmQAAmQAAmQQAoToFiTwoBpngRIIH4IXL16Rc2ePVt/jh8/FvKJY2Quyi1cuDBgmaSKNcePHzftuXLlSkDbbgcx6lXOZ//+/W5ZVEp51vz6ayJH1H/hwgXXuu2df/zxh2krykQzFv758+d1W5YtW2Y30XU9VLEGnjQIaQax5uxZ37mB5s6dY0Yq16tXV9WvX0974BQokF/169fHHENZiDN2OnfurCpWrIjKmPFNezfXSYAESCBVCezbt9fcw+/evRty3f/8848ph3u/LUiHKtasWbPGx8aTJ08C1h+OZ43dztWrVwe0n5SDGzZsMG3ftWunKZrUMGirVq00dg4ePGDshLry77//mvK4Dgjx6ZbCFWswBxvs4oMwdOGmAwf2axvPnj3zM4HBDbA/b95cv2PcQQIkQAIkQAIkQAIkQAKpRYBiTWqRZj0kQALplgA657/44nNVpEgh0zGeL19eVaFCec95SE6cOK4+/PADnUc64TNkeENvDxw4QEF8cKZQxBpM2rto0UJtJ1++d0x70Da059y5c06zPttnz55VI0d+qvNiPhN08OOTJ8/beh/OEwlhs2APHf2SJ2/ePHof9uMzf/48H9vBNg4cOKB69uyhy4pNLAsVKqD3/fbbYj8Tt2/fVq1bt1JlypQ27UCZ4sWLqpo1q2sx6dWrV37l1q9fb9o6b553Ozt2bK/zIb6+M/344w/62EcfDdGHMH8PzhvtRRveeiuj3h469CP18uVLn+KLFy/Wx0qWLGHa/fbbOfU+4ffzzz+ZMrduJeh8mI/GKUQ9evRInTlzWn9w/fH9adSooSpYML9au3atOYY8f/zh30EFTx2096effjT1cYUESIAEnATknod71MGDB52H9fZff/1l7mO9evX0y/Pee/318WnTpuljeE7AHp4xuA/hU6JEMVW3bh119epVv/KyA/Ny4ZlQoUI5Uw5lMQfX6NEjFcSDQGINnoXIh7oROlLqxrJ06ZJq2rSpKiHhplSnl7jXI3/+/K+frYULF9T7sB8fiAF2wkCHbt26+rQT9SHvqFEjFUSccNLWrVtV48YNVfbsWU3b8QzBMwtiVyhiDZ6Nn346QrfFft7nzZtb78PcaHjGBko43+7du/mcX+J1SOSC8J1IgwYN1DbxbiSs8TwTblgePXrUryqIUThml8M7E/YNGfKhwoAHt3T58iVj+/HjR/q6oJ3yPbt+/bouhmczBp3gGY9nNtqGcKPSLufgCLe6uI8ESIAESIAESIAESIAEIkmAYk0kadIWCZBA3BFApwg6lvAHH50mZcqUMh906PTp09uPyY4dO1SBAvl0GXSuSBm74/799wf5CTbBxJrHjx/rEFnS2SB2sURYLOwvXryYOn36lF+bsAMjV23xBR0ptg10kOzcmThy95dfJulj6KiCXXxy587lkx8eH6Gm5cuXqVy5chhbdr2lSiUKGvZIWHTETZ8+TVWtWkWXgWeIXcbufENYMKdYgk4+aTc6IL1SxYoVdD504jjTZ599qo916NBed1xCEMuTJ7dpR7ZsrzvRkPf58+fGBAQ1tNfmnTNnDlMWx+x2jR8/TtcF4ccroZN0woRvdT4IOh06tNOizcOHD72K6P0i1iDMGhMJkAAJeBGQex7undu3b3fNhnut3Fvr1avjl6dp08b6OO5pixcv0s8mPFvk/g2PQClfrlxZV7HgyZPHqlOnjiaf/ewpWbK43o97odxf8WxxJtxLUQ/yS91Y2qIA5v6y0wcfvK/zvvNOHlM32muX37dvnyny22+/qZw5s+u8sCv58GyVc/z2228U7t2hJggsEPIhKMAGnk1iF8vMmTOpli1b6HcPqcMtDBoGFyCf5AErsWOfX8OG9ZXXMwQeLnJ+sCPlsZTrIM+9997rp49DCJI6MbDBLnPkyBGDAe8z/fv3U9IWiCySV965YAfvUjt37jDlZOXMmTOmHngWO0U9EWvkmQlbGOQhdWCJ9zPYYSIBEiABEiABEiABEiCB1CRAsSY1abMuEiCBdEcA3gjS8eCcaBh/8h898u0ox2hk6XzAaFu7EwWdGhAgZHSnc8L5YGJNixbNdVsgoGBErJ02b96kmjZtoo+jo+PixYv2YXXy5EnTsQUPnx9++F6PzrUzQWBISEiwdyU7DBpElw0b1puRzfDOAQPsl/TixQu9z+7QgueRcIdXzYIF8yW7Xq5Zs1o1aFDP5EHHoJ0iKdZAAINQ069fX4UOMEnz589XYCnttK+15Ak1DBq+K7ATSKzBSHHkadGimRb64KmE7bp1aysw9EoLFizQ+apVq6LQCcpEAiRAAm4EIinW1KxZQz/rKlYsr+BpKAnPJgjHcu+sVKmiunfvnhzWS3hTyn21Z8/uyg7TiWdD69YtzXHkcxNr8DzFs8bpxXrq1CntlYhyeBbDC9OZQgmDhnIoD1EFXrSnTp00Zu7cuaMmTvzOtNEpCpmMLitTp0415TBYYelS35BgEH9EyBFGzmcPvHmaNUt8H8BAB7zHwCtTEkKoDh480NjB/Ge2hyqez/DahDCEOjAwZcaM6VJcL//880/N9++///bZH2oYtClTpmjbOJc+fXqpQ4dee3I9ffpUwTMLbUf9EMLs46jQFmvq16+rzwViG645Ps+ePVXXr1/T4gxsNGhQX8FL1U5ObvYxrpMACZAACZAACZAACZBAShGgWJNSZGmXBEggLgi8+24n3VmAjifnH303AOjQR8cARtZ6pfbt2+o85cqV8ckSSKzZvXuXEXk2btzgU0421q9fp+2ifju2PY7LqFN0fkDYCTUld84aiAhoDz4IX2N3aHm1AaN869Sprcug3Tdu3HDNinxiG2Ft7Bj6kRRrUEeVKpVc24B5AKQNbqPMIynWtGvXVndwyvXHyOHy5cvq+n//fZVr+7AT4WKkjc4Qa56FeIAESCDuCERSrME9p3LlSq6eMwArAjXyzZo1y7Deu3ePEQkQ5swr2V4jbmKNVznsX7durbknOoV+HA8m1sC7qHnzptoGPIncEgQHiCA4v3bt2rhl8duH+3OVKpVN25yDLqTA5MmTTR7Yd4oOI0Z8rI9DTNq6dYsU81tC5EB5fBCOTBK8XGU/3mWS4n0Siliza9cuI8QEGqBgD5aBF46dbLEGbf3qq/H2Yb1+5Mhhcx6Yr4aJBEiABEiABEiABEiABGKBAMWaWLgKbAMJkECaJSBiTdasWdTNm77x7d1OSkKABJrPBV4x6FyAcGJ7jAQSa7788gtdpkmTRn4hv+x2SAdLo0YNzG54zMgI1e+//97sD2UluWINRlBLm7zC6jjbceHCBVMGc9x4JYwe/uSTESavPUI60mINPHncUrCQQJEUayAWOj2q8P3BKG7bU8nZToo1TiLcJgEScCMQabHG6alp14m54OTZgFCNkiQkJI7hPu6VNm/ebMJ/JlWswSACeFqgjnDEmidPnpi2Q1zySqNGJT7/4KGCARfBEjxzhQnECafXipRHeNayZV/P4+YUaxDiC3YQHjVQ2rZtm6kP3kGSROyBjVDaLeWwDEWs+fzz0abeQINH4BUlc8TBY9lOtlgDb2K3+Y9ssQbfbSYSIAESIAESIAESIAESiAUCFGti4SqwDSRAAmmWgC0GYILahQsXqHv37rqeDzxA0GmEDg6EKkEHitvn999/NxMYz5w5w9jyEmsQnqRfvz7abu3aNV1tSj2dOnXQ+apXr2rsjh49Su9DzHp08iQlJUesef78T/Xuu4nzDrRq1cIvHI1XOxDKRDqsDh8+5JVN7//119kmnM7UqVNM3kiLNV5CE0K3FStWVLc3XM8ajMCWkDWYqyDSiWJNpInSHgmkTwKRFmsgangl3DsR/gr3eswdgns9PDoKFUqcJy0Ub1Z43qB8MLEGYUDlGYmwkbVq1TRzsYQj1tgiPMJhim3nEiHMJNzb1q1bvVCY/d27dzPPvkuXfEOZmkz/Wxk2LHFOHpw/6pW0cuUKlSXLW9rO2LFjZLfr8uzZMyZsK57VCNWK8GYyz1nbtq1Dfm5LBcHEGnjEFiyYOG9RvXp1FeauCZQaNmxgviM3b772srXFGre5A2EToUMlLC1CqfXt20fP3ReoPh4jARIgARIgARIgARIggZQmQLEmpQnTPgmQQLomgJGd8O4Q8QBLCCbwnHGGRYNAY+cLZT0UsebBgwdJtmuLNdmyZdHlMRI3qSk5Yo09crpXr54hV40OImEHr5FgCaOHkR+jiSWllliD+iZOnKjrD1eswaTLWbNm1jbmzPlVTiFiS4o1EUNJQySQrgmkplgDkLbnJbw80HEv934I2MFSILEG3oYJCTfVwIEDVJ48rye9F/uyDEeswXxzUj7UZShiDZ4hYg9em4GSl1iD+VrEBgYzBEv2+w28Ws+cOW3KQ9xIagom1mDAiLSvTZtWQc2vWLHC5J8w4VuTPxSxBpm3b99mPLBQb86c2RXeR/DdgHcuEwmQAAmQAAmQAAmQAAmkNgGKNalNnPWRAAmkSwI//PC9Hv0rnQxYYh4T21OFYo3vpadYo5Q9AhsdfF5J5m8IFL/fq2yw/RRrghHicRIgARBIT2LNqlWrTCc/ntfooMdzXD6Y5wz7Kda8HoySHsUafK/htSwhbe13uHnz5vKHTwIkQAIkQAIkQAIkQAKpToBiTaojZ4UkQALplQDix//yyyRVrlwZ0wlUoUJ5de3aNX3KtliDyWyRP9jHHtnpFQbN9qxp0aJ5UJtSp1wHetb8ICj8lhUrVtDXEhMxO1MoHZcok1zPGtigWOOkz20SIIHUJhDKPS/YPF1NmzY2z8dAYdBwbinlWXPp0iX15pv/1e2AxyUEa+e8XhJ6MrlizbFjR0N6Jjvrd7u29Kzxp5JczxqxiHet06dPq969e5rvJ4SbyZN/kSxckgAJkAAJkAAJkAAJkECqEKBYkyqYWQkJkEA8EYA3zZAhH5g//Js2bdSnD4EGnf7oAFi5cmWSkXiJNZjTpEyZxMmEW7ZskWS7tWvX0m3CXABuk/AGMpicMGgIM1K8eDFdd6NGDf3CxnnVO2rUSMMWoXECpUmTfjadcphPSFJaCoOGNqekWLNmzWrNc/DgQbpTURhxSQIkQAI2gdQUazA/isxp1qxZUz1fCsKOli2bOBiicuVK6s6d23bz/Na9wqD169fXPENOnz7lVw47kiPW4LkjHhrwnoxUGjx4oLF79OjRgGa9wqBt3LhBZc+eVdsZPnxYQBtou+SFiIF5hK5fv64wvx3Or0mTxkHnlHFWECwMGkLdQUCD/Ro1qvl4JzttYRtzBSJvnjxv+7xDhBoGzWkT52iHesO7CRMJkAAJkAAJkAAJkAAJpCYBijWpSZt1kQAJxA2By5cvq8yZM+lOBBFrcPJ58ybGxg8l3r4TlpdYg3xffvmF6bA4dOigs2jA7VmzZumy6PAYM+bLgHmdB5Mj1sDWhx++FrUgGoSSEIoFbcWndetWesJjt3LwIIIAgXyYt2b37t0mmy3WjBjxsd+oamSEx1KpUiV0+VjxrOnRo7sKNleBOckQV2SyaIxiZyIBEiABLwK2WLNo0ULXbBD85f7sNk+X7VmDCd690uHDh42dDz4YbLLB00Xsz5w50+x3rvz++yoz11euXDl8Drdr19bYuHXrls8xbMDjB3PPoZ5wPGtQXtqIZ1Ck0sGDB43d7t27qpcvX7iaxjkVKVLI5N27d69PPhFD4FV7+7a34LV69e/GxjfffG1sDBo0wOxfv36d2R/KSjCxBjY+/3y0sR8oFNm9e/dU/vz5dN4qVSr7VB+uWAMjeHd4773+2i7FGh+s3CABEiABEiABEiABEkgFAhRrUgEyqyABEki/BDD61y2tWrVSZcz4pv6zb4s1Q4cO0fswWjVUcULsBxJrMMpWxCHE3k9Khz7mjilUqIBuV4YMb6jFixeHPLGuLdZA9LDDtkm7Ay0hoEinVv787/gIKl7l0BFmd/hhHheMhrUTOlsQkk5sQ5CwE8S0EiUSvXqQ59mzZ/ZhPYq7adMmpnxqiDW9e/fy9GyxO80QsidS6dWrV1rwAoOxY8dEyiztkAAJpEMCEFAkfBhCRDqfMxBqypUra+6bwcQaiAYXL170I4X7knjV4Ll29eoVk+f48WMqS5a3dB0lShR39ezAc9kOGRZIrLly5bKxLSvLly8z5xBMrJk7d44UM0s8jzp2bK9tFCyYX+3fv88cS84KxAnxhMU9++jRIwqs7IRtW9BCPqdYg3s99uMDz5T79+/bJvT6rl27VL58eXUe8Lav9fbt2035AgXyqX37fMUgP2PWDlusWbLkN+vI61WcV6ZMGXQdb7+dU9nvUJLrzz//VLVq1dB58N6ybNkyOaSXoYg1eE+wz0sMYF/16lW1bYo1QoVLEiABEiABEiABEiCB1CJAsSa1SLMeEiCBdEmgf/9+aty4sT7nBqGmQYP6+o8+JilGfHxJJ0+eUOi8kY4SlF26dIkc1ssjRw5rm85OrEBiDQp27tzJ2G3bto22gbAxdnKrD8chtEibsPz000/UnDmvO6FQDh9nmDSIHqVLJ4YskXL79+9XP//8k12t5zo6lpo3b2rqzpkzu64HoVqQMOpX6rY7VdauXWPKoF6MgrXTxInfmePodEFoOmeqVStx5DTKYxQ1Oo6kPnTQYH+rVi31MqXEmjt37qhq1aqYtn7wwfsK/L76arxPc2/dSjB5IinWIIwczhPCIhMJkAAJBCOAjnHcM/Dp0KG92rlzp8JgAdynIb7gePPmzfTxYGINbEBwsecFOXXqlBowINGrAcchxjtT165dTBtQH+pGONCbN2/o9Xr16prjsOEUa6ZNm2qOV6xYXt24ccNUgXtv7ty5zHE3sQbiBLw1YRsDL1A/7tvw2JQELiIqwR7yYHCDnbZu3aL3w4sz1LRgwXzTNtQPkV9Con333QTVt28fn+PI4xRrLl68oEqWLG7yQbCxPWyc57d37x6f5uFZjBBosI0PBBWc3+bNm3S+hIQEvY19TjFp9+5dxuNJyu3bt08tW7bUp46OHTsY+xBuIBBJevTokapTJzF8K+qHZ7EzhSLW4F2rU6eOCm2SBEHM9uwBUyYSIAESIAESIAESIAESSE0CFGtSkzbrIgESSFcE0Lkhoy8hMshHRoSWK1dGIXa9M508eVIVL17UdESgo1zKYikdPOjosFMwsQajeZ0dNehQsm2jY6Natao+HTOoAx0qP/74g8+oaHSCSVnplIEI4kzo3JLjWGIkNEKwhJrQ8YPY+e+8k8fYgTiCurNlS4ytD7v2/DSYjHnVqlWGFUZ7S1uxFK8mXJ/Hjx+5NgVzFdjeNSgj8flR3/Tp09SmTZt0m1JKrEHDZs6cYc5b+OE7ZCd4LIERjqOjMlJpwoRvtc369etGyiTtkAAJpGMCCHslQoXcr+SZhXsvhPaJEyfq+0owsQYDGyBk2PfvrFkzm/shPCecAw6AFs86W9BBO9AmhPXCOj5z5841goRTrIF4X6FCOZMX5eT5gbIQaESwx/MM3pzOhE5+qQtL5EN4NTvhmYW5VCSfPNekLmzjmFdIOduWrONZAFHIFs3AHzalHoRIe//9wWbbKdbAFgZalC2bONcdyuHZJ+3CuWAfnsm7du2Uqn2WL1680EKa2/nZ18GtPMKXSluxRH1durzrYx/vBRCiJB/ySPvs5zSeYfCQcaZQxBoR7bxsw0v52rVrTtPcJgESIAESIAESIAESIIEUJUCxJkXx0jgJkEB6JoBOJIQKgWcIPpUrV9QT4sq20wvFZnH9+jWFcCCSFyNMMcJXtj/6aIjC3Cx2wohjOT5jxnT7kFnH6GJ0EEk+2IRt2cYSbXbrAIMRjIiFwCT5ixYtbNY//ni4a8gadNogrArKoPMJHiuYWyWpCR5In3wywtRn1/3TTz+qmzdv+pk8e/as9qqR9qJjB8IDtuEZ5OZRYxs5deqka30QrtABhHAssAUPG2fCXD9SL0LzeKWlS5fqfMOGDXXNgnpQH2yhEwqx91u1auGXd/bsxLmF6tatox4+fOh3PJwd+M6icxRh1phIgARIIBQCK1eu0Perxo0bakFE7oOYJwYp0D3PDmEJEWT9+vXaloSdbNiwvt5euHCBgpeDV0Loyh07dui88GBFGE20A+HTcF8XQR/74AHkTPDCkXZDzKlUqYLehlADoQDz88hxt+fl48eP1cCB7ym0F88dtN/NwwMeshDaxRaEgZo1q5ttDMq4du2qs3lBtzHYoEePbqpOndp6cILYxwADcMXzUvadPn3a1R7y4Nkq+SDOQMDBNrxrba9gVwNK6XcCvBuIDfu5jXcJvFM4Ezxj+vXro5/VYIeyTm9SlMH7zNatW43tChXs95lm+jo7Q6BKXRBZpE0QD90SBKtRo0aafHbbv+69GDMAACAASURBVP9+oqsI5GaH+0iABEiABEiABEiABEggkgQo1kSSJm2RAAnENQFM6puUcCY2LIQBcRMj7DzhrMNmUuLJO+s4c8a9k8eZT7Y3b96s0BETiZTUulHnunVrPYWoYG0Kp75gNpN6HKFzEBrNK2F+AHRuOUPGeOUPtB8heDBSGXMgMJEACZBAUgmgo/zChfNJKuYUa6QwPEZw/4b4n9QEUQHCergJYb7cRIVQ7KG9aHeo87Vt2bIlYmI72gdBQ8KGhtLeQHkOHz6krlx5PT9QoLxex5LyHMW8M2AXakK4OrwrpVRKSttTqg20SwIkQAIkQAIkQAIkQAIUa/gdIAESIAESIIE0QgAh9PLmzaMqVaoYcueg26nBm6dt29Y6/FBSOsvcbHEfCZAACYRKwEusCbU885EACZAACZAACZAACZAACZBAeiZAsSY9X12eGwmQAAmQQLojMGjQQO1dg3j64SaE+oGHTrNmTcI1wXIkQAIkkGQCFGuSjIwFSIAESIAESIAESIAESIAE4ogAxZo4utg8VRIgARIggbRPAGF3xoz5Us/VE87ZPH/+XA0cOEB1795NYd4DJhIgARJILQIUa1KLNOshARIgARIgARIgARIgARJIiwQo1qTFq8Y2kwAJkAAJkAAJkAAJkEAaI0CxJo1dMDaXBEiABEiABEiABEiABEggVQlQrElV3KyMBEiABEiABEiABEiABOKTQJcunVXBgvn15+nTp/EJgWdNAiRAAiRAAiRAAiRAAiRAAh4EKNZ4gOFuEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEkgNAhRrUoMy6yABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABDwIUazzAcDcJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJpAYBijWpQZl1kAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkIAHAYo1HmC4mwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARSgwDFmtSgzDpIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwIMAxRoPMNxNAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAqlBgGJNalBmHSRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiTgQYBijQcY7iYBEiCBpBJ49uyZ2rlzp2rfvp35HD9+PKlm0n3+J0+eqMuXL+kP1plIgARIgARIgASiS+DVq7/Ms/nOnTt+jbl+/bo+fuXKFb9jsbLjypXLauDAAeYdbOrUKervv/8Ou3nPnz83TO7fvx+2HRYkARIgARIgARIgARIggVAJUKwJlRTzkQAJkEAAAjt37lBt2rRWb7zxH59PmzatApSKz0OzZ882jKZPnxafEHjWJEACJEACJBBDBCDCyDtM165d/FpWpkwpfTx79qx+x6K9A4Nlhg37SGXM+KY5B5zLm2/+Vz148CDs5u3atdPYGzHi47DtsCAJkAAJkAAJkAAJkAAJhEqAYk2opJiPBEiABAIQgDeNdHJAtPnss0/15+7duwFKxechijXxed151iRAAiRAArFLIC2LNcuWLTPvYCVKFDPvYJs3b0oWcIo1ycLHwiRAAiRAAiRAAiRAAmEQoFgTBjQWIQESIAGbwLhxY00nQd++fdSff/5pH+a6g0CsijUJCQlq2bKlav78eernn39ytJqbJEACJEACqUUA4adwP8bn009HpFa1cV1PWhVrTpw4obJmzazfw0qVKqHOnj0bsetIsSZiKGmIBEiABEiABEiABEggRAIUa0IExWwkQAIk4EXg44+H606C3LlzqePHj3ll4/7/EYhVsWbNmtVGdBs/fhyvFwmQAAmQQJQI3LqVYO7H8FxlSnkCaVWsOXLksPmufPfdhIiColgTUZw0RgIkQAIkQAIkQAIkEAIBijUhQGIWEiABEvAigIlrBw8epDsKOnfu5JWN+y0CFGssGFwlARIgARLwI0Cxxg9Jiu9Iq2LNjh07jFgDj6xIJoo1kaRJWyRAAiRAAiRAAiRAAqEQoFgTCiXmIQESIAEPAteuXTOdBBRrPCA5dlOscQDhJgmQAAmQgA8BijU+OFJlI62KNQ0a1DfvYRRrUuWrwkpIgARIgARIgARIgARSkADFmhSES9MkQALpm8Dy5cvU119/ZToJqlatoqZNm2o+r1690gDWrVur9x04cEBvoxPqm2++Vm+9lVF9+uknrpB++22xGjt2jM6DfPiMGjVSLVgw3zU/dp45c0bXg7KS5s6do0qWLGHsoH1Pnz6Vw3o5a9ZMNXToRzpPtmxZtI3kdnhs2rRRtWzZ3NSLCX/nzPlV1xeqWIOOI7S3fv16xk6lShX0vlOnTvmcg9fGoUMHdf6iRYsYG61bt9L7Vq1aqYvt27dXb4uH1Btv/Ee1bdta75Pr6VXf9OnT1AcfvG9s4zr99NOPas2aNV5N0vtnzJiu7d+8eVNvHzp0SPXp01vbWb9+vU/ZlStXqNq1a5o6vvpqvC4bybj8PhVygwRIgAQCEFi0aKGqUKG8uSfhnod75dWrVz1L4Z734Yev75UIbYYyDx488Clz8eIFvX/ChG/Ns7Vy5Yp6n9yPd+zY7lMm2MbLly91+b59E++xuE9nyfKW3rdly2bP4qgHdW7fnljfkyeP9TYGZsBG6dKl9PaxY0c9bUTywMqVKxXCfKFu+QwbNlS3Ac86O+3Zs1vvf+edPCYvykye/It69OiRndWspzWx5vjx4/ocMU8Nntv4/PLLJL0P1w3vRHbauHGDPibssET4WuSV9zU7P9ZD8ay5fv2az/tavXp1tM0FCxY4zZnt06dP6zyVK1cy1+f77yeq339fZfJwhQRIgARIgARIgARIID4JUKyJz+vOsyYBEogAgRo1qpkOAukosJd//vmnrqVVq5Y63xdffK4wL0qRIoVMOcx3Y6fz588r5EMngm1L1jNmfFOVKVNKnT3r2wkBG7NmzdJlypUro9B5hHwZMrzhZ6dDh3a6g2zfvn06z5tv/tcvT7duXdTjx4/tpoW0npCQoJo1a6py5MjmZxNtQccSOu3kfCB2uKUNG9YrCDOSz7nMly+v+vDDD9TLly/ciqsnT56oXr16qjx53va0IaIIBDOnfec2OnPsBL7vvz/YsxwmO65Xr66C55VbwnVEHegEHD16lE87Ie4hXb58SdWoUV13Kjrbg20IcUwkQAIkkFoEzp07q/B8yZQpg+u9b926dX5N2blzh37OuN3DsK9Fi2bq7t27ptySJb+52rbLDxjwnskfbOXgwQOqZ88enjbxrEIbbt265WcK9aDe997rr+7fv6/atWvraidv3jzq5MkTfuUjtePy5cuqZs0ans8CDLJ48OC+qQ4DCN5+O6drW3E+xYsXVRik4ExpTayBSGh/L5zreCeS1KlTB5U9e1bP/KVLl1Tg7EzBxJoxY75UhQoVdLVbrFgRpzkF4XDIkA9V/vzvuJbBu8OkST/7leMOEiABEiABEiABEiCB+CFAsSZ+rjXPlARIIMIE0Am0ePEi84e7QYN6auvWLeaD+WyQRKwZNGigql27lkLHSsWKFfQHIyklYdQuPFDQ4ZA9ezbVtGkTYwt24RGSM2d2fRyeIidOHJeieiliDWxAbMGI2n79+mgby5cvV3nz5jZt7dixg8LI5nz53lGDBg3QeRYvXqwqVChn8qCDKinp3r17qm7d2ro8OvNwjhi1LEzgOYJzK1u2tKnDTayBp490uuBcvv32G2MDoglEKDkOsUtEMWnr06dPVO/evUye8uXLqYULFxgbaA/aKd4yFy5c0MfgsSJ2MQJb2o3ljRs3xLwerSsdLRCDunfv5pMXAkvmzJm0rYoVy6s7d+6YsrIiYg08swoVKqAgPsl3YufOnerff/9VI0Z8rG2g8+aHH773qQOdPRDGmEiABEggNQj89ddfqn//fvqelCNHdoV7t32PxD0JzwA7bdu2zXRK4164ZMkSU+aTT0aYTm6IJeJhc/v2bZ1n6dIl5n6M+7Vdl9Njwq7TXj9wYL/KnTtRsMc9dsCA/sbO5s2b9D1X7sX169f1a7+INZ06ddRCDTrf4fEqbWnatLFpIwZhpMQ9GTblmYdnQd26dUz9aAeebfC8tBM8ZeGNJO2U5fDhQ5UMzoD36MOHD+1iKtJiDZ59p0+fCvsDYSNQwmAInJs9sAODMOR8xXMVNrp27aIaNmxgjkme3r17mmuI6/3s2TOfKgOJNTg/edbjGohNLGfOnKF/I7YxeCx/+ukIXR88erp06exTBu+H8PgSry+7LNdJgARIgARIgARIgATihwDFmvi51jxTEiCBFCAQypw1ItZACICIMWPGDL+WQNhB+A7J4xXuDKHXRFCA2CKCEAyKWCM2Dh8+7FMPxKXMmd8y5THK9NixYz55Xrx4YTofIEgcOXLE57jXBsSF8ePHGdtu4d1gu3Pnd00etNMp1qCjDp1MOFanTi3X0c7w+GnSpJGxs3v3bp9m2aOo0UGDTsZQEryehC3OxS29evWX+uijITofOmncRiejHMLciS0ISv/884+POekgRB502hw96htGB22W8o0bN/Ipyw0SIAESSG0CCQk3zT0JgwGCJdwra9asrsugU9p5D0R5CA3i/Tl16hQfk8mdswb3UHkWwMvEeY+VyoYPH2bOC4I9nmWSRKzBvbh8+bIK4a7sBI+ghg1fz5eCgQWRTBC/EG4O9eOZgRBmyU0YiCDPll9/ne1jLtJiDbxGpa5wlvA0DiUlZ84aCCgQrqR9EPHsFEisgRc0yuHabN261S7mug5vZqlHQus5MyKEmuRxHuM2CZAACZAACZAACZBAfBCgWBMf15lnSQIkkEIEkirW9OnTy7UlEEXkDzrmTvFKECogYkhedCRIssWajh3by26fpQhCKN+jR3efY7JhzxWwYsUK2R1wiQ4PaVPRooX9YsXbhe1QJE6xpmvXzsYOOo680urVr4UVjIiWdPDgQS1+oC3du3eV3SEtQxFr7BA98HbxSginIqOh0RaIUHayxZp58+bah/S6LdagA5GJBEiABKJJwBZr3AYcONsm90qEGdu71z/kluSvVClRnMfgAzslV6yZMmWyeZYEChkJD8vChV+HsbLFfVussb1g7Xbi3i7PPoRJi2QCZ7Etc74l1z7mR5PwoBRrEmlu27ZVCy5gHY5Yg7mLLl26FPTSwLMHdTRp0thzEMnu3bvMNd+82Xs+paCVMQMJkAAJkAAJkAAJkECaJUCxJs1eOjacBEggFggkVay5fv26a7PteVyCdcpIeCz86fcSaxCCwy3ZYg1GNbslCC8SMi1UsQbeLdKphPYFShgdLHltsebu3Ts6Lj+OIXSZM6SObRNeOmLDFmvENkLf7N27xy4SdD0UsWbEiOG6XoSjwWTFgVK7dm1MG73EGoQ+cwv1Yos1mDx52bJlgariMRIgARJIUQK2WFOtWhW1Zs2agPWJWFOwYIGA+RCaDPdyeJ3aKblijYTdhOei0/vSrgfrEr4T7fASa06ePOksprdTUqzp0KG9ZoPnxKNHviHLXBsTYCee6/Pnz9Of/PnzabspLdagToRaC/djew4HODUVrmcN5iESJpkyJc4TGI5Yg+8NwvoF8wQSsSaQBxZsINwebDrnNAzEgMdIgARIgARIgARIgATSDwGKNennWvJMSIAEokAgqWINOgfckvyJxx905xwszvx2p1n79q9H8tqeNckRa1Af5rtBW0IVazChMfLjc/jwIWeTfbZnz55t8tpiDcQVsTFs2FCfMs4NhNRBXH7kz5Ytq9qyZYvOUqRIYb2vatXKziJBt0MRawoUSOzkCtYBicowsbacjzMsnHjWVKlSybVdCMWDyZPfeiuxAwkdmeggRegUdIAxkQAJkEBqEoCIYc/rlSVLZoWQTZhj69WrV35NqVGjmr7/yb0L9y+3T6lSJU0+20hyxRq5xyKsZrC0cuUKc6/+7rsJJrvtWeMl1oBLv359dflIetbAAyZXrhza7meffWraFOoKniG4NgijCe72vC7yXEppsSbUtiY3X6hiDZ6dYCLfQ3v+PGGSFLHm1q1bJkwdyuP9Y+TIz9S5c2f9Tmn79m1KvIoLFsxv2iBtsZcI2wd7FGv8MHIHCZAACZAACZAACcQFAYo1cXGZeZIkQAIpRSAaYg3ORToWqlevak4tnsQanDQ61YQD5vJBksmTY0GsuXjxommfM+ScdCR6iTVyURGSDh07cp5YNm/eTAtBkodLEiABEkgtAvAgwHxm9j2pbds2fvOfibBt5wu0HmnPGrnHhiLWHDhwwJwP5iSTFIpYg7yjRn2my0dSrIEwL7ySKtacPXtGiVcObOAZUqJEMfMBa+yPJ7EG3lUtWjQ3TIsUKWR4gI28OyRFrMG1v3r1qqpdu5aCt61cL9jG7+SPP/6Qr5JatWqlOS75gi0p1hh8XCEBEiABEiABEiCBuCJAsSauLjdPlgRIINIEKNYkEk1tzxrUGg9iDc7z9u1b6uuvvzKdSejgQZi6Awf2R/rrTHskQAIkEJQA5uSCB4F0cOOehLnKTp8+ZcqKWAPvEISnDPaZMmWKKYuV1PSsSU9iDQYJlCxZ3AgD8IaCB4idZD61lBZr4N0DL9hwPygfSgrmWQMvpXz58hom+C4+ffrUxzQ8xfA9TqpYI0ZWr/5d1a9fz9QBW71791JyDrZYA3Ez2O8BxzF/DRMJkAAJkAAJkAAJkED8EaBYE3/XnGdMAiQQQQLREGsQxgMdAfjY88PEk2cNYtm3adNaMyhUqIA6ceK4vqrSeRgLnjWzZ88y12nWrJk+3zoZ9R3Ms8ankFIKI6xz5UoMkYJOUCYSIAESiBYBhJWCB4GEayxduqRpiog1oYSMNIWsldQUa2zhHyHRJKVFz5qxY8fo5w6ehWvXrpVT8VmmllgzevQo8wyUd5akLIPNASMnFUysee+9xHmRcubM7imAJFeskbZs3bpVtW7dypz3pEk/60O2WBNozhqxwyUJkAAJkAAJkAAJkED8EqBYE7/XnmdOAiQQAQKREmu2bdtm/tyPGjUyYMsg0EiHx65dO03eaIo1vpMstzFtcltBmBlpvz1nzYsXLxRGnOJYjhzZ1I0b192K633IKzbq169r8o0fP07vR5iX5cuXm/2hrIQyZ82MGdO1/QwZ3lBe8wJJXe3aJZ4L2gk+dgpXrIGNd9/tqNtAscYmynUSIIFoEZDOcluskXtl7ty51IUL55PctOSKNfBGxL0Xz4Jly5YGrL9u3do6L/JjDhpJ0RRr8IyTsF14HjqfIdJG5xIDFXAeeEZ5pdQSaxYvXqy6dHk37E9CQoLXKfjsl+8fztttTrc8ed7WTIoXL+pTzt6IlFgDm7t27VIy74yINZiLsHbtmrodCIuKASdMJEACJEACJEACJEACJOBGgGKNGxXuIwESIIEQCURKrMGEtHny5NZ/5DEiec+e3a4tOHz4sIInCTolGjVqoB4/fmzyRVOsefnypSpcuKBuF0av7ty5w7TLXkHnix3b3RZrkA+jtHFu+PTv388vVAnyvHjxXHuYSL6lS193xC1dukRlzpxJl4fXSqidPbAbilizefNmM0lw8eLFdLx6+/xkfdWqVQqdlGhjr1491V9/vZRDepkcsWbatKnaLsUaH6TcIAESiBKBcePG6nuSLdbY98phw4aacFChNjG5Ys2yZcvMswDz1ng9C+bNm6sHB+BejXCeCNklKZpiDdpgD2wYNGigevbsmTTNcxlMrPn991UqS5a39PVK6TBono2M8IHkijXwghWv3HDDoNmn9ODBfVWuXFnNWMQaHMe7gLy3nD9/zi7CdRIgARIgARIgARIgARIwBCjWGBRcIQESIIGkE4iUWIOa7XlfMCHw3r17fRp05MgRPS8A/uxD8IC4YKdoijVoB2KsS4cHOk/QWSZx4R89eqSFjUqVKpjOCpyHU6xBbH1bzOnXr6/PSFmIQvA8kg6Pli2bK3SM2Kly5UrmONbhoYP6kRA//u7du/pjj6DGsU2bNupR2LCNzj2Uw2jYBw8e2OZVs2ZNjP2yZUsrzN9gp3Xr1plRtRhde/z4MfuwXg8m1mDU7dy5c9STJ098yqLtGB2MNkIcYyIBEiCB1CDw8OFDBWFc7umoE8IG7knw/MA9qVq1Kj5Nse+V06dP13lxD7cT7q/OeyyO37lzW2XNmsXc6/A8xP0Y9dmCim3LuV61ahVzr8Y9HWUl4VkAcV+EC0wKf+bMGTmsl9EWa/B+YT8PIdjgHGTierDE9r1790y7GzR4PW8KxBjx4JBrZXsRxYtYU6xYEf09yJ49q4/H7atXr9SVK5dVxYrlzfckKWLN8uXLVELCTQU7knBtZEBFogfu6xCoJ06cMN83CJunTp3y++7jvQTXFN91JhIgARIgARIgARIggfgkQLEmPq87z5oESCBCBCIp1uDPeZMmjUynAUJ3fP75aPMpUCC/OYa46M4UbbEG7YE3jAgpWNasWUO3v2jRxM4S7GvbNnGuGaw7xRrY2L79dUg45EE4MeGA8CHYh0+jRg1Np5XN4sKFCz4TLCNviRLFtA1Mii3lDx06aBfT6zZ/5GvevKmyR4sj082bN7WYI3YQUkbah6XM35A3b24Fgc0tBRNr0GED+xUqlPOxLWIYjkHMYSIBEiCB1CCATmncd2rWrG7uSXZIThyDUG0n570SeXr27GHK4375zjt5/e6xYsO+X6Ms7sdYOkVsye9cXrx4UZUsWcLc8+FtKffq0aNfi/5FihT2E2pgK9piDdoA8QDnbH/wnMJ5dO3aRe+HWCZpx44dPnmHDv1I5x0+fKjeX7t2LYVnE+x16tRRiunllStXTFnYdiYJnwbRI5ZSMM+ahQsXmPPCect3QN5XEG4O4fJwDF5gdkKoWWFvzxGIPF988bk+NnjwIGMT7yWSHyKRM0EglONY4lpIe7Ds3buXPm575DhtcJsESIAESIAESIAESCB9E6BYk76vL8+OBEgghQlEUqxBUzFCE50FEu/c/lOP9ZYtW6hNmza5nlUsiDUYxTthwrd+Ygna3rRpY7VmzRq1d+8eEyLMTazByW3Zslm1atXSp1NDWCD819ChQ3xGszqBYMQxwtvUqFHd1QYEmF9+meQspq5evaLKlSvjU8Yp1qDQ/fv3tSeULZ5I+7Ds1q2rOnbM36NGKgwm1qxcuVLVqfN6HgXbNjxrTp48aUZMi00uSYAESCClCMyfP09JiC37foR1hHxCR794cdhtCHavRHkI+Hv27LGL6XU8DxHu01lfqGINjFy7dtVHdHHa6tu3j4LA75ZiQayBBxDmYYG4hBCpzvZju3HjRtozFOcAD5rvvpvgmq9OnVralogutsiDsulVrMH3csiQD12ZdOjQXr9LyJw1GCBhJy+xBh40eA+RZ7nzukBoxLxDzoTruWrVStfvtdiAGAaRjYkESIAESIAESIAESCA+CVCsic/rzrMmARKIEAF4QJw/f15/vGLiY3Sx5HHrzHJrCkQDlDl9+pRq06aVOnr0iN62Q9A4y2H+Gqnn8ePEsF/OPAhlI3kCdXhdunQpaH1O2/Y2WKAedMLt379Pr9v1Xb16Ve+T8GR2WVlHfH5pK4QVTBiNbXQohZrQUSg2vv9+ollHuDWvhImcUQajjnfu3BmwPrG9Y8d21blzJ2PfrZPGrg8TbqMsOHglhAYS+3bbMcKdiQRIgARSmwDCbbndk3DPDJbknue8V8JeoLlY8IxAnuHDhyl4SGA91DBo0iY8d6Xd69atVX379jbbdggryS9LeRagbKB7unDBsz4l0/Xr10277WeCPXcd6rffS+CNihCfOAcJN4dnKLbheWQnuxzmDHKm1+XcxS1n/tTatrl4fTfguSzfAbxTHThwQG/LewkEOxzHu5ed7HJ2GD3JI+V2796l5s2bZ+oI9H1BWft97ZtvvlY///yzKesMrSp1cUkCJEACJEACJEACJBAfBCjWxMd15lmSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnEKAGKNTF6YdgsEiABEiABEiABEiABEiCBtEcAHjyDBw8M64OQc0wkQAIkQAIkQAIkQAIkQALxSYBiTXxed541CZAACZAACZAACZAACZBAChAYP36c6xwpMi9JoCUmvmciARIgARIgARIgARIgARKITwIUa+LzuvOsSYAESIAESIAESIAESIAEUoAA5jrBHDHhfALN4ZMCTaVJEiABEiABEiABEiABEiCBGCJAsSaGLgabQgIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEH8EKNbE3zXnGZMACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACcQQAYo1MXQx2BQSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIH4I0CxJv6uOc+YBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEgghghQrImhi8GmkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJxB8BijXx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c96acGz98cezJM/5FE49LEMCJBBZAhiI8PTp08gatawh3CnEiVjp6MY9DyHh0kJKqfeEtHDukWojxDi3kLuB7GNgCjyimUiABEiABEiABEiABGKTAMWa2LwubBUJkAAJkECUCKCjC15S4XwiKTRE6fRZLQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQBQIUKyJAnRWSQIkQAIkELsE+vfvFzS+u1useOwbP35c7J4YW0YCJEACJEACJEACJEACJEACJEACJEACJBCzBCjWxOylYcNIgARIgASiQQDzHUB0Ceeza9fOaDSZdZIACZAACZAACZAACZAACZAACZAACZAACaRxAhRr0vgFZPNJgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgATSNgGKNWn7+rH1JEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEDnMDB8AAAgAElEQVQCaZwAxZo0fgHZfBIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIggbRNgGJN2r5+bD0JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkEAaJ0CxJo1fQDafBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABMIhkJCQoL799hs1deoUdffunXBMsEyECFCsiRBImiEBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiCBtELgn3/+Uc2aNVVvvPEf/enbt7f6999/00rz0107Kdaku0vKEyIBEiABEiABEiABEiABEiABEiABEiABEiABEiABEohnAvPmzVUXL14MiGD9+vVGqBHB5vjx4wHL8GDKEaBYk3JsaZkESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEUoXAs2fPVMGC+fUnU6YMas2a1QHrPXbsmMqfP58RbLp166r++uuvgGV4MOUIUKxJOba0TAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKpQuDp06dGeIGnTDCxBo06e/as+vjj4WrcuLHq8uVLqdJOVuJOgGKNOxfuJQESIAESIAESIAESIAESIAESIAESIAESIAESIAESIIE0QyAcsSbNnFwcNJRiTRxcZJ4iCZAACZAACZAACZAACZAACZAACZAACZAACZAACZBA+iZAsSZtX1+KNWn7+rH1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ARIgARIggdAEKNaEZkQfJEACJEACJEACSUAAZlHc9s0jOb548UISlIJZIIHkINCqVUv9/8SZNclRH8mcC5jZwlpQeN5OmzYtmbPKvJEACZAACZAACZAACZBAShOgWJPS1cfMkwAJkAAJkED6EMDMmoULF0T948ya9LlXWNLQBCpUKEexJjQm+vgfAaxLBrGmWbMmZEICJEACJEACJEACJEACJJAgAhRrEgSW0ZIACZAACZAACZAACZBAshIQsWbgwAHJmkXmK4kIvP76WC3W5MuXJ4lyxayQAAmQAAmQAAmQAAmQQM4iQLEmZ9UnS0MCJEACJEACJEACJEACIQmIWDNr1syQfumBBFavXq3FGsyu+fDDDwiEBEiABEiABEiABEiABEggAQQo1iQAKqMkARIgARIgARIgARIggWQlMHv2LPXkk4/rzneKNclaS8mVr/3796siRQrpe6Z3717qwYMHyZVB5oYESIAESIAESIAESIAEcgABijU5oBJZBBIgARIgARIgARIgARIIl8DkyZPNLAmKNeFSo7927dqa++bGjesEQgIkQAIkQAIkQAIkQAIkEGcCFGviDJTRkQAJkAAJkAAJkAAJkEAyExCxpkyZUur06dPJnFXmLYkIzJz5oxFrpkz5NolyxqyQAAmQAAmQAAmQAAmQQM4gQLEmZ9QjS0ECJEACJEACJEACJEACYREQsaZOnVph+acnEgCB48ePGbFm4MABhEICJEACJEACJEACJEACJBBnAhRr4gyU0ZEACZAACZAACZAACZBAMhPImze37nSnWJPMtZR8efvnn3/UoEED9b2DNY8OHz6cfJlkjkiABEiABEiABEiABEgghQlQrEnhymPWSYAESIAESIAESIAESCBSAo8//l+KNZFCo39N4MsvJ5jZNQsWLCAVEiABEiABEiABEiABEiCBOBKgWBNHmIyKBEiABEiABEiABEiABJKdgIg1XHck2Wsq+fJ3+/ZtI9a0bNki+TLIHJEACZAACZAACZAACZBAChOgWJPClceskwAJkAAJkEAyEvj777/VX3/9pX/3799PxiwyTySQtgQePnyoRKzZsmVL2nJgwaMj8ODBA9WlSyct2DRv3kzBNBodCXgR+Pfff827AN4JeK94UeI5EiABEiABEiABEnASoFjj5MEjEiABEiABEshSAmvWrFbjx3+uf1ev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N0l0EmuqW9ASa6rLV6GLgAiIQF4CEmvyEpN/EWg8AhJrGq9MlSMRaHoCEmuavgoIgAiIgAiIQI0JSKypMfAmiU5iTXULWmJNdfkqdBEQARHIS0BiTV5i8i8CjUdAYk3jlalyJAJNT0BiTdNXAQEQAREQARGoMQGJNTUG3iTRSaypbkFLrKkuX4UuAiIgAnkJSKzJS0z+RaDxCEisabwyVY5EoOkJmFiz99493D/+cbM+YqA6oDqgOqA6oDpQ5TrQvftebrPNNm36NogAVJaAiTX777+ffsNV+A3vs09P96c//Z+7+eabxLcKfNUPUT9MdUB1IG8d6NSpY/Bevueeuyv7h6rQREAE6oaAxJq6KSolVAREICsBE2vofOojBqoDqgOqA6oDqgO1qQMSa7K2VOQvKwETa/Qbrs1vWJzFWXVAdUB1oH3UAYk1WVsK8icCjUdAYk3jlalyJAJNTwCxZuDAo/QRA9UB1QHVAdUB1YEa1oHBg49p+jaIAFSWwK+//qrfcA1/w2o/q/+gOqA6oDrQPurAhAkTKvuHqtBEQATqhoDEmropKiVUBERABERABERABERABERABERABERABERABERABERABESgEQlIrGnEUlWeREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAE6oaAxJq6KSolVAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREoBEJSKxpxFJVnkRABERABERABERABERABERABERABERABERABERABERABOqGgMSauikqJVQEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKARCUisacRSVZ5EQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQATqhoDEmropKiVUBERABERABERABERABERABERABERABERABERABERABESgEQlIrGnEUlWeREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAE6oaAxJq6KSolVAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREoBEJSKxpxFJVnkRABERABERABERABERABERABERABERABERABERABERABOqGgMSauikqJVQEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKARCUisacRSVZ5EQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQATqhoDEmropKiVUBERABERABERABERABERABERABERABERABERABERABESgEQlIrGnEUlWeREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAE6oaAxJq6KSolVAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREoBEJSKxpxFJVnkRABERABERABERABERABERABERABERABERABERABERABOqGgMSauikqJVQEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERKARCUisacRSVZ5EQAREQAREQAREQAREQAREQAREQAREQAREQAREQAREQATqhoDEmropKiVUBERABERABERABERABERABERABERABERABERABERABESgEQlIrGnEUlWeREAEmprAunXr3CmnnBR+Pvrow6bmocxXn8AbbywM6xt1748//qh+pBWK4fLLLwvT/sILL1QoVAUjAiIgAiIgAiLQDASmTJkStiMuuOD8Zshyah6vvnpUyGLcuGdS/emGCIiACIiACIhAOgGJNelsdEcEREAEQgKrV692V101Kvz8/PPP4b32dkJa//Sn/ws/77zzdntLotLTYARefPGFsL5R9/71r3/VTQ67d98rTPtNN/29btKthIqACIiACJRHYPny5WF7jrbdpEkTcwVEG9DahE8++USuZ+W58QjceecdYTti1107Nl4Gc+Ro//33DVlcc83VOZ6UVxHY+ASuv/4699VXX238hCgFIiACTU9AYk3TVwEBEAERyEJg+vRXw84Hg9Hffvttlsc2ih+JNRsFe1NHKrGmqYtfmRcBERCBuiIwadKkSJvukEMOdt99913mPNAGtEkxxx47OPNz8tiYBCTWtJarxJpWFjqrHwLr168P3+m826dPn14/ia9CSp9++in3wAP3h5+sk/DsuX79Dgp59ujRLQhn2bJlVUipghSBxiUgsaZxy1Y5EwERqCABiTUVhKmgGo6AxJqGK1JlSAREQAQalkBcrGFwbvjwMzLntz2INUuXLnUrV67MnGZ5rB6BjSXWfPfdekf/pD25RhFrpk59yf3000/tCa3SUiaBLO/Kv/71ilBc4P/gkEP6lxlb/T/20UcfuV122SnCY8OGDakZ+/XXX92UKZPdnnt2cZtu+ufIczapgeMOO2znzj33HPfbb7+lhqUbIiACrQQk1rSy0JkIiIAIpBKQWJOKRjdEwEmsUSUQAREQARGoFwJJYs3222/r3nrrrUxZ2JhizciRI9yAAYe7XXfdxd144w2Z0itP1SVQa7HmueeeC+rAAQfsH9SD6uYuX+j1LNasXr0q4Mrv689//n/ugw8+yJd5+W5XBM46a2T4rrzhhuuLpo37vrDw0EMPFvXfqDfXrl3rfPPQxiRNrFmxYoXr379fhF2HDpu7Pn16B58uXXaP3CO8Sy+9xLVnc/KNWrbKV/0RkFhTf2WmFIuACGwEAhJrNgJ0RVk3BCTW1E1RKaEiIAIi0PQEfLGGgSUbkBo+/MxMs343pliz9949wvRKrGkfVbnWYs2dd94Z1gFEu/bk6lmseeutxSFX3gkSa9pTzcqfln326RmWZymxhtUe48Y9E4ifd999l1u3bl3+COv8if/85z+BkELd32yzTd1f/rJJyC9NrPnmm29cv359A3+snLn//vvctGkvhyTWrFkTcMXUqP3PcrziistDPzoRARFIJiCxJpmLroqACIhAhIDEmggOfRGBCAGJNREc+iICIiACItCOCfhizT//eZvbYotWwebxxx8rmXKJNSURNZUHiTWtxS2xppWFzjYugTxizcZNafuI/cknnwgFlaFDT3BHHjkg/J4m1pDysWOfdoMHD3KIPWmOPeH8fWya2cxcGiNdF4E4AYk1cSL6LgIiIAIJBCTWJEDRJRH4HwGJNaoKIiACIiAC9UIgLtaMHv1AOCi11VYd3Ntvv100KxJriuJpupsSa1qLXGJNKwudbVwCEmuy8//qq6/cgQf2Cf4He/XaJ1hZlFWsQaT5/fffS0Y2fvz48H92k03+5CZNmljyGXkQgWYmILGmmUtfeRcBEchMIKtYg73zmTNnBJ9///vfYfhsAmvXL774ovA89JDj5P33V4fP+2GtXLkiCGX16tVhY4ilxu+8U3zQgYcYeLD0xY+ffPJJYurWrv088kwWcwEffrgmfGbBggWJ4Wa5uGpVK88ffvghfGTmzJlB+HBJWsJOg9LPn89vyZIlYTjFThYtWhSG8d///jf0umLFe+F1C3fWrFnh/Twnq1atKgiLdGNP25wfX7EZT+Z/wYLXwzB9Bq+//rp5KftYrlgzf/78IE0TJ05w1157TZi+N95YWHZasJ/s588/X7ZsWUG4vm3mm276e8F9u7B48eJIuGn2ln/55ZeIPz/+YrPOLJ4sRzb/tHCtrtn377//rmQQzHAz/7xPzP3rX/8Krz/wwP2OD/4wYyAnAiIgAo1CwBdrdt55R/fll18GmyObmZYzzzy96OBTuWLNe+8tD9+x8Xd3scEu/7nOnXcL23hnnHF6GJ6902kDpjn+t8xf/FjsubTw8lz/4osvInH77aekcPx2Hv+/SQ5mlo94Wzcen/n77rv1SUEVvUY7iedfemmKGzXqyjBOTADh8og169evD58nTL8epLW3icN/7rzzzg3rwPbbbxcJjzDnzJlTND+LF7e2Y41LlueKBvq/m2lijd++8OP88MMPU4P12120i7M4fst++KXaXdRD8z969OiQK++Cp54aE94zP/H29muvtbRj582bFyaPeoH/l1+e6q688q+J7xIGxy1Mjn49YN+QUm758tZ3id8eTWsfsgl8Hsf7wE+fndOfLeXMbzxf77zzTqlHE+8X66MSh++i78rW/VJOP/20gvz47zz/XUKY337b8tv2w046f++9wr6f5Z86X8pR1ub/888/D71///334XXMXT7//HPB96S+bfhQG05OOOG4sO4/8sjDQUhZxZqs0cLD/mM50neUEwERSCcgsSadje6IgAiIQEggq1hz+OGHhQ0RBm1//vmnoKG+++6tnWu/oXLssYMdDb0sjvCuu+5at8cencM4/LB2372TY/CbxrB/Pd6Bjcc1duxY17dvy2wa/zk779mzeyASxAcSaFT27XtgGFfXrnu4H374Ph58+J0O2V577Rn6v/fee8J73gj00AAAIABJREFUeU8uueTiMBxsTP/xxx/urrtabXiTdpZlm6Mjc9VVo9wxxwwKn7P82XHnnXdy559/bkkb1Wabl+cQ5H766Sd3+eWXud1227UgbDYopYz9AXFLU9KRdF599VUuaUNG4uP6woULgo0Zzz33nDA+Om1p7uuvv3bHHTfEbbnlFqF/yzNH7PU/8cQTDn/lujxiDfWIQRi4bL75XxLTtPXWW7oTTxzq6Ej5omex9NFB/etfr3D8Dvz8+ecdO+7s4h3NLGINQtd2220ThgtPv3NMuhANX3llmjviiMNDf37cnB9zzECXpROelk9+c7fc8g/XrdteqXH073+Qe/bZ8cHATlo4DC5Y2hh4wlGvjj76yPC63efI7/bvf/+by9vZT4tf10VABERgYxLwxRrecb/++ovD/Jn/P3n77benJjGvWEP757LLLnGdOnVMfMeSBt6/s2fPdvHBYBIxcuTw1Of8dzXnDA4nOdqxhx9+aGo4tC3feOMNR1szyTHozX8ywsSnn36a5KXoNf6X/LSWGkT323mHHnpwYthMPLAwBw48OvDDIPjDDz/k9t9/v/Ce+eFIG469KSjDUo520ZAhxwbtJD8MOx88+Bj3/vvvZxJriG/YsKHuoINa280Wjh179Ojubr/9n4ntBOqG+St13HbbrROzhuBz2mmnRtozflibbvrnYJIGgke5LkmsQew66qgjEtO/115d3c033+Q+++yzgihpB1r6OnfePXESVvwhNoa3ZziyF0kxRz30/Zc6X7p0aSQ4a/sj+uIYZB8yZHAkTF8g/OqrL4P27wEH7B/x48e77777BHt/IDimuREjzgyfpw4yEF6sfcjA+9y5c9OCC68jGDJ5Kq2viVhMezDueG/wHG17Py/++U477eDOPvss98EH78cfT/yO6PXUU08V7aMSvm+6cuTIEanx+2nhnD6DOX4b/n3el8XcRx996C6//FLXqVNh38/COeqoIx2T9pLe6RY2/S/z/+ijjwSXX3jhBUdb3q77x/326+VYCVrq/WnhZznSh+OdQTzUY/pdixa96diDxuIulocsceBHYk1WUvInAi0EJNaoJoiACIhABgLliDU//vijO/fcs8OGDg0ef7M+awDtuWeXYPC6WDJoOF122aWRsFhCjJ11PnSwLDzswNo5xzSxhtlkkydPCp9FWLDwOMYH0tlwMe7mzJntSIfFl9aApFHJxr3mj85cUscsHn7ad78Tz0oXhB8L246+WDN79qzwPqz8fHJuz3CkwYr4k+Z8sYZO4PDhZ0SeTypjOqOlVh4R5wUXnB8JK62ML7roQpdFrGFwoHfv1gELNoz0806ZW97x569SSst/0vWsYg31mP0BLE6O1LO0NHH/0UcfLdopQfy59NJLwo6Ghb3JJi3l7NdjeL755puRLJQSayiXU089OUwz5evPoLTAfFvPpMHPk/1GBgw4rKigaWElHVn55QtRft0grni9o57GBSULNy7WIHh27LhLmEd+I37dMKZ0xLOKZxaXjiIgAiLQ3ggkiTWk8fjjh4Tvwe7du6W2U/KINTNmTHdMQLD3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L22vlqR/Plv7lz0MYUG/hPD+XQIXizdNIKn0HVTOOw8xjzRfe216nC/ydtlll8bXqumjYu7PymD9Av8OSuOZ5OX7mtdee03IF+KSxZ0Mk/yc9a60vh/+k33Ucvbksnf67bffFvKF+UbLVznvdF++cvrSiJoWP8dy8pnkUc5nnjmfTpaY6vvE3n855+X2icvJr/yIQDMSkFjTjLWqMomACIiACDQ1AczRWUe12n1mmhqQCicCIiACIiACItDUBLLEmqYudBcvHCvQWYVmbeA0k31dHJGKLwIiIAIi0AQEJNY0QSWqCCIgAiIgAl2HADPBbKNOOqvV2I3vOrRUUhEQAREQAREQgWYkILGmGWs1u0y0f715MPbLYCWSnAiIgAiIgAg0GwGJNc1WoyqPCIiACIhAUxO48sorwoxCxJo08whNDUCFEwEREAEREAER6PIEJNZ0rUeAPYJsRQ3Hp54a1bUAqLQiIAIiIAJdhoDEmi5T1SqoCIiACIhAZyZwzTXDo5Ej74u++CJ735TLL78sWm+9dUJnFeHG7EB35rIpbyIgAiIgAiIgAiJQSwISa2pJs3PHdcUVlxe0f/ms9m/nrjPlTgREQAREoHoCEmuqZ6eQIiACIiACIlAzAptvvmkswuy66y7RwIEDUv/8jMK+fXdu0yawNcu4IhIBERABERABERCBOhOQWFNn4B2Q3Pz58+P28Drr/CFMVNp5553U/u2AulCSIiACIiAC9SMgsaZ+rJWSCIiACIiACGQS2HbbbqEj6kWZ5PmGG64f7bnnHtHSpUsz49INERABERABERABEWhmAhJrmrl2W8p26qmnhLZxS/u3X7RkyZLmL7hKKAIiIAIi0KUJSKzp0tWvwouACIiACHQWAgsWLIjuuOP2KGmT24s1t912azRhwoTOkmXlQwREQAREQAREQAQ6hMAvv/wSt5toO/GnQfwOqYZ2TdSLNQ8//FC7pqXIRUAEREAERKCzEJBY01lqQvkQAREQAREQgSiKfv/992jt2rWpf9yTEwEREAEREAEREAEREIFmJ7BmzTfRRRf9Lfrpp5/i9nGzl1flEwEREAEREAEISKzRcyACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACHUhAYk0HwlfSIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiCx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15ho0UhOYk3H15bEGok1Hf8U1i4HlYg1liqT0z788EP72KWOvIP//verwm/IRRf9LZzniTVAuv3223L7jFjTYE9T+3069thjuhRbFVYEOiMBiTWdsVaUJxEQgaYgILGmKaqxzYVoL7GmnIx5sWbMmDG5QTpqZU1uptpws5ZiTRuyUZegEmvqglmJiIAIiEARAS/WbLjh+tE333xT5McunHnm6WEwTGKNUdGxXAISayTWlPusNIK/asSaRihXe+VxzpzZ4fdj8ODDo2eeGR8+lxJrysnTWWedGeLDHHbeKtFy4pMfERCBthGQWNM2fgotAiIgAtHLL7+cSqGtYg2zM997793UuOtxsZZm0LIYtaUcLOP+8ccf2xJFXcKWI9ZgXgtzYLV2XqxhyXuea2SxJu356kxizU8//RSbHcjjX+69tLJKrCmXnvyJgAiIQDaBtPdrtu+WO16suf7663K9S6zJxVOzmx3RPmSz888//7wmZWCVMaaLkk5iTe3FmnK/8zNmvBGxsqGWbuXKldHChQtrGWXFca1evTp67733Kg5XiwD1Fmtg/cUXK2uR9aI4yn2OigKWeQHhhD09beUL/d9XX30lfK6FWLNy5echPtJ5/fXXy8ydvImACLQHAYk17UFVcYqACDQ1gQUL5kcsPWa5MH8bbLBeON9tt74R5pxwlYo1DNY/8cTj0V/+slUc32abbRLvlWHp7LXXHvEsmkrhTp48KTrwwEEhjxafHZnd+e2338bRXnnlFcGf3wTXl9HCXX75pZlZee211yKWUJvfZHiWY3/22WeZ4bkxdeqUEB4hAUfHpn///ePrG264QXTuuecUxfHpp59GmBqxtP1xq622jBlX2+EaN25s1K/fbqlx//WvF0bz588ryk+WWDNhwrPRPvvs/f/Lsn60+eabxudXXXVltGjRoqJ4/IUPPvigIA98NnffffeFe+uvv25oePM8eRYXX3xRROfTrrEvi3UC1lnnD+G63d9uu20tiZofzzvvnJDeySefVDL+8ePHRXvu2S+E8c8X5cLVQqz53//+F9KAA2YCku6nn34Mfo46amh8G/GE73KPHtvH96hbnlfiOOCA/aPnn5+YjCbzM53o8847N6Thy7r33ntGK1asiDeztrrjOHr06Mz47MZrr02Pjjnm6BCv1bMdR49+2ryG49KlS6N+/XYPYQ48cGD0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AQQQQAABBBBAQALkm0Rxz4J9NWxtWrSxlb53trb/urXdzTSwT+WSFr8ZZ0PbvOpBshcBBBBAAAEEEEAAAQQQQAABBEoC5JtKMmy/j4C+AHifKTETBBBAAAEEEEAAAQQQQAABBCYWIN808eIQ2ggB/SwUP8M0gpM+EEAAAQQQQAABBBBAAAEEEFgWIN+0bESNyQUq37xTsun1+qlUm3yChIcAAggggAACCCCAAAIIIIDAtQTIN11rvYg2I2A/7/37+0e/J6WCfvmbm5sycGxCAAEEEEAAAQQQQAABBBBAYB8B8k37uNLrgQJKKpUKJJsOXA2GQgABBBBAAAEEEEAAAQQQQOBLvomD4PIC+vNz2XzT4t+ku/z8mQACCCCAAAIIIIAAAggggAACkwmQb5psQQhng4C+RqfChs5oigACCCCAAAIIIIAAAggggAACnQLkmzrhaIYAAggggAACCCCAAAIIIIAAAgggkBUg35RlYSMCCCCAAAIIIIAAAggggAACCCCAQKcA+aZOOJohgAACCCCAAAIIIIAAAggggAACCGQFyDdlWdiIAAIIIIAAAggggAACCCCAAAIIINApQL6pE45mCCCAAAIIIIAAAggggAACCCCAAAJZAfJNWRY2IoAAAggggAACCCCAAAIIIIAAAgh0CpBv6oSjGQIIIIAAAggggAACCCCAAAIIIIBAVoB8U5aFjQgggAACCCCAAAIIIIAAAggggAACnQLkmzrhaIYAAggggAACCCCAAAIIIIAAAgggkBUg35RlYSMCCCCAAAIIIIAAAggggAACCCCAQKcA+aZOOJohgAACCCCAAAIIIIAAAggggAACCGQFyDdlWdiIAAIIIIAAAggggAACCCCAAAIIINApQL6pE45mCCCAAAIIIIAAAggggAACCCCAAAJZAfJNWRY2IoAAAggggAACCCCAAAIIIIAAAgh0CpBv6oSjGQIIIIAAAggggAACCCCAAAIIIIBAVoB8U5aFjQgggAACCCCAAAIIIIAAAggggAACnQLkmzrhaIYAAggggAACCCCAAAIIIIAAAgggkBUg35RlYSMCCCCAAAIIIIAAAggggAACCCCAQKcA+aZOOJohgAACCCCAAAIIIIAAAggggAACCGQFyDdlWdiIAAIIIIAAAggggAACCCCAAAIIINApQL6pE45mCCCAAAIIIIAAAggg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AAIIIIAAAggggAACBSlAIKUgDyuVQgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgWwIEEjJhiJ5IIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEEKEEgpyMNKpRBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAbAgRSsqFIHggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFCQAgRSCvKwUikEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDIhgCBlGwokgcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggUpACBlII8rFQKAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEsiFAICUbiuSBAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBSlAIKUgDyuVQgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgWwIEEjJhiJ5IIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEEKEEgpyMNKpRBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAbAgRSsqFIHggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFCQAgRSCvKwUikEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDIhgCBlGwokgcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggUpACBlII8rFQKAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEsiFAICUbiuSBAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBSlAIKUgDyuVQgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgWwIEEjJhiJ5IIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEEKEEgpyMNKpRBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAbAgRSsqFIHggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFCQAgRSCvKwUikEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDIhgCBlGwokgcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggUpACBlII8rFQKAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEsiFAICUbiuSBAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACBSlAIKUgDyuVQgABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgWwIEEjJhiJ5IIAAAggggAACCCCAAAIIIIAAAggggAACCCCAQEEKEEgpyMNKpRBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQCAbAgRSsqFIHggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIFCQAj7gH+IAACAASURBVARSCvKwUikEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDIhgCBlGwokgcCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggUpACBlII8rFQKAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEsiFAICUFxX379pnmTZr6r6VLl6awFUkQQAABBBBAAAEEEEAAAQQQQKCsCixetMi/j6B7CgcOHCirFNQbAQQQQACBvBcgkJLCIdy1a5cp938X+K+FCxaksFX+J9m/f7+ZOWOGGTb0EbNx48b8rxA1yHuBY8eOmZ9+/NHceXs3s2b1anP27Nm8rxMVQAABBBBAAAEEEEAAgcIU0LWLey9h7969hVnRUK127txpXh03zrz4whizffv20Fo+IlA6Ahs3bDCPPDzEzJ41yxzYv790CsFeEUAgrwUIpKRw+MpiIOXff/81zz3zrH/S16xRY3Pq1KkUtEiCQPEJfPXll/53Uhcku3fvLr6dkTMCCCCAAAIIIIAAAgggUASBshhI0cNu9997n3/d1q3rbebMmTNFUGRTBIouoPtZDevV97+Xo0eNMrrvxYQAAgikI0AgJQWtshhIOXLkiP8Pxj5BM+Xtt1PQKtkk33z9tSkrLYRKVrbk9zZj2jSzYf36hDtu1bx54Hv50IMPJkzPSgQQQAABBBBAAAEEEECgtATKYiBl6ZKlgWs23U/4cf780joEcff77qzZXi8HcROwIm8Exr8yzhxM0m3em5MmxXwv//nnn7ypIwVFAIHcECCQksJxKIuBlOPHj5ur2rX3/9E0zbEWKR3aX2lqVKtmKl5c3rw0ZkwKR5EkuShw/J/j3nHUsSx/4UVGLU4STQ892M//TuqEXH+bTAgggAACCCCAAAIIIIBALgqUxUDK1q1bTZOGjfzrtlxqkXLu3Dn/+rPCReXMhx98kItfG8qUgsCqP1f5x1L3BtatW5dwKwXzqlWq7H8vn3/uOVqkJBRjJQIIRAkQSIlSCS0ri4EUEezbt8+olYD6kEzWUiBEVuwfmzVu4v8DJJBS7NzFtgM9AWJbPGmeLJCiMVLmz5tnut12m9GJ01maiBfbsSFjBBBAAAEEEEAAAQQQKJpAWQykSGzHjh1m3NixZszo0Wbbtm1FQ8zi1gqkuNefBFKyiFvCWa1csSJwLJMFUlS89evXmyGDB5tZM2aY/fsYI6WEDxm7Q6AgBHI2kLJt61azZcuWmNeeUhgToawGUnL5G04gJZePTuplSzeQknrOpEQAAQQQKOsCW7dsMXd3784LA74DBfwdeGfKlLL+U1fm63/w4EHvnsGDvfvE/K2PevY5b50exiqtqawGUkrLO9l+CaQkE8qf9ZkEUvKndpQUAQRyVSCnAikalOy9OXPM48OGmUvKXRyILtunBurVqeut/+nHn4z+CZbElO+BFDmV5iBaxXGcshlIkU0qZUw1XbrfydI+PipvKvVPt16ppC/pQEpxHcPSNEzFmTQIIIBAWRQIX2Dbc0nmF0SeY+OCSz5+Bx4ZMqQs/rxRZ2OM7h28M3Wqad+6TdLftK5dupi5333nbVPSePkeSCmt60R7nLK9f+Xn/tZlo0VKKmVUmuK4J1Nc+Vr/VOap1D+VfNJNEz7PS6VFSrr7CKcvrroW532KcB34jAACRRPImUDKpk2bTFOnH033n1u89zdce505evRo0QRS2DpRIGXVqlVmwquvxbz27t2bQs7BJOvXrYvJx+a9Zs2aYOIknzZv3uzn1bXLLWbsSy97n2dOn+FvqWaNNv8/lv7hL7dvFv3+u7/e3c6u11wDvds81HzXTqtXr/aX33jd9f77PXv22CRpz7/95hs/n8uq1/BPgG675VZ/uS2LOwC9btbb5V9+/oW/X1u/oYMfNsOfeMJf7r5x6zfiyeHm/vvu8/M6kGQwM+WjVlV237//9ruf9ZEjR/zlD/bpY4YNfcT7vHTJEj9NKm904mfzd+f6Xiaa9u3dG9jOPUa///Zbok0Trnv7rbcC+bplWrf2fJ+ls2bM9NK98vJY/zjq77z/g/1itne3U0s1N88TJ04kLI9d6e9v7Fhz681d/DymvfOOTZJwru7E7H7V5Z2dli9b5i93DQ8dOmSTMEcAAQQQKCUBe4Gt88VnnnqKFwZ8BwroO/D4o8O8c0gCKaX0A1vKu129apW5/LLagesIe8/g7u53mc4dO0au03K1YCnJKVEgxb3WtNcamp86eTLtItprWzcf+z7da3DdG7Dbutc4X3z+uV+uRb8v8tPo3kN4cq/d3e3cdF9+8YWfx99//+2v+nXhQn+5u/+TGbjYTOe8+66X52vjXw18N/r0esDfl61z+Fpa3U/bdbZ1k8aUtctUxu0R3Ze52/Xr29c8+r9rfm13JoUuqpc515rxrom7de1qXnxhjFeWTRs32eqmNF+3dq1fB1sXzfVwc6IpvJ17jLQuk0nX9W4Zwu/da/AJr/13/+3Jxx8PHMunho+IycPdTuWa/s40P83iRYtSKuryZcv9bdy6qowaDyjZtH//fn/7eT/84CdXMNjWU/eDdF9In3/+6Sc/DW8QQCD3BHIikLJx40bTrFHjwI/g/ffeZ/5cudIoIGFfgwcO9G6C2pMkzXVTNJUb2kWhjwqknDp1yvTv95CpUbVaoNy2bJfVqGmee+YZs2HDhqS71g/ow4MGmRrVLo3MS3leUbuO+eTjj1P6h/vYo4+ampdWj8xLA6rpwkMnBx9/9JGfZuJrE2LKqbFHbH2aN2kas14LdGPCpvnl55/N6dOnzYCH+id00T/6TKbevXr5+7L7jDdXueykf542XY87u3uLf134a2CgMX3/3Gn2zJmeeVVnMDKbh53XrlHTjB41yiQ6Yfnu22/9fb/4wgveLqa8PdnUqVnLX27z0/zSylWMvvv2BM0tk32vpxX0XWjVvLm55OLykfnoeznxtdfsJv5c38dWzVsYld3dr/teA7DpAkTHM5VJwcz358zxvC6+4MK4+brGKru7z0TvP3j/fb8YP3z/fWC7RAGLUydPeU4N69U3+t5H7UMD3Nu/LQ18H28a+vDD/vYrli83SqvvY/UqVf3lbv46vm9MnBgvO5YjgAACCJSAgA2k6GESJgQQKCwBXf/p3ItASmEd11RqowcM69a6zD8H1/WHzst1Tab7Brohq2spvdfg0hro3D1Pv/6aa026gYVUyhUvTVQg5dDBg+bO27uZeNeaChJNev11k0q35npA7567egSubd366n3HK68yX3/1Vbwi+ssVzOjVs6d3TRrOQ58rla9gXn7xJe/m8UtjXvRdv/nqaz8P+0YBCpvHXXfcaRcH5nffdZefZvfu3ebwoUOme7c74tZFLu61YSCzJB+uatfO35ctV7x5+CHSe3r08LfdtXOnOXz4sHf83O3nz5vvl2DUM89615jyctO47y+vXce8/eZbRg84xpv0HbDb2HqPeOJJUyvOvZ6a1S41jw4ZGi87f/myP5aZQQMGxr1no95h2rRs5ae3bxR40LVzvHtgKqvWKW/tI5VJ99penzDR1I0TGLX11/fCTnZZKnM9+OhOjRs08E2TnR8qONnngQfiXvNr/zoWjw97zCi4G29auXKlv0/d99P0xWefG30HoupQtWIlo4eFFYBhQgCB3BMo9UDKju3bTeP653/M2rdpa5YsXhy32a1Oin6Y+733A25/dG7v2rVYnywJB1JmTJtuOnU4/5TLlW3amms7dTKdO14d80PYqH6DhIOr6URv5PDh/na6ka687Ktl02b+OtX3lZfj3wxQcOf5554LpNcNZJtX6+Yt/HX16l5udEPfGmYjkKKggX06zOar+tv3dq5/zONfeSXtpq3ZCqQoQFDHOflWudyb/Pozva7zNX65dVytoeYNLr/CX6dtdfziTeFAytQpU4z+MVqLK+rUNRUjgiF9e/c2R48cicx229Zt/vbKp3njJn75WjX7L0BR5ZKKRid54en1CRP8bd3tVC99j225NO/Q/krvJDGch/tZwbgr28aelLZo2swrU6N69f08r76qg79pcQdS1ArpkSFD/X2rPgogucfRPQ5aP/Ch/nEDWG4gZcEvv3hpXauo73nlCpeYN9+Y5NeZNwgggAACJStAIKVkvdkbAiUpQCClJLVzZ18KorjXYjded51J1qJf1wW6/qvvXMPddsstJVapcCDl/ffeM+1atfavU665+r9rf90Hca8v9F4tKsNP1LsF/+uvv7yH8Ox2epjLvd7RA2V2na7B7c14Nw/7Xg/HqdWETa+5HrCz+TVp0NBf175NG5PtQMrqVatNj+7d/X1o/1HXWHqQ7YP3zj9oZ8ufbJ6tQMqqP//0Hjp0nfTeDaTYQIcCKdbPzsMPNM6YNi1u0d1AyruzZ5sXnh9t3AcXo3xUlueeedbo3lDUpPtP9/a423cO33+y9yaiggzuNXG71m0CddP1v2uifWhfiSa1Dgrf71Ie9v6aGzDt16evn5W7n2TvMw2kfPv1N8btBUXH1B5DzcO96dSve7n3ILhfSOdNOJDy2aefGgW9bNn1ELb+1uxnO1cwpbgfGneKyVsEEEhRoFQDKXoSo+X/bvzqx2LM6Bcim0RG1UWtVdQNkP2RUfdVxTWFAykd2rf3/oEpGq9mj7Z7MbUsUUuBBlfU88ul8j08cFBkYEj/3J4eOdJPe8dttxuN/eJOejJDT7brxrjyatqokYlqLqmWIPKzHvqnffWVVxm3KyudhE1+621T5X838lUPmz4bgRR7MqV/Amo6Kwu1NtJ8yKDBgX8W2q+e5Ehn0hMQyksvtym3WnDY5XauExw7uS1S9M9IzTG1f5Xznrvu8rZVwMOd1CJF/9SVX7gfzLVr1hh181Wh3PlWDvH6VnUDKQq46AkNnZyoJYvy/nPln+abr7/2mnC6JwoqX1QTaP0jdU9SXn7xRbNj+/ku1fR0lfJ1TzTcetkWKeNfGWcUxHQnfY/1fa5WuYr/vbjv7nvcJIH3as7stiSTp1qyaP+7d+3y0m7csMH7rOa3bn2+nzvXW/7eu3P8fanOI4eP8JYrD/va7pQzlRYpJ0+c8J5OVH566W/n7Tff9J5Kcyug7rr0u2HTaR7+Htj07kmj/Z7rJN6W0X7P9ZtU3WmlVqnCJXGDMzZv5ggggAACxSNAIKV4XMkVgVwQIJCSC0ehZMug690Het7vn7un27LEbcmi6x1dC5TEFA6k6BpcQY2WzYLXmmpZMmf2uzE3VPUAYtSkAJGu1XQNo5vr6hXij6VLA0k3rF9vnn36GX/8WT0A91fENbiu69StkL0u0gNnajGjFj122rxpk3cjX9eyKr8bDMpGixR7jaV7KeFrLN2Ud69R9bCe6p/OpC6VlO/HH57vlUP11YOgdn92vnXLlkDWbosUW06Z636QglPabt/e890/q0WKgnzq3iw86aHhh/o+6FvrmjJeV05uIMXu117bap/2GvSpESMCN/1VL92ziJpGPfusv2/dFwnvW2WeOGGC+fyzz2I2ty1SZs2cGXMvR/fMtJ0eJrTfI+0r3nTs6FE/ndLbliyql72/piCIPuue2ao/z7f40DK9Xh03LpCHWrbYdXYevueUSosU3auwwTCVrff9vUy4+3N9R3RM3FZH+nvU71R4cgMpD/bu491n8nqKGfbfd2/x4sXe35q6HdN3yvpprlZLTAggkFsCpRpImTL5fIuItq1aRz5Bn4hLfRXaLqz0gx3+J5Bo23TWhQMp+kHr369f3Cw01knDUDBlW0SfmToxcX8k9ztjL4QzH/DQQ35aBQPCk/6puXnNmnF+LJRwWp1EuGn1PhuBFOWjG8dqAhk16Z+Zu9/Hhw2LSpbSsnQGm3cDKXb/+ocXr5wpFcAYc2Xb808N6Z971OQGUuy+dUIUNen42zSa628iPOl7ZNPoqSUF2rI96ekTuw89eRRv0sm1TacT6vDJRbzt3OU6AbZ5aK5+ZBNNqQRSFLBx89TAkvEmnaTZwJq2UYBuxYoVMcndQIrSqRu+8NMtdiOdALn7f/65UXYVcwQQQACBEhQgkFKC2OwKgRIWIJBSwuA5sLs///zTP8fOdKwTd2wVdflVElM4kKLrhHjBEZVH16i6prbXEwpaRE1T3n7bT6MHuRJN13bq7Kd97NHYa3C1drD7U4BgwS8L4mb31qQ3/bR2m2wEUpSX7qHoXkrUpC7F7P40VzkymfSQpJtPvAci3bzdQIrddvCAgW6StN9XqnC+2y/1eBI1uYEUu99417YLFywM1KvnPfdGZWm63Xa+q7vPPvk0Mk1RFvZzgkTaV9R05K+/TKerOvjlVWuOtRmMrWLP86xNKoPNpxJIcXsvUbd06lo93vTO1Kl+PVSOMaNHxyR1Aym2rHqANN7ktjpSyxUmBBDILYFSC6ToyXm3S6BUBmmKonNvmqrfxKgIcNR26SwLB1Jq16wV87RHOD8NuKauk+wPZdST/bb5rsZpUJ+liX6gNRaEzUvz8D/Q6zqfPzlSU0i19ok3aT86eXPzy1YgZWaCAI5OWtR02e73putvMHryJpOpKIEUNdEsahBFZXZPivXPLqoP23AgRS0W4h1nLXfHnFG3X+HWR24gRf3XFsek4+Q+gaHWHOFJT01UKHexdyxrVa9ufvs1swHqiyOQ0thpdq6LhmS/CRrk0H4nNR8yeHC4uiYcSFFz3HiT/NSNmM3z9lu7Jm3WHC8vliOAAAIIZC5gL7CjuqfIPFe2RACBXBAgkJILR6Fky6CeFez5tVq1ZzppDAnlU/6ickYPIxb35F4zar8tmjRN2guHBnJXdz+2vhp7NTzZJ+GVTukTTYuchy513bplc7DFhXvt1+XGmxJl5V3LDuzf3y+bypitQMpvv/4ad9+6xnK7Q1KvFJlMyse6ap5JIEXjlCifokzuQ8XqXitqCgdS1M17onsJbpddutcWNRaQG0g5mOCeUVR5UlmmcT1cX3dwdbu9zG0a9XChljWZTPY8z+aVjUDKq+PG+2VTjxvJxo1Vfdu1Pt9VX9NGjY3uBbpTOJCiB6MTfX8mvf6GXwa1QPrjjz/c7HiPAAKlLFBqgRT9k7Q/ePpHfObMmYwodCPWHZsk3Saeqew0HEiJ121SOK9e9/X066gAgvuPaseOHcaOH6GToGSTBn5z+490uyBSqwS3u6fpCfrZtPtRf6oKCNljkI1Aim4eJxokXfsOBxa2hP7J2PIlmxclkKKB77Ix6Z+q9dM8qnVIuL7hf6rhcmiAPdsvqfIMtyxyAyn6x66uuIpjck+m35wUHOdDXdLdf999ft2jBqJLtUzZDqSoia39XssxUcDDLWPbVq38+qjf2vDkBlI0PlKy35kP3z9/cqjjqIt9JgQQQACBkhWwF9gEUkrWnb0hUBICBFJKQjm39qEb/DqvVtfgycZeSFRyt1eIqABFom0zWRcOpCQa89TN3z50qTrrocyTJ0/6q3XDWIEgrVO6ZNPGDRuNnvpXer3ca3Cts2NHau7eZ4iX77atW/28lF82Ainq7UBdNCea1HWTrYMCQplMRQ2k6GHHeK1m0imP25JB7lGTG0jR9bnu4SSaVixf7vvIKSow5QZSFIzK9MHWeOXQPS97jDRXjxLupPsd7ni0UQ8cu+kTvbfneXZ/RQ2kqKt+t9s1db2fyuSOPayyhO9BhAMpvy5cmDBbHRN3LCi1xmJCAIHcEciJQIr62yzK9OnHn/g/1slucGayn3AgZeGC+E1d3fw1KLX9Uddcn+2kG+R2nQIu6vMx2euRh4f427gnOB99+KG/XHnqH0Aq0+W1a/vbZSOQoq6ukk3qE9TWW3P3JC7Ztu76ogRSdDKbzqTWPfbYqJ/PW2662Xt1aHd+jBnVJZVASrKTH5XLPl2kPMOBFO3DHaDu0ipVzbuzZhs9CZHupOClrdcnH33s10v1s61NVIZwIOVA6CmTqZMnp7trP322AynuyWZUQMTfcejNpDfOP/URtZ0bSFFLqmRTuPs8AinJxFiPAAIIZF/AXmATSMm+LTkiUNoCBFJK+wiU7P7VHa8eZtK1icYlKMqkMRNsV1elEUjZu3dvSsWf9s47getmdzu3F4OnRz7lX9PZa7uouboyk59e7jX4S2PG+MvVOiCVScfD5qV5NgIpqfS2oHFY7X5LK5CSbksY9Vphj8fggQP9a26NkWPrkkogpU7NWkkPjcZAtXlqHhVIGdR/QCCNxv9Yv2590rzDCXQdb+ulcTzsPRK322yVIRxIcR+o1vp078245bDnebbORQ2kKFhp89I8apwYd//2fXi7ZIGUcK8jNh93ri7WbVkIpLgyvEeg9AVKLZAybOgj/g9DURncH9BZM2YWNbuY7TMNpIS3ixdIsT+Q6cw1gL2dCKSMsRSR8/AYKan+sz7+zz/e4HH2RDvZ8SmJQIoquGTxksAgbipXxyuvMgMf6m8UlEzWuktdXa1evdqoZU6yOml9skDK/HnnByGMPAAJFuZiIEWBLDdQqeITSElwEFmFAAII5KiAPT8kkJKjB4hiIVAEAQIpRcDLw011o95etxQ1kKLqa9wD5de+dRtz9MjRYhUJt0hxAyKJdqzxX22dNXe3cwMpbppU36tlh50IpHxgKeLO3TFSUg2kqKcOPeTXpmXLwHGMOkYlGUhRawe1tHDLoZ4udC9BgapkDyYraKDvtDteqptX+H2yQIqCP5lO9jzP7jNXAinhVjbhFikEUjI94myHQG4IlFog5WpncKmiUrg/oFHjGxQ1/3BAJNUWKeHtshlIcW/0EkjJfiBl967dpl2r831d2n/Ousmuk029+vfrFzgBKalAir7P6s9XfanacrlzDfC2YnnsgOn270BPwrjp7XttZ+tW2RngsCwEUtRSSoM0WotxY8daLm9OICXAwQcEEEAgLwTs+SGBlLw4XBQSgbQECKSkxZX3iYsrkKJzfz10V5xTLgZSaJHyX8scHf90x0hJJZCy6s8/zRW16/jXlvYas17dy/3r7e533OGvL8lAir7rerBSLUhsudx56xYtTbyu4rXdrTdHbzf8iSe8uoWDfGUhkKIHWbt26eJ7qlsudyKQ4mrwHoH8Fyi4QMrsmbOyflTCAZFsB1LUR+TgAQPTeq1atcqvJ4GU7AZS1Odr25bnx8zQycQbE183asLsjgGTyRgpRe3ayz/oxhiNm6M+dvs+0Nv/p21PgmpUrWZWrAgGUzQwncb3UTNopVOwRN87NW9X3dyWLInGSAl37VUILVLWrlljalWv4TsSSHG/abxHAAEE8lOAQEp+HjdKjUAqAgRSUlEqnDR/rlzp35jOZouUEU8WfdDwZMrFHUhR64J07yXoes5OtEjJbosUfVcvc64rNVbuB++9711vu6090h0jJVtde9njrnFPdT9D353G9Rv418G6T1D+wovM8CeetEm9uVqydOva1U93+WW1zVMjRnj10r0EO3h6sjFSwl17FUKLFHWt3/Oee30bAimBrw4fECg4gVILpHz6yflxTTZt3Fgk2E8+/tj/0XL/ORUpU2fj4g6kKHpflIlASnYDKeomywYkmjduYnbu3Bl5eEo7kGILpQDImtWrTdtQCxoFTdzgyKvjx/v1ql6lqtdtmc0jPC9rgRR3jJSa1S6NGRyeFinhbwifEUAAgdwXIJCS+8eIEiKQqQCBlEzl8nc7O9h8/wf7mbNnzmRckcOHDhvd3Nb1Xi6PkZJq1166IV+UiUBK9gIpx48fN3UvOz8Orb6zGm81airtQIpbph07dhi13rX3QDTX/YJt27b5ydT1l12v1jbxBkwvi4GU8BgpGjPGnWiR4mrwHoH8Fyi1QIobiR4Rinany3rzDTf4P+q5FEh58YXzA7dd26mTOXTokF81d7B5dRdVlCkcSEmlefJfhw8HBi1nsPnzR6Benbre96n8ReXMjGnTz68IvcuVQIot1vbt282Vbdv5fws60XFbwDz5+OP+OvVpmmhKJ5Dy0QcfJsoq4Tr9vdoTMs2/+vLLhOnVNNhN7/5NaUN3sHkFRNTaJpXJDaQw2HwqYqRBAAEEcl+AQEruHyNKiECmAgRSMpXL3+1sIEXXAupBINPJvXZ+fcKETLNJebtMW6S441nqaXfdrLWT231S+zZt7eKM5m4gpWG9+kYtD5JNW7dsCVyTMdj8f2LqMcJeq1a+pKL5cX78sURzKZBij/fTI0eaCheV8+vg9tLQ7bbb/OUjnhxuN4mZpxtIWb5sWUweqS6w53nWPNtjpExLMUgZDqQw2HyqR5B0COSnQKkFUvbu2WOuatfe+zHWzd/wDdFUOdX/ZL26/9341qBxZ06fTnXTlNOFW6Q8PmxY0m3VtNFt3qf37rR+3Trj37C/8CLz9Vdfu6vTer9p0ybTuMH55piPPfKoUTdO8Sat0z9F+w9HcwIp/2npRFd9lMrk8tq14xF6y3MtkKJCzf3uu8BxtYEU/X3pJNse899/+y1h3RIFUk4cPx5o1tumRUuj5qyZTNkOpOj3wC37yy++lPBvwZb5hmuv823U+iQ80SIlLMJnBBBAIPcF7AU2Y6Tk/rGihAikK0AgJV2x/E8/5e3J/vn6wP4DUjrHD9da1yxt/teFc8WLy4dXF8vncCBl8ttvJ93PubNnTbvWbfz6jnr22cA2Gi9T3S/p2k7dSC1evDiwPp0Py/74w1S5pKK/rzffmJRwc91LcFsnqAwEUv4je+/dOb5jlxtvTOiYi4EUFVjBNHvPwAZSFKBwlytYEm9KFkhx7wNqP/f06OF3CxYvz3jL7XmeLW9RAyn6fbi7e3e//uqiK5X7HBpnx5ahWaPGZsvmLYEi0yIlwMEHBPJeoNQCKZKbOmWK/4Mza+bMjDAfe3SYl4fGe/j5p58zyiPZRuFAigIga9asSbiZbuDaH1PN3WaRdkO3K6abb7jRFKU1zahnnwvsb+b0+C0p1B+mWza9z+dAStcutwSe0LG+dq4WOm59Uh3qpwAAIABJREFUdTIbb5KDTVutchWzdMmSeEnN88+N8tNqm5IcbD5eoeIFUvT9s/XSPFHfwot+/z14Mj0p9mQ6/H174P774xUp4fJwIEV/z4mmZC1StK17kqe6njhxIlGWJtxs/oP33otJTyAlhoQFCCCAQM4L2AtsAik5f6goIAJpCxBISZss7zfQDVg3uPDWpDfTrpPbykNji5TEFA6kXNmmrdmzZ0/CXT/Yu49/7XZJuYsj02q5vb5T+qJM7gOgGk9zwc+/xM1OXUrb/dp5PgdSBvUfELeudoVu9tu6Jhps/uFBg/x0TRs2Mom6sFc+Ns+SHmze1itq7l5L20DKvB9+8MuqMn/68SdRm3rLtM7WS/PwYPNK5H7flGbM6NFx80u0wp7n2f1Nfit5kNJ9ADnq/HD8K68Eyv/GxImJiuD1gGG7ClQ59IBmeCKQEhbhMwL5LVCqgZRDBw+ZVs2bez9U6t5KT5mkMz3y8BD/SYzbbrk1nU3TShsOpOgHUv1CxgumfPnFF0aRaPuD3rJZs5gxF1QAPUliW9MobbeutyVtmbNly5bI5rZqleL+05Pn22/GnlwuXLDA3Hf3PX7ZbBnzLZDiNslWHY4maIKcTiBFN/Y1cJp10cm2HTjN/dI8PfKpQLNXpS+JQMo/f/9tNm6IP6bQ2JfOB/DatWrtB+f0JMXDgwb79WraqJFRV2DhSV3uVatU2U+ner0ZEUhRs+XrOl8TSNevb1+jIF06k55oevbpp/18dGKTaEolkKLAiAbjs8dQJ74aAC9q+ubrrwNBIz1dFRV4IZASpccyBBBAILcF7AV21IVybpec0iGAQDIBAinJhApzvcYesOf4alEy4dVXU6ro6dOnzUMPPmgUJND2l1aukrDbpZQyTTFROJCi/Xdof6XZsX1HTA4qp65z3RYiukkbNX3x+edGD/4pP9VLY8do+0TTnyv/jLy2XbhgoVG3yNZWN/a/nzs3Jqtvv/nGXNups5/Ops+nQIquP1984QW/DnVqXRZTz/CCVAMpe/fu9fOVzQvPPx/OynsA1A2UKV1JBlJWrFgRUya7YMOGDeayGjW8Ouh+0tdffeWt0jX+LTfd7NdNwYKoLrTfnT3b6AFn+73QPCqQsn3bNv8+oNKoO7FMxivSeLC97uvp769b1662KnHnyQIpuh90+61d/Tz1N7Zi+fLI/HS8b7zufM8Wjes3MOohIzwRSAmL8BmB/BYo1UCK6Ca/df5kSP9A3po0yezauSuhqn7gnxn5lP/j1rJZc5OoeWHCzFJY6QZSNB5Lz3vv9fZdv+7l5onHHjd6gl8vnYB07ni1cZ8OadygYeQNa7tb26LG/rNRU2MFhWyedq4TMOXdpEFDszZOaxj9wKtMNi+dgGkb91WjWjXvREtRfzUDtmnzLZCikzhbds01QPznn37muanPWHdKJ5Ci7a6/5tpA3sOfeDJwPGSnptQ1qlYLdCNVEoEUdSfWqF5975jq5NZ+PzSf8OprplKFCl7ZVT6Nw+NOaqbtmqlLPXd7nYzbAIS+ZzZtVCBF+Wo8k/CJUsf2V5q+D/QO5KuWZ/oO6oQkatINLrsvXRAprS1XuOVMKoEU7UMXSjZPzdu3bmPU6s3mq/l999xjal5a3U+nk8Njx45FFdEQSIlkYSECCCCQ0wIEUnL68FC4PBfQzUj3GsO+dx+qGf/KuJg0n3z0cVZqTiAlK4x5l4lunKrnB9utla59Xnv1VbMj4gExWzldOz86ZKh/zq9ruI8/+siuLva5G0jRNUqnDh28sjRr3Ngb4Nten+haVte07jXMjdddb/bv3x+3jLpv4KbX9rpJb/O0cwVn9Deqh0HjBVt0bed2kVyrevWYv1/dXK9SsZJ5ddz4wH7zKZAiTI2NY90qlLvYq6fu5chLQZbwlGogRV1guw+36tpWv4P2OGhuW61cXruOfy1dUoEUdfutLsf0XVDvGm659N4te6cOHQMM7t+Q7Hp07x7YXl2VKUApzwZXXOH7RgVSlLF7H1D5KZiicmlcV7dcuh+g5UMGDw6Ux35wr/urV61m1N2/3X7Ca6/ZZP48WSBFCefPmxd4uFQP2g4aMMDPV/m/PnGi0X1I+z3SPN54LwRSfH7eIFAQAqUeSJHisEce9U+G9AOkJ+k1+LNuTIdfI4ePMOqr0P5g6Udt2tR3ivVguIEU/RPVyZhOQmwZ4s2bNGyUsPWACv33sWPmgZ73m+pVqibNz+5HP9zxplWrVnn/uNxBwux2mmv58Cee8DbXGCB2Xb4FUtQc+oZrgwEPWxfV0Z3SDaTs3LnTdO7Q0bex+bpzBal0Qnr3XXf56UoikOKexLnlcd+r/go0hidd8D46dGjgb83dTu/1NJNaZahrOLsuXiBF+evESCf4Nm2iuYI0UZP6Mq3v/E27eVx9VYfAJqkGUvSEzLuzZnsnc25+8d4r+KMWYvEmAinxZFiOAAII5K4AgZTcPTaULP8FdF4ZdV7lDoitG1/hNInOK9NRIZCSjlbhpX3mqae9G7b2+9WqeQvTq2dPs3jRYv/+gYIlWqYWBzadblh/8nF2gnmpqrqBFLXEV4t4+/CaLVfUXNe6yboA0/ouN97kBTei8ohalugBVLVAqOc8mBneXoErdZ+k1v7uunwLpKiHB92rcetg3+vB1vDkXoMn6tpL23nXtgkMtR/d+1EX4uq5RJ9LKpASvpa2dQ7PO7RrHxOcPHb0mP9AcTi9/awHitUKZ/So533beIEUWX32yaemWeMmflqbT9Rc9xyipgW//BL3mr9fn74xm6QSSNFG+ru9vev5lilRZbLLateo6dXF/f/n7phAiqvBewTyXyAnAilinDF9umnqdIdlf5QSzfVjGq/LnmwemnAgRXmr+5/wEyBuWdVSZePG+F0whcv3x9Kl3tMjbh5R79VPpZ5WSTbNnD7DNHf+KSmKrycv3LFo8jmQovofPHAgMuBR1ECK8lYzzavatY/8p67jPu/7H7xDUNKBFJ3cus1Hw9+R1s1bmDmzZyf8egwb+khkvRSUfOt/3cG5A+Ulu+BVF33hvkTD5dLnwQMGxi3XurVrA62p7PaZBlLsjn7/7beYPlht3pqrCbv+LpJNBFKSCbEeAQQQyD0BAim5d0woUeEIEEgpnGOZrzWZM/tdo2sf99w+0Xu1jteT5iU9hQMp2r8CIFe1axe37K+8/LJ3rZtqWTWGxe23BlunhC3UWkDXPeoGOdGkbq2Vzn3Qs3u3O7xl6sJcU74HUlQH3atxe2GwXkUNpCjveNe22oce4LPjsJZ0IEXjpro9u9g6u/PRo0YZ3f+KmtQiTGMLuente41f9MF773ubpRpIUeLNmzYZ9QBi84k3j3rw15bx999/N2r9E962KIEU5a3eKvS3EM7X/Tx44MDI7rxs2TQnkOJq8B6B/BfImUCKKNUSQE35OndM3Bqge7duRl0c6QS+JCbtRycU9mX3aZevX7/eK7fKri6nlC6Tstn81ORSedmXBimz+04nX7uNndty27kNpOgJCHmGJ1ueeNsrfSpp3HzD6dOpj5uPfW/Lpqd75LV69WrPyq7XPNN92rxHDh/u5a0u5bTMLbNNE15u95/JvlPNU/2b2u/Ij/Pn+98Ru+94c1um9+fM8bbXkyB2n3YbmyZevWw6O3fTb9q4yS+XmojbvJUm0aR0ekLK1unQoUPetu427n7SLZuaG9u8NaC8LZebf7z3Nq2dx0tnl2dSTrstcwQQQACB7AgQSMmOI7kgECWgcx33ZpJ97z6RS4uUKDmWZVNA5+afffppTNfM9vuoAb91/r9k8ZLANVw2y5AsL/e6QO/tZK8r1KWUvUZZsnixd43iprPpk83tfjZu2ODnp3x1b8HuK1ke7nq7jebh8riBFHXjtGb1GndT7727vd5HTamkcbezdbTbuesyea98VBfrr54sospq92fnqexLad1rW/WYoGWupc1P86gp3fqG07v7svm7aUY9+5xX95fGjPG/I1Hb2G01t9tPnDDB21YtQmw9bDqbJlxfuz48d9Or9xV7PPRQpM07WbmUbv26dd62T40Y4W8X3pfNL9WyaXulVc8vtlya68HqVPNw65fqNkpnX8nqHq4jnxFAoHgFciqQYquqf/aKlg99eIip+7+muC2aNvP6ENVyDQDFVDQBDU5vB5SrV6du0TJjawQQQAABBBBAIMcECKTk2AGhOAUloBs79ma1OyeQUlCHOW8qc+TIEe/+weeffeZ/L7ds3pxwfJG8qVwOFlQ3u+3fvcaZZEIAAQQQQKCsCORkIMXFt00HFS1nyo7Av+fOmScee8w/+QkPJJadvZALAggggAACCCBQegIEUkrPnj0XvgCBlMI/xvlYQ/cG/9mzZ/OxCjlfZj2J744Z8lDfB3O+zBQQAQQQQACBbAkQSMmWZA7ko6Z/OrFJNOmEcvo77/hBFI0nou6XmBBAAAEEEEAAgUISyHYgReOH9e/Xz38t++MPj0tP4P+6cKG/XGmmTZ1qEt3EO378uFE3HyOefDKwnbYdN/YVb537ZL97XAY+1N/f5tGhj/hlUJcwbvk07tmxo0f9TaPK+c6UKV4f4H6iOG9Onz5t1qxZE8hf+1K3G6pHIUzqC10erqHeaxBl2yVLVD0nvPpaYBt1VaxJx/iLzz8PrFMXRMXdRcepU6e88ur4h+syZNDgwLXCubNnvbQa9yCcVp/Vre3RI0eiqu3Vwz6R7s7d7y1de0XSsbAYBQikZI575vRpo9/6RJPWPzVipH8vQeNSrF0T261XojxYhwACCCCAQD4LEEjJ56MXKvusGTNN1y63mO/nzg2tOf/x7bfe8k98dNFzXedrzq/kHQIIIIAAAgggUCAC2Q6kPDpkaOAcSjfFNcBvt663BZbbm8pKr3HuwpP6Y7+uU+fIbey2mve4s3t4U+9z+Qsv8rdVN62aet5zr7/MzaPB5Vf4N7nuvD16gNgmDRt5g+5G7swYb1Dc3vf3isxf+1J5NFZbPk9vTppk5ODahd/Pnjkrsoo693bTrvpzlfnoww9N545XB5bbNM8/N8poHLjimgb27x+5X7v/MaNH+7tW4MgujzevU7OWWb58ub+NfUOLFCvBPJcECKRkfjSeHvmU0W+9HQg9KqfHHnk08JuhwD4TAggggAACZUmAQEoBHe1ePXt6JzaXlLvYVKtUOfKlFij2QqlZo8Zmw/oNBSRAVRBAAAEEEEAAgf8EijuQUqlCBaNzLnteFTV/4fnnYw7Hrl27Em7j5nP3XXcFWhAoMzeQUqVixbhBFJvP0Icf9oIy9nPUfPSoUTHl1IKlS5eayhUuSVpeOXz91VeReeT6Qt0IvPiCC5PWUefQbVq2Mlu2bAlUKRxIqXJJReOeb0d5v//ee4E8svFh0e+LvHP/ZHVxAylu9zxR5bTLqlepapYvWxYoJoGUAAcfckSAQErmB+LKtm2938GK5StE3kfQ/QX396Vj+yu9gewz3yNbIoAAAgggkH8CBFLy75jFLbEu1u0FT6K5ToBuv/VWs37durh5sQIBBBBAAAEEEMhngeIOpCQ617Lr1O3JJx99HGA8ePCgaVy/gWlUr753PqZzMvvSjXq7rZ2r2zB3cgMpNk1R5/XrXm5sl1R2XwcOHDCX1agZKE/bVq3MGxNfN2qdcfWVVwXWdbnxJqMBn/NpmvT664E6yFEPGtnjodYYYdsXXxgTqGI4kBJOH/W5WuUqZvGiRYF8ivJBXfve2+PumLJq3yqf6nN952uMgjwH9u/3d/Xs009729j6unP3hqnyebB3n0C3PwRSfEbe5JAAgZTMD0avnvdH/oaEf8MUUOnRvbvR/wgmBBBAAAEEypoAgZQCOuLqk1jdeumlLrtaNmsW85o4YYL54fsfCqjWVAUBBBBAAAEEEIgVKIlAim60z/3uO//8q2uXLjE3oqZOmRJTuA3r15t1EQ+07Nq50zSq3yCQR98Hege2jwqk9Ovb1y/DoP4DAtvbm2CDBw7y0/Tt3ScmzdTJkwP7eWnMmECaa67uZNSaxk6HDh6M6b5qyZIldnXOz//66y/TtFGwOy8FuDZv2uSXfd4P84y6T7OGmteuUTMwLkxUIKV9m7a+tc7LW7doEchD+WSzO7RRzz4bk3+Lps28MmgMRU1///23mT9vnl83vdE4Lt/P/T6wzH54YthjMXm64+EQSLFSzHNJgEBK5kdDXQ7q9+q7b7+NuYdg7yu8N2eO+e3XXzPfCVsigAACCCCQ5wIEUvL8AFJ8BBBAAAEEEEAAgViBkgikvDFxYmDH333zbczN56hAit1IA9LrQRjdoNaYKnrVurR6II9kgRR1I/X3sb9tlkaDjbs3/vVeabQvO6nlSDiNG0jZunWrada4SSDNLz//bDf353fdcWcgzVMjRvjrcv3N5LffDpRdHrNmzowp9ognn4xJ99r4V/10UYEUDVDvTlEtX7IVSNE4PE0aNAyUMRwQcssS772+h3rNnDHD+x7edP31gTzlQyAlnh7Lc0WAQEquHAnKgQACCCCAQGEKEEgpzONKrRBAAAEEEEAAgTItUBqBFN1ojglQRLRI0YEZP26c6denb0z68PbJAikvjXkxcJyjAikTX5sQSJMskKJup8LlGDxwoBn/yiuBV6tmzQPpru3UObCfXP7Qp9cDgbJ7g6qHxgFR+c+cORNIJ5d0AylLlyyNySNbgZQFv/wSk7cGuk91Ujl0XDUOSviYhz8TSElVlXSlJUAgpbTk2S8CCCCAAAJlQ4BAStk4ztQSAQQQQAABBBAoUwK5GkhRd0q9evZMetPa3sTOlUCKLU+ieT4HUtq1bhP595GPgZRwF16RFTPGfPnFF6ZyhUtS/i4SSIknyfJcESCQkitHgnIggAACCCBQmAIEUgrzuFIrBBBAAAEEEECgTAvkYiDl6NGj5qEHH4y5ca3xLG687nrz9MiR3mDnbrCCQErxfI3DLVIKKZCim8nJps8+/dTUCI3/Uq1yFe97qO+iumlzv4d6TyAlmSrrS1uAQEppHwH2jwACCCCAQGELEEgp7ONL7RBAAAEEEEAAgTIpkIuBFPcmn71Jra65dmzf7h+jtq1aB25g50ogRYPPf/H55wlf6mYqX6ZwIEVdW/38008xxT944EDgeOi45XrXXg8PHBRTj/CCDu3aB+p1XedrjDsOzjtTpwbWE0gJC/I5FwXc31h3XKhcLCtlQgABBBBAAIH8EyCQkn/HjBIjgAACCCCAAAIIJBHIl0BKOPiQq4EU9yZ7Evq8WB0OpChQEDXY/OPDhsUEFHI9kHJ57dpG3/9EUziQ0uu+noHkBFICHHzIEwECKXlyoCgmAggggAACeSpAICVPDxzFRgABBBBAAAEEEIgvkI+BlLVr1pgratcJ3LgvjRYpUn3g/vsD5ahXp66ZOmVKfPA8W7Nv375A/RRIqVS+glmyeLFfkyNHjnhdXWmdfSlI4U5du9zir7NpvvnqazeJKc7B5rWje3r0iCnDpZWrmGV//BEoh/shWSCl9/29YvKkay9XkPe5KEAgJRePCmVCAAEEEECgcAQIpBTOsaQmCCCAAAIIIIAAAv8TyJdASt3LapvnnnnGG/hbwQp7M97OSyuQsnbt2piyXHzBhaZR/QaRr8eHPZZX3z11+/PIkKExdaxRtZr58IMPvO676tW9PGb91MnBYFIuBFJWLF8RU059f2pWuzRwrFo0aWrWr1vnHadwIKVKxYrmxuuu876HgwYMiMyPQEpefcXLZGEJpJTJw06lEUAAAQQQKDEBAiklRs2OEEAAAQQQQAABBEpKIBcDKRpsvsuNN0XepLaBk/C8Tq1aZv369T5b+QsvCmyvMVbc6dSpU4H1ym/iaxPcJEYtLcL7mTp5ciCN8nlqxMiYdOHt7Gd1lZVv07at20zjBg1TruPtt3Y1Bw4cCFQzFwIpJ0+eNMOfeDKleowZPdor/+yZs1JKb4+v5i+/eP679u+//0Zur7LYacjgwTFp3pw0ya4u0lzHQWV6ZMiQIuXDxoUlQCClsI4ntUEAAQQQQCDXBAik5NoRoTwIIIAAAggggAACRRbIxUCKKvXt19+Y2jVqxtxg1k3hy6rXMP0f7Bez7o+lS32Pkgqk2B1++P4HpmWz5uaSchfHlMu9yZ7KAOc2z1yab9ywwTz39DNe6w23Pu57Ha8pb0+OCaKoHrkQSFE5FNj44L33TLNGjU2FBMfKBlL279vnBfUqV7gk5rhWrVjJ3N39rphu5vr36+cfOgIpPgVvckiAQEoOHQyKggACCCCAQAEKEEgpwINKlRBAAAEEEEAAgbIukO1Ayg/ff2/GjR0beC1dsiTAfOLEicB6pV+xfHkgjf0w/pVXzIN9+ng3q22+agWiVhL2s53v2bPHbmbGvzIusP63X3/11+mNuqyy29n5ksXBcqrVgF1n58vjlNNmru6ubFqNJfLEsMf8z1r+z99/26R5OVcLB1s/BReaNmrkfR4/blzC+nz0wYf+dnb7TRs3BrbZs3t3TBod5+Ka3pszx9/f9ddc679X+X5duDCw2x/nz/fWV69S1agFidIsXrTISzNt6juBbb/95ht/WwVSbH3d+ZkzZ/w038+dG5Pmj6Xxx23xN0zhDS1SUkAqg0kIpJTBg06VEUAAAQQQKEEBAikliM2uEEAAAQQQQAABBEpGINuBlOIotYIeJ0+cKI6sizXP48ePm3PnzhXrPkozc9XP7aKqNMtS1H2fPn06pSwUBNT3MV8mAin5cqRKtpwEUkrWm70hgAACCCBQ1gQIpJS1I059EUAAAQQQQACBMiCQD4GUMnAYqGISgS2bN5t5P/yQ0WvN6tVJci/c1QRSCvfYFqVmBFKKose2CCCAAAIIIJBMgEBKMiHWI4AAAggggAACCOSdAIGUvDtkZbLAL415MWaMEnd8lkTvBzz0UJk0U6UJpJTZQ5+w4gRSEvKwEgEEEEAAAQSKKEAgpYiAbI4AAggggAACCCCQewIEUnLvmFCiWAGNoTP9nWkZvRb88ktshmVkCYGUMnKg06wmgZQ0wUiOAAIIIIAAAmkJEEhJi4vECCCAAAIIIIAAAvkgQCAlH44SZUQgMwECKZm5FfpWBFIK/QhTPwQQQAABBEpXgEBK6fqzdwQQQAABBBBAAIFiECCQUgyoZIlAjggQSMmRA5FjxSCQkmMHhOIggAACCCBQYAIEUgrsgFIdBBBAAAEEEEAAAWMIpPAtQKBwBQikFO6xLUrNCKQURY9tEUAAAQQQQCCZAIGUZEKsRwABBBBAAAEEEMg7AQIpeXfIKDACKQsQSEmZqkwlJJBSpg43lUUAAQQQQKDEBQiklDg5O0QAAQQQQAABBBAobgECKcUtTP4IlJ4AgZTSs8/lPRNIyeWjQ9kQQAABBBDIfwECKfl/DKkBAggggAACCCCAQEiAQEoIhI8IFJAAgZQCOphZrAqBlCxikhUCCCCAAAIIxAgQSIkhYQECCCCAAAIIIIBAvgsQSMn3I0j5EYgvQCAlvk1ZXkMgpSwffeqOAAIIIIBA8QsQSCl+Y/aAAAIIIIAAAgggUMICBFJKGJzdIVCCAgRSShA7j3ZFICWPDhZFRQABBBBAIA8FCKTk4UGjyAgggAACCCCAAAKJBQikJPZhLQL5LEAgJZ+PXvGVnUBK8dmSMwIIIIAAAggYQyCFbwECCCCAAAIIIIBAwQkQSCm4Q0qFEPAFCKT4FLxxBAikOBi8RQABBBBAAIGsCxBIyTopGSKAAAIIIIAAAgiUtgCBlNI+AuwfgeITIJBSfLb5nDOBlHw+epQdAQQQQACB3BcgkJL7x4gSIoAAAggggAACCKQpYAMptWvUNC2bNeOFAd+BAvoONGvcxJT7vwvMI0OGpPnLQPJCFiCQUshHl7ohgAACCCBQ+gIEUkr/GFACBBBAAAEEEEAAgSwL2EBKnVqXmTYtW/HCgO9AAX0HWjZrTiAly7+ZhZAdgZRCOIrUAQEEEEAAgdwVIJCSu8eGkiGAAAIIIIAAAghkKGADKWNfejnDHNgMAQRyVYCuvXL1yJRuuQiklK4/e0cAAQQQQKDQBQikFPoRpn4IIIAAAggggEAZFCCQUgYPOlUuMwIEUsrMoU6rogRS0uIiMQIIIIAAAgikKUAgJU0wkiOAAAIIIIAAAgjkvgCBlNw/RpQQgUwFCKRkKlfY2xFIKezjS+0QQAABBBAobQECKaV9BNg/AggggAACCCCAQNYFCKRknZQMEcgZAQIpOXMocqogBFJy6nBQGAQQQAABBApOgEBKwR1SKoQAAggggAACCCBAIIXvAAKFK0AgpXCPbVFqRiClKHpsiwACCCCAAALJBAikJBNiPQIIIIAAAggggEDeCRBIybtDRoERSFmAQErKVGUqIYGUMnW4qSwCCCCAAAIlLkAgpcTJ2SECCCCAAAIIIIBAcQsQSCluYfJHoPQECKSUnn0u75lASi4fHcqGAAIIIIBA/gsQSMn/Y0gNEEAAAQQQQAABBEICBFJCIHxEoIAECKQU0MHMYlUIpGQRk6wQQAABBBBAIEaAQEoMCQsQQAABBBBAAAEE8l2AQEq+H0HKj0B8AQIp8W3K8hoCKWX56FN3BBBAAAEEil+AQErxG7MHBBBAAAEEEEAAgRIWIJBSwuDsDoESFCCQUoLYebQrAil5dLAoKgIIIIAAAnkoQCAlDw8aRUYAAQQQQAABBBBILEAgJbEPaxHIZwECKfl89Iqv7ARSis+WnBFAAAEEEEDAGAIpfAsQQAABBBBAAAEECk6AQErBHVIqhIAvQCDFp+CNI0AgxcHgLQIIIIAAAghkXYBAStZJyRABBBBAAAEEEECgtAUIpJT2EWD/CBSfAIGU4rPN55wJpOTz0aPsCCCAAAII5L5AqQZSTp8+bdasXu299D5quuO22025/7vAjHr2uajV5ujRo97269eti1zPQgQQQAABBBBAAIGyJ0CSWOwOAAAgAElEQVQgpewdc2pcdgQIpJSdY+3WdNeuXd61/+7du93F/vtUAimbNm3y8jh06JC/HW8QQAABBBBAAIFUBEo1kPLP33+bHnd29wIlD/S837z4wgteYOTUqVN+2aMCKcePH/fSDR440HTt0sWUv/AiM/zxJ/xteIMAAggggAACCCBQtgVKKpCi81Y92KNXvAeDwkfis08+NYMHDPReGzZsCK82586dM6ed8+GYBCxAoIwLEEgpm1+AeT/8YCqWr2BaNm3m/X4uWbLEHDt2zMeICqScPXvW+322v7s1q11qGtWrb3gQ02fjDQIIIIAAAgikKFCqgRRbxm5db/OCKWp5otctN91svv3mG291OJAyY9p006ZFy0D6Uc8+a7NijgACCCCAAAIIIICAKalAyp23d/PPS/s88EBK8k+NGOlvs+CXXwLbbN2yxTw+bJjp3u0O89OPPwbW8QEBBP4TIJBSdr8J+s2seHF5/zdUD1W+NGaM0UOa4UDKxg0bzCNDhvhpda+haaPGZtPGjWUXkJojgAACCCCAQMYCORFI+XHefFOtUuXACY5OjqpXrWYqXFTOW16pfAXvs06UbMBF87vuuNOcOXMmYwA2RAABBBBAAAEEECg8gZIKpFx8wYX+uWmtS6unBJkokPLKy2P9/J575pmU8iNR0QWWLl1a9EzIocQECKSUGHVO7qhrl1v830l7b+DSylVMVeeeQvUqVU2VipVi0i1btiwn60ShEEAAAQQQQCD3BXIikCKmzz791KiZrT0RSmXe8Ip6ZuWKlbmvTAkRQAABBBBAAAEESlSgJAIpr0+Y6J271q5ZyzuP1QM/0995J2k9EwVS3pszx8tTAZqZM2YkzYsERRPo2P5K075NW3Nd585Fy4itS1SAQEqJcufczg4fPmzc1oCp3DtQmmeffsacPHky5+pDgRBAAAEEEEAgPwRyJpAirp733JtWIEVP7DEhgAACCCCAAAIIIBAWKO5AilpEDxow0Dt3vadHD9Plxhu99y2bNTcnTpwIFyfwOVEg5eCBA14Xt3O/+y6wDR+KR+CSchd7x61d6zbFswNyLRYBAinFwppXmaobr6oRLU7iBVXUYvCff/7JqzpSWAQQQAABBBDILYGcCqSsXLnSuN0jxDsJ0nI98ffvv//mlialQQABBBBAAAEEEMgJgeIOpOzatct/AOj9994zk996y/+sgecTTYkCKYm2Y132BQikZN+0JHIkkFISyrm/jx7du/u/u4nuHWjd2Jdfzv0KUUIEEEAAAQQQyGmBnAqkSGrOu+8mPRlS/6e//fprTsNSOAQQQAABBBBAAIHSEyjuQIrtgks36LZt22b0QJC9kffwoEEJK57tQMqkN94wr41/1Xup3smm7+fO9dOrBUxZnjINpMhZ5tu3by9Wvm+/+cY/VurOiOk/AQIpfBMkcPDgQdOh/ZX+b6/9DQ7P77vnHsAQQAABBBBAAIEiC+RcIOXvv/82bVq2SngydHf3u4pccTJAAAEEEEAAAQQQKFyB4g6k9Lqvp3e++vDAQebs2bNm+7ZtpkmDht6yW2662SRqlZIokPLrwoXmitp1vNe4sa/EPUC//Pyz0Tmx0rotujXAspbNnB4cX2XTxk1m9KhR3roql1T0z7Vr16xp2rduYzZv2hR3X4W2YsXy5Z6DnOwN1woXlfOXafn9997nVVtduOmzXsuXLTOLFy0yD/bpY+SsbX/68UefR926Kd01V3fyl4XfzJk928/vow8/DK/2Pm/YsME89/QzXrrKFS7xy1inZi3vpvHWLVsjtytLCwmklKWjnbius2bM9P9G7N+zO9c4rAsXLEicCWsRQAABBBBAAIEUBHIukKIyT582zeu6yz0Bsu/VGuWXn39JoWokQSBW4PfffjPXdurkvxS4Y0IgmYAGpXS/Nwt+if0NOnLkSCDN4sWLk2Wb8+uXLF5s9Fq9alXOl5UCIoAAAmGB4gykrPpzlalVvYZ3827S62/4u+7fr59/Q2/d2rX+8vCbRIGUH+fP9/N47plnwpt6n9WVmL2Rr3Pkzh2vNtd26uy9dBNfy/bv2+dvu2P7DtOkYSNveZWKlfy02sYGVZo1bmJ27Njhb1PIb9auWesb2GsMOVhDzR9/dJhHoECKTTN/3jxz2y23+p+13A2k1KhWzVvXtGGjuHxTJ0/2t581Ixjs0kZbt241jerV99JUq1Q5UCYbVGndoqXZtXNn3H2UhRUEUsrCUU6tjqdPn/b/Zuzfqju/564eqWVEKgRSENADDPa6UC1TmRBIJrBp40b/O6PvzratsQ9D6Hrbfq8037NnT7Jsc3r9yRMnvfsIupdQlh7UyemDQuGyJpCTgRTV7oo6df2LDPdEqPsdd2St8mRU9gTUPYL7fdLNbyYEkgkcP3488L354vPPYzZR1wLud+uH77+PSZNPCz547z2vPpUqXGKmTpmST0WnrAgggIAnUJyBlLnfzfV/88+dO+eL//zTT/7yZ5562l8eflOUQMqnH39iqlaq7O2nXp26Rp91s99OKo+W6SEATeoOqlWz5l76W2/uYub9MM8m9ebzfvjBdPxf1zitmrcwZe3cKFnXXm4g5ap27b2HvYYOftgzlrMbsCpqIGX//v2mRZOm3rHq1vU289P8861ddLDUJZtaD+l8Qy34y/LA2QRSAn/GZf7DlLcnRz6IWalCBbPo90Vl3geA7Ak0uKKe9xus3+FXx43LXsbkVLACbtev+t5EPWiz6Pff/e+V0qjL2HyeXnh+tFcfPRCih1CYECgkgZwNpMyYNj3wQ6IfE73UpJ4JgUwFCKRkKle2tytrgRTdROt0VQfvN/eeHjzFV7a//dQegfwVKM5ASqcOHb3fyLvuuNP8+++/PtKJEydM1y63eOtuv/VWf3n4TVECKeUvvMjLX0GUtWvWhLOO+Txt6lQvvc6j1dohapoxbZqfZp/TkiUqbaEtSyeQIsMhgwbHJShqIOWtSZP847B79+7I/Ux+6y0/zV9//RWZpiwsJJBSFo5yenWse1lt/2/D3ju4+y66BE9PkdTJBAikJBNifVigrAVS1AKlWaPG3u/xs0/Hf6go7MRnBPJFIGcDKXqaTs3W7UmQ5n179w5crOYLMuUsGYGPP/zIbNuaOHJPIKVkjkWh7aWsBVIe6Hm/99t7Zdt2RjcqmBBAAIF8FCiuQMrGjRv9bmTemDgxhmbM6P+ewtO5q1oQRE2ZBlKeeeop/9xYrV9SmXr1/G8sF3VV5QZ93G110WvPuR/s3cddVfDv0wmkXH5ZbaPxVeJNRQ2k6KavjsPIJ4fHPVYKntljNaj/gHhFKfjlBFIK/hCnXcEP3n/f/9uwfyObN29OOx82KJsCaoGfSnCaQErZ/H4UpdZlLZCiewj6DdZ4gW6r7aIYsi0CuSSQs4EUIX30wYeBk6EN69fnkh1lyQGBY8eOedFuRbwrXlzefPP1NwlLRSAlIQ8r4wiUpUCKWv3ZLmNmTJ8eR4TFCCCAQO4LFFcg5cMPPvDOTy+v/f/Z+wp3rYru7T/le18DRUVBECREukRBDAwQFRVERUK6W0pQ6e6QUkDpMlAMQgnpbgkR7N8733Xvw5qz9jyz6+lYc13nzH72nrxnx8zcKx6wmsGCKS34IcEicuL48Vag4iFSoO3S+tXXnHKh9YLfQQFtefqJJ5080J7BPMn2B5OVlO7tN98KKjavrkchUpo0auTb90SIFJgIRfm4bzDOtnHCuc8+/VQ9cdMPTqeOHX3bk88XhUjJ59GNr2/wfflI3XrOM4TnCD6r/vn77/gKk1wFgcC+vfv0XgLumcOHDgf2W4iUQIgkgYFAIREpn65c6ezL3XNnSbVxwwYDCfkpCOQHAllNpPzw/fcKzuXxUYM2ChzJSRAEOALXfv1VT5Zxn2CB6ReESPFDR655IVBIREq7t9rqZ0okSLzuCDkvCAgCuYBAqoiUp5o84bwnS95ewpG2g8Sd+Ufmt2pWq26FKh4iBaaeMNfBX1hzNZhLU56wsRAp7iHjPlJSSaR8vXVr5LESIuU/qmf37u4Bk18FjQBM0tK77tChQwWNhXQ+GIFdO3fq+wX3jRApwZhJiugIFBKR8tgjDZ1nqnrVh6MDJTkEgRxBIGuJlL/++suR8iM704MGDHB+//vvvzkCrTQzHQgIkZIOlKWOQiFStv/wgypXuowz+Wn7xpueZkXkjhAEBAFBIBcQSAWRAgfu5coUvSchbQcNBNvf3Xfc6bxL77v7HrX1q69i4MoEkXLn7bdb22q2v2vnzjHtzecT2aKRwokUkHTmuNh+9+7RM5+HxrdvopHiC09BXrx27Zrasnmz3hi/fPmyunHjRkFiIZ0Oh4AQKeFwklSJIVAoRMraNWsUzaneGzEiMdAktyCQxQhkHZGCDcvR772nYH6ApEl43K1LVzVl0uQshlSalk4EhEhJJ9qFW1ehEClkrgbvXJvd/8K9A6TngoAgkIsIpIJIGT92rJ6fwnyBV1gwb75OB7vrZsgEkdKvTx+zGfJbKb3or1+nrhWPTGik4P6Q4I+AECn++BTSVZiPwf4ByG2+b4DjWtVrONewkSlBEDARECLFRER+pwKBQiFS3h81Sr+DYQlGgiCQrwhkDZFy8uRJhQevVMm79MNnToTo923/+a9j8mvB/PkKtlAzESCRuHD+fM8/TO55OHXypCttkJmynTt26PRrVq3mReljaOdQG/iL6sD+/c75D0a/r/r06q3T4+DzLVt0HmwOIyCmckBgnTt3zpWH/9i3d69OS3ko9suHMo4fO67zohwKsN9NZXTv0lV98P77zu8DBw5Qkpj40xUrnTQzp0933S9wpEplUXz82DGd38+0F8xfUJ51a9fqPH4H8NFCeRBfvHjRL3lSry3/+BOn7mlTpqi2b76l2wE752ECJB+p7b/++qvOsmf3bn0e9wOlyQaJrjNnzuj2ULt4rDthHJj5eL/gtDUoFAqRUuXBis7zVKlCBQWtQAmCgCAgCOQyAskmUjDvev21Vs578onGjytssHsFzPPq1KjppIVWihniIVLgBBeb/ZgPN6xfX533ma9RfceOHVMPV3nIySNECqHijkl6MtNECswQPVSpkjNWQqS4x8j2S4gUGyqFdQ5rHpjbo2eY9gpscckSd6g3X2+jvt22LStAwpqRr2HMY9s8/JOPP9Z5+Fra1qEwa1S+Bt/2zTe6GFoT9+nZS02fOk2fxwEECNDWJYsX6/PYA8A5+FZ8reUrzt6CvmgcAH+zr/Q7aK25+6fiNeqpk6d0ySeOF+8xwL/U3DlznDpgDtMW/ve//+k2jBw+3Hnn0j0z5oMP9TVqFzSbePDykYJvNOVBbObjZfDjzZs263zffP01v5SyY8xfqK3Dhw5VmB/Q7y+/+DJUvRfOn9d5tm/frvPwfbLBAweqwQMGOunghzPTAet+6qcZf7byU8/m8Xwzpk1Xb7V5Q5dz5vRpz3x0oRCIFOwnwWcxnqXnmj7jO0cmXCQWBHIVgawgUk6dOqUa1qvv+ojB1nTf3r0VXlr0hw9j44aPutK1ad1a4aOVroBJ++KPFunFMX10zRjt4gFqbjwNJjd+gS+wsVi2BUywqMwnH2/iJDly5IiqVL6CPg8zADxwTZ8LFy445tLavvmmTo/ybCYosJEMG8QVypZzpaX6EcNmODbnvcKK5ct13onjJzjJ5s+dq2pUfVif5+U9+EB556Num0jC5iJP63e8/JNPdJP8iJSZM2boMmGSY9PGjTqf18HmTZt0HrQBE89UBjiWBRlWr3YdVeLW21x1EwYwBwHblF98/rn652/vTZ72bd/W+WEP9sb166pb5y6q/P1l9XkqE3Gt6tXVik+Wp7J7nmUfPXpUvT9qtKpaqbK1bdTOiROK7isq6NjRo+rR+g188z1Y7gGFhcJeRu5RfooLhUh54ObYY4EgQRAQBASBXEcg2UQKNgfoe9OlU6dAeIh0wSYfvmM88HmeOXfC95vqGfbuuzyb4vnmzZnjuub14802bZzyyt5XWkGwQIIbAdqETSaRgrnFaY/NlX59+urxxUYOD/B9g7GHmc10CufwNuTKsRApuTJSqWnnuDFjFdY89K6sWrmKeuH5Zs76jfYO5sya7Zy7/977dLoy996bUQfIJ0+cVFgHV7tJcFP7zXjEsGExwOG9QuloLR2T6OYJkOiUFjHM95rh5337dJrOHd9xLmMTHd8Kymv6harxcDXnGgkIgEQhv2GUxyZceenSJfV6q1YK+FM6M4ZZYQiTegUIiVKedWvWOiaIRwwdpkgQjK5RXLVyZTV2zJiY4uADktKEiU1tJi8iBYKzfB8mjL8x4NKI7W91bN8+pr3JPHH50iX18dKlqm7NWp4YYGxfeqGFCiJ1QL4RfgP79XeauWb1alX7phAJXaP4gTL3q04dOiqY4Et3APEIgVv+DFG7KAYJsHL5ClfT0Efsu/jle6hSZUcg3Jzn8YIKhUghLOGeQYIgkM8IZJxIwSSYv8irPVTVmdx4+UKB5ATMz5QpVfwRfqP16+q3NLyQF85foBo1LHKeRC8JxNjchTPR0veU0h8TOLrjIR1EyqGDB2MmZX5EytEjRxQ+8LwvODaJFGwi9+7ZU6e79667nf6iz/ijzVfkLXHLreqTZR/zrutjk0j5aMFClwo2Jm3QNjLbM2TQIAUCgYdUECncdAPaMGOaWwKH10/HtOBF+qZPPplSUg/jAGkRjg8mjjQOiGkzgNJAygYbP7bAiRRsNkEbiPIhxmSH/8Yx7nE/Uya2ehI5h7aPGvmeMscb9wn1my+iYHKFhxHDiqWMMLGlPIj5JBh9a9GsufrjppYWLwPHhUCkYFxJigQLFQmCgCAgCOQ6AskmUrgWLMyBBIXPt3BCZKgrOSdEohApBw8e1HMlbHZwYRFXBewHJ2b69u7jKy3MshXMIc2dMDewbfDw+aG5qWiCNGTQYD13Mu2Do5ypkyfr8cPcwyRSNqxfr/MPGjAwZv5r1lfIv4VIKczRxx4BJMKx5sQzhOcXEvV+juUhLd/urbb62QJRCXNg6QzQUsQ6pXaNGrodaD/+aj5czVmjkG8tnBs6ZEhM8/hmbiqIlC+/+CJGoM5853EiBRoXTRo1jumPSaRAUv3lFi10Oqz5+ZqM7+tgrem1gc+JlM8+/VRNGDdOlwnMbGtX3CfTp01TfG8pVUQKBqxbly66TY8/1ijQegoEN+k+QJxKjSmMAxeqRX3VH6rqGgveFqwLZ8+cpYCXLZhEyto1axUnLTGWtLbk5YIsSpdVGQgvQxiYPztoC/YP6B6k/ac7brtdweIHD9hnpLY/XLmKzoO85Q0B4x7durnuM15OIRApkyZM0FiZhBTHQo4FgXxAIKNECkiRR5gmysNVqihIxocJ33/3nZ5A4eUGNdJUBix+6CWL+vBRbvXKqwp2r9EPBHxM8BtOOncZqoupJlJgYgJaMGjb7f+9xdFIQFsWLljggoV/PCdNmKhfdviYzJox02k/V4PFpAMfBfqAvNziRUfTgRcKaRYQLYRP40cfs34cOZEybswYB0PkGdCvv1MvNiVAVuG3+dE1JxUg09A/+MuhtiHGhxLn+R8IIwp+GimYJLR+7TVdXoVy5SibNT58+LDCB5XqX7nCLcFgzRTnSYwDHIpSXRjjcWPHKqjU8gCVbzL7QWm9Nns4kUL3AmwLE3bQ0MAxpLtosYIyMUnlk1Fef7KPsfChfiDGfQFJTqiOUwABgHaCCDHDju07HHOBo98bpU6fcqvdYpI/9sMPneeF6kDZtpAOIgWYgjhK1p/XpNfWP5zjdv+xOJEgCAgCgkCuI5BMIgWmQLp3LRI4wDznlxCmPGHuAZKM+MY81uARxbWR4yVSMCZ8QxDzN8wPli5e7Hw/zp454/zGOaoP5lIgXUrfOsyZsUnPvzeUb+3qNbk+7JHbz4WKYI4C5l2Bz9kzRWZhohApMHdD82HEGAfcK9CY7dSxozMGzZ59Tm/4mUQKiBxIctJYQatp6OAhrrGCOWSUC9KlkIMQKYU5+tz/FJ4xCI2FCbBw8GrLlvrZgpBWutYzaB+IHnquEYMAwqY71jA0Z8e7B7/xjraRunwzONlEyjvtO6gGdYtMR2Ldh28G2mKajCYiBYKV740Y6fQJ41DxgfJOeuThJrrw/sR7FX1Guo7tOyhzbfrdt9+qN14v3rDGe882NpxIobUrrYlRL61dscYlgpwwv8TMruN7jvT4A2FFaRDD1w5doxhaIzxwYTxTiG/L5s2u8qCh4Re6vNNJp3+pRQvnXe+XPt5rGAf+bQFph/6Zwqo4ZxJSXgLLnEiBsGeVipWcMUafUA4IMQh7YB1u7u2ka6N98aJFGl+M7523l1Aw38YFQ7GvgPbCXJcZsH+FeRYIJZpTUZqDBw6o/n376m8+yp9j8YmH9OkgUjDGfF6X6DGekygBWm30LGF/UIIgkM8IZJRIWbRwoX7YwOqeOH4iEtYgU+67qQWCjwF+pyLgpQltA3oxgH3+6aefIlWVaiKF2obYz78HJ1IoT8d23iqkIGIoHSYkfgHm2Cht106dY5JyIoXSTZ86NSYdTsAkE6VB/ETjxtZ0yXY2v23bNu2np9Rdd6vtPxTb+zQbAM0d3kZOQJlpE/1tTgL8zI7BFAQ3lQfV8SOHi8kkagsnUtAPSGeZE1tKC8fjvK8gwlIdDh86pKCmT/U+2qCBwqI52QGqyFQHTKLZQjqIlPlz5+l2UHsSib3G0tY/nBMixQsZOS8ICAK5ikAyiRQI+tA7Gd/PsKHliy/pfBcvXNDZEiFSUAg2kR6qWORPg9plxqaGMAQOzDTm72eeetq1CaYbnMcHMHnDJaIJk717ivz5RSFSANOgAQM8cX6uaVNng5A2I00iBfmxqcrn1NQeM2727LPqzz/sWsd5PFy6a0KkaCgK5gBrHMzV6VmARkLUAFPhlB8CdOkIMOfFzR3VqVnL0/SfX3tSSaQQJngX+pmqpncXpUc89kPvdSHMU1JaCBb4BW4Wa7xlbDmRQmV6rYmhcURpEIPItgWsl3i6MEK9fkQKCLtnnnpKlwnz0X4BprOpflOL0S9f1GvcSgM0gvxMqME0HjeXBs0am78XTqRQH94dHKtJhbaCsKE0iEG6pDrgPoaQKNULIYao5ECYNkLQmOrwmh+mg0jh80pqTyKxjcz1w0OIFD905Fq+IZAxIgWT38cfe0y/dOJlLZcuXqLL+PD9D1IyPiAm6CVUucKDvh8erwakg0gBmQQfFn4fCJNIgbYJ2GqvQBMaSJ2YEilmHkiTEE53lbhDwfwEDyaRArLFJm2CPDgP++NUHvyocKdyVG6yiRSUC4kaqhdSiiQlRHVS/PQTxeQaNHK8+kLpE4kx2aA2wY5qUJg7e7ZOj3yjRo6MyWISKX7j+/uNG6pi+WJc3nrjjZT2F42FbWDqMzTXbBO4mE7FcQJEKdVT4tZblc3RnBApcQArWQQBQUAQyDACySRS4NgdmiD4iyI4Ad91lI8754VmLZ0/cOCAC6mf9/2sr/n5Jrt65aqaNmWqTlu7eg19DEGYa7+67ZDjW/bVl1/qNPXr1FEwqUvtgGANyB6veY+rkXn2AxtCwAF4QLMXx/DhiID5HWEECeyggI00CJwgT8P6DRQ2bnHco1t3TVIN7D/AOWeadaOyMe/asnmLrhdmkGH+h9rR+Z13CnasCCMhUgiJwok/YkKYWMeA5IwasKFL5rUgJZ+OMHH8eL3WAIkSxjm1rV2pJlIgLOplVovaYxIpMOfjNQ7QxqON7IrlK/gSNCj/IybAWarkXcr0k2oSKdAs8ApFhMbTGncICdj86iabSEF7sCdFa8tyZe5XEA60BQhKktUH7OOkytwV1tA0DmiX12Y/b+OAfv10H5AHcxYzmEQKBEdgws4WsD81/N2husyypUurQwftuNjyRz2H7zb2K2gcXnn5ZYXvairCj7t26XqwB7Zn9+6YaoRIiYFETggCOY1AxogUmGqiF9vbb70V86EMiyo+iI82eMQpq1KFB2PUE8OW45UOqozPP1Okjor2mr5PvPKZ59NBpGBjPyhwIgUaCAf2uxfvPD+cZNJHF5OmoAAHW9xRuUmOmUTK8ePHfYs0neQhvxlSQaRw+44Yc3MShzZAIgrkDq5DpdjLoajZ3nh+Y7INIgt1QbWUq6J6lQdfH5x8gQkyM3Ai5akmTawq5DzPlMluM2p+BBzPF88xzG5xu6Op1oABtvS3bMmSmCang0jBhgCkg5L1x9XqYzpknMCmWc9u3R0MQFqRuUIjmfwUBAQBQSCnEEgmkZILHT99c+M/bFtBCJ04EU0bPGzZuZoOeEQhyoL6ef78ec+NpaC8/PqZ02cUTHpJKEZAiJRiLArliExEYc6+f//+uLtNFhdgamrWzJlxlxMmI9aMIGhpnWHzfRKmHKRJNZFisyhhto0TKdBa8Nv8h7Yf9Rt7EEEB1h5ozYt85lqTEykQ9rzAtDxtZZv+R/bs2ROTLBVEyrmz5xR8mFHfp3lY4Hh3cLFPrbAm6mI6EOIE1pbUFmgc7djubXGDigP5w018vfjCC3RJxyaRYppi1wlvHmB9z30Kw2dYqgIEeqnPiFNptpprLKMum1WIdBAp2I9K1j4CyokiJIx9B9LAhmlC7J1IEATyGYGsIFL2Wj5qUUBftPAj/aKMsnkYpg6uZYEXY5CdS68y00GkfLpipVf1+jwnUqBt4RfeHzVK4wq/JWfOnAn8a/vGmzpPEJHiJb1CbYJEA/8ApotIAXFRq1qxmi33x0FtW/RR8T0H9dhUBj5ptBEiXnUH5eNEClRSgwImIHw8zMltUP4o1zGxorowET1kaDdFKYvS4n6jexjP45uvt9F/VBfiTBEp1M5MxBhLwiAMIZuJNkqdgoAgIAhERaDQiJSo+Eh6QSCXERAiJZdHL762E5ECXwZB60i/GrDhC8lxzH1hemSyfbkAACAASURBVCqVgUgb1AXhu30J+A5INZFC5gz98OBECvyJ+AXuf2rmjBl6HUbrMVvcuOGjek1irjX52hamq4MCTFTR+gZxuogUtGtg/2LT0dBMtIWSJUo47Stx621WjQ9bnnjOdXi7ncYBvm/Chg7t2ut8YYiUUyHIfgjy0pikkkjp1b2HrqdOjZoKfuASDdBmo3t2wbx5eh8B2FCfEGeKSEm0f4nkx7uDMAhDyCZSl+QVBLIBgYwRKdyGX6JA0EIZD2+qiZR4JfdynUihF2OU2FS3NTVSgibAmSJScD8++XgT/THobbFtCs0kwmLGtOmJ3sK++fmkMV4iBWSEKSWSK0QKpGESDSBiuN1OGjtbLERKsGZbouMh+QUBQUAQSAcCND9MlenXdPRB6hAEBAE7AkKk2HHJ17P7f96v/Ta8P2p0wt0k4cJ0EilB/kaDOpXLRIptzRV0zhQS5WvibCdSlixarPcK0E8zQFuGzHrBdGMqQzKIFPgtPWSYKDM1UrKVSGn65FMJwws/uq+98oprTL3uXyFSYn0lJzwAUoAgkGUIZIxIgZ8HevkkigktlFEefH4kM5gaKUKkFJtAovHzivftLXLSSeORS0QKnMzzfh09cpS64cSlS5VyroOgwCQilYFPGqMQKVs2b3ZMgVE/pk+d5mpmoRAp6CdU9wkHiiEl1b9vX+ePziEWIkWIFNeDIj8EAUEgZxGg+aEQKTk7hNJwQcATASFSPKHJywvr1hT7LE0mkYK5f5CJqEQA5RopQqSE30fAuPz5xx8u6PmaONuJFPgEgSYKrTEhRMzD8KHFvkB7du/OLyX9OF4iZcG8+br96Af2FngoBCLl+m/X1fPPPOvCgca0V4+ezj5Cx/bFmju4JkSKECn8OZHj/EQg74iUmdNnJHWkhEgpmvA80fhxx1kmHGaG/SMnnTQguUSk/PXnX+rVli31RxMfSAogJGhjvtUrr9LplMV80hiFSIHUyD0l79J9KDQiBb5tunXpovsPm7swBQAb4/jjvm9oQoS4EIkUTPbJTi/88EBKSoIgIAgIArmOgBApuT6C0n5BwBsBIVK8scnHK6kiUmpWq251Qp4sDIVIKdpLeOH5ZqH3EGivwXRcztfE2U6k4P5ZvWqVXodC+PL8uXPObXXl8mXtK6RC2XJW5+TJuv9QTrxEytavtur2Y41caETK5cuXtd8P9P/BB8qrvr16670E+BhFyBYfKcm8Z6KWhX2VN15/3blfSpW8S8HHjgRBIJ8RyBiRwn1MJArw+nXr9EteTHv5o0lqzPgYRPGRMm/OHP+CQ1zNJSIF3RkycJC+r6AS+ttvvzlOtyA1Avzwh0l9qgOfNEYhUng+qIKbtkHzXSMF0mo0Tpi8Ll0c60Sexo7SIc4UkbJh/Xr1XNOmSfsz1a+pr17x+LFjNV6pdMjnVb+cFwQEAUEg2QgIkZJsRKU8QSB7EBAiJXvGIh0tuXzpkpbwT1QjBWs6rO0w7xfTXsVaIqn0kfL11q0J3yZ8bZsLRMqPu3ZpwgT32vYffnAw2LN7t15zhfFTmihw8RIp3EfK4481UleuXHE1Jd81UriPH5ga97JCki1EypzZs5O2j4A9iaj7qtyMuukr2XXjyA9BIA8QyBiRAn8NtHn5yccfJwTls08/rcuK+sAHVWxqpOzfvz8oi/V6rvtIgWO5REOuESkXL17Ujghxr375xRfq2rVr+l6rU7OWOn36dKKwBObnk8aHKlZSpuM9rwJ4PhsBkytEStnSZRScu0UNfPLXplVr3+z0LkKcKSJl/tx5+t7i7Yn32KZW7AeCECl+6Mg1QUAQyEUEhEjJxVGTNgsC4RAQIiUcTvmUipzNN6xXP661AWHxxeef6zl3OokUOBX//fffqRmR41z2kQJhzkQDX9vmApGC/vL19hutX3cg4MTGsqVLE4UlMD+vr/lzzytT08erAL6WzmVn87Cswi1RePXXPN/40cf0ewKm2LxCthAp3Ad1vPsHPB/2vaIEIVKioCVpcx2BjBEpp0+dVnVr1XJeTk0aNY5bpfbggQMKm8t46Js9+1zoD0PYgcNGeb3atfVLFE7G4wm5SKSAdYeZH2B7/733qR3bt8fTdZ0n14gUNHzokCF67AcNGKhWLl+hf8NeZjoCSMe7Styh6zVNdNnagMnCs0831Xl69+gZk4xP7MJIw0BLgX9cwxI6MRWHOIF7rfQ9RX5oUOe4MWNC5CpOcu7sWdWgTl3d3iDtDN6vTBEp2PCDHf9k/Z27qT5ejIr/kRAp/vjIVUFAEMg9BIRIyb0xkxYLAmERECIlLFL5k27i+Al6br9yxYq4Ozaw/wCnnNv/e4v66suv4i4nTEZoH5QvW063G2vLeEOuESmwBkBrLAhlHjt2LN6uO/lykUiBOWnCoE6NmuqH779X9dkaFZvwqQ4fL1um24C2mCa6bPVjHcnX0tOnuX2tIk82a6SsX1tssQZ9jmptYe/evariA+U1bjCD7RWyhUiB0G+y9hFQTlTySYgUrztEzucjAhkjUgAmpMTpw7L8k0/iwpfs+qMcPPCpCG++3ka38/ZbblGYxEUNe3bvcb2MbRvbVCY+XHBGR9g0rF+fLrlivNwoDeJPV6x0Xbf9iGLaC/lhEonqwMZ7IiEdRMrwd4f6NpGbgUO/fv31V9/0qz9bpTDJRlpMerp26qzxiCrx71tRwMUype7V9ZYscUdAaqW4pBXaDiLPDNlMpKCtVW4SpGj/HbfdrrZ+FX6hA1Vq5KM/mBL0ClCzpnSIM0WkeLUvXec3b9qkCbvqD1VNV7VSjyAgCAgCKUNAiJSUQSsFCwIZR0CIlIwPQdobsGfPHj1nf/qJJ2NMDYVpEISrKpav4JRz5223h8mScBq+cY41/prVq+Mq8/XXWun+o+1+mgXQfuDrGzIrxSuG+R2eJtmmvS5cuOAqH0RIIiEdRMriRYsCm1j5wYq6XxBE8wvws1G/Th2dfuqUKfq4W+cuivxs+JWR6DV6V9JYP1LPvrfE65k1Y4ZuJ/IdPHiQX3aOs5lIgcAn9RcxfNHs27svpg9eJ0zyCQSYV8A9w+uy7RHtZubckPaAxcrN99995yrnxIkTXlVm5XluXSOMkG5WdkIaJQiERCCjRApeMvTSgSPoqKqNI4YN04QDtFouXboUstvRku3/+WdVtVJl3VZsZE8YNz5aIUopUkdGn7ExDp8IZrh69arixA3SZpJIWbJosYLDKBonONgKYqePHT2m/vnnH7NrKhVEyr///qt69+yl2xe0ARyVSEEnSBoD2jmlbxIacIKXSo0ME7xlS5YqPCM0DuizV/0b129w7i9K27Fde8e/i1lmthMpqz79zNUPPDPY7A8TYArs1ZYtNV6NH33U+n4AOXP/faV1OmBWqEQKcH3g/rIOFlggSBAEBAFBINcRECIl10dQ2i8IeCNAm4PwXSihMBDA2gfWIWiN83KLFurSL7+E7vyxo0cVzB0j/9133KkWzJsfOm8iCbF+gY8FajcEFePRqDHX0t27dLWaCsPGbim2bkS9mSBSsB8AAdTb/vNfp+9YS4/98MNAKL0sCaSCSMGakQuahtkAjkKkoLNzZ8/RY48NfboPoK2SjvDvP/+oyRMnauFQkHB+pNbM6TOc54PaOWrkSOv+TzYTKSCoZkybrtBX6gc0ww5ZCCHbGFz79VdVv3YxAYa9nz9+jzU1/tHCha69MtRVqEQKBJQJa5iQkyAI5DMCGSVS8OHq2a3YcTcmFSBTwNz7hbNnzzpEBj2o+CjbJO79yoh6DcQJ1YcY0iQvvdBCfTB6tMLHnv5mzZjpnIcZKDNA64aXAd8PHdt30HnfbNNGPdG4sZMGEgo06ahdo6bCy9wM6dBIQZ0wmcbbDZNWvXr00O2mvmNTGpjUqPqw40vEbK85+bORLTwPpGx4vchvC++PGqXTYVLc8sWXdNtMM1jxECmzZ87U5VN7ElHLtvUhzLkWzZq72vH8M884xALhjxj3U7nSZXS65s8/bx0L1JftRArayLXWgH25Mvc79xg0THi/hw4e4pyfP2+ehnLwgIEaB+Tl9wXybtywwZFOwbXyNwkEHBcykTJy+AgHM5iSW71qlcZSDgQBQUAQyEUEhEjJxVGTNgsC4RAQIiUcTvmWCuZ/+VoHa8/Dhw75dhMEDCTCsUbFXB9/TzV5wjdPsi9yqwaoH8J5aPvsWbNca5rR741yzkNzwQznz59XMA9FfUD8zFNPK6xvsbaZPnWqkxfCdzADxoXKbHslqdZIofZXrvCgbnOJW2512jj6vfdc/Ub7V3yy3LnWsH4DyuqKU0GkoAK+JgbhBRNFtM6EA28zRCVSYBaKjxmOsaYNEk41603090NMMBgWN3D//fTjj7qv6DPOcZPi73TooCC4agvZTKRQe+vVKjbRD9whHI0+bli/wdVvjDnOY3+AAvYO+LhBoJjuC8SLP1rkkCgga7j1kEIlUrC31/7ttx3Myt5XWu3YvoOglFgQyDsEMkqkEJpvv/mW6yX1+KOPOSaXQLTQixsPJn7D2Tuci9FLDR+BeLRDqO4o8bw5c51JCdXtF9smZ5cvXXYmO375QJ5UKFdO7d2zR0sNIL1NzTRdRMrZM2dUo4YNFSY+fm3n12xkWKqIFJhxupeZIOPtADHFQzxEyv6f92tJfZQNHIJMgvE6k3UMvx9jPxwTehxavfKq+nrrVs/q+aQxjPRNOn2kUKOxSJ48cVLoPsPmMYU/oZXycrFWCr8v+DHeP1zNupCJFDyjROCOHzdO+dmDJZwlFgQEAUEgWxEQIiVbR0baJQgkjoAQKYljmKsl7Nq1y6Vxgf2AT1eudPYK/vrzT90t7B1gU9M0c9Wgbj116uQpnS4dB3DcDOE8br6br0fM4y7vdLI2a9qUqa49AjMffkPIFJY7+vburdfu5poYhaeLSMFausqDFQPbTX2BgJtN4DJVRApIJq99DhAJZoiHSGnTutikPfo5cUJ0U/FmO6L+PnDggOrft2+occB6sGvnLgrzKK+QC0TKkSNHFFwBkKl2use8Yk6cXTh/XjVp1Eg/Q7Y8KHfUyPdUr+49dLpCJVJwn4z54EONgwhlej05cj4fEMgKIgVAduvSRT90/CWFjxdUQF94vpn1+uyZs9I6DnBu37VzsZ8M3lZ+DGkSW8CEbsSw4S41Q698/IWfSSKF+rF+3XoFbRTeXvO4aOI23CrNnioiBe2DNAWZJeJtMieN8RApKB8O8qhcSNBkMkBSwtQSorYhLlemjKMpFdTGXCBSqA/w+QIpEd5P2/GmjRspi469yJQqFSuqSRMmOumESNFwqcaPPqZxTofd3uKa5UgQEAQEgeQiIERKcvGU0gSBbEJAiJRsGo30twWCdNxcFq0LHqpYydk7wP4BCQfRNcQwmX3xwsX0N/hmjdu+2aZgJoi3yXa8/GNv/7FYUz/R+HFrGfB/Ad8kCNlCpBDYixZ+5OBv6y+dg4Nv7JVgk94MqSJSUM/nW7ZYN9uTQaSg/CmTJunxwn2byYB9pUcbPKLbQ9hTXLt6DRVmjy0XiBTCGc8TXAFQH20xtCh27nBrUcAqjFc+aE6RH1YhUgjpYh/L1as+XHxSjgSBPEMga4gUaFdA5db0D2J7yd19Z0nV4e12ChNo0lhJ57hAQgJ14w8b82gL/tauXqPP26QoeBvhz+W7b79z8nXq0NGaDzZfqR6bPwxIi9N1xLY0vE4cQxqG8vz222/m5cDfv//+u5MfTDv1GzHsTaLcyz5+atA+qhtxkLR71P5dvXLFaQe1C75a4HOGB9xnvA1hNooPHz6sTUBBVfrGjRu8yIwc0zi8N2KEHgdIUKBvV65cCdUmjD9hYTMdZxYCCS9Kjzho/Mz8if4GCUn1Q6KLxhnvDTpvq4PyQUICeZYsXuyk51pFf9y8r1GO7Tky70WbKjbuJWoHYlsaW/uy7dyWzZv1JBPSbBIEAUFAEMhVBIRIydWRk3YLAsEIYK6FdaL4SAnGKl9TYO03bswYVatadT13te0d4NyTjR93TIhfj2P9m2z8+JoYPhZoTfP9d9/rtUTQGhXrUTwDA/r1c/LDVBF+8/X99evXdXnmmhh94nsayBu0f4E8WGciLf7iWRMDf+SFYCD1G/48qUxbOwn/32/2GWnDrHej9g/7MyAH0K4unTo5beJ4UjtgeYPaizV5UMA6sl3btvoenTtnTlCWlF+ne6NHt256HGB9Av3CflGYADPshAPiMPtyUbEL046waW6w5wFCz3T/wW0A2u91T1G+fn36OnkguIn0/F1CeOK87TkKcy/Gg2fYvqcz3fRp05x7HULhCxcsSGfVUpcgkDYEsoZIoR7jJQMJEzi5avrkU6rMvfc5DyJUKPF7zerVat/evZRcYkEg5QjA3w1Nyr00jVLeCKlAEEgTApgIksYTTCHYiKU0NUWqEQQEAUEgIQSESEkIPsksCGQ1AtiwEiIlq4cobY07deqUs38AU8WP1Kun121PP/GkY3IHewt+wn5pa6hUVJAIHDt2TN+TdWvWCvQHXJAgSafzBgEQktBGwfeZm13Pmw5KRwQBpVTWESnmqJA5n+FDRTLaxEZ+pxYBSFVArZXUwqEqfvLESd9KoYVw+tSppPzBoWAuBEhPJKvP586dy4Uu530bISVG5CHsvkoQBAQBQSAXERAiJRdHTdosCIRDQIiUcDgVWqrvv/tOz2HDSMgXGj7S3/QicOTwYVXj5qYy1lZhTGbBN0ey1ta5IBAHrZ5k9RffBQmZR2DKpMnOexj7aMuWLM18g6QFgkCSERAiJcmASnH5gwDUbmkzGTHMaAWFHdt3uPLw/FGP69WuE1RdVlw/sH9/0vpctXLlrOhToTcCauzPNW3qjGv1h6qqY0ePFjok0n9BQBDIQQSESMnBQZMmCwIhERAiJSRQBZZMiJQCG/As7i7WTySZj30AaEudO3s2sMV+/kui7id8u21bYH2ZTgCn5FH75ZX+xebNM90dqV8phxirW6u2M66NGz7qMjkoAAkC+YCAECn5MIrSh6QjMHH8BNcH/ZWXXg5VB1TLB/brn5S/iePHh6oz04kunL+QlP4Ctw/f/yDT3ZH6GQKD+g9wxlaIFAaKHAoCgkDOICBESs4MlTRUEIiMgBApkSEriAxCpBTEMGd9Jw8cOKAqla/g2k84c/p0qHbDMX2y9hOOHz8eqs5MJtq3d1/S+jsvC/zPZBLLbKobJr7oPrb5GsqmtkpbBIGoCAiREhUxSZ/XCED9tn7tOurO227XE59qD1VVBw8cyOt+S+cEAUFAEBAEBIF8Q0CIlHwbUemPIFCMgBApxVjIUTECQqQUYyFH6UcA/n7hwL3sfaX1XgK0J+D/V0zNpX88pEZBQBAQBFKBgBApqUBVysxZBCZNmKgnPXfcept67JGG6vChQznbH2m4ICAICAKCgCBQqAgIkVKoIy/9LgQEhEgphFGO3kchUqJjJjmSh8D169f1XgIIFAhkjvlALC4kD2EpSRAQBASBzCMgRErmx0BakEUIzJox03EuX/qeUmr40GFZ1DJpiiAgCAgCgoAgIAhEQUCIlChoSVpBILcQECIlt8YrXa0VIiVdSEs9NgRu3Lih7r7jTlXy9hKqSaPG6nRIc162suScICAICAKCQHYiIERKdo6LtCqDCMyYNk2dPXMmgy2QqgUBQUAQEAQEAUEgUQSESEkUQckvCGQvAkKkZO/YZLJlQqRkEn2pGwh89+23av26dQKGICAICAKCQJ4iIERKng6sdEsQEAQEAUFAEBAEBIFCRkCIlEIefel7viMgREq+j3B8/RMiJT7cJJcgIAgIAoKAICAIhENAiJRwOEkqQUAQEAQEAUFAEBAEBIEcQkCIlBwaLGmqIBARASFSIgJWIMmFSCmQgZZuCgKCgCAgCAgCGUJAiJQMAS/VCgKCgCAgCAgCgoAgIAikDgEhUlKHrZQsCGQaASFSMj0C2Vm/ECnZOS7SKkFAEBAEBAFBIF8QECIlX0ZS+iEICAKCgCAgCAgCgoAgoBEQIkVDIQeCQN4hIERK3g1pUjokREpSYJRCBAFBQBAQBAQBQcADASFSPICR04KAICAICAKCgCAgCAgCuYuAECm5O3bSckEgCAEhUoIQKszrQqQU5rhLrwUBQUAQEAQEgXQhIERKupCWegQBQUAQEAQEAUFAEBAE0oaAEClpg1oqEgTSjoAQKWmHPCcqFCIlJ4ZJGikICAKCgCAgCOQsAkKk5OzQScMFAUFAEBAEBAFBQBAQBLwQECLFCxk5LwjkPgJCpOT+GKaiB0KkpAJVKVMQEAQEAUFAEBAECAEhUggJiQUBQUAQEAQEAUFAEBAE8gYBIVLyZiilI4JADAJCpMRAIieUUkKkyG0gCAgCgoAgIAgIAqlEQIiUVKIrZQsCgoAgIAgIAoKAICAIZAQBIVIyArtUKgikBQEhUtICc85VIkRKzg2ZNFgQEAQEAUFAEMgpBIRIyanhksYKAoJAriJw9uxZNWXSJP23bu3aXO2KtFsQEAQEgZxAIF+JlKmTJzvfkqVLluTEOEgjBYFUICBESipQzf0yhUjJ/TGUHggCgoAdgSWLFuu9BOwr/H7jhj2hnBUEBIGUIiBESkrhzc3CDx44oCpXeDDmb/FHi3KzQ9LqvEHgwvnz6tOVK52//T//nHC/fr/xuy7v999/T7g8s4B///3XKb929RrqgTL3q1v/33/0310l7lDbf9huZpHfKUDg77//dr3P1q9bl4JapEhBQBDINgSSTaTQO33Yu++63ik0Zxo/dqzzzsc8KpXh9v/e4nxLGtavn8pqpGxBIKsRECIlq4cnY40TIiVj0LsqbvXKqzHfyWbPPudKIz8EgUwgsGnDRmeutm5NcoQav/v2W6e8n/ftS0l3du3cqbp06uQ8T3fcepveS8C+Qq8ePVNSpxQai8DggYP0O+2tNm/EJpAzBYWAECkFNdzhOrt3z17XC5o2f2fNmBGuAEklCKQIgZdbvOjcmzWrVVenTp6KqWXShImqd8+e6vpvv+lrWGi/3qqVguQujnk4f/68qlC2nFNm106d1W8sH08Xz/GpU6fUk483sT5L9Ex98/U38RQteSIi8Ndff7nGYeXyFRFLkOSCgCCQiwgkm0j5888/Xe8Sepeb8UMVKyksrP/444+UwCZESkpgVadPn05NwVJqShAQIiUlsOZ8oUKkZMcQ2tZA9WrXyY7GSSsKFoFPV6xUJW8voe6+4041c3rs3taxo0fV0088qfbt3evCaPKkSapn9x7qwP79rvP40bNbd2duCKEaM19M4ogn+vXpo8rfX9Zz7tnurbYRS5Tk8SKAvSKa7z//zLPxFiP58gQBIVLyZCCT2Y18JlKuX7+eTKikrDQisHbNGnXf3feoErfc6pAiZtW4Th+3b7dt05fnzpnjnHfyLV6sz9PBTz/+qPNBQiUZARv37w4arMuldpmxECnJQDu4DCFSgjGSFIJAPiKQSiKlVrXq6uNly1x/2DiCtiG963dsT43WoRApyb1bO7bvoNq3fVu98Hyz5BYspaUUASFSUgpvzhYuREp2DF2+EimwYADtVAm5hwD2gRo1fNSZozV98qmYDvxy8RfVoG495zrmBDzQvM6W77dr11Tz555z8rVp1Vr9888/PGvcx998/bUqf1Pgk+o3YyFS4oY3ckYhUiJDltcZhEjJ6+GNr3P5RqRAO2HYu0Odv47t28cHiuRKKgKHDx9W06ZMiVQmbU4NGTTYMx9NLoYOeVeneeXll52JzZCBg/Q586Dliy85aSqUK6d2795tXo78e8vmzU551B6vWIiUyNDGlSGfiJRVn32mvvziy7hwkEyCQKEhkEoiBRKLtgDzk/TOb9EsNRvzQqTYkI//HJnKqF+nbvyFSM60IyBEStohz4kKhUjJjmHKNyJl2ZKlzl4CzJOdEe3FrLjJJo6foE4cPxG6LYMGDHTmZ3Vr1VanT8VatkBBvbr30GnOnDnjlA1BS8zr6tas5Zlv4/oNeu43+r1Rodvkl/DhylV0mTSvNGMhUvwQTO61fCFScF+P/fDD5IJTgKUJkVKAgx7U5XwhUqpWruKobt552+36I/Tqyy2Dui/XU4jAeyNGOmOCTQtMRsIG5MPEoUrFSsrP9vznW7aoUiXvUjCrArJmx/YdCnUh3wEfm/Vbv/rKyYc6oJ6baMBmjDnRwe8Xm7+g0EaYhxkxbLg6euRIolVJ/hAI5AORgucFqujYQH1/VHIm6CGgkySCQE4jkAki5X//+58aMWyY8w247T//VZs3bUo6hkKkJBdSIVKSi2e6ShMiJV1I51Y9QqRkx3jlA5Ey9sMxztwb8298z2ltJ0RK5u4xmODEeOAP4xFWKBGbxzR3mjxxkmcHYJK1SaPGTtnTpkxV0GIBeYa6YELcK8Af5xM381V/qKo6duyYV9JQ52FSn+43HsN82Oj33nP2EjZt3KgWLfwoVHmSKHEEcp1IgRAznhvMeaHpJCExBIRISQy/vMydL0RKxQfKx3yAhEjJ7C07fGjR5hImBGGJlCtXrqj7773PGcuXXmgR2AGY+EL6wQMGqrfeeMMhVbCZFhRAcqBdMB8G+6iJhDo1asbce1AlFtNyiaAaf958IFKqV31Y31NCpMR/L0jOwkIgE0QKEB41soj8xzdl44YNgaBv377dSYe0+0I4K6XNANPZ/LZvvnHK2bwx+eRNYCdyOEG8RMqpkycdvC9dupTS3u/ZvVvfHzdu3EhpXblUuBApuTRa6WurECnpw9qvpnwgUj4Y/b6ee/PNbCFS/EY+tdegScLHIiyR0qtHkaYJ8p48edK3kdh7aPrkk6purVpq8aJFTn0Txo9XIEv8AjSSSYD3/VGj/ZIGXps+dZqrn9TnrV9tDcwrCVKDQK4TKZMnTtT3lBApid8jQqQkjmHelSBESt4NadZ0KB4i5cP3iyex69auDL6j8QAAIABJREFUjekLJkZvtXlD7f/5Z/332CMN9YeCX8OmGmygTxg3PqYcmEyiSUoi6o7YCLvnzpK6LCrTZlM1phFyIiUICJGSElilUEEg6xHIBJEC2+k9uxc5HoWGJMgNrzBn1iznm0TCAvheVCpfwTkHh6hYzNsCJ1JQHxZH+LahPpQByVn8HjpkiII9dwmxCBw8eNDBCDiRpDHww2/6I1OiwJjOHdh/wDHrMn7sOFW7Rg0H7y+/+EJX0PrV15y0fqZkMZeh8rw0lkDOLFu61ElXodwDek7xVJMnVMd27dXVK1d1nYV6IERKoY68f7+FSPHHJ11XhUhJF9KFVU88RMrPP/+sHba//lorBa0THjZu2Oh8a0GE0H4C9gpoDY/453379DXsZ+AbbpaDMh+46RgemiOJhNoWoUy0A+2TkBkEhEjJDO7ZWqsQKVk6MjD989tvv+m/eCXZYWKClxNGki1ZRArq4nX/3//9X0JoIz8vD8d+uOSiRspff/6pMGa5ECCVEXVMoxIp2Lxo+8abzkQGEqNHDh+OgebRBo+4Jjp80uN13KFdrK+ckydOqJrVqjllQXsEm+/xhHlz5lrbkwiRwu/9MJhjbMxnJUy+sP2FEz1evt89a76DkuWAz6uteHeaIRlECu7FVLfdbDf/nUyNFBtGvK54jnPp3RVP/yRPbiKQCSLl/Llz+hvgpQV74fx51bVzF53u7jvuVPfedbfzR+Yq8P165qmnFZ4tMxCR0qBOXTVzepH5B3wjqQzSsEAZ/fv2zei7y2x7tvzetXOnxovmCiBUCEPEr7z0ktNcvPspzbfbvlVvtH5d/8Z5TqSULlXKuVatykOeXZ09c6bOv3D+/Jh02Jx5/LFGThqMNW8TkT7Nn3s+7nlKTIU5ekKIlBwduBQ3W4iUIoDxHuFz9XhJdcx/eTm2zWPbkCaDSIGfU6rbb81vq992zuwLyv79hrewQS5qpGC99/df/poTNmwydS7qmiQeIgXfaPqGQ8DEDPPnztPXKV2Y2HZP9u3dxykLQpUw5x1voG+92Y5EiBR6J9jmlbZ2on/0/CEOm89Wlu0c3ysM2nehtqMdYd9BtjrDnPNa8yeDSIl6v4dpb9g0ydRIiWcfMKidzrsrQOsrqIx0XhciJZ1oh6gLdh+hCvhUkyauFzocbeM8/n65eDGwpMOHDjlp4WSdv4DL3lfaOf+Vj7PiRIgUvByoneVvMvJUP5x9f7RgYWDbzQT4YKBM5KeyKMaGA66RpsKKT5br+rHwpHQU16pWXV938q2J1XAw6w/6DWlC6rMZL//4k6Ds6sD+/To/nNfCHwiVg02goICPEKVHfDzAJid8hfD0//7zT0wVe/fs0Wl2bN+ur587e06ff+WllxUmCyjrpx9/1GnMA/g0ofpAJtBYPFDmfn2erkONlYcfd+3S6SHhawsgUqB1Anuh9AcfKVRPo4YN9Xlcf/6ZZ5WNSEHZ2LSifFEXHGtWr3b6g40zKoPHaBP1E/Gvv/7qdAf18PM4hk1eCqdOnVKDBgzQZfqpI0MbBvnbtGql01MbBvbrr+bNnUvFesanTxW9g3ibeL6ffvpJQdKWykX87uDBVhutSxYtVsPefdeVtn3bt9WYD5Lr4Gznjh0awycaP66P4RgSIV4iBRMpwqFr587qzdfb6N9418Qbli5eosuh8inmG3LQkqLzXGL9uabP6PN0neeztWv92nU6D8cI+TEpDQp7dhe/E4A3hY8WLnTKxbtr/bp1dNoVg6SkdvLYz0axqwD5IQjEiUA6iZRDN+ddDevVd955jzV4RGGj1xbwLqF3aP8+fdWJE8XOUn/68SfVoV07fR3PlikEQ0QKlfHs0031PAj14VvQ7Lkim95Ig8WfBG8EiHjycjbPiZQXXygyAwoig+Ycx48f14UnSqRcvXpV22eHQ1xs8PAwY9p0BZIG44pxT/WGAq87246FSMm2EcmO9hQ6kQJTgJhr1apepDFH3wlIyNMcDPPboPDD99876bt36aq/Ryir5s219O7du32LiJdIOXv2rG5niVtu1XXDZBLaDxPOUQM0Q5G3U8eOujzCpWL5Cs6177791in26JGjun6sGSkdj7EuIywRJypodemXX1zl8bJxfO3atcAuT5wwwSljYP/+Ct8pKmPBPPc3xKuglStW6DzQiA0K8BdCdWz/oXivgOcbN2aMk2bWzJn8tEKbKC+tSeYHrFGpvoH9i9fEGJPO77yjy6IyjxomuiEgSeNnE/7Dd7baQ1X1Nx3fdmiuUB7Eo0YW7zNg3YtzNiLl42XLdD5sXEcJtA+IfvC6+XHvnr10f/l+3meffqrPEw7Yz6EwZ9Zs59lFWVibe4ULFy7ocrhgD/JhPoqy8YwGhbmzZ+tyqD1nz5zR2T58/wNtuh1l09r2orHPSfuA9WvX0ZjQfh7edckK2MSnduKdB4EZ+n3lcpF2eLxECtbHVBbd7/Q7zBrc1ke+f0hlUTx+7Fidha/BWzRrrjG8p+Rduk2UbxzLpwtgB177gMj/9dZwJudg9QXpZ8+apUveu3evcw57VX5m/PEeobby+NDBg7qsdB4IkZJOtH3qgrpgvz59HKkz/rK0HQdtQmLDj8w72PLjHF6MM6ZPV5d+ibXrHC+RAmdXtID0qhcTImwaQMUyKGADHxu2NjNJZvld3unkFPdaS/smtpmefnfu+E5QMzyvg7wBMWB+ZKhsxFice71YduzYod7p0MG3f3ffWdLRyKDJna0xFy9c0C9F1Pn5ls9tyfQ5qK3yNtqYcWyAU5ppU6c6eUcOH+55f0KaFmSGTZoAH3YqKyiuWrmybicOwhAp+ABxm6WwWY5JPsamQd16zof52k3SAmVi08HclKJKgTO1cUC/fnQ6VAxyhvKGidFOhMuXL8fkA3GKAPLQJARtRMq5s2cd8vXOm473vOrH5hvMxsDeq9ekn2NA5Txav4EzttAOuvvOO2Pai3R4tkcMG+60G+QZfNTwBRCVRfEbr7+e8AYQSChMdHH/Ubk8LnHrrerdQYPVvr17XddXLl/htNPrHyTKMWEvU+peVz5eNp7terVqq08+/tirmJjzSxYvVjWqPuyLC94nmMQitH2zSBuL1+t1jEm9Laz+bJVq0qiRttlry1/6nlJq9Huj1Am2GWiWteijjzQW2MhDGD50qKsvmNzzgAl8rx49VSkLqY12QNoKGPPnl+eXY0EgUQRSSaTg/Yb7l/5o3oXNnhXLl3tKuUKDhDbuP1qwwKrZ+c/f/6gWzZrpZ27DuvUuKDiR4mVeAt92CCzgWUMbE5FidFWehz9oPMIQKcATgiS2uROgoXlwvBopuHfoPW1uBhH0I4YV+5sD8VKoQYiUQh15/34XKpGCfr/95lu+60p6t3y28lNPELGuerVlS3WXx9yayoCAD9YTtrUfCo+HSIHlAnPdQ/VRjG8sBM6w6RwUoBHwcosWCusqyu8V0+YjHHh7pfE67/U9CGofBF/fHTzE8c/pVTbOw5yjLUAoDyQAvvFeGgy333KrqvxgRWes/Ag0Thy0adXaVp3rXLnSZTROU6dMcV2jH7Q+gxlMBKzHQOihTWZ/nTVqhQedNJSfxzSfMfPZfpsmM4OIFNzDJinSv28/xxwYCb5wITJsuuPbayNlUBZZy8AzhLRhA3932fplnuOEyJttigV0KB2eT5ANMA/K5408H28bNqfvvfuemLGh8ijGMwp8/OaVmE9ReorhDxCCfbhf6ZwZN3qkoWM+Fbih/Q8y06ZmWgiI72FkEe9LlGOQiH5tAvmxbs1aRyiJ2gCSNSisXhV+Dc4FcvzKDbN/iDaOG1NEpmAfktocFGMdYwv79+9XA/r193034x0LombL5s22IvS5kiVKOO0hX8nYdzafbZ1YKWeujfsAJvP4Pcz7AlIIRGG6gxAp6UbcUh9eFN26FJt44DeG7djrpQV1O2z+2vJ4ncMC3GR+4yFSFsyfH0je8DY8+EB5dejgIQsaRae2fvWV4h9ontd2fPBAEROZDiIFkqNPNGocMymDBg5eqmDrqY1lS5dRP1q0NfBS4/3DRwt56e+RuvV0GSgLk9UN690bKQReyomUKVMdx7m00YD2QGrDNmEDMQU1bB4SIVLeumnWC3UeC9C0QZ2YVDes38B50X/x+eeOBtRt/71FwWb5lcuXebOsx9CsobHr0a2bNY3XyWQTKSBMsMFN7aHYJFIgHWBbrFB6r7h7165WQslGpGDzH2PrVRadxz0CsgCTZDrnFw8eOMgLzsDzWDy0e6utqx5MAOgZ4rZlTTN/fkQKSJSnn3jCVS6eaSoXMe8TPupYBHkRU+gIpPoeqed+plHGw5WrOOXinqUyoblE92qiRAqkfcjpIa+P+mKOU73adRQ0oGyBEynTp01T740YoTeDqe2cSMFirVOHYsk/TLCoXsR0b8PskG0hYmuDnBMEoiKQSiIF9zDd0/QMIMY7Ac87FvI20p5MNiGt3wL7661f6/cC3nU80GICEsdeflSQnqvxgxyWYEeA5jdhiJT77r5HYY7qFRIlUl575RVn3N9p38GTZMY6gO65EUOHeTUl788LkZL3QxxXB/lmpN/GcVyFZ2kmbAJDkpfeC0GxlwALNodN04VBZUGY0dyEBky2tQnmmbaAeaBtXulXNywOnDldLOFulguNaS9BHrNcrLNpPyQdRArwHzRgoKpkWS9BEBBzi3I3BSHQVlgYMQME8eh7Qf1p/Ohjel6CMkxhzx7dunsKeaSaSMF3i/v7QtuqPFgx5p5Fmn1795ndjdlspT7bYk6kQEOXCB1gHrTmwLwMhB6EZbD2xXcG7cS+zTdffx3TLtsJjAO1y2+eZ+bl7y7K7xdzQsRGpGB/DnMJswyej9rwwejRrjWjmcf2228/z0akDBk0SK//bOXROVgIgTYT/faLK5QtZ33/UL+C4k+WLYshMuFrl+b3tN+FdSy3DoHrfmHMBxHX4LVqq1Mn7Wtw1IN3M6x68P1D4IJ1PrWV7nOsERZ/9JHTvESJlMOHDyu+j4L5MtWHGMKafHywFwMz916BEyl4ziuUK+fKj7J4wB4KL/+RevV1/XVq1nKuoX3Q6kt3ECIl3Yhb6oOzUX6D0DEWa5Bo4x9ZMMA2PxGQhBg6eEhMOXj4UQb+vBhdrlqF5kUlUrBxatMawSYd6n34pgkC6hfFXovErV9tVXgpUrowMWkcpJpIwcdwQN9isgofWfguAEu9a9cuZ3QxFviNP9vEBx9hPpF4reUrMc5oQY7MnTPHxfyCDbdtyqSaSBk5fIQzFhjjaVOmOP06cuSIQ+zA2aq5GWuaGDp37pzGg0/OIR1DOFEM8oMHbgosjPkKTNBxv7zYvLkuhqSQIFESFLKFSMHkEiSD7d7nRMrVK1fU42yyZqaHpIZ5jv8e1H9ADCQ2IoXnCTqGlkZQGrqOdxvupagBCzZMJqgcvCvxHGHjkQImI1Bzp0kFpUXsRaRgkoLnjNKWL1vOuUdNSTNI05j95KZ5qA2IkbflSy/pMqFlBmIG9zwk0RDw8cdvSK5MGDdOZ4dGFj0b/P0NiUM6TzFUfClg42DGtGma7MQkC4sCqo/SQRMSEkVcMgzfEdsigxMp9E4AThXLl3dU4dEOSJpRgCYb4YjJtPlegJ+Bj5cuVXNnz6EsEgsCSUcglUQKnmMK0FDFMzB75ixVtVJlfe/36t7D5ewd5kVI6g0LdNuzRmXinYJ3G54jzG34e4iIlIb161NyawwzCtDQRBkwExVlQW8tME9PRiFSsGj0C4kQKZjnwGQYxgsCVpBQtP1B2w8CPUgHUzWFGoRIKdSR9+8334wsFCIFQil4H5h/EOjDWpyb28ZmoE34B5oo0BY3y8CahPYSzE08Smsjl8MSKWjLpIkTY+pF2RA4Qt3mWpPqHTVypPVmWLZ0aSQBT0g7U0gHkQJToNQHxJjjY3Mb8wjS8IEGBH7DVNf5c+epeU7827VrzrqHysC8AhryZDaaEn+x5XPHQgOlQ4znwxZSSaRAAJOE36Dtgn6hbSBXcAwtBFqvo41Y55hkH8gRpF04f4ELO2gn4Tz/I1IM/cS9QP2fMmmSreuuc+TDDBvCtK4BAYMyME5hrKpkC5HC12uEAWJOpOD5m87WbDwdjjEutrU0pcM+H/z+mcFGpFCeoBh7Tl77h7a8UydPNqsP9RuaKDTPRrl41yxdssQloASzXPXrFJsVo/q9iJSiNfh09xr83aEKzzwPtAbn1jtgXcJrXWAKJkPwEmttrgHy1ZdfOs9Bty5ddVWXLl3SzwYXioUwGH9mcAzSkQdYGAEm1OcmjRqrzZvcGif4bsDaTZl779PpsL9z7Ve7OUIiUiCki+ccZeNZg3C/0561xW4Xjh096nr3Y43FXVycOX3aycMFOXn7U30sREqqEQ4oH4sAOAulG5TiVq+8qjfXYX4LplTwB58UtvDdt9/FlAETPpwRhLS+7aUGFo8vrqMQKcjHXwDU/onjJzgmi9BWpEF/6BqPzU3U//3f/1nxoDzYPMBmPuExcfx4R/qTbIdCa4Ou8Rcj5cdGO11HbG7u2bDl56BaRmUhhumlKAEvRzCpVAZewjeuX/csYtMGt3oxyCczpJpIQVtByHmZMMIGLrH1SPtc06ZmE/XvqM7moxApsJlLuIIMoNCubZHWAhYOYLX9Al7ONPmBLU4yseSXh65BfRz3FNeiofYgxiSS33v48CDYTHvxfOYxESkg1bxIFEg8oy6o8yJu07q1xoaXV6ViJQWfOTz4ESkYZzyDmATTRh4vzzwOk5b74OHt8Dv+eGmx/VnU6WU+D2VAIo3fn0hvI1LwbMI/EfUBaqY0gba1BWawaj5cTafHJiVIQzMMGVRkRxfloh2LP1pkJgn1O4qzeZh6o34ghl1fv9CnVy9XepiWMQMnUqhsLHzOWybPyMsdacOMpARBIBMIpItI4X0D4fFi8yI/GnhWuFkufEfp+QljO7t3j546PTcrQe/fICIF7eLSYoWyqcjHI8xxthApUSQH6T4SIuU/ysuHXpixlzT5h0ChESnYjIZwGr0TKIadf9ieR8B6G+sBmAeHkJEtwI8p5aUYJoqw2UgB82JOylC65595JmYDMCyRgs0yKodiCI6ivfTNwlrpqSZubXGkxbya72GgnfjtZ+oY83uUTX9Yy2ODnALWWXTt5RYvxrQN9UJ6n9Ig/vefYJ8zVD6cpXP/NX7a4JTHjLkQLoSltv/wg5lE/wap0Jj5CHmoUmV10OJTIJVECo0r5kZegpHwkUHpEJvrU+pQVGfzUYiUXy7+4pgFR/3wVUcBwl/UtjCmv2FWidKv+vQzKiYwhlUEuq8ovxlDSJfSfP9d8b6GTSPFzEu/OZEyc8YM3Va6jhjPFvbz4AMWZMLUyVNi1tOUHkSoGWx7jpQec1j4eLO9SygNxUiLzXyYZzPX85QmSDDJbBt+4z3B9wr9BG4h2MQtXaBeLyIFewHULsRBa/C+vXq70tvW4DDnVa5MsSk9CNz47R/a+otzXEsdwqJ+AfsiXOMN1jNs+xxUxs6dO12EG7SKbIGIFMIIY7p2td3vFTfxj/f/1SvZZcpWiBTbCKfxHLRL6EbicZgFNm8mXyhTObYXPVhJ+DugNBRzkw9RiBRytkXlIH6qSROX5CS1kza0eVo45uYBm578Oh1DdfDD99/nSQOPuRoalWPWF1gISwDsHn+sWFUTZnOiBk7E4MXhZa6LysWGzNNs4ggywHTsng4iBZIYfgFmoghjEAZHPbQMUkmkoH2YhJl2XTG5hPo3v8f9+sJNdNkmmn55cQ3kJWHBY5BCthBEpIDVhyos/UELBcGUTKC6IC1g01yCMz5Kw2OUy4MXkQKJFE48ggTmJql4mTiG+Sce8OyZafAbH8aoAR9/KgsTMXMRZZYHSQVKj9hGpECKi6fp3jXYtBveATwPtEB4gPMzSIxQGmicxBuiECncJFh1n+eR2gLpZjjbpHZi8QvtHB5MIgWEIxHYPB0dcyIlGfZrqVyJBYEoCGSCSEH7QKzT5jw0QigIkUJIZFdMY4WFvy1AYpPej6nUSBEixYa+9znRSPHGppCvFBqRgk1Oej/xeN3adZFuA9Km42XAOoIZYE4bm/E8HY4hTcxDWCKFb9ZRmZjHmsFcE1Na00wwNprpGo9BWNj6Y9bDf38w+n1rWZCEjjdACJTa1bBefcd0VNSyuPYGfHYFBZMkg0liM6SaSEGb/QLN1wgb00E95U0lkYI6yJcsl3zH+WbPPquw33E8hKlxvpaGtlg8wYs0AHFqC0FECsgG2kuA1hUCBO9Mc/LAH1poppUQpMccxWaFpm6tWgrjwoMXkQKLEjyA3KUxN2Psu5HgKfJAY8ILFz/hR14fHb8/apSuF9oZXppalB4aJLx9XkQKaVkgrd+eGJULsjtoDc7Ns4FEiTdEIVJgQYf3F+RtUMAeHM9jE3TlRArm3ls2b/EslhMp2SgwI0SK59Cl54IXkQKG1OZbw9YqMMW0CKSbt0Xz5lo11MxjbioiD99kDkukQFofqlhUJ2JIkPAXHq+bO9CkPCaxYbOVibQ9u/fgRYU6TjaRAlU/ajdi4BQ1wIwOlYHN/TBh1WefqTtuu13nmz7VvVmbDiLFb8MUfYAEBfULMe5JW4hCpJw5c0az/5Cc8FJ15PWAnbfZiw9qPy8jm4gULFSgVWILHdvbndsDY1vAmPAxouNa1Ys3+ZCPT/4oDeJmzz4XUyxtYvB0OK5ZrZqCVA8PcAzPJbAoT1QiZdaMmVob5q477nBJe/P6+DFIUKoPsY1I4RtYIGp++uknXoT1+NTJk47ZASrbnNwMHfKuq16bKQVrwZaTYYkUEHN88QotmzChd89iyXf0xyRDTSIFWkF+gRMpaM/Zs2f9kss1QSAlCNDCPB7BB1uDsJFDzzs37WVLS/MjIVJs6GTXOZpDZxORgkUjpP+C/n41SO/sQja1raE5SDYusFPbcyndDwEhUopMfEFr2pzLeeEGk0fmBiVMU5JGiJmPTBDS9xBxPEQKJOr5xhrKgZCWl9aCjdjgRApM5dK3l7cNxzBfFDXY6kNZ8RIpztq2eg09jwDGUcO+ffu0LwvsF8GcT1CAKTDyJ4D216lRMyZLqokUEEh+Aaa8uAlwbqab54tKpAy+aZYL+0I2Xz68bBxjvwHfXVNID0KKXs+DWQZfS2cDkQItNNsa1PQ/Qc8MSFWvYPNpgXymeT8bkQKT46Z1EIw7FwCkNuB99PGy2LUmTLlRGh5HIVKu/3bdZT4fljuCAvDjJImNSDE15+D3KUzwW4PD0Tsnr6CNFG+IQqTAAhDh6/hjDOFrmJsvRl6bIDZ/38MnrV/gRAowgBBxNgUhUjI8GqdPnfZUa4OaKTag8BKBeS+vwCUc6YaHOtWO7Tusf/wjRelh0/v//i1SSw1LpOAjQ/kpxuTFq144XaJ0FMOeHh4SCvdZnGtjsuZFzlA+W5xsIoVPGlu++JJV6t/WDn6ObKOj/1FehDxfJogU3gfbMSYXNKaIk0GkgECiMuFwLF0hm4iUXTt3enbbRqRAvdvLWfiVy1cUVPQJU4ohIbRmVTHxxSd/lAbxkkWLY9rCNxV5Wq9JI/mw4WmjEinjx43TfYD5wjAB9oZ5nTYihdsNNQkRvzr88uEdTvVikhSGDPSqKyyRsn37dl0n6obJhDAB721qK2Jz8c2JFKhZBwVoEPLyMM7cNFFQfrkuCCQDgWwjUqCpcs9NAZR+ffr4vhNgjpUWrLAdzDcAwpr2wqKO/DnBhF8i76BkjEe2lpEtRAo0jmm+xzcHsxW3TLdLiJRMj0B21l9oRArm7dxEDZ97wc8A9hIgXc6/IebIcelsyt/+7Xaea3oyg0xpEUNinwcu1EPpsA7ggQsxURpIt3vtJXALCJQe631yNGwKF1IaaOXbNpJ5W2zHySZSTGsC0FyPGqIIJfKyRwwbruflmSBSwmgD8bVtsogUmHLDfQDzd+kKfC3ttSYOaotJbNK9HFUjpWvnzp4EkBeR4meOipstozYhhhl/HmxECvyQ2kKXdzrpe5PKxLzMFmZ5mCKLQqRAwJbqQRxWe69rp846n41ICVpL2/qDc3753h81WtcJv6ReJrW9yubnoxAp3IKRjRDh5fLjoHycSJk/dx7PGnMMyzDw80VjhfkxfHOb2mIxGdN0QoiUNAHtV40ptUw3C49hrgcbmTbJ+pdeaKFvMJ4n6jGx7GGJlAnjilVTo9bF05MkBWxI0mKWX7ep9/rhSddSSaRg8zSeQAtk9C9eIgU2InkwJ42fb3E7bOdpcUwqq4QxNsPNgHuNriMOCkKkFCOULNNe95Qsqf0MFZdedARbnXDAyMcIx/g4+QX4rzHz4Pec2bN1Nj7542mFSNEQuQ44kVLB0GThRArszCYS0k2kmA48oxIpWLDCdr+5EIA0D74d2OCVIAikGoFMESnYsCIJMvgS4gE+rOjdajqG5emglUzpenTrzi9prbx6tWt7Su4iw7w5c5wyQLzMDqGW76qkgH7Q3DOZGikw6/j7jd+tKI4fWywQsHD+fFcaMnMDe9w2DVtX4gL/IURKgd8AHt0vNCIFMLR+9TX9vaDvhhmDkN+8cVOMICC0P+AX0kwf9Tf8GPAQhkjpbNlAjVov0pPWM98o5OWYc1reTr/jVBMptjW4X3twLRlEik2TJdUaKUKkBI2s+7q5fqL7OQqRgjKgbeYVYPGFyuUx1nxeYfknn1jzPFKvniuLECmxQokugNgPk0jh7ytOpJjvWFZEqEP+fgzykRJEiHhVyPPVrl4jZr0fhUhBHV98/oXCnhi/P+EjGPsJMLMHjaZMBSFSMoU8qxcERlgypEHdejEOsLm/AH6TRT2OSqS89cYbrps6an2UnogUmzQM0giRolTHdsVmnPBR5EGIFI5G4sfZopHiZaILPaTNQXqGKBYixT7+qdRIWf3ZKtd7ELaqKeQSkQJvEQ2lAAAgAElEQVTzfI/Uq6/7YtpcjkqkEAYd3m6ny6T7FDGwSZa5JapLYkHARIDelcm617gWnpdpL5gxhAYW3e+w6cwD19aCiU/bZjk0wmBbmcrAd54H0kjBdT+TBDQ/DKu9x+sopONkEin8nWcTmNm8aZMmwjB+JpGyYP58Pe4gwiR4IyBEijc2hXylEIkUPAvcoTh9O2wxfAvSmh/3iSmdbcsT5py5yReGSGlYv3jeGaYOrzREpLR7q61+f/K0fGMyyrORT0TKtm+2uQRWIfjHgxApHI3EjrlQYiY1UiDA6xdsPpbx3AiRYkctVRopWIPzdyFfg+cakQKT4vzda5pBjEqkYCRgMozm6bxsHHfq0FHB/FkmghApmUDdUicmNHCOVv7+sq6bz7xZ8PvF5i+4SqCFsi1tlHM0qQqrkSJEimsYQv2IVyMFapk0loVCpMA2KTaq0G9sGnnZyw0FfIREQqR8q+81uucQi0aK/SbasH69C69cJVKwUYtNXRpzPolDz+MlUvAcwzFpn169FQQBqHyKIUVJ3x47wnJWEIgfgVQSKSA6yHQenEXC3AD++OYRFkCmne3jx48rrmEG6S3aBEJPDxw4oCpXeNB5VvDtg6lM0yQXESn0jYS/ObJPDS0XmADliw5IEErwRuD5Z57R76YO7do5Zgjnz5un4F8LARp29M4KcjbP35UlbrnVuSegtQuta5jEwNhBUhPOTVGmSaRcvnRJvysx34NJBTgK5uHK5ctOuTt27OCnC+5YiJSCG/JQHS5EIgXA3Lh+w5lrwcwvva+84v59ih1gC5HifVvlE5Gy/YftrnlBoRApMAVEzwH8PqQjCJGinHkO4U6xmPay331Fa/BH9X3K1+C5RqSYrhySQaQANWieQBDNRpbDfN/ePXvs4KbwrBApKQQ3nqLhhAyOibAoppeOGd99x51q61dbdfGw0WemgYkZlBH2DwtGWqiHJVJskwssGsPWiXRwIg7pTYTlH3+ikN/sS9Mnn1JXr1zV/Q17kK+mvUzHVfmqkYJxxtjT/ZBuIuWhSpXUmdNnwt5uOl2yTHv5aaQcO3ZMb7QRPojj0UiBX6NNGzfp9vPJHy9biBQNkeuAm/Z6qkkTl8mEXNJIMdWKf/jhB1c/+eYgNgLjCdiUxLemZIk79HONe2z37t3xFCd5BIFABFJJpODehQ8TkCLlmA1fem9ijgRtOFs4dOiQS+MEGiMoB38P3BSogSr70sWxvqlQHhEpWzZvViT9BVMdyA+TUtQGlNuvdx9f2/i29hXauY3rN2hTbMDu/nvvc8wSYj6MEIVIgU+/Nq1a6zFAeVUrV1HwR4Zj2Ka/cP68qvFwNee3SaSgvosXL6q6NWvpMjDedH8grlKxonMNGtuZNGuQ6ftEiJRMj0B21l+oRAqNBsj6Hl27OT5L6FtgxiByT5085WTBOrxWter6fUNpqz9UNdKa3tS+5EIFVKbpI6V927dj6i1d6t5I9U6ZPFn7Pxn74Ycx5aHueN+Vtr0OlGduDhL2QbHpIyVTpr0wtqa5+HzVSFm2dKm+J/zMXAWNXZTrfC0d5AfCq1wIUtBzw+Mopr2CNFJsvklQVzwaKdjg5kFMe8Vv2ouvwXONSOGmvbp06qzfzXRvxKORQnkRY10FgTOYDePPRdfOXXiytBwLkZIWmOOrBNKFjz1SLCHMbxZIQVOwOZsvV+Z+tSfOzamwRIrN2TyIEDD/8Qabs3n0G47Ho4ZUEilwqBXPxj7XSAGJFDbwfIXibB7YpJtIOXLkiKpw00F4j27dwg6PK106iBRUyB3y0bsBk66FCxa42kM/MKnj9xHlqVW9OiVxYj75ozSIs5FIgQYfOZh0dcL4EdW0F3xSYTMsTOBEiumknhMpA/v312R1mHLNNNg8o/GAGUSvYDqb37Ztm1dS13mTSEnU2byrcOMHpPbJfwT61LtnLyOF/BQEkoNAsokUvEugWeX3B/8XMFkapGl19MhRNfq993RZZe69T0EIBmW/0fp1xRdSJhoN6zdw0u3audNZpAwZNMj5DcfCkEam9m03CFGzHPldjMCCefMd3ECiQNMbGB4+fNhJgLEkTLHxFxSuXrniSM0hD74DdWrWdPI/3eQJderkSSc7JA5xffWqVdbiTp065dg2p3ohcVf2vtK6HXD2jPssHgfK1gpz8KQQKTk4aGlocqETKQTxH7//4TiZ53NRmkciJo1KpLeZ1wYpn4g/uzBEis3ZfJH/jq+oG5FiU7iQ9/dAHOZfUk2knDh+PFL/kJj7SIFm7JXLV0KVUajO5jNBpLRrW2xiztRKDjVYSsX4mKR7OZlEipezecwvvALfm6E2ISataMqXS0RKGP896FdU014wSRUm+K3BOZFSqcKDClrL8YZ4faS8075DaKEdTqTYnNQnSqRQ30+eOBFDptC1dMVCpKQLaZ96/Dbk161ZqzfP+MuKEymfrfxUSyfyNHjY45FUC0uknD9/Xt15e4mY9uEBuno1ugYJIMImAu8DHWMBGfZlRFDbiBT4ool30blw/gJX23Zs305VhY579Sh26gUJQ7+xp0LXr13nbIwAC0i9mhNBc9K4bu1aymqNly5Z4uqHTRoGm+aEPeKgkApn86iTf6yxMZHq8JPLuW92Eyndu3ZzjRGN1yN161lJAGh8URoewy8GD9lOpOzbu1dhkUV9gAopadPxfvBjrtaNfCuXr+CXnePPt2zRZSINpMaCAiTSSKoYefCO4AHkCbUTMRxQxxvCEinYWOLOrMO+8wb0K24rtBxNSbVkaKTwvnMfEkKkcGTkOJkIJJtISWbbzLK+3bYtbgEYKuvc2bOh3l2UXuJYBPANTKaW3M/79qnfb9yIrSjimR937VLY9JBQjIAQKcVYyFExAoVIpPitJyeOn+Cai9K8lBMpEACg8zyeMG58oFBAMfLuozBECr57JW69LaZuEM229am7hthfeCeUtOxNoE+Yrx+5SY7H5rSf8SJSIHgXT8DmH183QGI76kb7jz/+6DLRNWPatMCmQDiM+0H8YPTomDxcI+W1lq/47pdgbEDs070y1cNkFqyoUJowm9VcSPDF5s1j2ogTp0+d0mWi7G++9t+s5kQKNJaC1ozWSiOeBBFB/Y46vlRVOjRSdu7Y4bqXqM0QyLHtJ/31559WNwQQpDb36bKZSMH+6GuvvKLH6OHKVTw1yGk8zp45o2oyzT2slc2A9w/3OwN3DGH2Hf3W4BCM58KHE8ePN6sN/TsKkTJh/HiND+6Lo0ePBtaDby9/L+D+MkOyiBSUu3Sxe0/TrCvVv4VISTXCIcqH2QVIgti0LsIQKaiCP7T0EkQMzQmUbTMvgYcJ1/b/7HbQE5ZIQb3vDh7sesio7kcbPOKUTdJ8HAZsUKLeTRs38tPO8UcLF1rLQ7kwQYR8+INzVmyO0m/bZMtGpKAcfKQp39o1a2La4HUCi2HqH2K8dA8fOuSV3Hp+8aJFrjIGDxxkTUcnMW7PNS223Y06zXDj+nXtSwTtqlurtpnE9Ztsr1NfbNilg0gBOQbiwi+M+aBYRbtn9+5+SZNyjRMpq1etjqvMdGmkQEqMxtCMhwwarLChRgFaCqVLFdljN9Oaz2G2Eynok+kXyk/yG7bk+YQW/bcRKfArwLHBQicoYDLD8+AdwcOK5ctd10Fw2BxL8zxex5xIea5pU98FJkwY8HZ9+cUXXsU65/ENqPxgkakY5LMRG0Kk+EIoF7MUgVwiUrIUQmmWIJC1CAiRkrVDk9GGFSKRArM6WNt+8/XXMdiHIVKQyWudAMFM7BmYAetHWk9fuHDBvOzyF0ZzUtO0FzLxDU1Khxha3ijfphWDTXlcswk1wucsL4cfw8xiUZuLiISpkyc7vydNiO0f2uZFpMD0IvUdcZjNUgKIfJtRu8IQIZSXYjIViTKwyRoUOJmAPDALaoZ5c+e6cDM3xnl604RaJomU4UOH8qbFHEMAj+8JpZNIadGsWdzETTqIFID1Zps2rnGn+xL7T5xMwVobzyRd5/FrLVvG4J7NRAoai+eW92Hm9BkxfeAnJk2c6EpvI1KQ/u0333KlC1qDQ0A6aA3OLYrgvvh8y+e8aaGPOZFyT8m7FPZ8vAK+JRyfN19v45VUn3/7LXff9QV2IEQKAyPVh5CmxSD6+QtIdRtSWT6kQcgpHByDwrQV/7v7zpKumxhYVCxfQZHdZmrbV19+FZOO3/yQ4Obl4phe0OamYhQi5c8//rD6NaG68XE36yUHqH1796bm6/jvv/5SXvYaqUzE9951t6vea7/+qsugA/7R5Hn5MczyhA34gMAkDc9f5cGKjp2+sGWAAYcNPyoDY792tZ3MgVZPi2bNdVqoZntJI/JJIzRdevfoGdMkTBw6tmuvx53akE4iBXVxSaEgu6GQwKR2poNI4XiT754YIANOpItIwXiu+GS56zkgrBCDeKRnj0+4eRrcN+bkPxeIFDje5f2A5JrNFBfIJJjp4mlxbL7zMKTAE+fp/YT3Yzcfe5uj3xvlwh7vBpPQwfPep1cvV/1wtAeziFHDpytXusqxvfOoTCxoG9Spq9PXqPqwpxQeyB8yZwdsGjd81Ko5E5VI8XOCfAISecxUWSLmIKnPEgsCNgSESLGhIucEgfxAQIiU/BjHZPei0IiUzZs26fko1lg096fY9EuHuV6dmrUcX0wc+zmzZut5ozlvxpyYytMx0w439yVQbhiNFKQ7sP+AZ71oR6m77o6pm/yEmeauUR7WmtyigdkX+o1+0F4IfJPZgheRQmVQbFtL28rDuYMHDyr4KKG8kOYfN2asV3LreYw5/NxQGTAH6tUGkE60tkH6kcOHx6z9UAnMTlJ5iOGDgGstUUO+3vq1ay2PtOkkUqDh0adn8doKwrtBoVHDYkfeqSZSsF6j+9NGQAa1la7TvcnHBMfJNO2FumBhxkZ6oK47bru9+NljzztvE94l0BIyg63MbHE2j7bieeEWLrBnCXO5tgANLtOPsxeRAksxMMlKGAWtwbnpRdynNusVX37xpbqfaYD57R/a2k/nIKBdsXx53bbxY73fO9gf4u8/vENs71uU/c/ffzt+qKjP2INav24dVeuKoxAp8K0Kv8Begb8HmjzWyCtZys6LRkrKoA1XMFRM6aYLG9ukhbHpC2IibBk83Yfvf+BqbBQiBRkx8bqLqW7ysv2OW736qnY0zxuw+6fdVsetfmXZXnzTpkwNxCMKkYI2AudqVR5ylQvCBh8LaBSBdaY/2DDHedNG+Z49exS0Mag/mMi1fPElnQ/5Z0ybrmredERK6TBp8grYOMXHjtLi44u68RJDeZBUql+njnMdZAEmHZTWlKJHHanSSEHZ/AUKR7iwn4g2goCAvW8eoKqOTXK0FXbLsQGbqvDLxYt68xkTXK8JaVD96SJSqB3cFiWNaZgY5LStj7lApEB75PVWrfQ9jP7C1wtUaOn5gzYTNLhwDVpaA/r10+ltRArhySfbyIvnaM2q1bpclA/1eCLAkQYm+0wShco7eOBAjAbNw1WqOFoy1FbEIMVQF/4u/RJr/xTPMuqiv7q1aimY6UPevr37UHU6hr1/PgmHXdUhAwe5+tGrR08XiVK2dBlPnzNRiBRMAl956SWnL5Bk5P3EMfpI/cAE0yTzdCfkQBBIEAEhUhIEULILAlmMgBApWTw4GWxaoREp5vyQ5ld+MdaZZoAA3ysvF625/PLarmHz2AxhiRRs7nE/ALbyvc7Z9kTQDpjF5malvPLTeTi4P3miyH8V78fFixddm62U3oxt6ylejnnMNyhRFggwzI1pTUzzZghjOef7DzCLUNAC4O3AhjYsX1BexM889ZTLLBC0D7zaCuEvCFzyMis/+KAaOmSIU+bMGTOctmA9jjTcKkmv7j1i2ocTfAySZdoL5Q7sP0C3E8KCEJqjfsP3nBlWrlih08NcXSoD6qcxtT0XYevmazg+JskmUtAeCLbyOsIew3rDmTNnrF3iaz0qL5uIFDQaa1ts+lP74GMa7V4wf76+nxreXPMj3bSpxXuLXkQKyl0431iDl6+gBg8s2u+i+7R3T2MNfl9phTmNVzA1h7B/iLbCOgaVibhN69bO+VkzZ1qL4pZp4FIBgsrIB6010zrShfPnFYTGCR88z08+/rirPuTDPgulQTx71ixr3TjJ9wGDBKrhBxzaOugn9kF5P4cOHqIJS7wDzLZ7NiCJF4RISSKY8RTFP0L8BrQd48PV/u12Vslr1A3tkO5dukYmIUAE8BCVSEFeTMj4g2Zrv+2cTdIB5e3csVN16tDR9VDa8tM5aLGYAVLfpvospac4KpGCOkB+vTdihGsjlcqzxV98Hqt+B+KHO6m25aNzGHdMAEyfBWZ/sTHOJU4oP49hHghkBcfFpr2SSiJlxDDvdq5ZHWtOi2+A+6kgmnhE/Y0XMGEFleV4Q7qJFDikhUq6TXuN+sNjSMlg491r4z8XiBSMDUxkgYzlfbMdQyoENonHjyu2/+xHpJw+ddpx8MvtkdrKxTmQKXgX2EwY8vsHJuO6d+0a2FaqB9JBZoCES7Nnn7OWASkZW9i4foMz+aBy/WL4LPnCR1U4CpFimkH0qhckShibq7a+yTlBIAwCQqSEQUnSCAK5iYAQKbk5bqludaERKV6msWxzL2ycwR6/l98GSADDLDjXdrCVY56zbSqGJVJwP0BLAH4FvXylmvXRb2w2ewU4v/YyRUT5eewlnQ2BU5tPWJ7Xi5zwahvIIxBgYaxnoB5onJgBAoDY8OVS9bxN/Bhrv359+qp9e90miM0yYWYI/lh5XvMYwqA9u/dQCxe4fceaZeF3qogUp51MKJW30eZbZdeuXXrDvFPHjikV4IJ2E9qDDetEQjqJFLQT/pdheo9j6XcMfyF+2gK5QKSg3/BvGrTmx/X58+Y5e3GEie2dx8d744YNLs0UymeLsQaHr1a/ACfzIErDvptHjRxpLQ5aUl6WSiCEaQaY/x40YECMRo6tH7AYNHf2HAUCxitEIVLCaBaiL9M8fDR5tSFZ54VISRaScZaDlxbYTWyA489UG8NvnH+nfQe100PdzKwatiB7duuuyyT1Qrrh8Zvqgy8FbJDxgPx0ncdzfNhF5MfkC/YDKY/ZF3wQ6BocmsEUDiTLvQImeUgDp0XIx8vjZeEaXla2AE0NqMsiDceBMPAz3WMrj5+DBDm0AahPhC9iOgfJ9dOnT/Ns+pj6hwkL7xvy07h3eLud8jORowu7eQBWGB9B1E/tobLeavOGTv7s0011G20m1iDpTn3AZnFQgLN5So84yPfMyOEjnPQ0SaDxtOWDdD6NHTQOvCb/QW0Mut6ubVsHM9iMhEmxeAM+QhwLOoatUVuA7V9Kw2Ns0EcJG9atVzSuhBfdA1QuSClMuv0CFqCUnse4J8zw159/WdNCUsgWGtavH5P+2aeetiUNdQ73Hd4RuEdvv+VWfc/T8z1y2HAtYTZxwgRdd/u2bweWj3czxgwYEI6IqWxonOEdECXMnjlLQYWXcKVy6f7H+RbNmyv0yxZwr4AE5W1CvzGJ8AogkUYMG+7k8bovxn44xlHt9ioD50GuUrshOecX0M7Jkybp9NRPxFQGpO6iOv30q1OuCQI2BIRIsaEi5wSB/EBAiJT8GMdk96LQiJRlS5YqElLDHMtrrge/nEdDOkmHf4w2rVrpORut12g+R2tL1AdhLpuZamhD0JyPYqwD/AKEayBkSunNvtAcHNex1+EldU11wE/ilEmTdXl8vc3n3mXuvc/Xbyd8HsKaA+olDPicNiqRQu37+eefFSTTbf3lfV3+ySeUJSb+eutWBefwZtuof7CkAdIjbNi7Z48jmIvyaNypLGi3k2/dj5ct0+1GWlsAyUN9C5I+R/7O77yj07d88UVbkfoc2lm+bFnXHgrq8sqHfRAau+M+5oJ0BXEcwHcFWWnp36dvHCUUZwF5R9jxeP9+t29jygH/FDwdjkF6RQknjh933ClQOYQXYrofYUIJa++jR/ydj/M9MioPG+O20K1L15i2g4SzBexHUnk8tllYseW3ncM+IogRlMf7jN/PP/OMQzIh32/XftN1w+oFPQu2MnEOWm7Ba/APA9fgvPxvt21TbVq11u2gZxTtpvcytGf89g+nTp7i5Kf3Kz3ffu+JxR8tUrWqVXc9b7xOsq7D22o7BtlC4wbNHb+wetUqBS0mpKe28nsRZD2shmQqCJGSKeQ96j158qSjQgk1SvzF65iYFw+NCCoP8Q/f/8Avp+wYkyFeL9SzEgnwgUDlgZGNGuBfhPLbTIFFLc9Mj81IlD/mA7epNDOd7feZ06d121AGSKlEAiRdqK/x+GNIpO4oeVd/tsppJzRu/AK0bejDtmWzP2PvV47XNUiqkJNFTjh5pc/28zCPR+OPONX2YLMBjwMHDug+Q/UzmQHPNOHp53wxSp1//vGnLnPBvHlRsjppoTqONsF0WNgAXKgfUAVOV4BNVdQLnzwSBIF0IiBESjrRlroEgfQiIERKevHOldoKjUgxxwVrGprrDU/SvGv5x5/oMlF2urSJYR6b+oLYZuXB7L/fb2ygU3leQph++bGeovxBzqn9yvG6BqsRVL7XhrlXXpyH43rKD4GwRAM0+FEeNjSzNcAfJvUZ+x9eAXsttJfQ+tXXvJLFfR5mil964QWnDhBO+/b5a//EXVEaM44aWbTWBL7p2j9MY/esVcEqCfobz36etcCbJ/kafEIS1+AgWen+j7p/uHnTZievKVTv1w+Y76b6EB8JSc77lRnm2o7t23W9O3fsCJMl5WmESEk5xFKBICAIJIoAXtqkhuilep1IHWQTFmbUvt32bSJFSV5BQBAQBASBLEFAiJQsGQhphiCQAgSESEkBqHlQZKETKXkwhNIFQSDpCMCkNfxBgExp/OhjCv5vkhkgsEtETb8+sb4rk1mXlCUICAKZR0CIlMyPgbRAEBAEQiAwfOhQZ4ICQsWmQh6iCGsSmD6iiQ/U4yUIAoKAICAI5AcCQqTkxzhKLwQBGwJCpNhQkXNCpMg9IAgIAjYE4FeU1vzwBZSs8Mcff6jWr73mlA0z5F4mmpNVn5QjCAgCmUdAiJTMj4G0QBAQBEIgAIdmdWrWciYpcMqVjADpFNjlxKSqRbPm6tIvvySjWClDEBAEBAFBIAsQECIlCwZBmiAIpAgBIVJSBGyOFytESo4PoDRfEEghAn169XL8LZQpda/65utvklITTA1hL6HUXXerL7/4MillSiGCgCCQ3QgIkZLd4yOtEwQEAYYAnKDBqeG0qVPZ2fgPr1275pSHMuGDR4IgIAgIAoJA/iAgREr+jKX0RBAwERAixUREfgMBIVLkPhAEBAE/BObPneus/+PxQ2Mrd9Vnnznlbdu2zXZZzgkCgkAeIiBESh4OqnRJEBAEBAFBQBAQBASBQkdAiJRCvwOk//mMgBAp+Ty68fdNiJT4sZOcgoAgIAgIAoKAIBCMgBApwRhJCkFAEBAEBAFBQBAQBASBHENAiJQcGzBpriAQAQEhUiKAVUBJhUgpoMGWrgoCgoAgIAgIAhlAQIiUDIAuVQoCgoAgIAgIAoKAICAIpBYBIVJSi6+ULghkEgEhUjKJfvbWLURK9o6NtEwQEAQEAUFAEMgHBIRIyYdRlD4IAoKAICAICAKCgCAgCLgQECLFBYf8EATyCgEhUvJqOJPWGSFSkgalFCQICAKCgCAgCAgCFgSESLGAIqcEAUFAEBAEBAFBQBAQBHIbASFScnv8pPWCgB8CQqT4oVO414RIKdyxl54LAoKAICAICALpQECIlHSgLHUIAoKAICAICAKCgCAgCKQVASFS0gq3VCYIpBUBIVLSCnfOVCZESs4MlTRUEBAEBAFBQBDISQSESMnJYZNGCwKCgCAgCAgCgoAgIAj4ISBEih86ck0QyG0EhEjJ7fFLVeuFSEkVslKuICAICAKCgCAgCAABIVLkPhAEBAFBQBAQBAQBQUAQyDsEhEjJuyGVDgkCGgEhUjQUcsAQECKFgSGHgoAgIAgIAoKAIJB0BIRISTqkUqAgIAgIAoKAICAICAKCQKYRECIl0yMg9QsCqUNAiJTUYZvLJQuRksujJ20XBAQBQUAQEASyHwEhUrJ/jKSFgoAgIAgIAoKAICAICAIRERAiJSJgklwQyCEEhEjJocFKY1OFSEkj2FKVICAICAKCgCBQgAgIkVKAgy5dFgQEAUFAEBAEBAFBIN8RECIl30dY+lfICAiRUsij7913IVK8sZErgoAgIAgIAoKAIJA4AkKkJI6hlCAICAKCgCAgCAgCgoAgkGUICJGSZQMizREEkoiAEClJBDOPihIiJY8GU7oiCAgCgoAgIAhkIQJCpGThoEiTBAFBQBAQBAQBQUAQEAQSQ0CIlMTwk9yCQDYjIERKNo9O5tomRErmsJeaBQFBQBAQBASBQkBAiJRCGGVLH7d+9ZUaNGBgzN/ly5ctqeWUIJDdCFy9etV1L584fjymwRcvXnSlOXPmTEwaOSEICAKCgCCQPwgIkZI/Yyk9EQRMBIRIMRGR30BAiJT03AcrV6xwrauwrzBk0KD0VC61CAIpQGDB/Pn6nv542TJrDXNmzdJpPl250ppGTgoCgkD+IyBESv6PsbWH48eNU7f+v//E/B07dsyaXk4KAtmMwKmTJ1338rfbtsU09+DBg640P/34Y0waOSEICAKCgCCQPwgIkZI/Yyk9EQRMBIRIMRGR30BAiJT03AddO3V2rauwr3D7f29JT+VSiyCQAgRebvGivqfbt33bWsNzTZvqNN26dLGmkZOCgCCQ/wgIkZL/Y2ztoRApVljkZI4iIERKjg6cNFsQEAQEgRQiIERKCsGVogWBDCMgREqGByBLqxciJT0DI0RKenCWWtKHgBAp6cNaahIEch0BIVJyfQTjbL8QKXECJ9myEoFCI1KOHDmirly+kpVjIY0SBAQBQSBbEBAiJVtGQpKhz4oAACAASURBVNohCCQfASFSko9pPpQoREp6RlGIlPTgLLWkD4FCIlKuXrmiDh8+nD5wpSZBIM8QECIlzwY0bHeESAmLlKTLBQQKhUh5p30H1bF9e1W+bDm1dPGSXBgaaaMgIAgIAhlDQIiUjEEvFQsCKUdAiJSUQ5yTFQiRkp5hEyIlPThLLelDoBCIlCWLFzt7CU2ffEo9+XiT9IErNQkCeYaAECl5NqBhuyNESlikJF0uIFAoRAr3ayRESi7cmdJGQUAQyCQCQqRkEn2pWxBILQJCpKQW31wtXYiU9IycECnpwVlqSR8ChUCk9O7ZS/t4ESIlffeW1JR/CAiRkn9jGqpHQqSEgkkS5QgCQqTkyEBJMwUBQUAQSCMCQqSkEWypShBIMwJCpKQZ8BypToiU9AyUECnpwVlqSR8CQqSkD2upSRDIdQSESMn1EYyz/UKkxAmcZMtKBIRIycphkUYJAoKAIJBRBIRIiR/+7T/8oLZs3uz8/e9//4u/oBzKuWvnTtWpY0dVp0ZN5+//s3cWblcUfxv/U179qUh3dzcKgoqIglISBtLdUoqIpNKplISCgqAgrYAg3SDdLaXzXvfCd5jdM3vqOec8J+65rnPNxuRn9uzOzD3RqkULdfnSpahzcPjwYc3w+vXrUYdDj3YCFFLsXDL9KoWUxDwBFFISw5mxJI4AhZTEsWZMJJDqBCikZGMJ3rlzRx05ciTgd+vWLWuqrly54nJ79MgRq7vr16673EkcZ86c0e5DCSkXLlxwwnivVWv1ztvNnN838+Y51x4+fKjDCXXw4MEDnZb327fXYSHMQ4cOqbNnzwYN4trVq9q/5OPSxYvaD9I5bcoUJ9wRw4br67YD8EIYA/v3d6Vj08aN6uSJEzYvWbqGRrOkGbzlGPbt27dDhn3/3n3tB/kUgw4NCWv9unVq6ZIlzvlFg4u4TbR98+ZNnTZJo9jHjx0Pmpy/T53SfufMnq3QiQO/ofwh0HQWUv7++2/NxVzaa+L4Cfq6MPZ21Jw7d067wX8R5tGjR/oanss7xrPoLb9QnWd45iTu06dPBy1fuYn/vPjx2qHikzBokwAJkEA4BBIlpOBdtuL7H1x1C6k7der4sfPOQ6dvKplXXn5ZL/8QSb0vlfJoprVbl66qSIGCOs/43ubJmVOhjhitGdCvnw5v+x9/RBsM/fkQoJDiAybDL2eSkGK2Nc069b1796xPwfnz51118FOnTlndoa1thifHZlszlJBy+u/TCuK0fAthr161Sh2LYoNr9GEgDdOnTnWFN2/OXOd6sG/UxSd9GpIH2NhoWwzaL5+NHOmEO3PGDLlstS9duuTE9/2y5a50jB0zxrmOvp1YGokPafb2Jdy/fz9kVOhTknxfvXpVu4dfuf7d4sVqw2+/OefXDC7acTYc4BmR9Hltv34yJNP0Z/IKt42arkLKjRs3NM+P3v9A10vq1aqtrwtn7zsB57hn9jv+888/2h84Sx8DysDsrzx54mTIp0f+24jD7O8K5hH9aJJer+3tCwkWDu+RQFYIUEjJCr0s+t20YaN64dn/6ZeZdJK2f69tQMh3795VL9Wp63L74vMvuF5c4mn61GkudxLu3DlzxInzMZbrpn3ixAl16uRJVbVSJWsYcDtl8mT177//6rD8Dvbv26c+7PC+bzgIq1zp0mrf3r3KrwI0acLEAP/9+vR1OoO/nvSVqlqpsr7f9I0m1qTghd6rRw/1/DPPardmnnFcIE9etf7XdVae1kCDXETl5Ifl36vXGjbyja/5W287oxTND483yIMHDmj/GCEJc+H8edWzew993cxHjarV1LQpUx023rDifY48r/rpJ9Xk9cbWtCGduXO8qH795RdXUtBxDn8on6IFC1n9wh/u37xxw/e5S2ch5eW69axczLKX49mzZrn44l0i9yDI4H+LRoJcg/3L2rXaz5LvvnPdC/U/79urt3aP5z2YwX989KjPVdlSpbUfMx04XrL4O3Xfp/EXLGzeIwESIAEbgXgKKRCl0SmF75P3XeY9z/G/59SfO3fakpi01zJJSMGgFNQDUW758+RVc2fPcX5rfv45S+VDISVL+EJ6ppASElFGOsgkIQUDz2zt21EjPw0oe7TvK5Ur7/pe1axazdoG79+3r8udfNO2bN6sww0mpEA4LlGkqDWMF597Xv24cqUKZ/AU2g6fjfxUlS5R0hqWpAt9An7iUY9u3QL8or2MsId9MlSVKFpM30e7xmbwvZ8xfbqqVb26ditxmzYEefTZZNXc++cfNXP6DFWreg3f+DBAFXUcvz4UpGHlihXa/7gvv3SSteevPer9du31dTP92DMDAzRDtf+ymj+bf8R55fLjPhvUmcx0mccftO/g8g5/GOyLupifv5JFi6nhQ4c6ZRPsuUtXIeXbefN8eZpscVynZk0XX3kGcz7/gnP90cOHakC//q7w0H8o5ovPP9f3KpWvIJd9bfTfSRq6de7i605uoL7W/O23tR/xK/brjV4NWc4SFm0SyAoBCilZoRcDvy2avxPwIihdvERAyFBX5QVh2iOGDQtw6yekHNi/X7uFemyGI8fo6K5Yrpz1nriBPXbM44+xDtBzAHHErwJlhiPHH77/vieEx6d+QsrPq1cHpNEmpGBEfu0aNQPcSrxe+/VGjcKaLWJNrFLqfITxofPZb2SFV0iBWFC9StWQeRk65BO/5MXl+rIlS1X9ei+FTBdYjx871pUGjNzxlkGwc4w6sBkKKc84HEMJKZMmBgqTiRJS/Crt3vLGkiooTxoSIAESyCqBeAopo0eNcn2/qlaspD4dMTLgh4ZkrhdyZDUrCfefSUIKOvbwLSpWqLDavWt3zFhTSIkZSmtAFFKsWDL+YiYJKShsfGO8dWlbm3jHjh0B7uDv22++CXhm/IQUcxaEn5CyY/sOlT93HmtcZjoxizOUea9165DhSJhlSpRUBw8eDAjST0j5etKkgLD9hBR82yWeUDY6nLds3hKQjnAvoL+mVLHiYcfXoW0736C9QgrqREULFQ4Z9vxvvvUNMx43MNvB3AQ9GGMMyDON1POC+THvUUh53GdgMjGPQwkp3bp0CXh+EiWk+A1CN9Mvx4sXLTIfEx6TQMwJUEiJOdLIAgxXSPlt/fqAlxZeFDYhpVPHjgFuP/7wI9eIBT8hJW/OXAF+5YVk2lD8V/34kzWzmIniN7vADMM8xmgaiCZe4yek1KlZKyCd3kojRuDb3Jnx2o7DUcO96cQ5On/r1nqaLszqmTBunDPFEbNi8EOn9dtvNnWlvWvnzrbglFdIefWVho6/+vXqqY8/6qgmf/WV+vyzz1T7tk9nHSA/mOWUqI8HpgJLB4SwxDON5dMkz/379nPSi3R7R+lg9BDKqGLZcgojGMSP2OioqlD2qbCHkTIYAew16SykoIxR3vgJY9h4HuS62Bs3bHChMWekzJox01VWmC0GfxA9xcRjRgoaXR998HQa8ZuN33BmIUkZw8azXMMQCb+aOEmSRJsESIAEoiYgDewvvxgTdRg2j6h7ycjHl+vUVd/Mnadu3bQvy4olE69eebqkhi28ZLyWiUJK1072+li05UMhJVpy4fmjkBIep0xzRSHlGeVtE+MZmDl9uqsdIW0Kr5By+9atgLYq3H7+2SjXLBKbkAJ34fYlYIDBgQMHrI8nlg7CjAtJY7g22pNeYxNSpk6ebE2nTUgZOniI/t6Hm448L+ZU0SwxtH//flXcmMmDVQlQPmabadHCheqVl+u72HgHKgoDr5Ai/TN4PtAGXLxwkerds6dq1vQtV3gQg7b/sV2CibtttgHBuHKFik76tm3d5uR9+dJlzjnSuXjhQld60N+Dckd/wqyZM12swK1Pz16uZTvbtmnjWtbaDCxdZ6RgJpn0FZirzmDwiFwXG6KhacwZKdOnTdMz4PCMix8sQScmXjNS1q5Zo3K/mNN5TiGaDv9kqKusMQuuTctW+jluWL++upJiS+oKQ9qpQYBCSjaX08YNG/UfXj7O6Jj+btFiV8qwtJPcN23M+sA+IqaxLRc2fuw404nv0l5m2KGOvWEiAqxZWNIzigIiSeNXX1ObN21Sf+3e7dhlSgZO0YU/794hNiEFL31Uvrzp81YaG7z0dH1vcYuZE8uWLnXSgbTYhJZC+QsoiEGRGrNSU6FMWeVdY1LCwwwUiDWSpkL58jtTnOW+2KaQgnW78cHCdEXzYwW3Dx88dPJjChrVKleRYOJmY5kxCBuSj3KlSqttW7cGiCWSAL/9cLAeJvZH8TPSESbxrPt1XYDTRAkpeMawxF4sfkOHDAnIR6gLwgA2Kr+hjCmkoNIBf1gPFc++bdp2PIQUTMmXdOM/giXabObc2bOuytnPq7O2pIotDl4jARLILALy/YilkLJg/nzdqdKofgN16eLTBmQ60c0UIeXUyVO6PDE4JJaGQkosaQaGRSElkAmvKJVpQsrsmbN0PVvq25gRsnWLe1ZEw/oNAtzBPZaGNg1Gl0s4YmM5cSz5ZBo/IUX8hGOvXLHSDFIfY8ktr/8qFSs6K2KgDYOf2ZYWtzmee07hG20am5AibSLxJ7ZXSMEgCRk0IW6wzBhm7Eg6xowerdsv4gY29l2JxEA8MmeiYNUKb5tfwkMHMdqkEh+WrkJ9x2tMIaVU8RJOOtH5jQEepkH/C5aylPBgo1M6EQb1Mwg3iDPHc8+rCePGK789TZBOm0CFfoRg+2tg9QwzbxBfbCbeQgr6gGLRhyBhzJg23ZaNoNfMmT/oxwllREhBfx5WzQFH7KG8f9/TlW7MMOIhpGCWVuH8BXQZok/RZjBAF0u/SVnbtkuw+eM1EoiGAIWUaKjF0A/WK7VNf8V0UzEP7t9XZoeovBzENjdfhx+bkOJdPspvRgrCrFe7ttOxj/VL8atrmf0Bd/jYe83UyVP0y0vSV7xwEa8zZ7aFjIoQd7Dh3zQ2IcV0D4GhXOkyzg+bZ4nBbBnsrWG6BWfvhxMd8Miv6Q7HqHRFYrDPh8QH/qjUBjNnTp92lTsEHe8GdaaQgjTVrFbdOhtD4sGIEskHRgNhY7F4mnFfjtXxoQJ36NChuESHGQ3t2ryn4/KujYpIEyWk2J5ZYR6p3bZ1m4h5mXFEKqTALypefpVTJCbWQgrebxDYEHe+XLnVih+CT+M3G2UQX2lIgARIICsEYi2kYF8zrCmPdxqWIcTyoVk1CAPfMPnZRO5QceB7D/9++65hfXcJH7bfWvJmPJkipGDddPm2hhJSUE8zOYbamDdcIUXKD2F7Z+6aZeI9jtafN5xUPaeQkqolF990Z5qQsuG3DSqXp82Ld9rqVas1aLy7XqpdR7/r5J0HG/tDmcYmpJQoWtR04hybdXYzPBy3fOddV18CBkF63eAce2t6zfFjx1WZkqVc7jFYcPmyZS6nyNPHH33kcocw8Y02v4U2IcVMCwalSl8CBn+JgbBhW1Lbtrz5sE8+cc36R/ho/6AdFK4xZwxhwOi6X38N6nXzps267wHxYaaFufQaPJtCCtxgRoe3T0giwben1bvvap7oQPf2TYjbWNnXrz1duh5iCvbSjIe5euWKwsAXKXfMrrKZeAspfkv1S7oitW0r09jyZV6LVkiRtLVq0UIFq/vEQ0jpZewP/NEHH/rOKEI+pd6P9EJ8+X3bNjP7PCaBmBGgkBIzlNEHhNEP8nIS2xRS9u7dG3Bf3MHGpphisHeId9M5bMj04P4DceLYfkJKzWrV1JkzZ1xu0elfo2rg3hxeIQVLLkkHg6QPHc/m0kFmwFDRxZ3Y3mW1ggkpiN+2Fio6ITBzQ8IU26+BvGlj4KwgdCBEYrAUkcRjq2zawjIb2PDrHenjFVKwMV4ws2/fPmd9b0kHloSKp8mV4+msoHlz5sYzKjVy+AjNF9N/vQadD5Jv2JgZ4zWHDx92ucFIokjNnFmz1ZTJk2Pyi2bGhZnHaIQUc5NIW95jLaTs2bNHMw9HnMQzLnnETC0aEiABEsgKAWlQxWpGCjpy5B1l1tOiSePqVavU4AED9SbnEm6/3n18R1ZiRh/84Hf1yWxkjLTEEgbwj3qD12CASo9u3XW64Q6Dc/BdDWbSXUhBvQEc69etp9lg0IbwxexlMahX4nqL5s21W3DEIBhscutnzHoelp2wme+XLVfmSPHWLVo6ceH58DMYeYv0NGrwtGOo1bst1JCBg/y8pOV1CilpWaxZzlSmCSkAZs5OkG+JKaTgPSPXvTY6sM1Oeyy363XTu0fPgHLxE1LebNxY3bl9x+UefQG2vTlsQorZ5pN0+M3uwLtZ3Ji2OVggmJCCdzj2N7WZJYsXB4QdbBCcuWSSpAXtoHBNz+5Pv9NvvBbeYLLmb7mX5PLOSvEKKet+CS7OYG8XSTvs7+K8z8TggYN0fPVq1wkXVVTuzEHJmFFhM/EWUvBcxqofAeFEIxJkVUi5ePGiDZ2+Fg8hxawjmSKpjtQ4ePjwoX6m8Ax7BVjDKQ9JIEsEKKRkCV9sPNuEFPzxMYIQxiuk4MVpfuTMmRhYLsi8h+MvPh8dkFA/IWXyV18HuMUFjCzxhotzCB1i9u3dF+AGG+D5GZuQguW4sJ6lGD8hpWK5cur4sWPizGV7X6CSbr8Xr01IwSgSv43NXZEp5ZSTxAHbbHx73ZrnKF/TXyghBc9BKFOlYiUdZjyFFLOSi1lBO7bHfh1VTKee8vXXzu+tJk+nL2enkBKKf7zvm89LpEKKX6XRTHOshZQmr7+un0eEHY7BOrfIJ4WUcGjRDQmQQDACsRZSsNa2vId3/flnsKiD3sPmsBKOn431oL0Gs1fE/cmTJ53RvHIO2xRSkD7sj2fetx1jAI7NpLuQ4rfxsjCS/VJso7PFjdgYuWszwYQUlJ9ZZ5OwxP5ksH35z6FDPglapuiY9C6Ta0tbOlyjkJIOpRj7PFBIebyZdKVy5TVcr5Di7UtA56eY1i1aBLxjbG1bm5CCwZx+3xTseyHvN9Ne/ZNbNJY9QU032CvWZvyElPXrni4D7SekvFy3btDVG2z+gg1qtAkp2IslHINVHcz8egURvzBC+fMKKZhlE8qY6YinkIKBumZcEFViadAfJP0IsOvUqKnj82sTx1tIiWX+og0rK0IKZvCGMrEWUswBTBgoLf2jwdJh9h9SSAlGiveyQoBCSlboxcgvlF3zQyLH8qLA6Ae5Bttb+Xm9USM9xc4rpGAq7A/Lvw9IqZ+QggajzYQjpGCDczOdOMa6omVLlbb+sBeJ1z3Ozf1JzBeh6RYj7/zMX7v/soZbtmQpazqw9JgZthzbKo22OL2CSLT+hg8d5greOyMlWYUU79q6rkxEcIKN0rFRvTwv3jVppVwopDxuIKWakIJ9kaRsg9lS7nlz5VaYRURDAiRAAtESiKWQcvLESWeJQnyL3mvVKmAJjUjS+PWkr5wlKzErAp0J8ps7Z45ejx0zgRGnaUwhBYNwsPwHNqPFTAr8zpx+PKMYA0cK5s3n1G0w2AGzfSUO2COGDlPlS5dx7uNda6snpruQgiVQwMIUxzCgRTjJjB/U0cF25vQZ+p64AXs8D6hrf2qZ4RNMSJHlUfHNw6xeCRP29KnTrOvAQ1yBeyzFg0FUph8siYLBS0gP6lKSfvP5SbdjCinpVqKxyU8mCinYD0XaSWKbQgraanIdtrcv4f127fVyWF4hxW95HJuQguWt/Uw4Qgr2S6xWqbIrrUhvscJFfNoQ7iXAJI/mXic2QQTu/MRqpP/WzZvqrSZvBqQDg7z82jDSfpE0wMaAsnBMKEHELwyvv4XzF7icppKQgtkwWTVYah374aKMvMvDmeVCIeVxX0Ike6SAX3YLKQWD/P/M/yXcSXmPHD48q48V/ZOAlQCFFCuWxF5Egxcbl8kfXuy/Tz3eCAujy+QabEzjMzf5xrWdO3Y6Mzm84RTMl8+amXgIKW82fsOVTjPNkRyHI6SYI028GcQGcJHE5+c2WkEkEn/mZnfFi7jXn80UIQWb1jd/623dQSXlgcoqOinwwx4scp1CSmoKKVJ+4drY0widRDQkQAIkEC2BWAopR48c1d+hjh98GG2SQvozZ3zOmjnT5d4UUvAuRb3Lu9k9lo6QfT/QAfazsU6+Gdhffz0ddILZwN591dJdSBEWwgo8/ZaAFbdeG/UXqcd59xmA22BCinQq2uo03nhwjg5GCDZIp7mkr+kWy83JNxadyeluKKSkewlHl79MFFKwr4h3H0f0Cchm5eYm5nhHYL9E2Tha3hn4BuC7ULhAQf0ewT18C2wmHkIKRH1JT1bsUEIKZs4E27/k0MGDMUlHvIUU5MFcMs27JFimCCkHDxx0lnX37hOM/gPpS0C/gjxTFFJSU0iR8ovEHj92rO31xWskkGUCFFKyjDA2AdiEDTTAsI8DNkGTFwY+yKjoeGeIYDS/t4ENP/369LEm0BYf3GdlRkoihZQTx49b84WLqSKk/Pfff8qc/piJQgpGTGJ9Wnm+0RHRs1t39d3ixQqjq8SYHUu2TodE7ZEi6ckuWzjBTrUZKWjgYbPJcH+VK/gvC5hd/BkvCZBAahFIRSEF9RvpnA8mpGBd+9+3BXaWY9lT+VaYS796S+7B/fvqvdattds1P//sckIhxYXD9wTL54J3tEKKbY8AW2TYVBbx1K1Vy3cPHXOZmz69etmCSatrFFLSqjhjlplMFFIADzMP5d0vNpbRXvvzGpXnxZz63gftOyi8K2QGm7iFWGtb7nr6tGnWskl1IcWaqScXU0VIefTwoer0UUddtpkopGDgqSwLjWcZA0g+HTHS6UvYu+fpsujJsEdKsGcuUfdSeWmvvDlzhd2PIP0NP/34Y6LQMp4MI0AhJUkK3CZsQEjBuqFSwYHdvWs3J8VeIQUzVGxCyoL58605tMWH8LNbSHm5Tl11+dIlnWa/pb3iLaRgOuihg4d0OoIdxGppL1SATZPuM1JQznVr1dbPd4UyZdXRo0dNBPo4WYSUsWO+dDboRXqy+gt3zxANQSnNCv/VVBNSMmXNdrO8eEwCJJC9BFJJSMHa5fJdQQMQ7/lgQkrrli2tcKdOmaK/FaG+M6NHjdJuKaRENiMFmzOjvDq0e7zfTbRCCgQxhBNq7XoRUrBsl5/BAJ13mjVzyhSzjNLdUEhJ9xKOLn8UUh6PNsc3BEKKty09cfwEB6xXSMG+UDYhZfsff1gLIpmFFHOPMdvSXpiREszESkj5auLTvWSDxhejPVJQ1qZJ9xkp6KvBkk541vHDsl7mXrsmi2QQUsx6ntT3smKjHhKpSWUhxft8R5p3uieBWBKgkBJLmlkICxtieffqgJBiLjmAD8T8b791YvGuiQkhBUtNyIcENja/lH1WvEmLh5Cye9cuV/xIA0ahY8NTfDjC+Xk3hPdW/iR/wYQUxCPuTBsfm3DSADdYGiNcEyshJVU3m492jxTvM4zl6fwMKhlSltk5I8U7bV7SFI2NvY8iNWY8qSakmNPsI8033ZMACZBANASSXUjBEk2lS5RQuXO86PzMdzyOoxFSzIE2ly5eDIoNdU8so4i4vN9Wzkhxo9u3d6/q1aOnLivveviRCilYQkdmHoE/noFRn36mZFlfM3YszyPxYekSeV5stiz/RSHFJMjjTCKQqUIKOpC935BpU6cqc69VzEyR5bF/XLnS5R5Ciuz7JOGg8xmzV2wmHkIK2tQN6zdwpQtp+XTEY7E53HY8RGUx0QgpyHPXzp0D0gGW4aYB7vzYSdrE9raJUXcJx4Tyl+5CCmYbyLMK+8b1G77YkkFIuX79uiu9ZtqjOcYAi0hNKgspqN94+wojzT/dk0CsCFBIiRXJGITj3QsFazlKg0herrdu3XJiMpduwL3qVao4a0OKO9gfdOjgm6p4CCn79u6zfhz69u7tm45QN6IRUtAxYHKQ45bvvqvu3rkTKsqI76OSVK1yFR1n7Ro1wgrjwIED2g82hd2yebPLXzLPSFm0YKF6/tn/OenHaMrvly93pT2cE7Ny16Zlq6DiVbIIKfhPvduseUx+mN0SqZFnGXYqCClYWkTSjH1wbj95f0Wab7onARIggWgIxFJIwbIn5Z6MfMyfJ686sH9/NEly/GzetElVrVRJvx9febm+67uS74m4EW8hBYmBAID3NPbsMA2FlMc07t6968wGl1lCqK+Z9QDpeIxUSEHoGGjUrOlb+jlAOWDfAu/mqBDE5Fsark0hxXyaeZxJBDJVSLlz547zHjffEcUKP57dKNewZ4SYn1evdr1X3n6zqapQtpzrGpag9jPxEFIQ16uvNHSlAWkvV7qMOnvmjF9Sgl6PRkhBgH7+Dh8+HDS+aG5iT8iyJUvpfLdv2zasYMy2NL4dJ46fcPkz74MjxJ1QRp4V2N8tWhTKedT3MaMQq1FIfGgnRmrGfTlW+x/Yv39Q4SoZhBSszmDWH7J67LfyTDCOqSakYKl3c38bcy/lYPnkPRKINwEKKfEmHEH4mJEgHxObjTUwIRLAoGHX6t0WQd1jeq6fiYeQApHH2yBEPjB9dtKECQqjJv65ezcgSdjfAvfwQfWaaIQUjELp3rWrlU3vnj2duG5cv+6NSl28cMG5h86SSM1XE59u8BmOsAA1/eMPP9JptDV4k1lIAZ9cOXLo9GOJLlv5BePY/K2nnQetW7T0rdxh/dee3bvruLyjZhFHJu6REs508XAqjWYZYWkXjHCV98/smbPM267js2fPuir9rzVs5LqPkz179uiwEObG3zYEuOEFEiABEogXgVgKKUhjn55PxWHvUljh5gFLhsjed1jLe9mSperatWsu7zWrVXfenRRSXFjicmLO/LZtNj9syCf6O/Z+u/Zq544drnTgOcD3LRohBQGhXr/u13Xq5bp1Va4XntarJowbr+v8ppCC+iLch/rt2O5OpyvRaXLCpb3SpCBjnI1MFVKA0dx7U+rypm0KI/j/1DOWWDbdyfH58+d9SydeQsriRYv0O1fSAful6Lcc0wAAIABJREFUOnWddrotTTdv3nTuHbMsEe0niPhm7MkN20obSEf50mXUH3/8Yd2sHitaoE8DP79VQfziNdu6qBv88bt9STXxj0751wzRqVPHjnJL28kspCCRgwcO0mWNASqhliPVGXtyUL5MGe1/QN9+vkIK+s3MPipuNv94KTT03+C/E8xghRv5H6K+FMrMmjFDD7bFDLjVq1b7etmxfbsqXKCgDt+7zL14NGepYe+/+/fvyy3aJJBtBCikZBv6wIh/WP69wpR9eVl5bWxoaRpTUfa6xRIAWzY/3azb9IfjeAgpCBfLZ3nTYp5jTW9UaMxfqeIlHD9m5U7SG42QAr/79u1TGDVoxm0eN371VVcakB4sUQU377dvL9GHbUMdx2bxEkeDei/5zn5BxWrsmDHaLcpq6uTJAXElu5ACsQoimeS5Xu3aAZ1BAZkyLsz/5lvtF2HgY+o1YGWu9w53mSykYINI4V2kQEEvroDzSIUUBID1ZSUOdOadP3cuIFyUi7m2PtzbhJSrV68qc6YdRkuhYRLKsIIUihDvkwAJhEMg1kIKZpLI+7FRgwa6ozuctIibAf366zD8OkqyIqS0a/OeDv9MiBG8q1et0jOfPxs5UpLo2JyRotSRI0f0LCR0wqAzxmuyKqSY4WGpnbo1a+nyw96HMNhTTmaoB9sjxQwrE44ppGRCKUeex0wWUsaPfTpCX75Vpr182TIX0LeavKnfN6Y7HOOdc+HCBZd78yReQgr+1xCMvemR8yoVKwa04Zu+0cRxj7a410QrpGDQIwb6Sbxeu2ihwgHpMNtd3gES3nR5zzdu2KAwGFPiQX+E3zJGuN6548fa7YvPv6DWrlnrDVIlu5ACwd/MMwYT/LTyR2UuzRaQKePCsE+GagbgZmOOwQpYXlq4ws5kIQUzPEwW6H8MZiIVUhCWzHRGPK83etUqfOAZhihipsVPSJk+dZpe3hTux4z+IqRQiXKPVMwMxoH3SMBLgEKKl0g2n/tVHDBKHA1406zybERvvoj8NiEV//ESUjASo/Grr7leima6gh3HUkhBPrt83CmqdEQjpCA+fIjM/L3y0svKW2HF8mddO3dxuftm3jwpFped7EIKEmsuTYK8Y2TDl1+MUUePHHHlZeGCBc7137f9rq9jtI7Jqzw2m/f4szUIMllIMUUljPIAa6lkr1+3XrOVA7NC71dpFLdiYx1is1yqV66ivpk7V24rbFLZ+ePHlfdmTZtqtzYhBZ6868EWKVjQSbdtxtyfO3c6995r3VrHxwMSIAESiJZArIUUNMzebPyGfu/16NY94qSZ9Ty/9dOzIqSYS7+ikRrMmIK4d4YNhRTl2nh56JAhVpSxFFIQwcwZM/TzJUIKrstm81UqVrKOhLYmLs0vUkhJ8wKOMnuZLKQAWQGfgYQYzORdktJvwCLaAX7vPCmWeAkpCH/h/AX6PWi2SUIdx1JIQTrQ92LO1A8Vv3nf1qkv7PxstOvMMLD002/r3e27TRs3qVYtnq5KAsFrg8+M/2QXUsBhyuTJrjwj/9gvbOl3S1yY8OyCz/SpU/V17x4pWGrTu9l8J0NwErZ+bWLwFjfYe9hmmrz+unYDkS7VDAYrSh5ho99r+5PBrEePHlV/nzrlylI0QorZ/4A4IKZgoAgMlvlGOWJQCO6ZfQl+Qgr8YXl1M93Y02nSxImutOIE9WqE36FdO+sg3QAPvEACURKgkBIluHh569e7j+slIS8MrA3oNd4XobiFHWr/hXgJKUgj1t80OxrMdAU7RkXllmd6oV8FL9hm88IJfLwjEILFL/cwMuLPnX9KMGHbiA+dEuZ6n6jcYHqu/PLmzOUqX3RIo6PZZlJBSMEsEoh2wk7sfLly6zwj77JJKoQRMRglMHP6dJdfmz+MTsEeLFKRzWQhBRtEgpFwhl3oyfOFjjevMSsyfpVGr59jR485axGbcbzwv+d0ecp1jDb5Ze1anRaU8eqfVnmDcyo0qAzLMyD+UZ7yvxAb4hDu161VKyAcXiABEiCBSAnEWkhB/Og4l+8RZmWiMRfu6En4DyWkfLdosZ6dHM3SXlgGqlqlys67FPWZObNmW7FhGSvJxxuvva5FeXFMISU8IaVOzZoO62iX9hLeYn+/bLn+rppCyg/fP521btalxF8m2hRSMrHUQ+c504UUv1kmDevXD4CHzmmpl5s2vm3ewYBez/EUUtAZir0gg63UYaZXjpHuqZOnuJIa7YwUCeS3deud9orEEa6NpUAjNehDwf6S5nJHWEpb2kmw5buNdGD1DSwJ5mdSQUjBINxBAwboJU+Fb0AfypP2b9lSpXV2MZhwYP8BrmcYQqLJC89E8cJF1JLFi7U7vzZxJggpGBD0Up06mgV4o/0NZuhj8A50jEZI8e5rgjhQH0UcBfPl13GXKVlKLV+6TJ/nfCGHwvK3NoMl/WSQkTwjsM2ylmO5b1vtxBY2r5FANAQopERDLY5+zMqfvARgj/0ycGNqvAgrejaFEz8nT54Mmsp4CimIGEv6oDFoNsQlbTa7aqXKCgo/NsozTVaEFISD8PAyR9j4kNriNq9hoze4PXjA/hI30+Z3jEppqPhqVauuME0xmEkFIQXpR6VvxLDhLgHJZCrHqBAtWfydK8uoKE+cMEEvWSFuxcYMF4xKgpGKYyYLKeCACodt2TrMDvKaaIQUhIG9TfAMSzl4bezvc/jQIYXKr3kPHT1+BsvtfdjhfYUlyUw/3uMiBQupd5o1U3/+GbmY6Rc3r5MACWQmgXgIKSCJWZb5n2wIj3cYvlU/rliptmzerGTm5batW51zXMM64GLMpQwG9uuv9wdDnQ5usem7vBejEVIQz5Svn47wxAAO735XEMGlowabDyOtXmPW35C2dDXB9kjB84NZlCgPdMSYjXLUszFoSfY1iVRIwYby2GzeNFj6UjZaRgeDd2StLEGL+hDq8XhezLKBoIdrfh0RZlzpcEwhJR1KMfZ5MNvSmbi0y/xv3Usny/dkxQ8/BMDGewzfAHEjNgY/hTLxFFIk7n1796oObds5g8YkbX42vslouyz9zt3WzKqQgrRgmcf+ffuq0iVKBrDypgfiD9IxYdw4yUbE9to1axSEL2/Y5jkGZWBGRjCTCkKKpB+zf+T7Z+bTe4zBuqbBkpuDPGKK6QdhbtywUZ09c0bzzGQhBeww4OaVl+3PVyyEFMSBpWPNeqRZJjjGcrJ4/2B5fPNesM3ksdz4jGnTVK3qj/cRNP15jxs1eEWN+/LpAF7zmeExCcSCAIWUWFCMYRjXrl5Vq376KeB35vRpayzHjh0LcAv/XkHC6zlSf1jD0pYuLCERzCAd4m/0Z49na2DGBn7YFE3unfbJH8IXN6YdKn+2NOGFjjBmz5rlxC/pwJRCCTsrAoo3TsSHF7jEAxubyiKuYGvOSji3bt7S6YKfmzduyC1fGyNMJS9HDh/2dRePG1iWS+LGmrKSbwghuP7L2l98o0WnzuSvvnrsp2w5HQ4EOTE/r17tXMcasl6DSpTEDdv0J25v3XLzvBEGT/GbbPbv27Y5U56F8dzZs5Vtk1zMrBIuWDYrUgO/mB6LeGpWrabDAksYCGESPmzbfireONERBbf9+/TVzwhmoEg43o18vf55TgIkQALhEoiXkIL4F8yfrzD4wtt4w6CBNq1auWbhYSTe9Scbyu/evVuZs1PffrOp416WOcAyCxhxiXCxTIVpMENB4gu2hCvezej0kdG86HhHmuRXtFAhJxzMdjbFATMuswFsdtabbtLhOJiQgvx16dRZM8fSOMIQghc2x+3Vo4dzHx2Py5YudSEZ0K+f9rv9j6cbB2P2NZYzzZ8njw4P4cqSPBhwYJt1curUKYWBOPIMwMZzI2lq07KVcw/XMNAh3Q2FlHQv4ejyl+lCCtrUUqc2bb+lpjB4ynSHY7RhQxmrP8vMdAnHbKOa8YXTJsZ+YuIHgrK0fzCgVK777Q2715I/+InGYLCkxNf0jTd0OpCeeXPmOve8y2RGEw/8SNsWszUkv+hAlvix2Xwog1H84h52OMKi6R7iQyINVveQ+CeOH6/zjWVU5Try5DXiD99zsIJIIO5xDwYDP+WaX5tY2qhwt3vXbm80zjna4BIOnq1UNefOnnXyAVEJzLDnDvJ15fIVV5YgrEh+Ix2kIf2AA/r2c+LAvqkSFuqpMNjsXq7Bxnkoc/HCRccPBpfKfwP2uC+/1GFlQh0oFCfejy8BCinx5cvQSYAESIAESIAESIAEsoFAPIUUZAcdGdOmTHUEC8x6NWe+yjlsrNVsbiy/dMkSx624F7ctmjd3ltiqXb2Gcx8CiGkgpIhbvxGVpnvsb4XGpfhBx7scY/3vnTv8BfaG9Rtot+kspGDvEWGy0bLOPAZdvPHaa9qNyRAdgxg5LP69e/0N7N9f3zOFFIy47NW9h75nhlmsUGGFUdh+BuuXm2lG3KZ/nGMj1guWzia/MFP1OoWUVC25+KY704WU+NJl6CRAAiRAAiRAAhRS+AyQAAmQAAmQAAmQAAmkHYF4Cyk2YBgh590c1uZOrmHmwYnjJ+Q0rvawIZ8ozHymiY4ABI5Qy7JGEzKel3/u3o3Gq9q1a5fvPjhRBZhCniikpFBhJTCpFFISCJtRkQAJkAAJkEAGEqCQkoGFzixnFgFMUy1TomRMflgugoYESIAESIAEUoFAdggpqcCFaSSBdCBAISUdSjH2eaCQEnumDJEEsCxTrPoTgu2DQdIkQAIkkAoEKKSkQikxjSSQBQJ/7f5LYUO6WPy6fNwpCymhVxIgARIgARJIHAEKKYljzZhIINEEKKQkmnhqxEchJTXKialMLQLvt2sfk74E9EccTvA+rqlFmqklARJIBQIUUlKhlJhGEiABEiABEiABEiCBiAhQSIkIFx2TQEoRoJCSUsWVsMRSSEkYakZEAiRAAiRAAhlJgEJKRhY7M00CJEACJEACJEAC6U2AQkp6ly9zl9kEKKRkdvn75Z5Cih8ZXicBEiABEiABEogFAQopsaDIMEiABEiABEiABEiABJKKAIWUpCoOJoYEYkqAQkpMcaZNYBRS0qYomRESIAESIAESSEoCFFKSsliYKBIgARIgARIgARIggawQoJCSFXr0SwLJTYBCSnKXT3aljkJKdpFnvCRAAiRAAiSQGQQopGRGOTOXJEACJEACJEACJJBRBCikZFRxM7MZRoBCSoYVeJjZpZASJig6IwESIAESIAESiIoAhZSosNETCZAACZAACZAACZBAMhOgkJLMpcO0kUDWCFBIyRq/dPVNISVdS5b5IgESIAESIIHkIEAhJTnKgakgARIgARIgARIgARKIIQEKKTGEyaBIIMkIUEhJsgJJkuRQSEmSgmAySIAESIAESCBNCVBISdOCZbZIgARIgARIgARIIJMJUEjJ5NJn3tOdAIWUdC/h6PJHISU6bvRFAiRAAiRAAiQQHgEKKeFxoisSIAESIAESIAESIIEUIkAhJYUKi0klgQgJUEiJEFiGOKeQkiEFzWySAAmQAAmQQDYRoJCSTeAZLQmQAAmQAAmQAAmQQPwIUEiJH1uGTALZTYBCSnaXQHLGTyElOcuFqSIBEiABEiCBdCFAISVdSpL5IAESIAESIAESIAES0AQopGgUPCCBtCNAISXtijQmGaKQEhOMDIQESIAESIAESMCHAIUUHzC8TAIkQAIkQAIkQAIkkLoEKKSkbtkx5SQQigCFlFCEMvM+hZTMLHfmmgRIgARIgAQSRYBCSqJIMx4SIAESIAESIAESIIGEEaCQkjDUjIgEEk6AQkrCkadEhBRSUqKYmEgSIAESIAESSFkCFFJStuhSI+FHjxxRO3bscP3+2r07oYl/8OCBK/6bN24mNH4zst27dqnvFi9WDes30D9cS0fz33//ubhfuXIlHbPJPJEACZAACSQpAQopSVowTBYJxIAAhZQYQEzDICikpFeh7tu719WeRL/C4UOHEprJmzdvutJw//79hMYvkT180qcx+euvdT/CG6+9rs6eOSNO0s4+dfKUZn/o4MG0yx8zRAIkkJoEKKSkZrml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tRJjekmABEiABEiABEiABEiABEiABEiABFwEKKS4cPCEBEiABEiABEggxgQopMQYKIMjARIgARIgARIgARIgARIgARIgARJILAEKKYnlzdhIgARIgARIINMIUEjJtBJnfkmABEiABEiABEiABEiABEiABEggzQhQSEmzAmV2SIAESIAESCDJCFBISbICYXJIgARIgARIgARIgARIgARIgARIgAQiI0AhJTJedE0CJEACJEACJBAZAQopkfGiaxIgARIgARIgARIgARIgARIgARIggSQjQCElyQqEySEBEiABEiCBNCNAISXNCpTZIQESIAESIAESIAESIAESIAESIIFMI0AhJdNKnPklARIgARIggcQSoJCSWN6MjQRIgARIgARIgARIgARIgARIgARIIMYEKKTEGCiDIwESIAESIAEScBGgkOLCwRMSIAESIAESIAESIAESIAESIAESIIFUI0AhJdVKjOklARIgARIggdQiQCEltcqLqSUBEiABEiABEiABEiABEiABEiABEvAQoJDiAcJTEiABEiABEiCBmBKgkBICZ49u3dRrDRupryZOVP/9918I17xNAiRAAiRAAiRAAiRAAiRAAiRAAiSQaALJJqQ0a/qW05ewbOnSRKNgfCRAAiRAAiRAAnEgQCElBNTZM2eqXC/kUM/93zNq8cKFIVzzNgmQAAmQAAmQAAmQAAmQAAmQAAmQQKIJJJuQMmTQIJXjf8+pfLnzqN/Wr080DsZHAiRAAiRAAiQQYwIUUsIA2qFtO0dIqV/vJXX92rUwfNAJCZAACZAACZAACZAACZAACZAACZBAoggkm5CCfNeqXsPpS3inWbNEYWA8JEACJEACJEACcSJAISUMsH+fOuVUfjArpf17bcPwQSckQAIkQAIkQAIkQAIkQAIkQAIkQAKJIpCMQsqvv/yi+xI+HTEyUSgYDwmQAAmQAAmQQBwIUEgJA+rDhw9V186dnQpQvly51Z87d4bhi05IgARIgARIgARIgARIgARIgARIgAQSQSAZhZS7d+6oNxs3dvoSCucvoC5fvpwIFIyDBEiABEiABEggDgQopIQJ9ejRo+r5Z551KkAfdOgQpi86IwESIAESIAESIAESIAESIAESIAESiDeBZBRSkOe1a9boWSmjR42KNwaGTwIkQAIkQAIkECcCFFIiAJs7x4tOBahOjZoKs1RoSIAESIAESIAESIAESIAESIAESIAEsp9AsgopJ0+cVC8+97zTl4Clwh89epT9sJgCEiABEiABEiCBiAlQSIkA2bQpU/VIkkULFkbgk05JgARIgARIgARIgARIgARIgARIgATiRSBZhRTkt1+fvrovYceOHfFCwHBJgARIgARIgATiSIBCSgRwf1u/XmGPFGw63693nwh80ikJkAAJkAAJkAAJkAAJkAAJkAAJkEC8CCSzkLJo4UItpEyfNi1eCBguCZAACZAACZBAHAlQSIkQboUyZZ0KEDaKoyEBEiABEiABEiABEiABEiABEiABEsh+AskspDx48EALKQ3rN8h+WEwBCZAACZAACZBAxAQopESIjEJKhMDonARIgARIgARIgARIgARIgARIgATiTIBCSpwBM3gSIAESIAESyHACFFIifAAqliuvZ6T8+++/EfqmcxIgARIgARIgARIgARIgARIgARIggVgTSHYh5flnnnX6EjAj5b///ot19hkeCZAACZAACZBAnAlQSIkQ8KqfftJTcseM/iJC33ROAiRAAiRAAiRAAiRAAiRAAiRAAiQQawLJLKQgrxPHT9B9CcuXLYt19hkeCZAACZAACZBAnAlQSIkQMIWUCIHROQmQAAmQAAmQAAmQAAmQAAmQAAnEmQCFlDgDZvAkQAIkQAIkkOEEKKRE+ABQSIkQGJ2TAAmQAAmQAAmQAAmQAAmQAAmQQJwJUEiJM2AGTwIkQAIkQAIZToBCSoQPAIWUCIHROQmQAAmQAAmQAAmQAAmQAAmQAAnEmQCFlDgDZvAkQAIkQAIkkOEEKKRE+ABQSIkQGJ2TAAmQAAmQAAmQAAmQAAmQAAmQQJwJUEiJM2AGTwIkQAIkQAIZToBCSoQPAIWUCIHROQmQAAmQAAmQAAmQAAmQAAmQAAnEmQCFlDgDZvAkQAIkQAIkkOEEKKRE+ABQSIkQGJ2TAAmQAAmQAAmQAAmQAAmQAAmQQJwJUEiJM2AGTwIkQAIkQAIZToBCSoQPwOxZs9Rz//eMyp87jzp18mSEvumcBEiABEiABEiABEiABEiABEiABEgg1gSSWUj577//1OABA52+hOpVqqqLFy/GOvsMjwRIgARIgARIIM4EKKRECLhCmbJO5adw/gIR+qRzEiABEiABEiABEiABEiABEiABEiCBeBBIZiHlwYMHTj8CBmU2rN8gHtlnmCRAAiRAAiRAAnEmQCElQsAUUiIERuckQAIkQAIkQAIkQAIkQAIkQAIkEGcCFFLiDJjBkwAJkAAJkECGE6CQEsEDcOjgQVW0YCFnJMnc2bMj8EmnJEACJEACJEACJEACJEACJEACJEAC8SKQzELK79u26RkpmzdtihcChksCJEACJEACJBBHAhRSIoA7bcpUXflZtGBhBD7plARIgARIgCo0FtUAACAASURBVARIgARIgARIgARIgARIIF4EkllI6denr+5L2LFjR7wQMFwSIAESIAESIIE4EqCQEgHcWtVrOJWfimXLqbNnzkbgk05JgARIgARIgARIgARIgARIgARIgATiRSBZhZQL5y+o8k/2Wn290avq+vXr8ULAcEmABEiABEiABOJIgEJKmHAfPXqknn/mWUdIebluvTB90RkJkAAJkAAJkAAJkAAJkAAJkAAJkEC8CSSrkHL06FE9G6XjBx/GGwPDJwESIAESIAESiBMBCilhgh0yaLCu/GzZvDlMX3RGAiRAAiRAAiRAAiRAAiRAAiRAAiQQbwLJKqS0ereF7ku4cOFCvDEwfBIgARIgARIggTgRoJASBtgL58+rvDlzOZWfd95+W92/fz8MX3RCAiRAAiRAAiRAAiRAAiRAAiRAAiSQCALJKKRs27pV5Xohh9OX0K93H4WVLmhIgARIgARIgARSkwCFlDDK7ZPBQ5yKT8mixdSO7dvD8EEnJEACJEACJEACJEACJEACJEACJEACiSKQjEJKy3fedfoSKpWvoM6cPp0oFIyHBEiABEiABEggDgQopISAeuTIEVWmZCmn8jPq089CuOZtEiABEiABEiABEiABEiABEiABEiCBRBNINiFl08ZNqmDefCrH/55TC+bPTzQOxkcCJEACJEACJBBjAhRSQgAdPnSoI6JgJMl///0XwjVvkwAJkAAJkAAJkAAJkAAJkAAJkAAJJJpAsgkpbVq2cvoSBg8YmGgUjI8ESIAESIAESCAOBCikhICKNUwfPnyo/v333xAueZsESIAESIAESIAESIAESIAESIAESCA7CCSbkIJ+BPYlZMeTwDhJgARIgARIID4EKKTEhytDJQESIAESIAESIAESIAESIAESIAESSBCBZBNSEpRtRkMCJEACJEACJJAgAhRSEgSa0ZAACZAACZAACZAACZAACZAACZAACcSHAIWU+HBlqCRAAiRAAiRAAo8JUEjhk0ACJEACJEACJEACJEACJEACJEACJJDSBCikpHTxMfEkQAIkQAIkkPQEKKQkfRExgSRAAiRAAiRAAiRAAiRAAiRAAiRAAsEIUEgJRof3SIAESIAESIAEskqAQkpWCdI/CZAACZAACZAACZAACZAACZAACZBAthKgkJKt+Bk5CZAACZAACaQ9AQopaV/EzCAJkAAJkAAJkAAJkAAJkAAJkAAJpDcBCinpXb7MHQmQAAmQAAlkNwEKKdldAoyfBEiABEiABEiABEiABEiABEiABEggSwQopGQJHz2TAAmQAAmQAAmEIEAhJQQg3iYBEiABEiABEiABEiABEiABEiABEkhuAhRSkrt8mDoSIAESIAESSHUCFFJSvQSZfhIgARIgARIgARIgARIgARIgARLIcAIUUjL8AWD2SYAESIAESCDOBCikxBkwgycBEiABEiABEiABEiABEiABEiABEogvAQop8eXL0EmABEiABEgg0wlQSMn0J4D5JwESIAESIAESIAESIAESIAESIIEUJ0AhJcULkMknARIgARIggSQnQCElyQuIySMBEiABEiABEiABEiABEiABEiABEghOgEJKcD68SwIkQAIkQAIkkDUCFFKyxo++SYAESIAESIAESIAESIAESIAESIAEspkAhZRsLgBGTwIkQAIkQAJpToBCSpoXMLNHAiRAAiRAAiRAAiRAAiRAAiRAAulOgEJKupcw80cCJEACJEAC2UuAQkr28mfsJEACJEACJEACJEACJEACJEACJEACWSRAISWLAOmdBEiABEiABEggKAEKKUHx8CYJkAAJkAAJkAAJkAAJkAAJkAAJkECyE6CQkuwlxPSRAAmQAAmQQGoToJCS2uXH1JMACZAACZAACZAACZAACZAACZBAxhOgkJLxjwABkAAJkAAJkEBcCVBIiSteBk4CJEACJEACJEACJEACJEACJEACJBBvAhRS4k2Y4ZMACZAACZBAZhOgkJLZ5c/ckwAJkAAJkAAJkAAJkAAJkAAJkEDKE6CQkvJFyAyQAAmQAAmQQFIToJASYfFs3bJVrft1ndq0cWNIn/fu3XPcwv3ePXtCuqeDzCTQ5PXGqkaVqmrtmjWZCSCFc71o4UKn7Nq3bRuQi149ejj3pk2ZGnCPF0iABEiABEiABEiA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Qkq7Nm3E27dv/bDCIiRAAiRAAiRAAsEmQCEl2ERpjwRIgARIgARIQCdAIUWnwf24JjB44ED1hHGg66rPnDEjrlmy8SRAAiQQqwQuX7qkfitGjxwZq81ku0iABEiABEgg6ghQSIm6LqPDJEACJEACJBBVBCikRFV30dlQEsAf7xXLlgflde7cuVC6StskQAIkQALpRGDShAlKSHny5Ek6ecFqSYAESIAESIAErAQopFiJ8D0JkAAJkAAJkEAwCVBICSZN2iIBEiABEiABEohpAs2bNKGQEtM9zMaRAAmQAAlEKwEKKdHac/SbBEiABEiABKKDAIWU6OgnekkCJEACJEACJJDOBO7evSsql69gCCkjhw8XHz58SGePWD0JkAAJkAAJkIAkQCFFkuCWBEiABEiABEggFAQopISCKm2SAAmQAAmQAAnEHIE9u3er2SgTxo+PufaxQSRAAiRAAiQQzQQopERz79F3EiABEiABEoh8AhRSIr+P6CEJkAAJkAAJkEAEEFi/dq0hpGTLlFlcuXw5AjyiCyRAAiRAAiRAApIAhRRJglsSIAESIAESIIFQEKCQEgqqtEkCJEACJEACJBBzBMqVKWMIKTmzZou5trFBJEACJEACJBDtBCikRHsP0n8SIAESIAESiGwCFFIiu3/oHQmQAAmQAAmQQIQQkELK9y1bRYhHdIMESIAESIAESEASoJAiSXBLAiRAAiRAAiQQCgIUUkJBlTZJgARIgARIgARiisCN69dF0YKFjBkpK5eviKm2sTEkQAIkQAIkEAsEKKTEQi+yDSRAAiRAAiQQuQQopERu39AzEiABEiABEiCBCCGwdMkSFWieQkqEdArdIAESIAESIAGNAIUUDQZ3SYAESIAESIAEgk6AQkrQkdIgCZAACZAACZBArBGQQkqxwkXE9WvXYq15bA8JkAAJkAAJRD0BCilR34VsAAmQAAmQAAlENAEKKRHdPXSOBEiABEiABEggEgi0btnSmJFSsVz5SHCHPpAACZAACZAACVgIUEixAOFbEiABEiABEiCBoBKgkBJUnDRGAiRAAiRAAiQQiwSyZspEISUWO5ZtIgESIAESiBkCFFJipivZEBIgARIgARKISAIUUiKyW+gUCZAACZAACZBAJBGQQsr6desiyS36QgIkQAIkQAIk8JkAhRReCiRAAiRAAiRAAqEkQCEl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gARIwF0EKKS4y5/sDQmQAAmQAAmQQIITOHHihChcoKAanNuza3dCEqGQkpBuZ6cThIBbhJSjR46oZ/XpU6cSxHvR66bdhJSNGzaItavXaJ8rl69Er+OsmQRIgARIgARIICYEKKTEBDMbIQESIAESIAESIIHYETh+7JgonL+ANkCXJ0dOsX3bttg1bpOWKKTYxBE0gwSiQMCNQsrIYcOjQCqxqrSbkJIzazYllBUtWEiMHjlSvHv3LrGcwt6SAAmQAAmQgIsIUEhxkTPZFRIgARIgARIgARKQBE6eOKEGcPLmyi127dwpLyXElkJKQriZnUxQAm4RUp48eSLq1KylPasppIR/M9tNSNmxfbuoW7OWKFIwbZbojGnTw+8oayABEiABEiABEogLAQopccHORkmABEiABEiABEggugQ+fPggWrdsqcSUHFmyikMHD0a3URvVTiHFRs6gKSQQYQJuEVKApWO79tpzulqlyuLp06cRJpVY1dlNSJH0r1+7pv4Wl0kqJW7duiUvcUsCJEACJEACJOAgAhRSHOQsmkoCJEACJEACJEACwRKQg3Tf/N//tIGcQwcPBVuFI/NTSHGk22g0CQREwI1CCp7RtznAHpD/vWWyq5ACe4cMGqzEFMQyYyIBEiABEiABEnAeAQopzvMZLSYBEiABEiABEiCBgAm8fv1a9OjWTQ3gtGrZUuCc2xOFFLd7mP1LZAJuElIuXLigns8UUsK7qymkhMePpUmABEiABEiABHwToJDimw+vkgAJkAAJkAAJkIDjCTx//lz07NZdDdb17d1bvHjxwvH98tUBCim+6PAaCTibgJuElDu3b6tn86gRI53tmDhbTyElzg5g8yRAAiRAAiTgcgIUUlzuYHaPBEiABEiABEiABEDg1atXonPHTmrArk/PXuLNmzeuhUMhxbWuZcdIQLhVSOnQth29GwYBJwgpmdNnEH+fORNGL1mUBEiABEiABEggXgQopMSLPNslARIgARIgARIggTgQaNUiLQB9l07JcbAgNk1KIaVhvXpi/Nhx/JAB7wEX3QPDhw7VROHvBwyIzQMliq1gxmD9OnW1/lBICQ+0E4SULsnu/bsbnvdYmgRIgARIgATsT4BCiv19RAtJgARIgARIgARIIGIE/vvvP4GBHBl8vn3btuLDhw8Rq98uFUkhRfaT2/8pn5MFWbjlHnCD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ARIgARIgARsQoJBiAyfQBBKIEgGnCCmvX70S9WrXUbNRdu/aFSUirBYEKKTwPiABEiABEiABEogmAQop0aTLukmABEiABEiABEiABOJCgEJKXLCzURKICQGnCCl9evVSIkrzpk3Fx48fY8InURuhkJKonme/SYAESIAESCA2BCikxIYzWyEBEiABEiABEiABEoghAQopMYTNpkggxgScIKRgSa+cWbNpQkqxwoXF32fOxJhS4jVHISXxfM4ekwAJkAAJkEAsCVBIiSVttkUCJEACJEACJEACJBATAhRSYoKZjZBAXAjYXUj56+hfInf2HGo2ytmzZ+PCKdEapZCSaB5nf0mABEiABEggtgQopMSWN1sjARIgARIgARIgARKIAQEKKTGAzCZIIE4E7CykvH//XiR37KhEFOx/+PAhTqQSq1kKKYnlb/aWBEiABEiABGJNgEJKrImzPRIgARIgARIgARIggagToJASdcRsgATiRsDOQkrL5t8qEaVbly5xY5SIDVNISUSvs88kQAIkQAIkEDsCFFJix5otkQAJkAAJkAAJkAAJxIgAhZQYgWYzJBAHAnYUUl69eiXat2mrRJQqFSuJd+/exYFO4jZJISVxfc+ekwAJkAAJkEAsCFBIiQVltkECJEACJEACJEACJBBTAhRSYoqbjZFATAnYTUhJTU0V3Tp3USJKvly5xa6dO2PKhI0JQSGFdwEJkAAJkAAJkEA0CVBIiSZd1k0CJEACJEACJEACJBAXAhRS4oLd0Y0+fvxY3Lx5U/s8ePDA0X1xu/F2ElJevnwpuiZ3ViJKzqzZxJ7du93uAlv2j0KKLd1Co0iABEiABEjANQQopLjGlewICZAACZAACZAACZCAJBAtIeXTp0/i48ePHh+cj0UaMWy4GD50qJgza3YsmkuINuDPpUuWiAply6nB8KKFColLFy+G3P8/Nm/W/ARfQZxhiiwBOwgp8lnQoW07dd9883//E0cOH45sZ1lbwAQopASMihlJgARIgARIgARCIEAhJQRoLEICJEACJEACJEACJGBvApEWUj58+CDmzZljWL4Hg6byM2jAQO368ePHowom/Vdfa21WrVQpqu0kUuWlSpRUfpT+LFa4iPjn0qWQMQwbMkTVefzYsZDrYUFrAnYQUnbu2KF8jPsmR5as4sjhI9YG82xMCFBIiQlmNkICJEAC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



















! npm 和 pip 分别是如何解决包依赖冲突的

!! npm

对于 npm v2,`npm install` 时每个包都会在各自的 `node_modules` 文件夹中存放自己的依赖。这样对于一个稍大型的工程,会有成千上万的文件存在。

npm v3 把依赖库尽量地 flatten 到顶级 `node_modules` 中,但是版本有冲突的情况下,还是使用 v2 的行为。不过这样已经解决很大一部分问题了。([[来源|https://docs.npmjs.com/how-npm-works/npm3]])

!!! 目录结构

对于非 global 方式安装的包,包本身代码和它的依赖是在同一层目录:

```bash
$ mkdir test-dir && cd test-dir
$ npm install http-server
$ ls node_modules
async  colors  corser  ecstatic  eventemitter3  he  http-proxy  http-server  mime  minimist  mkdirp  opener  optimist  portfinder  qs  requires-port  union  url-join  wordwrap
```

对于 global 方式,包的依赖放在它本身的 `node_modules` 里面,而不是在同一层目录。比如对于 http-server 这个包,它的依赖放在 `/usr/lib/node_modules/http-server/node_modules` 里面。

无论是哪种方式,`npm remove` 一个包时都能正确地处理依赖:

# 全局方式时,删除该包的最上层目录,如 `/usr/lib/node_modules/http-server/node_modules`
# 非全局方式时,npm 会去读 `package.json` 文件,判断要删除的包有哪些依赖还被别的包依赖着,这些包不会被删除

!! pip

pip 并 [[没有|https://pip.pypa.io/en/stable/user_guide/?highlight=conflict#requirements-files]] 真正的 dependency resolver <<footnote "[1]" "这可能在 PipFile /pipenv 后有所改善">>,你可以在 `requirements.txt` 文件中强制指定依赖库的版本,这会覆盖掉各个库在 `setup.py` 中指定的版本。

!!! 目录结构

pip 安装的包,跟它的依赖最终都会放在同一层目录平躺着。

pip 安装包时是装到一个 env(一般是全局 env / vitualenv),而 npm 装包是针对全局 / ''一个项目''的。''这导致 npm 处理依赖时更为灵活、合理'',因为它没有多个项目共享同一套包。所以 pip remove 一个包时,并不会同时删除它的依赖。

Python 的打包感觉太复杂,存在 `distutils`, `setuptools` 这两个让我搞不清楚的库,打包格式又有什么 source distribution, egg, wheel 等奇奇怪怪的东西。有必要的时候再研究了。

感觉 npm v3 的解决办法是最好的。
!! Resources

* [[bradtraversy/design-resources-for-developers|https://github.com/bradtraversy/design-resources-for-developers]]:全面、丰富
* [[码力全开|https://www.maliquankai.com/]]
对设计稿的要求。

下面的内容主要来自 [[大厂 H5 开发实战手册|https://juejin.im/book/5a7bfe595188257a7349b52a/section/5a8ebcabf265da4e9a496bdc]] 中的「设计稿审查」部分:

拿到设计稿后,我们需要站在开发者的角度,先做一个初步的设计稿审查,其目的及意义主要有两个:

* 了解设计稿的开发友好性:
** 帮助视觉设计师发现并指出有哪些地方的设计对开发不友好,例如是否存在展示缺陷(缺乏经验的视觉设计师一个常见的问题是没有考虑按钮或标签文字数量的溢出情况)?是否开发成本高或者根本无法实现?
* 了解设计稿的排版布局及内容构成
** 帮助自己全局理解页面的设计细节,特别是排版布局及内容构成。利用模块化的思想将设计稿解构成一个个组件,并明确每一个组件的可复用性,包括可复用的范围。

事实上,设计稿的审查流程一般都比较固定,我们可以将其整理成为团队内通用的审查清单:

* 确定设计稿的开发友好性(是否有还原成本高或无法还原的地方)
* 确定一些特殊的元素是否有合理的边界处理(如文案超出外层容器的边界怎么办)
* 确定页面的框架结构(Layout)
* 确定跨页面可复用的组件(Site Component)
* 确定当前页面可复用的组件(Page Component)
* ...

---

另外看到的一些内容,要求设计师在编写 PSD 时要注意遵循不同平台的设计规范(比如 iOS 和 Android),并考虑到开发时需要的不同尺寸的图片(比如不同大小的图标),做出方便生成此类切图的 PSD 稿。

!! Resources

* [[大厂 H5 开发实战手册|https://juejin.im/book/5a7bfe595188257a7349b52a/section/5a8ebcabf265da4e9a496bdc]] 中的「设计稿审查」部分
!! 生成常见的图形素材

[[Canva|https://www.canva.com/]] 网站提供模板,可以生成各式各样的设计:

{{ canva-illustration }}

!! 生成 logo

Shopify 的 [[Hatchful|https://hatchful.shopify.com/]] 是非常不错的工具。
|!Name |Designing Data-intensive Applications |
|!Author |Martin Kleppmann |
|!Edition |1st |
|!Release Date |March 2017 |
|!ISBN-13 |978-1-449-37332-0 |
|!Medium |电子书 |

介绍 reliability, scalability, 和 maintainability 的含义,以及实现它们的手段。

这里将最常见的数据处理需求列出来了:

A data-intensive application is typically built from standard building blocks that provide commonly needed functionality. For example, many applications need to:

* Store data so that they, or another application, can find it again later (''databases'')
* Remember the result of an expensive operation, to speed up reads (''caches'')
* Allow users to search data by keyword or filter it in various ways (''search indexes'')
* Send a message to another process, to be handled asynchronously (''stream processing'')
* Periodically crunch a large amount of accumulated data (''batch processing'')

不同的数据系统(主要指软件层面,如 MySQL、ElasticSearch 等)会有自己的特性,来满足上述一些场景的需求。

! Thinking About Data Systems

<<.s "背景:">>

Data system 分类的 ''边界模糊'':

* Redis 即可以做 cache,也有人使用它做消息队列
* Apache Kafka 即是消息队列,也提供了类似数据库的执行久

一个工具往往不能满足全部业务需求,比如下面是一个可能的业务架构图:

{{ ddia-ch01-architecture }}

这个系统是由一些通用组件构建出来的特殊系统,需要考虑:

* 如何保证缓存数据的一致性?
* 如何保证出错时数据保持正确和完整?
* 当部分组件不工作、系统降级时,如何仍然保持系统整体性能?
* 负载增加时如何扩容?
* 服务提供的 API 应该是怎样的?

<<.s "问题:">>

如何判断使用怎样的系统?各个系统在设计上有什么共通点?

<<.s "解答:">>

不同系统间一般有 3 个共同要考虑的点:

* ''可靠性''(Reliability):即使出现异常情况,软件也能正常运行
* ''可伸缩性''(Scalability):可以应对负载的增加
* ''可维护性''(Maintainability):系统可以容易地进行变更来使其顺利运行,比如可以容易地打补丁、发布修复 bug 后的应用等

这一章下面的内容在阐述这几点具体的含义。

! Reliability

<<.s "定义:">>

「可靠性」,

* 简单地说:continuing to ''work correctly'', even when ''things go wrong''.
* 复杂地说:
** The application performs the function that the user expected.
** It can tolerate the user making mistakes or using the software in unexpected ways.
** Its performance is good enough for the required use case, under the expected load and data volume.
** The system prevents any unauthorized access and abuse.

错误相关的概念:

* Faults: things go wrong
* Cope with (certain kinds of) faults: fault-tolerant or resilient.

Faults v.s. failure:

* Faults 一般指单个组件的功能没有满足要求
* Failure 一般是系统整体出现错误,无法满足要求。如果没有做好错误处理,fault 可能会演变为 failure

Netflix Chaos Monkey: 有意地破坏系统中一些组件,产生 fault,以演习和测试整个系统的可靠性。

并不是全部 fault 都是可以被 tolerant 的,比如有安全漏洞导致数据库信息被黑客盗取。

下面描述各种不同类型的 fault。

!! Hardware Faults

<<.s "现状:">>

硬件错误是非常常见的:机房断电、运维插错电缆造成网络配置错误、内存或者硬盘坏掉。一个硬盘平均 10-50 年会挂掉,如果像数据中心那样多的硬盘,几乎每天都会有硬盘挂掉。

<<.s "解决方法:">>

Add redundancy(增加冗余):硬盘上 Raid,机房多路供电,上 UPS。

<<.s "但是……">>

并不是任何一种应用都需要强调单机的可用性。比如一个互联网应用的逻辑层 server,往往会有数十台甚至上千台机器,依赖于前端的负载均衡和高可用机制,一台机器挂掉了也有其他机器继续服务,影响并不大。比较依赖于单机可用性的,可能是一些关键的数据库服务等。

!! Software Error

<<.s "关联性:">>

硬件错误往往不是相关联的,比如一台机器硬盘挂了,并不代表其他机器也会同时挂掉。但是软件错误往往是「系统性的」,比如 Linux Kernel 的一个 bug 可能会影响非常多的服务;一个服务可能返回了错误的信息给到上游,导致上游也出现异常。

<<.s "潜伏性:">>

软件中的 bug 经常在于代码对它的运行环境有一些预设的认识。一般情况下环境的情况符合这个认识,但是一旦不符合了,bug 就会引起错误。

<<.s "解决办法:">>

编程时多思考;详尽的测试;进程隔离;出错时 crash 并重启;监控及分析线上系统等。

!! Human Errors

<<.s "现状:">>

人不可靠。事实上互联网中的服务不可用,绝大多数是来自运维操作或者配置出问题。硬件故障引起的问题只占很小一部分。

<<.s "解决办法:">>

* 设计一个不容易犯错的系统。比如 API、管理界面上,把容易出错的部分抽象或者屏蔽掉,只留下容易理解的、好用的接口供用户操作。
* 提供机制,使用户即使犯了错也不会引起问题。比如提供沙箱环境,让开发可以拿线上数据做分析,但是又不会影响到用户环境
* 做仔细的测试,覆盖系统的各个层级;做自动化测试
* 提供快速恢复的机制;比如发布配置或者发布程序的平台,提供快速回滚的机制
* 建立详细且清晰的监控机制,使得出错时能快速定位问题
* 通过管理和培训的手段来减少误操作的发生

!! How Important Is Reliability?

通常都非常非常重要。如果是做原型,可以为了开发速度适当牺牲可靠性。

! Scalability

指如何去应对负载(load)增加。

!! Describing Load

<<.s "问题:"" >>

如果无法清晰描述 ''负载''(load),那么也无法知道什么是负载增加,以及如何应对。

<<.s "解决过程中引入的概念:">>

负载,一般拆分成多个 ''负载因素''(load parameters)来描述,根据你的系统架构而有无不同,比如:

* requests per second to a web server
* the ratio of reads to writes in a database
* the number of simultaneously active users in a chat room
* the hit rate on a cache

<<.s "Twitter 例子:">>

Twitter 的场景是读多(300k rps)写少(4.6k rps)。一般有两种方案:

# 发推时写帐号自身的存储,读 timeline 时从关注的全部帐号中拉取帖子并进行合并和排序
# 发推时写帐号自身的存储,同时更新到关注者的缓存中;这样读 timeline 时不用去拉关注的帐号的内容进行合并

在读多写少的场景下,第二种方案的性能事实上比第一种好。但是 Twitter 有个特点时,部分名人有些非常多的关注量(上百万甚至千万),用第二种时会导致名人发帖时要写入的数据非常多,无法及时送达到全部关注者。最终 Twitter 结合了这两种方案来解决这个问题。

在这个场景中,Twitter 的 ''关键负载因素'',是用户的粉丝数分布(以及他们发推的频率)。你的系统根据自身的特点,也可能有它独特的负载因素。

!! Describing Performance

<<.s "从实际问题出发……">>

* 如果把一个负载因素增加(比如请求量增长一倍),保持系统资源不变(如 CPU、带宽、机器数等),你的系统的性能会受到怎样的影响?
* 接上,如果你希望系统性能不变,需要增加多少资源?

<<.s "应该如何描述性能?">>

不同类型的系统,用来描述性能的指标不一样。比如 Hadoop 类批处理系统(batch processing system),一般以 ''吞吐量''(throughput,即单位时间内处理的纪录数)来衡量。线上系统则一般以 ''响应时间''(response time)来衡量。

不同请求的响应时间各不一样。一般观察响应时间的 ''分布情况'' 来做判断:

{{ ddia-ch01-response-time-distribution }}

一般来说各请求的处理时间都应该是一致的,但是一些因素会引起的额外的延时,导致各请求响应时间不一致。比如进程切换、TCP 丢包重传、GC 引起进程中断等等。

从分布情况中,一般考虑这些点:

* 使用 percentiles 来衡量大部分请求的时延情况,比如 p95(即最快的 95% 的请求落在什么范围内),以及 p99、p999 等;这个方法能得出绝大部分用户的情况
* ''不考虑'' 使用平均数(mean / average),因为对于延时变化很大的场景,它并不能体现什么

有时候 p999 会显著大于 p95。High percentiles of response time,被称为 tail latencies。有些场景需要着重考虑 tail latency。比如亚马逊中,处理得最慢的请求往往是下单量很大的客户,他们的数据多导致了处理过慢。到了 p9999 时,优化最慢的请求往往已经变得性价比不高,因此对于 tail latency 的处理应该有合理的评估。

<<.s "非核心内容">>

service level objectives (SLOs) 和 service level agreements (SLAs),往往是以 percentiles 的形式描述的。比如 p50 的响应时间是 200ms,p99 的响应时间在 1s 内。服务的当机时间少于 0.1% 等等。

Head-of-line blocking(队头阻塞),是指后台程序在按顺序处理请求时,有部分请求执行时间过长,导致其后的请求在队列中等待了太长时间,从而引起整个系统性能降低的问题。

如果场景是用户需要发多个并行请求(比如动态加载内容的网页),并在全部请求都返回后才能处理(例如渲染出整个网页),那么最慢的请求会最终影响性能。这叫 tail latency amplification,放大了 tail latency 带来的影响。

<<.note "Latency(延时)与 response time 并不一样。Response time 是指客户端观察到的延时,包含了网络传输、请求在队列中等待被处理的时间等。Latency 则仅包含请求被程序实际执行的时间。">>

!! Approaches for Coping with Load

<<.s "应对负载增加的方法">>

常见的两种说法:

* Scaling up: 换更好的硬件,让单台机器更强(Stack Overflow 在很长一段时间是 [[这样做|http://highscalability.com/blog/2014/7/21/stackoverflow-update-560m-pageviews-a-month-25-servers-and-i.html]] 的)
* Scaling out: 堆更多的机器,是现在互联网服务常见的模式

有些系统是弹性的(elastic),可以根据负载变化自动扩缩机器。缺点是系统变复杂、可能应对不了一些异常的流量增长等。

无状态服务容易做 scaling out。有状态服务难。以前的惯常做法是,对数据库使用 scaling up 模式。但是未来 ''分布式数据库应该是标配''。

<<.s "Scaling Architecture 的考虑点">>

没有一个适配任何场景的 scaling architecture。考虑点有:数据存储的大小,读写数据的量,数据的复杂度,响应时间要求等等。比如一个 100,000 RPS,每次请求处理 1kB 数据的系统,与每分钟 3 次请求,每次处理 2GB 数据的系统,他们处理的数据量是一样的,但是架构完全不一样。

<<.s "非核心内容">>

对于创业团队,如果想法未被市场验证,应该优先开发速度而不是架构设计。因为设计出来的 scaling architecture 可能跟后面业务的模式不匹配,导致无用功。

! Maintainability

可维护性中的「维护」,包含了修复 bug、维护系统正常运转、增加新功能等等。考虑 Operability、Simplicity 及 Evolvability。

!! Operability: Making Life Easy for Operations

主要讲运维应该做什么事情来维护系统顺利运转。如监控、问题定位、打安全补丁、容量预估、运维工具开发、文档维护等等。

!! Simplicity: Managing Complexity

复杂的软件系统出 bug 机率高、维护成本高。

复杂的功能可以通过 ''抽象'',使得软件实现上简单直观。

!! Evolvability: Making Change Easy

应对需求变化、外界环境变化、商业模式变化等等情况,你的系统需要是可随时进化的。这往往构建在 simplicity 的基础上。但是作者说这个很重要,要单独列出来。
数据模型经常是一层叠一层的:

# 应用开发者一般会将现实世界的内容抽象成数据结构并提供 API 操作它们。这些数据结构一般是不通用的,仅适用于你的应用程序
# 为了存储或者展示这些数据,你经常需要使用 JSON / XML 文档,或者关系型数据库中的表等等
# 你所使用的数据库软件,会决定这些数据(比如关系型数据库中的表)在内存、磁盘或者网络上是怎样表现的,并且决定这些数据可以怎样被查询、修改等
# 在更底层,硬件工程师决定了各个字节怎样用电流、脉冲、磁场等形式来表示

Data models 有很多种,各自适合一些不同的场景。按你的应用的特性,选择好相应的 data models 是非常重要的事情。

! Relational Model Versus Document Model

Relational model 一开始被使用于事务处理(银行交易、航班预订等)和批处理上。后来变得通用化。同期的其他模型,如 network model 和 hierarchical model 都发展不起来。

!! The Birth of NoSQL

NoSQL 在 2010s 开始流行开来。NoSQL 表示 Not Only SQL,目标是为了避免或者解决 relational model 中的一些问题:

* 提高扩展性(scalability),特别是在大的数据集(dataset)和非常高的写入量时
* 优先使用开源软件而不是商业软件
* 支持一些 relational model 中无法比较好支持的查询方式
* 支持比 relational schema 更灵活、有表达力的数据模型

!! The Object-Relational Mismatch

普遍存在对 SQL 数据模型的一个批判是,它引入了 impedance mismatch,即在业务代码和数据库数据间需要一层转换(比如把一行数据转为一个类实例)。比如下面 Bill Gates 的简历中,涉及一对多的部分(Experience, Education, Contact Info),需要用额外的表来存储:

{{ bill-gates-resume-rdbms }}

当然新的 SQL 标准也加入了一些对结构化数据的支持,比如可以定义一个列为 JSON 数据,并对里面的 key 做索引等。不过这些能力并没有被广泛应用。

像简历这种 self-contained document,用 JSON 来表达是比较合适的。面向文档的数据库,如 MongoDB,RethinkDB 等支持这种数据模型:

```json
{
  "user_id": 251,
  "first_name": "Bill",
  "last_name": "Gates",
  "summary": "Co-chair of the Bill & Melinda Gates... Active blogger.",
  "region_id": "us:91",
  "industry_id": 131,
  "photo_url": "/p/7/000/253/05b/308dd6e.jpg",
  "positions": [
    {"job_title": "Co-chair", "organization": "Bill & Melinda Gates Foundation"},
    {"job_title": "Co-founder, Chairman", "organization": "Microsoft"}
  ],
  "education": [
    {"school_name": "Harvard University",       "start": 1973, "end": 1975},
    {"school_name": "Lakeside School, Seattle", "start": null, "end": null}
  ],
  "contact_info": {
    "blog": "http://thegatesnotes.com",
    "twitter": "http://twitter.com/BillGates"
  }
}
```

JSON model:

* 减少了 impedance mismatch,业务代码和数据模型结合更紧密
* 增进了 locality,查同样的内容,RDBMS 需要多次查询或者联表查询,document-oriented database 只需要一次
* Lack of schema:这个特性存在争论,有优点也有缺点,后面会有

!! Many-to-One and Many-to-Many Relationships

<<.s 问题:>>

上面的例子中,为什么表示区域和行业时,要选择 ID(`region_id`, `industry_id`)而不是直接用字符串(如 "Greater Seatlle Area" 和 "Philanthropy")来表示?

<<.s 原因:>>

用 ID 可以实现:

* 一致的样式和拼写
* 避免含糊不清(比如多个城市带有同个名字)
* 容易更新,比如城市名发生变化后
* 容易实现本地化,以别的语言展示
* 更好进行搜索,比如后台如果纪录了西雅图是华盛顿中的一个城市,那么搜「华盛顿里的慈善家」也可以搜索出 Bill Gates

用 ID 的好处是,它本质上对于人类来说没有含义,所以即使它背后的数据发生了变化,ID 本身也不用变。用 ID 也可以避免用具体文本带来的需要批量更新问题。去除数据库中的重复数据,这个过程称之为 normalization。

<<.s "Many-to-one Relationships and Many-to-many Relationships:">>

多对一关系(many-to-one relationships),比如「很多人居住在某个城市」(一般人只会居住在一个城市)。多对多关系(many-to-many relationships),比如「人们任职过某家公司」,一个人可能任职过多家公司,多家公司也可能有过不同的人任职。

对于这两种关系,一般适合在 RDBMS 中 normalize(因为有 join),但是在 document database 中则难以做到,它们的 join 能力一般会差一点。对于这种情况,你可能需要在应用代码中去做 join 的工作,比如发起多个数据库查询请求。

另外,即使 document database 适用于一开始的数据模型,但是随着业务发展,数据往往会倾向于互相有联系。

!! Are Document Databases Repeating History?

并没有。60s-70s 讨论过的 network model 和 hierachy model 对应用代码来说,使用的负担很重。

!! Relational Versus Document Databases Today

这一章主要从 data model 层面来做对比。

!!! Which data model leads to simpler application code?

视你的业务形态而定。如果业务逻辑中有很多 many-to-one / many-to-many relationships,那么 RDBMS 合适。如果是 one-to-many 居多,或者有 collection 中的元素类型不定,可以考虑 document-based。

!!! Schema flexibility in the document model

<<.s "schema-on-read v.s. schema-on-write:">>

Document database 经常被称作 schemaless,但是这是不准确的。实现上数据的结构、类型是隐式的,仅在数据被读取时才被解释出来,因此称之为 schema-on-read 更合适。而 RDBMS 也可以被称作 schema-on-write,即数据库会保证写入的数据符合 schema 的定义。

类比:

* Document databases, schema-on-read, 类似动态语言的运行时类型检查
* RDBMS, schema-on-write, 类似静态语言的编译期类型检查

<<.s "Data Migration:">>

Data Migration 涉及的数据变化的种类,见 [[Data Migration]]。

RDBMS 利用 “statically typed” database schema 的特性,可以在 DB 层面提供支持:

```sql
ALTER TABLE users ADD COLUMN first_name text;
UPDATE users SET first_name = split_part(name, ' ', 1);        -- PostgreSQL
UPDATE users SET first_name = substring_index(name, ' ', 1);   -- MySQL
```

Document database 则没有 DB 层面的 migration 功能,一般有这么几种做法:

* 单独写脚本去负责数据的迁移和回滚
* 数据在业务代码中被读取时才更新。这会带来额外的代码复杂度。

!!! Data locality for queries

对于读取:

* 如果读的数据,对于 relational model 来说需要多次联表,对于 document model 则不需要查多次,因此后者的数据本地性(data locality)强,即可以消耗更少的时间、I/O 查询出结果
* 如果 document 比较大,但是每次只需要读取其中一小块数据,那么 RDBMS 可能性能更佳

对于写入:

* 如果 document 比较大,但是写入时仅需要更新其中部分字段,那么:
** 如果写后 document 的体积没有显著变大,那么一般 document database 可以做到 in-place update,对性能影响小(参考 MongoDB [[文章|https://www.mongodb.com/blog/post/schema-design-for-time-series-data-in-mongodb]],关键字 "in-place update)
** 如果写后 document 的体积显著变大,则难以做到 in-place update,需要整个 document 重写进数据库,对性能影响大
* RDBMS 一般比较少存在这种问题

将关联的数据放在一起以增加本地性,必不仅是 document database 的做法。Google Spanner Database, Oracle, HBase 等均有类似的功能。

!!! Convergence of document and relational databases

document database 和 relational database 都在互相采纳对方优秀的点:

* 一些 RDBMS(如 MySQL,Postgres)支持将 XML / JSON 数据作为一列并将里面数据进行索引
* 一些 document database 支持 join,如 RethinkDB
* 一些 MongoDB driver 会在 client 通过多次查询模拟 join

! Query Languages for Data

<<.s "Imperative v.s. declarative">>

* SQL: a declarative query language
* IMS and CODASYL queried the database using imperative code

Declarative (声明式):

```sql
SELECT * FROM animals WHERE family = 'Sharks';
```

Imperative (指令式):

```javascript
function getSharks() {
  var sharks = [];
  for (var i = 0; i < animals.length; i++) {
    if (animals[i].family === "Sharks") {
      sharks.push(animals[i]);
    }
  }
  return sharks;
}
```

声明式描述想要的最终结果。指令式描述处理的过程。声明式在数据库领域取得了胜利,它的好处有:

* 对于使用者友好,更简单明了,使用者无需知道数据库底层工作原理
* 相对声明式,对数据库软件来说更容易优化,比如数据库可以在不影响上层用户使用的情况下,对引擎进行优化,利用多核 CPU 等特性

!! Declarative Queries on the Web

Declarative query 不仅局限于数据库。网页上也有类似的例子。考虑下面的 HTML 结构:

```html
<ul>
    <li class="selected">
        <p>Sharks</p>
        <ul>
            <li>Great White Shark</li>
            <li>Tiger Shark</li>
            <li>Hammerhead Shark</li>
        </ul>
    </li>
    <li>
        <p>Whales</p>
        <ul>
            <li>Blue Whale</li>
            <li>Humpback Whale</li>
            <li>Fin Whale</li>
        </ul>
    </li>
</ul>
```

如果你想将被选中的元素(`class="seleted"`)的标题(`<p>`)的背景色置为蓝色,你可以用 CCS 表达,它是声明式的:

```css
li.selected > p {
    background-color: blue;
}
```

如果不用声明式而用指令式,那么你可以用 JavaScript 这样写:

```javascript
var liElements = document.getElementsByTagName("li");
for (var i = 0; i < liElements.length; i++) {
    if (liElements[i].className === "selected") {
        var children = liElements[i].childNodes;
        for (var j = 0; j < children.length; j++) {
            var child = children[j];
            if (child.nodeType === Node.ELEMENT_NODE && child.tagName === "P") {
                child.setAttribute("style", "background-color: blue");
            }
        }
    }
}
```

这里的 JS 对应上面 CSS 的方法,有一些明显缺陷:

* JS 更长更难读懂
* 如果 `selected` class 被动态移除(比如用户点击了别的 `<li>`),JS 的方案并不会自动去掉蓝色背景;但是 CSS 的方案中,浏览器会自动检测到变化并去掉蓝色背景
* 如果 DOM 出了新的性能更好的 API,JS 需要被重写才能得到优化。但是如果是 CSS,优化可以被浏览器自己实现,不需要使用者关心

!! MapReduce Querying

MapReduce 是一个被用来在多台机器同时处理大量数据的 ''编程模型''。它的实现介于 declarative 和 imperative 之间:处理数据的逻辑是用代码表达的,同时这些代码被框架所重复执行。

<<.s "例子:">>

你是个海洋生物学家,你想统计每个月观察到的鲨鱼数量。

<<.s "纯命令式:">>

你可以在 PostgreSQL 数据库里面这样写:

```sql
SELECT date_trunc('month', observation_timestamp) AS observation_month,
       sum(num_animals) AS total_animals
FROM observations
WHERE family = 'Sharks'
GROUP BY observation_month;
```

<<.s "Using MongoDB’s MapReduce Feature:">>

```javascript
db.observations.mapReduce(
    function map() {
        var year = this.observationTimestamp.getFullYear();
        var month = this.observationTimestamp.getMonth() + 1;
        emit(year + "-" + month, this.numAnimals);
    },
    function reduce(key, values) {
        return Array.sum(values);
    },
    {
        query: { family: "Sharks" },
        out: "monthlySharkReport"
    }
);
```

比如像这样的 `observations`:

```javascript
[{
    observationTimestamp: Date.parse("Mon, 25 Dec 1995 12:34:56 GMT"),
    family: "Sharks",
    species: "Carcharodon carcharias",
    numAnimals: 3
},
{
    observationTimestamp: Date.parse("Tue, 12 Dec 1995 16:17:18 GMT"),
    family: "Sharks",
    species: "Carcharias taurus",
    numAnimals: 4
}]
```

会先经过 `map` 处理,`emit` 出两个 k-v 对,`("1995-12", 3)`, `("1995-12", 4)`。这两个 k-v 对在 `reduce` 时被聚合,`reduce("1995-12", [3, 4])`,结果返回 7。

<<.s "总结:">>

对于 MapReduce 模型而言,`map` 和 `reduce` 函数是指令式的,你可以在里面实现简单的处理逻辑。整个框架是指令式的,一般框架都会将数据切分成多块到多台机器并行 `map`,最终再 `reduce` 回来。

一般 `map` 及 `reduce` 函数的实现,都必须是纯函数,即无副作用的。比如他们不能查询数据库,或者对外部数据有修改,而仅仅应该接受输入参数的数据并做处理。这使得框架可以以任意顺序运行函数,或者失败时进行重试。

MapReduce 模型并 ''不是'' 分布式数据处理的必须。很多数据库也实现了分布式处理,但是不用 Map-Reduce。SQL 的语法并不关心底层是 Map-Reduce 还是其他实现。

<<.s "扩展:">>

MapReduce 的编写难度相对高,而且 DB 引擎难对其进行优化。因此 MongoDB 也提供了一种声明式查询语言 aggregation pipeline:

```javascript
db.observations.aggregate([
    { $match: { family: "Sharks" } },
    {
        $group: {
            _id: {
                year: { $year: "$observationTimestamp" },
                month: { $month: "$observationTimestamp" }
            },
            totalAnimals: { $sum: "$numAnimals" }
        }
    }
]);
```

这可能是 JSON 形式的 SQL reinvent。

! Graph-Like Data Models

<<.note "这种数据模型在应用上不广泛,在比较少的领域,如数据分析、知识图谱、SEO 优化等场景被使用到。">>

这类模型适用于关系非常复杂的场景:

* 社交网络图,人是点(vertices),关系是线(edges)
* 网页图,页面是点,页面上的超链接是线
* 铁路图等

这类模型中的典型问题之一,计算两地的最短距离。

点(vertex)所表示的数据,不一定需要是相同类型的(homogeneous)。比如 Facebook 中,点即可以代表一个人,也可以代表打卡过的地方、评论和事件等等。

下面是一个图所结构化的示例:

{{ ddia-ch02-graph-example }}

!! Property Graphs

Property graph model:

* 每个点由这些信息组成:
** 唯一 ID
** 一组以此点为起点的边
** 一组以此点为终点的边
** 一组 k-v 对,用来表示属性
* 每个边由这些信息组成:
** 唯一 ID
** 边的起点(the tail vertex)
** 边的终点(the head vertex)
** 一个标签(label),用来表示两个点间的关系
** 一组 k-v 对,用来表示属性

如果用关系型数据库的表来表达:

```sql
CREATE TABLE vertices (
    vertex_id integer PRIMARY KEY,
    properties json
);
CREATE TABLE edges (
    edge_id     integer PRIMARY KEY,
    tail_vertex integer REFERENCES vertices (vertex_id),
    head_vertex integer REFERENCES vertices (vertex_id),
    label       text,
    properties  json
);
CREATE INDEX edges_tails ON edges (tail_vertex);
CREATE INDEX edges_heads ON edges (head_vertex);
```

这种模型灵活性很高。你可以表示不同颗粒度的信息,比如 Lucy 的当前居住地为具体某一城市,但是它的出生地可以只标记在州这一级别。扩展性也很高。你可以往图中不停加入新数据,比如将 Lucy 的过敏源纪录进来,并纪录各过敏源所对应的食物,这样就可以判断出 Lucy 不能吃哪些食物。

!! The Cypher Query Language

Cypher 是 property graph 模型的一个声明式的查询语言。上面的例子用 Cypher 出来是这样的:

```sql
CREATE
  (NAmerica:Location {name:'North America', type:'continent'}),
  (USA:Location      {name:'United States', type:'country' }),
  (Idaho:Location    {name:'Idaho',         type:'state'}),
  (Lucy:Person       {name:'Lucy' }),
  (Idaho) -[:WITHIN]->  (USA)   -[:WITHIN]-> (NAmerica),
  (Lucy)  -[:BORN_IN]-> (Idaho)
```

有了数据后,我们就可以用 Cypher 查询出想的数据,例如查询出生在欧洲,但是居住在美国的人群:

```sql
MATCH
  (person) -[:BORN_IN]->  () -[:WITHIN*0..]-> (us:Location {name:'United States'}),
  (person) -[:LIVES_IN]-> () -[:WITHIN*0..]-> (eu:Location {name:'Europe'})
RETURN person.name
```

上面的例子表示要找到任何满足下面条件的人:

* 它有一个 outgoing 的 `BORN_IN` 边,边的终点通过 `WITHIN` 链(`[:WITHIN*0..]`)最终指向 `name` 为 `United States` 的点
* 它有一个 outgoing 的 `LIVES_IN` 边,边的终点通过 `WITHIN` 链(`[:WITHIN*0..]`)最终指向 `name` 为 `Europe` 的点

<<.note "如果有 `person` 的数据是直接 `BORN_IN` United States 而不是下面的具体地区,这条查询也是能查到数据的。因为 `-[:WITHIN*0..]->` 表示要匹配的点可以没有 outgoing 的 `WITHIN` label。">>

使用指令式时,数据库引擎可以自动选择最高效的方式来执行查询,

* 它即可以从 `Person` 数据开始,找到最终的 `Location` 数据;
* 也可以从 `Location` 数据开始筛选,最终反向找到需要的 `Person`

!! Graph Queries in SQL

SQL 也可以表达上面的查询,但是会复杂很多。需要使用 recursive common table expressions。这里不详细描述。

!! Triple-Stores and SPARQL

Triple-Stores 的基本原理是,将数据表达为 `(subject, predicate, object)` 组成的三元对,比如 `(Jim, likes, bananas)`。其中:

* `subject`,对应 property graph 中的 vertex
* `object`,
** 可以是原子类型(如字符串或者数字),对应 property graph 中 vertex 的 properties
** 也可以是图表中的另外一个 vertex,此时三元对对应 property graph 中的边
* `predicate` 则类似于 property graph 中的边的 label

例如:

```
@prefix : <urn:example:>.
_:lucy     a       :Person.
_:lucy     :name   "Lucy".
_:lucy     :bornIn _:idaho.
_:idaho    a       :Location.
_:idaho    :name   "Idaho".
_:idaho    :type   "state".
_:idaho    :within _:usa.
_:usa      a       :Location.
_:usa      :name   "United States".
_:usa      :type   "country".
_:usa      :within _:namerica.
_:namerica a       :Location.
_:namerica :name   "North America".
_:namerica :type   "continent".
```

Triple-Stores 在设计之初并没有准备作为 semantic web 的实现手段,但是在 2000s 开始讨论并流行的 semantic web 风潮借鉴了它。The semantic web 认为网页已经是 human-readable 的了,那么为何不更进一步将其中的数据,变成 machine-readable 呢?期望最终达成 a kind of internet-wide “database of everything”。但是一直没有好的实现出现,同时标准屡次修改,后来并没有被推广开。

在此过程中产生了 Resource Description Framework (RDF)。RDF 虽然也是 triple-store 的理念,但是使用 XML。同时产生了 SPARQL (SPARQL Protocol and RDF Query Language),它是一门设计得不错的查询语言,后来前文提到的 Cypher 借鉴了它:

```sql
PREFIX : <urn:example:>
SELECT ?personName WHERE {
  ?person :name ?personName.
  ?person :bornIn / :within* / :name "United States".
  ?person :livesIn / :within* / :name "Europe".
}
```

!! The Foundation: Datalog

<<.tip "下面的 Datalog 例子感觉非常 inspiring。需要重点理解。">>

Datalog 这门查询语言比 SPARQL 及 Cypher 更老,在 80 年代被广泛用于教学上。它的一个实现,Cascalog,被使用在 Hadoop 的数据处理和查询功能中。

Datalog 的数据模型与 triple-store 类似,但它使用的是更泛化的 `predicate(subject, object)`,如:

```
name(namerica, 'North America').
type(namerica, continent).

name(usa, 'United States').
type(usa, country).
within(usa, namerica).

name(idaho, 'Idaho').
type(idaho, state).
within(idaho, usa).

name(lucy, 'Lucy').
born_in(lucy, idaho).
```

对于之前用其他模型实现过的,查询生于欧洲但是现居住于美国的人,可以这样实现:

```
within_recursive(Location, Name) :- name(Location, Name).      /* Rule 1 */

within_recursive(Location, Name) :- within(Location, Via),     /* Rule 2 */
                                    within_recursive(Via, Name).

migrated(Name, BornIn, LivingIn) :- name(Person, Name),        /* Rule 3 */
                                    born_in(Person, BornLoc),
                                    within_recursive(BornLoc, BornIn),
                                    lives_in(Person, LivingLoc),
                                    within_recursive(LivingLoc, LivingIn).
?- migrated(Who, 'United States', 'Europe').
/* Who = 'Lucy'. */
```

对比于 Cypher 和 SPARQL 使用一条 SELECT 语句查出结果,Datalog 采用了更渐进式的方式来做。上面定义了三条规则,用来告诉数据库如何生成新的 predicate,比如 `within_recursive` 及 `migrated`。然后用这些新的 predicate 进行查询。

理解这几条规则的要点在于:

* 大写字母开头的表示变量,如 Location, Name, Via 等
* 每提供一条规则给到数据库,数据库会按此规则扫描现有的 predicate 并生成新的 predicate
* 生成新的 predicate 的前提是,`:-` 操作符中定义的条件需要全部满足

例如:

```
// Existed predicate applied with rule 1, new predicate generated:
+ name(namerica, 'North America') 
    => within_recursive(namerica, 'North America')
      
// Existed predicate, cooperate with predicated generated in previous rule, applied with rule 2:
+ within(usa, namerica)
+ within_recursive(namerica, 'North America')
    => within_recursive(usa, 'North America')
```

下面的图描述了这一过程:

{{ ddia-ch02-datalog }}

Datalog 的查询方式,在写一次性查询时会略显啰嗦,但是在处理复杂数据时会更强大更易理解。
这一章讨论了 ''数据库系统如何高效地存储、读取数据''。

根据用途不同,存储引擎的设计也不同:

* ''针对事务性的(transactional)场景'',一般有两类存储引擎,分别是 ''log-structured'' 和 ''page-oriented''
* ''针对分析(analytics)数据的场景'',还有 ''column-oriented''

下面会分别针对这几种存储引擎进行分析。

!! Data Structures That Power Your Database

这一节构建了一个简单的基于纪录(log-structured)的数据库,存在一个名为 `database` 的数据库中,为 key-value 形式,每一行前面的逗号即为 key:

```shell
$ cat database
123456,{"name":"London","attractions":["Big Ben","London Eye"]}
42,{"name":"San Francisco","attractions":["Golden Gate Bridge"]}
42,{"name":"San Francisco","attractions":["Exploratorium"]}
```

''查找数据时,需要线性遍历文件数据'',根据纪录数的变化,查询所需时间也线性变化,时间复杂度为 $$O(n)$$。写入数据时,''只往后追加数据'',不修改原有的数据。追加数据是顺序写,I/O 的消耗最少;如果在原地修改原有数据,假如新数据长度大于原数据,会造成后面大量数据需要重写,影响性能。

为了''加速查询'',引入 ''索引''(index)来辅助记录数据库的元信息。''索引会增加写入数据时的消耗''(因为需要更新索引),但是会加速查询。

!!! Hash Indexes

<div class="box">

前置的总结,''log-structured 数据库的要点'',涵盖了 Hash Indexes 和 SSTables and LSM-Trees 两节的内容:

{{ log-structured-database }}

</div>

最简单的索引是 ''哈希索引'',即纪录每个 key 所对应的纪录在数据库文件中的位置:

[img width=700 [ddia-ch03-hash-index]]

另外,由于写数据时都是 ''追加写'',这会导致

* 数据库文件 ''无限膨胀'',可能超过文件系统能支持的单文件大小
* 一个 key 可能出现多条纪录,但只有最后的纪录是有效的,还可能消耗完所有的磁盘空间

''数据库文件分片''(data file segment)及数据压缩(compaction)用来解决这个问题。文件分布的意思时,数据库不在集中在一个文件中,而是可以分散在多个文件中。压缩是指把同个 key 的老数据清理掉。一般来说,压缩会在一个单独的背景线程下工作,一旦压缩完成,生成新的 segment 文件和索引后,数据库便可以使用新的索引和数据文件,再把老的索引和文件删除:

[img width=700 [ddia-ch03-compaction-and-segment-merging]]

上述的模型只考虑了简单的点。其他重要的细节包括:

; 文件格式(file format)
: CSV 作为文本格式在性能上不如二进制格式。应考虑使用二进制格式。
; 删除纪录(deleting records)
: 如果要删除一个 key,应该向数据库写进一条删除纪录。这样数据库在压缩合并分片文件时,可以将这个 key 的纪录全部删除。
; 崩溃恢复(crash recovery)
: 重启时需要扫整个数据库文件以重建索引,比较耗时。一个优化点时,将索引也落盘以省去重建过程。
; 只写了部分数据的纪录(partially written records)
: 数据库可能在写纪录写一半时崩溃。需要加个校验码等机制来确保数据是完整的。如果数据校验时不一致,可以丢弃掉不一致的数据。
; 并发控制(concurrency control)
: 假如有两个请求同时要求写入数据,可能会引起数据库文件混乱。一个解决方法是只提供一个写入线程。

这种模型的 ''缺点'' 是:

* 用来作为索引的哈希表需要存在内存中。如果 ''key 数量太多'',内存可能不够用。''在磁盘上使用哈希表性能差'',经常需要大量随机 I/O 访问,而且也不易实现
* ''很难做范围查询''。比如查 `kitty00000` 到 `kitty99999` 之间的所有数据时,需要遍历整个哈希表

!!! SSTables and LSM-Trees

Sorted string table(SSTables)指文件分片(segment)是排好序的。这种形式的好处是:

* 压缩合并分片文件时性能更高,对内存要求更少
* 不用全部纪录都落索引,可以只落一部分。其他 key 在数据文件中的位置,通过已有的索引进行判断<div>
[img width=600 [ddia-ch03-sparse-index]] 

</div>

再进一步,由于 hash table 没有排序且存储在磁盘中难高效使用,Log-Structured Merge-Tree(LSM-Tree)是更好的选择。这类树结构可以将 key 排好序,一般用红黑树或者平衡树实现。好处是:

* 写入数据时写进这个树结构中(有时称之为 memtable),不再直接写到数据文件中
** 等树中的新纪录数量达到一定程度时,再结合压缩合并过程,将其落盘
** 写一个单独的 WAL 防 crash

上述的各种方案中,如果 key 不存在,都需要查索引以及查询所有分片文件。''可以用 bloom filter 来快速判断一个值在不在数据文件中,避免这部分查询的消耗。''

!!! B-Trees

B-tree 是用于索引时最流行的数据结构。笔记纪录在 [[B-Tree]]。

!! Comparing B-Trees and LSM-Trees

{{ Database: Concept: Index Data Structure Comparison }}

!! Other Indexing Structures

如果索引中的 key 不唯一(即一个 key 可能有多行),两种方法:

* 每个 key 的值为一个包含多行的列表
* 每个 key 与其下的每个行中的唯一标识(一般是主键)组合成一个复合的 key

!!! Storing values within the index

数据库查询发生时,一般会先在索引中查找 key。而 key 所关联的行(或者 NoSQL 中的 document、图数据库中的 vertex),可以跟索引存在一起,也可以单独存在另外的位置。

这两种情况下的索引,分别称作:

* ''聚簇索引''(clustered index):数据与索引保存在一起
* ''非聚簇索引''(nonclustered index):索引只保存到数据的引用

非聚簇索引下,数据 ''存在另外的位置'',这个数据文件被称为 ''heap file''。heap file 特征:

* 使用广泛,''可以在多级索引的场景下避免数据重复''
* 如果更新数据库纪录时没有修改 key 本身,''那只需修改 heap file'' 而不需要动到索引
* 如果修改后的数据量不超过原有的,可以实现 ''原地修改''(overwritten in place),是比较高效的

''索引 key 与其关联的数据存在一起时'',这个索引被称为 ''聚簇索引''。InnoDB 的主键即是聚簇索引,其他二级索引会指向主键索引。

这两种方式的折中是,使用 ''covering index'' 或称 ''index with included columns'',即保留表的一些常用列到索引中。这样当查询只查到这些列时,索引就能覆盖(cover)到了,不再需要去查 heap file。但这种数据的重复,会带来额外的写消耗,以及需要额外的代码保证一致性。

!!! Multi-column indexes

前文所述的是基于单列的索引。如果有多列一起形成的索引,有几种方法:

* 使用 ''concatenated index'',即把多列的值连起来合成一个值。但查询时要遵循 ''最左前缀原则''(leftmost prefix)([[MySQL 文档|https://dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html]]),不然无法使用索引
* 使用 ''multi-dimensional indexes''。这种方式不再使用 B-tree,而一般使用 R-tree。PostGIS 是一个例子。我没有深究

!!! Full-text search and fuzzy indexes

上述索引进行的是 ''精确匹配'',但在搜索的场景往往需要 ''模糊匹配''。给定一个搜索词,可以搜近义词、修正 typo、忽略语法上的不同变化(比如过去式)等等。ES 中的 Lucene 是一个例子。实现细节文中没有深究。

!!! Keeping everything in memory

''内存数据库''(in-memory database)是将数据主要放在内存中的数据库。特点:

* 内存访问速度快,但空间小,单位存储成本高
* 内存掉电后丢失数据
** 有些实现,如 Memcache,只作缓存层,因此数据丢失只要再重新缓存
** 有些实现会定期将数据落盘或者通过网络发给备机,数据丢失时重建
* 内存数据库的性能优势,''不在于可以从内存(而不是硬盘)读取'',因为假如数据不多,基于硬盘的数据库中的数据也经常被 OS 缓存在内存中;而在于 ''不需要维持一个用于写入硬盘的数据结构'',比如 B 树
* 不仅仅是 key-value 型,也 ''可提供关系模型'',还可提供 RDBMS 不容易实现的复杂数据结构,比如优先级队列和集合
* 通过换页,也可支持数据量比内存更大的情况

!! Transaction Processing or Analytics

''Transaction processing'' 并非指数据库中的、带 ACID 能力的事务功能,而是指通常意义的「''一个业务操作''」,比如添加一个条目、发送一条消息等等。它通常要求客户端请求的延时低,对比于早期的批处理系统。

''Analytics'' 指''数据分析'',即通过数据库做统计和分析,比如本月的收益有多少。

对这两者的处理,分别叫做:

* OLTP (online transaction processing)
* OATP (online analytic processing)

对比如下(直接摘抄书中表格):

|!Property |!Transaction processing systems (OLTP) |!Analytic systems (OLAP) |
|Main read pattern |Small number of records per query, fetched by key |Aggregate over large number of records |
|Main write pattern |Random-access, low-latency writes from user input |Bulk import (ETL) or event stream|
|Primarily used by |End user/customer, via web application |Internal analyst, for decision support |
|What data represents|Latest state of data (current point in time)| History of events that happened over time |
|Dataset size|Gigabytes to terabytes |Terabytes to petabytes |

早期的大家使用同样的数据库做事务性处理和统计分析。后来随着数据库发展,有 ''专门的数据库被设计出来处理数据分析''。

!!! Data Warehousing

数据仓库中的数据,一般是从线上数据库中通过转存(dump)或者流式更新(continuous stream of updates)复制过来的。在此过程中,会做数据变换、清理成适合分析的形式,再落入数据仓库中。这个过程叫作 Extract-Transform-Load(ETF):

[img width=700 [ddia-ch03-etf]]

数据仓库为分析的场景做了优化,它的索引结构跟 RDBMS 不太一样。但书中也没有继续深入。

数据仓库大多数也支持 SQL 查询。

!!! Stars and Snowflakes: Schemas for Analytics

在数据仓库中,大多数的数据 schema 是类似这样的星形,由一个中心的 fact 表格引用非常多 dim(维度,dimension)表格:

[img width=700 [ddia-ch03-star-schema]]

与此类似,还有雪花形的 schema,即是 dim 表也引用其他的 dim 表。

!! Column-Oriented Storage

大多数的 OLTP 数据库中,数据是以行的形式保存的(row-oriented)。但有一些场景下,一个表的列非常多(100+),而你只需要使用其中的几列。如果在 row-oriented 的数据库中,你需要读完整的一行,而行中的绝大多数数据是你不需要的,非常耗性能。而有些 OLAP 系统实现了 column-oriented,即 ''数据是按的形式存储'',这样只使用其中几行时,效率非常高。

!!! Column Compression

由于同一列中的数据,''类型和数据往往相近且取值范围小'',因此适合做压缩。比如数据仓库中经常使用的 ''bitmap encoding'' 来做压缩:

[img width=700 [ddia-ch03-bitmap-encoding]]

上面的例子中,`product_sk` 的取值只有非常少的 6 种,因此适合用 bitmap encoding。当遇到这种查询时:`WHERE product_sk IN (30, 68, 69)`,数据仓库也能高效处理。

<<.info "Column-Oriented Storage 这一节中的其他内容,不再细看。一方面作者并没有花很大篇幅去写,不够深入;另一方面自己也没有使用 OLAP 系统的需求。这一节结束后,本章结束。">>
📝 原书笔记:

<<display-pdf path:"/files/books/designing-data-intensive-applications/chapter-04.pdf" title:"chapter-04.pdf">>

重点内容:

* 代码与数据的双向兼容
** 向前兼容:老代码读新数据
** 向后兼容:新代码读老数据
* 编码格式
** 语言内置的格式,如 Java 的 java.io.Serializable,Python 的 pickle 等
** 纯文本编码格式,如 JSON、XML
** 二进制编码格式,如 Thrift、Protocol Buffers
* 不同编码格式如何支持 schema evolution
* 数据是如何流动的
** 通过数据库(一方写,另一方在未来某个时间读)
** 通过服务间调用(一方发起,另一方马上回复)
** 通过异步的消息传递(一方发起,另一方稍候处理)
📝 原书笔记:

<<display-pdf path:"/files/books/designing-data-intensive-applications/chapter-05.pdf" title:"chapter-05.pdf">>

重点内容:

* 为什么要复制数据?
** 离用户更近,提升可用性,支持更多请求量
* 复制数据时,采用同步还是异步?
* 三种复制模式:
** 单 leader(主从复制)
*** 如何加入新的 follower
*** 如何处理节点故障
*** 同步日志的实现方式:''statement-based'', ''row-based'', WAL shipping, trigger-based
*** 主从不一致(同步时的延迟导致)引起的问题
**** 读不到自己刚发的数据
**** 先读到多条数据,刷新时数据变少了(回到以前某个状态)
** 多 leader
*** 多组 leader + follower。组内延用单 leader 的模式,组之间通过各 leader 互为 follower 同步数据
*** 相对单 leader 提升了可用性;''不主流'';可用于多 datacenter
*** 可以离线编辑的应用(如日历、Google Docs),可以当作多 leader 模式,本地和 server 端的数据分别是两个 leader
*** ''难以解决数据冲突问题''(但书中给了一些方法)
** Leaderless
*** 特点:
**** 允许客户端向任意节点写入数据。不保证多条消息的写入顺序在各节点一致
***** 实现上:有些是客户端需要写多个节点;有些是客户端写到一个协调节点(coordinator node),再由这个节点向其他节点写入
**** 可用性非常高,允许一部分节点挂掉
*** Quorums consistency: w + r > n,即读取的节点数与写入的节点数应该有重叠。但这仍不能保证总是读到最新的数据
*** 检测冲突的内容中,''happens-before 及后面的内容我没有看了'',有需要了解时找一个现成产品看看
{{ Database: Transaction }}
📝 <<coslink "原书笔记" "/files/books/designing-data-intensive-applications/part2-prologue.pdf">>

重点内容:

* 垂直扩展与水平扩展
* 分布式系统中数据被分发的方式:
** 复制(replication)
** 分区(partitioning)
Preface 章节里面,描述了这本书的时代背景:

* 数据量越来越大
* 开发过程越来越敏捷,要求有快速试错能力
* 开源程序在代替商业程序成为核心骨
* CPU 性能不再显著增加,导致并行计算越来越重要
* 因为 AWS 等服务存在,大型分布式服务的门槛越来越低
* 很多服务对可用性的要求越来越高

Data-intensive 与 compute-intensive 不一样,data-intensive 注重于解决这类场景:

* 数据量大
* 数据复杂
* 数据变化快

而 compute-intensive 注重于解决计算能力是瓶颈的地方。

与 data-intensive 应用有关的一些技术有:数据库、消息队列、缓存、search indexes、frameworks for batch and stream processing 等等。这些技术虽然快速发展,但是都有一些原则,来判断你的场景是否适合使用这些技术。这本书即是来阐述这些原则,并指导你使用这些系统搭建自己的 data system。
设计模式主要是在这本 [[Design Patterns: Elements of Reusable Object-Oriented Software|https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612]] 中被提出来的。

但是 Peter Norvig 在 1996 年发表演讲,认为对于动态语言(Lisp / Dynamic Language)来讲,23 种设计模式中的 16 种将失去作用或者变得更简单。后来《设计模式》的作者出来说,设计模式主要是针对类似 C++ / SmartTalk 这类静态语言的。

这本书出版 20 年后(2014 年),Ralph Johnson 认为这本书太过于强调「使用了设计模式」的这一结果而不是为何要使用这一设计模式的思考过程(Too much emphasis on patterns as end-points instead of steps in the design patterns.)。

所以在编程语言越来越现代化,各自互相借鉴新特性的情况下,设计模式可能变得''不再重要'',或者只有具体的一些领域(比如 GUI 编程)上有它的作用。

如果要学习设计模式在 Python 上的应用,可以考虑看看这个 [[视频|https://www.youtube.com/watch?v=bPJKYrZjq10]] 和对应的 [[slide|http://www.aleax.it/europ11_pydp.pdf]]。


! 开发文档工具

Mac 下公认 Dash 最佳。

Windows 上没有 Dash,但是有两个与 Dash 通用 docsets 的软件,分别是 Zeal 和 Velocity。但是他们在界面和易用性上都比较差。

''最佳''的选择应该是 DevDocs。它有几个优点:

# 文档非常多,涉及各语言和流行的库类
# 排版一致,减少了心智负担
# 而且搜索极快,浏览器上做的搜索(虽然不支持全文检索)

但是它也有一些局限性。它不支持全文检索,作者强调 DevDocs 不是 Google,它要做到的是最快速度地搜索到可能需要的东西,而全文搜索会带来大量可能无关的信息,增加筛选的负担。这使得有一些场景并不适合用 DevDocs 解决,比如查出错信息、查模糊的 API、概念等。


获取技术信息的方法、渠道。

这里的 platform 只是一个粗略的词用来描述这几类主流的开发类型。并不是指诸如 Intel / ARM 等不同 CPU 架构的平台,也不是指 Windows、Linux 或 Mac 等不同系统的平台。


收听链接:[[得意忘形:#45:第一季番外篇之「金钱的意义」|https://www.lizhi.fm/1959617/2665553089813079046]]。

这期对我来说非常有意义,主播们聊了一些我觉得非常有价值的话题,使得我在一天内听了两次。当时边听边用 Daylio 纪录了想法。

---

听播客的好处有时候比看书强。比如我看「少有人走的路」,虽然很多人都力捧这本书,但是我看的时候没有感受到太多 inspring 的东西。可能书的内容挺好,但是由于翻译和文字这种媒介本身并不能给到足够多的信息,你不知道作者描述这些内容时是怎样的形象、语气、心态,感染力上并不如播客。而且播客往往还有多人对话,有问答,有观点的碰撞,而书本缺乏了这一点(当然写得好的书也会让你觉得在跟作者对话,比如Fluent Python),所以播客带来的体验很大程度上比书籍要好。当然好的播客内容也相对难发现一点。

!! 07:15

传统观念中一旦工作即定型,一生做一件事情。但有一些人觉得,人生应该是阶段性的。有个硅谷人提供了一种 new kind of retirement。每工作五年 gap 一年,想想后面应该做什么,怎么做。人是需要做长线思考的。

!! 14:35

End game 指中长期的一个目标。

个人如何去掌握 end game?人最终都会去做自己想做的事情(注:当然是在一个人有意愿有能力达成的情况下)。「以后我大概想过什么生活?」需要准确地具象化。描述出来会变成一个蓝图。知道你想达成的生活方式,去反推需要做的准备。

有路线图、有计划是非常重要的。虽然计划往往不能被完整地执行,但是一旦有计划,你至少知道下一步应该做什么。没有计划则很难迈开步子去做。

!! 34:30

构建一个可以给你建设性反馈的圈子。比如做什么事情,如果没人给你反馈,可能会走弯路。如果你想做一件事情、一个决定,生活中没人给你批评性的建议,或者他对你的想法表示赞同,那你可以尝试要求他从反面去提一些意见。

!! 1:03:00

人在年轻的时候应该学习逻辑学、如何写作、演讲、批判性分析、钱是怎么流动的。播主也很推崇查理芒格。

!! 1:15:25

自由不意味着你拥有多少东西,而意味着你不需要去拥有多少东西。

!! 1:19:30

「得意忘形」的播客简介写到:

> 《得意忘形》是一个主张追求个体自由与探寻真理的媒体计划。我们见证了第一次工业革命以来科技对人类社会的极大推动与助益,但也意识到资本主义与市场经济不可避免地催生了 ''消费文化''、''剥夺了个人价值''、并''窃取了大众时间''。带着对生命的有限性与无目的性的敬畏,我们试图为读者与听众提供更全面的觉察自我与认知世界的工具,以不断重建当下的方式穿越时间、抵达生活的本质。

我加粗了我觉得讲得好的部分。要让自己过得快乐,并不需要花很多钱。财务自由本来是为了让我们自由,现在反而成为了一种绑架。并不是你能买多少东西才是财务自由。

!! 1:21:30

人很容易被过去的经历所绑架。比如小时候家里穷,长大了有钱了就各种买买买给自己,但是你真的喜欢 / 需要这些买买买,还是说小时候的经历让你这样?

!! 1:23:30

有钱的作用是,让你不容易被钱绑架,知道自己喜欢什么不喜欢什么,更好地做判断。

!! 1:29:15

钱的道德化。这个社会有一种倾向,就是谈钱很俗。

!! 1:33:00

播客的一个意义是,提供一些观点一些生活供你参考,帮你构建你的短期 end game。Vlog 我觉得也是。

!! 1:40:00

意外惊喜:做一件事情,你得到的往往跟你想象的不太一样,很可能会超出你的预期。''过程即奖励''。这种观点跟李笑来的 [[serendipity|https://b.xinshengdaxue.com/A18.html]] 论很相像。

对于英语学习来讲,翻译软件是必不可少的。目前我的使用场景大多数是英文翻译成中文,尝试了一些翻译软件后,最终选择的是:

* PC 端(Windows / Linux):Goldendict([[官网|http://goldendict.org]]|[[GitHub|https://github.com/goldendict/goldendict]])
* Android 端:欧路词典([[官网|https://www.eudic.net/eudic/android.aspx]]|[[Google Play|https://play.google.com/store/apps/details?id=com.qianyan.eudic]])

!! 安装

!!! Windows

留意一下目前它官网上的版本是 2010 年的一个非常老的版本,不是太好用。用 scoop 去安装,或者去 GitHub 的 [[wiki|https://github.com/goldendict/goldendict/wiki/Early-Access-Builds-for-Windows]] 上下载最近的 Beta 版。

!!! Linux

Arch Linux 的官方仓库已经有 GoldenDict,直接安装即可。但是默认不带构词法文件,需要手动下载添加。官网的 [[下载页|http://goldendict.org/download.php]] 有说明。

如果查词时,点击发音按钮无法播放,参考 [[这里|https://wiki.archlinux.org/index.php/PulseAudio#libao]] 将 audio driver 从 ALSA 换成 pulse。

<<.tip "对于中文翻译成英文的,目前还没有找到太好的办法,基本上是靠 Google Translate 翻译后再逐词研究。后面有需求时再看看有什么好办法。">>

!!! Android 

* GoldenDict:直接在 Play Store 下载
* 欧路词典:在国内应用市场或者官网下载,不要去 Play Store 下载;Play Store 版本往往会缺一些本地化功能

!! 词典

安装完成后,需要导入词典才可查询。

* 这个 [[知乎回答|https://www.zhihu.com/question/20961302/answer/37433547]] 介绍了一些质量高的词典
* GoldenDict 网站上提供了非常好的 [[词典资源索引页|http://goldendict.org/dictionaries.php]](但是我没用过)

目前我最钟爱的词典是 Longman 5 DOCE,解析详尽、通俗易懂,同时又带了大量有发音的例句。

!!! GoldenDict 使用的词典

GoldenDict 使用 ABBYY Lingvo 词典文件 (`.dsl` 后缀)。网上有网友做了非常赞的词典(盗版),内容来源自各词典的提供的 CD。我把它们放在 [[Google Drive|https://drive.google.com/drive/u/0/folders/0B53FkIQeYar7akRLWU91XzRpOFE]] 中。

导入词典的操作方式很容易在软件界面中找到。

!!! 欧路词典

欧路词典使用 Mdict 词典文件(`.mdx` 后缀)。我放了一份 Longman DOCE 5 的 MDX 词典在 Google Drive 上,路径 `Resources/Dictionaries/Longman 5 MDX`。

!! 使用 Tips

GoldenDict:

# 词典选项中有构词法(morphology)规则库的选项,将英语构词法加上,这样查词的时候,复数、各种时态的词,都可以查到原词
# 皮肤用 “Lingvo” ,相对好看
# 一般用 <kbd>Ctrl-C-C</kbd> 热键,用剪贴板来取 PDF / 网页中的词
# 如果想 Google Translate 来翻译整段句子,看看这个我写的这个 [[项目|https://github.com/onlyice/google-translate-cli]]

!! 为什么不使用其他词典软件?

* 有道词典:广告太多,推送内容太多
* Lingoes:词典并没有 GoldenDict 好,不跨平台
* Babylon:感觉很难用
|!Name |明智行动的艺术:成功决策必须避免的52个思维陷阱 |
|!Author |[德]罗尔夫•多贝里 [译]刘菲菲 |
|!Edition |N/A |
|!Release Date |July 2013 |
|!ISBN-13 |978-7508641287 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

下面的内容是我在微信读书上做的点评和笔记。

!! 点评

非常短的一本故事书,52 章每章都配有几个简短的故事和背后的道理。故事容易看,但是有些道理缺乏生活经验辅助消化。

!! 前言


> 总而言之:我们不需要额外的智慧、新的想法或更多的行动,我们只要更少的愚蠢。这条提升之路是通过否定方式实现的。

!! 1 为什么很差的理由往往也能用 用理由辩护

为什么发这条感想?因为我想发。略无语😑


> 结论:必须要有“因为”,这个不起眼的词是人与人之间交流的润滑剂。你要尽可能多地去使用它。

!! 2 为什么做的决定越少,效果会越好 选择疲劳症


> 在后面讨论“拖延症”一章中我们可以看到,意志力就像电池,在一段时间之后它需要充电。怎么充电呢?人们需要休息,需要放松,需要吃些东西。如果血液循环中的血糖含量过少,那么意志力就会变弱。宜家家居就深谙此道:在其拥有一万件商品的环形购物通道中,消费者肯定会出现“选择疲劳症”,所以宜家的餐厅正好在环形通道的中间,而且宜家不会吝啬于提供价格优惠的瑞士蛋糕,让你吃完之后又感到精力充沛,可以决定购买哪一种台灯。

!! 4 为什么没有战争的平均规模 平均数的问题


> 用最后一个例子说明一下:有少部分演员每年收入超过千万欧元,但也有成千上万的演员仅仅能维持温饱。如果你因为电影的平均收入看起来很可观而建议你的子女去当演员,那你最好还是再考虑一下。结论:当提到“平均”这个词时,你最好还是对它敏感一些,试着探究一下其背后的整体分布情况。如果一个极特殊的情况不会给平均值带来很大影响,就像第一个公交车的假设,那么“平均”这个概念还是有意义的;如果一个极特殊的情况会改变整个局面,就像第二个公交车的假设,那么你(特别是记者朋友们)就应该放弃“平均”这个概念。

!! 5 你如何被钱毁掉了动力 激励排挤效应

幼儿园这个例子,之前有本说什么什么规范的书也提过

> 而幼儿园向晚接孩子的家长收取费用,使家长和幼儿园之间从之前人性化的关系变成了金钱关系,晚接孩子也变得理所当然——只要为此付钱便可。科学上称这种现象为“激励排挤效应”。当人们不是为了挣钱去做一件事时,付钱给他们会破坏其做事的意愿,换句话说就是金钱上的激励会排挤掉非金钱意义上的动力。

!! 6 如果没有什么可说的,就什么都别说 废话倾向

KM 上的文章,越没内容废话越多

> 在学术界,正如我们所见,“废话倾向”也在蔓延。一个学科获得的成果越少,这种现象就越严重。对“废话倾向”特别没有抵抗力的就是经济学家,这在很多评论和经济预测中不难看出。这种现象也出现在经济个体中,一个企业经营得越差,其总裁的废话就越多,而且废话之外还要加上多余的经营活动。

> 在你对整个世界顿悟之前,最好还是记住马克·吐温的话:“如果你没有什么可说的,就什么都别说。”简单是生活这条艰难长路的终结点,而不是起始点。

!! 7 作为经理你如何什么都不做就可以使数值看上去更好 威尔·罗杰斯效应

有意思…

> 威尔·罗杰斯效应在医学界特别常见。肿瘤一般被分为四个发展阶段——从第一阶段到第四阶段,也就是“病期移行”。处于阶段一的肿瘤最小且最易治疗,处于阶段四的肿瘤情况最糟糕。相应地,在阶段一的病人活下来的概率最高,阶段四的病人活下来的概率最低。现在每年市场上都会出现新的治疗方法,诊断结果也更为准确,以前医生不会注意到的极小肿瘤也可以被发现。这样,以前误认为自己很健康的病人现在都被划分到了阶段一,所以自然而然地在阶段一的病人活下来的平均概率就提高了,这是医学界的伟大成功吗?其实这只是“病期移行”。

!! 9 为什么在满月时会看到人脸 聚集性幻觉

人脸识别作为一项根植于基因中的技能,用来说明偶然事件,感觉不合适。

> 如果你认为发现了某一规律,那么应该先把它看成是种偶然。如果你觉得实在是很有规律,那你应该请位数学家帮你做个统计测试。

!! 10 我们为什么要爱经历痛苦才得到的事物 劳力辩证现象

> “劳力辩证现象”是所谓认知不谐调的一种特殊情况。一枚简单的别针使自己的胸口留下伤疤本来是可笑的,约翰的大脑为这种可笑做了调适,也就是把别针的价值提高,把它从普通的事物美化成貌似神圣的东西。这都是在无意识的情况下发生的,而且很难人为地进行干预。

> 在20世纪50年代,市场上出现了便捷的蛋糕粉,制造商认为这肯定能赚钱。但万万没想到的是家庭主妇们不喜欢这种蛋糕粉,因为对她们来说太简单了。直到制造商把配制方法变得稍微复杂——包装上说明要打一个鸡蛋进去——家庭主妇们才又找回自我价值感,她们才开始重视这一便捷食品。

!! 12 请谨慎对待你的期望 期望的正负效应

> 使自己远离不好的意外的最佳方式就是去期待意外。

!! 17 你为什么要和自己唱反调 内省错觉

> 但内心的观察又会有多纯粹、多诚实?瑞典心理学家彼得·约翰松给参与实验的人快速地展示了两张人物照片。参加实验的人要说出哪一张更吸引人,然后约翰松把照片拿到近处让他们解释原因,在拿到近处的过程中约翰松会迅速调换照片,但大多数参加实验的人并没有发觉,还很具体地解释为什么更喜欢某张照片。研究的结果表明:内省是不可靠的。我们窥探自己的内心时,会虚构出一些内容。

> 结论:没有比自己的信念更令人确信的事情。如果你不惜一切代价去相信并坚持自己的观点,那么它肯定是最确定的,但这样也是危险的。窥视自己内心的这种自省,大部分是虚构出来的。如果你太过相信自己,一直相信自己,那么清醒过来的那一刻对你来说就会更加残忍。越是你深信不疑的事情,你越是要多一些怀疑。作为聪明人你不需要信奉任何教条,你要做自己的异教徒!

!! 18 为什么你要断了自己的后路 缺乏关门的能力

> 如果一位总裁去审查每一种可以想到的扩展可能性,那到最后他不会得到任何可能性;如果一个企业想要和用户针对每一处细节进行讨论,那到最后用户也不会给予这个企业任何讨论的可能性;如果一个售货员想要跟在每一位顾客身后跑,那到最后他也不会有任何顾客。结论:我们是着了魔的。总想尽可能多地在婚礼上跳舞,不愿结束任何事,一切都悬而未决,这样不会给我们带来成功。我们必须学会关门。你应为自己制定出一套生活策略——就像公司策略那样,也就是帮你有意识地去忽略一些可能性。“我居住于无限可能中”,这是19世纪诗人艾米莉·狄金森很美的诗句。确实很美,但没有启发性,因为诗人在那个时候就不是很好的策略制定者。

!! 20 为什么煽动宣传会有效果 睡眠者效应

> 大脑忘掉信息从哪里来(从宣传部)要比忘掉信息本身(战争是必要的)相对快一些。因此,一个从不值得信任的出处而来的信息会渐渐赢得人们的信任,被视为不值得信任的出处会比信息内容本身被人们遗忘得更快。

!! 22 为什么我们会说后起之秀的坏话 竞争偏见

Valve 的公司准则里也有类似的说法。

> “竞争偏见”也是很多创业者容易犯的错误。盖伊·川崎在苹果公司做了4年的首席宣传官。如今他是风险投资家,为创业者提供咨询。川崎说:“A级人才会雇用A+级人才,也就是比管理者自身还优秀的人才;B级人才相反只会雇用C级人才,C级人才雇用D级人才,D级人才雇用E级人才,以此类推,直到短短几年之后企业只剩下Z级人才。”

!! 24 为什么我们感受不到未知的事物 放血效应

> 存在2 000多年之久的医学界的主导学说以错误的理论为基础。为什么会这样呢?这听上去让人不敢相信,但对于所有拥有完整体系的理论,比如关于人类、证券交易、战争、城市、生态系统、企业的等等,体液学说是其中一个典型例子:我们不是在一种理论被证明错误时放弃它,而是在有更好的理论出现时才放弃它。这不是明智的做法,但这也绝不稀奇。我们将这种现象称为“放血效应”。

!! 25 为什么自己做的菜吃起来更香 非我发明症候群

让我想起公司里面常有的论调,「开源的不如自己的组件好」

> 很多公司往往认为内部人士提出的想法比外部人士提供的解决方案更好、更重要。不久之前我和一位软件公司的总经理共进午餐,他公司的专长是开发医疗保险公司的软件。他告诉我,他的软件——以安全性和功能性的客观实际情况来看——要使潜在用户感兴趣非常困难,因为大多数保险公司坚信公司内部研发的软件是最好的。

!! 26 你如何利用不可想象的事情 黑天鹅效应

> “所有天鹅都是白色的。”几个世纪以来每个欧洲人都对这一点坚信不疑。随着人们见过的每一只天鹅都是白色的,这一点也愈加不可辩驳。另一种颜色的天鹅?完全无法想象。直到1697年,威廉·佛拉明在澳大利亚探险时第一次看到了一只黑色的天鹅。从此以后,“黑天鹅”便象征几乎不可能发生的事情。

!! 27 为什么我们的知识不能延伸 依赖域现象

> 同样,如果我给投资者们讲课,用发生在金融领域的例子来说明思维错误,他们也会立刻明白,但如果我举出发生在医学领域的例子,很多投资者都会迷惑不解。由此得出的结论是:知识很难从一个领域延伸到另一个领域。这种现象被称为“依赖域现象”。哲学家纳西姆·塔勒布是这样描述“依赖域现象”的:“棋手擅长解决棋局的问题,但仅限于这个领域。我们相信自己可以将能力从一个领域延伸到另一个领域,但实际上是不行的。”

!! 29 为什么你总是有道理的 篡改历史现象

> 威斯顿·史密斯,真理部的雇员,39岁,年纪较大,喜欢思考。他的工作是改写旧报纸的文章和文件,以使其包含最新的认识内容。他的工作很重要,对历史的审查修订给人一种绝对无可置疑的错觉,也能帮助政府来巩固其绝对的权力。这是乔治·奥威尔在其经典作品《一九八四》(Nighteen Eighty- Four)中描述的篡改历史现象,这种情况其实很常见。我们的大脑里也有一个威斯顿在工作。这听上去也许令人吃惊,但事实确实如此,而且更糟糕的是:在奥威尔的小说中,威斯顿·史密斯是非自愿地做着他的工作,并最终去反抗现行的社会秩序。而我们大脑中的威斯顿在高效地工作着,并与你的感觉和目标完全保持一致。他会轻松地修改你的记忆,不会引起你的注意,这个威斯顿会无声无息、认真负责地清除着你陈旧的错误观点,所以你会坚信,你之前一直都是有道理的。

!! 36 为什么钱不是赤裸裸的 赌场赢利效应

> 那个时候我自己也攒了几百法郎,但从没想过用攒起来的钱去买一辆不必要的自行车,最多偶尔去看场电影。等到很久以后我才意识到我那时的做法是多么的不明智。人们说钱只是钱,但实际上并不是这样去理解它的。根据钱的来源不同,人们的做法也不同。钱不是赤裸裸的,而是被包在感情的外衣里的。

> 我们花赢来的、偶然捡到的、继承的钱要比花挣来的钱更草率。经济学家理查德·塔勒尔将此称为“赌场盈利效应”,就是说人们在投机赢利之后愿意接受的风险等级升高,所以中彩票的人在几年之后往往比赢得大奖之前要穷。连民间俗语都能反映这一“赌场盈利效应”,“来得容易去得快”就是对此更通俗的说法。

如此狡猾…不过当你花完这些钱后,你大概也会知道自己愿不愿意继续付费?

> 市场策略专家都知道“赌场盈利效应”的作用。线上赌博门户网站在你加入会员时会先“赠送”你100美元的赌资;美国的信用卡公司在你填申请表时会“赠送”你100美元的奖金;

!! 37 为什么新年时下的决心很难实现 拖延症

> 只有当任务被分解成清晰的步骤,并且每一步都有时间期限时,自我制订的计划才有效,所以每个人的新年决心如果没有清晰的分步目标,肯定是无法实现的。

!! 44 为什么你打算做的事情过多 计划谬误

> 而且很重要的一点是,你要在项目即将被通过之前,召开一个所谓的“最后期限”会议。美国的心理学家加里·克莱因建议人们将团队召集起来在会上讲述如下的一小段话:“请你想象一下一年后的今天,我们将目前制订的计划实现了,但结果很糟,请你用5~10分钟假设出一个糟糕的结果。”团队成员虚构出的故事会给你提示,情况有哪些发展的可能性。

!! 45 为什么拿锤子的人会把一切看成钉子 专业偏见

> 结论:我们的大脑不是中央处理器,对它更合适的比喻应该是带着很多专用工具的瑞士军刀,可惜我们的大脑不是一把完整的军刀。每个人都是其不完整的思维模式的囚犯,所以请你再为它加上两三个额外的工具——即你自身专业领域之外的思维模式。我在最近几年使自己增加了世界生态学方面的视角,于是对很多复杂的系统有了新的了解。我的一个朋友是音乐家,他使自己增加了经济学方面的视角。请你思考一下,你对哪个领域一窍不通,然后你可以学习在那一领域的思维模式,大概需要一年的时间才能掌握新领域中最重要的思维模式,但这是值得的。你的瑞士军刀会拥有越来越多的专用工具,你的思路也会因此变得更清晰。

!! 46 为什么计划使人感到安心 蔡格尼克记忆效应

> 布尔玛·蔡格尼克误以为人们一定要完成任务才能将其从大脑中清除,但这不是必须的,一个很好的计划就足够了。

!! 48 为什么检验清单使人盲目 正面效应

怎样从存在的东西中找到不存在?…

> 有两列数列,数列A为:724,947,421,843,394,411,054,646,这一数列的共同点是什么?在你找到它们的共同点之前请先不要往下阅读。没错,这列的每个数字都包含数字4。数列B为:349,851,274,905,772,032,854,113,这列数字的共同点又是什么呢?在你找到它们的共同点之前也请先不要往下阅读。你会发现找第二列数字的共同点更难,答案是数列B的数字里都没有数字6。你从这个例子中认识到了什么呢?找到“不存在”要比找到“存在”难很多,换句话说,“在这里的”要比“不在这里的”更重要。

> 结论:我们很少去考虑没有发生的事情,对于不存在的事物我们是盲目的。当战争的乌云笼罩时,我们会意识到它,但在和平年代,我们不会去想目前是没有战争的;当我们健康的时候,我们很少去想自己也可能会生病;我们走下飞机登上马略卡岛,绝不会因为没有发生坠机而吃惊。如果我们能够做到偶尔考虑下没有发生的情况,那我们会感到更满意,但这是种费力气的思考工作。这里最大的哲学问题是:“为什么是有什么,而不是没有什么?”你应该期待着快速的“不回答”,但其实这一问题是抵制“正面效应”的有效工具。

!! 50 石器时代对替罪羊的猎捕 单一因果谬误

> 因为只要我们相信原因是唯一的,那么我们总能将胜利或灾难归结到一个人身上,将其贴上“应负责任者”的标签。这种寻找一个替罪羊的愚蠢狩猎极适合权力的行使——也是人们几千年以来一直在玩的游戏。

!! 51 为什么开快车的人会开得更安全 意向性治疗谬误

> 从汉堡到汉诺威有50公里,我们将能在1个小时或更短时间内完成这段距离的司机划分到“开快车”的一组,因为他们的平均速度能达到每小时150公里或更快,余下的司机都归入“理智司机”这一组。那么哪一组发生的事故更少呢——开快车的一组还是理智司机的一组?很明显是开快车司机的那一组。他们都在1个小时之内行驶完这段路程,肯定没有司机卷入事故中,出事故的司机肯定都会减慢速度而被自动归入理智司机一组。

!! 52 为什么你不应该读新闻 新闻错觉

现在比新闻更有毒的,应该是微信公众号

> 我们的信息很灵通,但知道的很少,为什么呢?因为我们在200年前发明了一种有毒的知识类型:新闻,即世界各地的消息报道。新闻对我们精神的影响,就像糖对身体的影响一样:新闻是可口的,容易消化的——但长期下来却是有害的。
!! Beyond Compare <<plat-win>>

[[Beyond Compare|http://www.scootersoftware.com/]] 是 Windows 下最强的 Diff 软件,主要用的是比较文件和比较目录,非常实用,而且试用期的设置也很良心。但是正版比较贵,目前没有买。

!! TortoiseSVN <<plat-win>>

[[TortoiseSVN|https://tortoisesvn.net/]] 也提供了一个 GUI 工具,功能比 Beyond Compare 弱。

!! Vimdiff <<plat-win>> <<plat-linux>>

命令行形式,稍微难用一点,但是好过没有。

!! JSON Diff <<plat-chrome>>

[[JSON Diff|http://jsondiff.com/]]: The semantic JSON compare tool

!! diff <<plat-win>> <<plat-linux>>

命令行的 `diff`, `patch` 工具提供了对文本文件的 diff / patch 支持,但是不支持二进制文件。大部分 Linux 发行版都内置了。

!! bsdiff <<plat-win>> <<plat-linux>>

`bsdiff`, `bspatch` 是命令行工具,可以支持二进制文件的 diff:

```bash
# 根据 old-file 和 new-file 生成 generated-patch-file
bsdiff old-file new-file generated-patch-file

# 根据 old-file 和 generated-patch-file,patch 出一个 new-file
bspatch old-file new-file generated-patch-file
```

! EaseUS Partition Master <<plat-win>>

[[EaseUS|http://www.partition-tool.com/]] 免费版本可以 Resize / Split Partition。
<!-- Test if current tiddler has any child -->
<$list filter="[tag<currentTiddler>limit[1]]" variable=none>
  <h2>TOC</h2>

  <!-- tc-tiddler-body class for line-height -->
  <div class="tc-tiddler-body">
    <div class="tc-table-of-contents">
      <$macrocall $name="toc-selective-expandable" tag=<<currentTiddler>> sort={{!!sort}} />
    </div>
  </div>
</$list>



并发控制的过程中经常需要上分布式锁。分布式锁相较于单机锁,可以在跨多台机器、多个进程的场景下上锁。

在分布式计算中,并发控制有两种方法,分别是 [[乐观的和悲观的|DC: C: Optimistic / Pessimistic Concurrency Control]]。悲观的并发控制往往带有上锁过程。但假如上锁的一方没有释放锁(比如进程挂掉了,或者程序有 bug),会造成死锁。因此需要有 ''自动释放锁'' 的机制。但假如上锁方在它的临界区操作未完成时,锁就已经被释放了,这时候就会造成混乱。此时需要有 fencing token 的机制。Fencing token 是一个单调递增的 token,在下文中会讲到。。

!! Redlock

Redlock 是 Redis 作者提出的一种分布式锁实现。我对该博客文章做了 annotation:

<<display-pdf path:"/files/archives/2021/05/redlock.pdf" title:"redlock.pdf">>

总的来说,它的机制是在单实例的 SET KEY + TTL + 随机 value 的基础上,扩充到多实例。要求给定 N 个互不关联的 Redis 节点,当 client 对其中的大多数(N/2+1)个节点上锁成功时,才算获取到了这个锁。文章里面给出了具体的实现细节和安全上的论述。

!! How to do distributed locking

这是一篇由 [[Designing Data-intensive Applications]] 作者 Martin Kleppmann 所写的 [[文章|https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html]]。我对它做了标记:

<<display-pdf path:"/files/archives/2021/05/how-to-do-distributed-locking.pdf" title:"how-to-do-distributed-locking.pdf">>

里面 Martin 批评了 Redlock 的实现,提出了它自己的看法,我觉得讲得很在理。文末推荐的 [[ZooKeeper 书|https://www.oreilly.com/library/view/zookeeper/9781449361297/]] 及 [[curator recipes|https://curator.apache.org/curator-recipes/index.html]] 感觉非常值得一看。

这篇文章中提到 fence token 的机制。''但 fence token 的具体实现我还没深入。''

Martin 在文中提到的 asynchronous model with unreliable failure detectors,表示这类算法不应该持有 timing assumption:

* 你的进程可能在任意时刻被中断任意长的时间(比如 pause-the-world GC,或 CPU 调度问题等)
* 网络包的延迟可以非常大(比如 GitHub 就曾经有过事故,包延迟了 90s 才到达)
* 时钟(`gettimeofday` 这类)可能是错的(比如管理员手动调整了时间,或者 NTP 同步等,可以造成本地时间来回跳)

这是很多分布式算法实现正确性的前提。如有兴趣,看 Martin 推荐的阅读材料再深入。

!! Is Redlock safe?

[[Is Redlock safe?|http://antirez.com/news/101]] 是 Redis 作者对 Martin 的文章的回复。我没有仔细看,因为 Salvatour 的英语真的是很难理解。大的论点大概是:

* 如果你的存储服务支持 fence token,它就是 linearizable 的了,也就没有引入一个额外的分布式锁的必要
* Redlock 也可以通过 compare-and-set 来实现类似 fence token 的能力
* Client 长时间 pause 引起的问题,在设计中已经避免了

!! 参考材料

[[Everything I know about distributed locks|https://davidecerbo.medium.com/everything-i-know-about-distributed-locks-2bf54de2df71]] 讲了一些概念:

* 乐观 / 悲观的并发控制
* 锁的自动释放、fencing token 机制(比较简略)
* Lock manager(比如 Redis)的部署方式比较:单 leader 带 followers,还是多 leader

[[Distributed Locks with Redis|https://redis.io/topics/distlock]]:Redis 官方博客写的实现。

!! Resources

[[Taiga|https://taiga.io/]] 和 [[Sentry|https://sentry.io/welcome/]] 都是成功的大型 Django 项目。V2 网友说它们的代码很好。学习下。



如果不记得怎么用 DRF 了,按它 [[官网首页|https://www.django-rest-framework.org/#installation]] 的 installation 和 example 走一遍。大致的流程是在 Django model 已经写好的情况下,依次做这些:

# 添加 `serializers.py`,在其中编写 `ModelSerializer` 子类
# 添加 `viewsets.py`,在其中编写 `ModelViewSet` 子类
# 在 URL conf 中添加 default router
#* 注意:截至 2020 年 3 月,上述的官网首页中的路由部分的代码,仍然用的是 Django 2.0 之前的 `url()` 函数,而 [[2.0|https://docs.djangoproject.com/en/3.0/releases/2.0/#simplified-url-routing-syntax]] 之后转向使用 `path()` 函数了。因此这里应该用 `path('', include(router.urls))` 取代 `url(r'^', include(router.urls))`。注意 `path()` 的代码中,URL 样式是不包含正则中的起始符号 `^` 的


Django 的 auth 系统提供了一整套非常实用的 API,包括 Model、View、Template 等等。它默认是以 `username` 作为用户的唯一标识的。

常见的需求是换成 `email` 来标识用户。Django 的 [[文档|https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#a-full-example]] 提供了一个例子,但缺了 View 相关的部分。[[Practical Django 2 and Channels 2]] 一书的第 3 章有一个跟官网近似,但是更完整的实现。

* Model 层:编写自定义的 `User` model 及它的 manager
** 对于登录的 form,它应该负责校验用户的用户名密码是否正确,并初始化 session(使用 `django.contrib.auth` 中的 `authenticate`, `login` API)
* Form 层:编写相关的 `Form`,基本上是重写一套类似于 `django.contrib.auth.forms` 中的 `UserCreationForm`, `UserChangeForm` 等实现
* View 层:
** 编写注册新用户的 view,来实现展示注册页面(GET)以及处理注册请求(POST);下面有一个实际的代码
** 对于如登录、登出、修改密码等过程,可以直接用 `django.contrib.auth.views` 中提供的 View,如 `LoginView`, `LogoutView` 等;如果它不足够满足你的需求,比如你想在登录过程插一段你自己的逻辑,那么你可以继承它实现一个自定义的
* URL 层:加上相应的路径映射规则使得浏览器可以访问这些页面和接口;下面有一个实际的代码
* Admin:编写 `UserAdmin` 的定义使得 Django Admin 可以正常工具

!! Signup View Example

```python
from django.contrib.auth import authenticate, login

class SignupView(FormView):
    template_name = 'main/signup.html'
    form_class = forms.UserCreationForm

    def get_success_url(self):
        redirect_to = self.request.GET.get("next", "/")
        return redirect_to

    def form_valid(self, form):
        response = super().form_valid(form)

        form.save()

        email = form.cleaned_data.get("email")
        raw_password = form.cleaned_data.get("password1")
        logger.info(f"New signup for email {email}")

        user = authenticate(email=email, password=raw_password)
        login(self.request, user)

        form.send_mail()
        messages.info(self.request, "You signed up successfully.")

        return response
```

!! URL Example

```python
from django.contrib.auth import views as auth_views
from django.urls import path

from main import views, models, forms

urlpatterns = [
    # ...
		
    path('signup/', views.SignupView.as_view(), name="signup"),
    path('login/', auth_views.LoginView.as_view(
        template_name='main/login.html', form_class=forms.AuthenticationForm
    ), name="signup"),
]
```
使用默认配置时,Django 会采用 PBKDF2 算法及 SHA256 摘要算法,迭代 150000 次(Django 2.2)来生成密码:

# 生成一个密码学安全的随机字符串作为盐
# 使用 PBKDF2 算法,将密码原文、盐及迭代次数(默认 150000 次)作为参数,并以 SHA256 为摘要算法,生成一串 hash 值
# 以 `"%s$%d$%s$%s" % (self.algorithm, iterations, salt, hash)` 形式将密码保存至数据库(默认 `auth_user` 表)

代码入口在 `django.contrib.auth.base_user.AbstractBaseUser.set_password`。
Auth 模块的安全性跟 session 模块紧密相关。相关的内容落入 [[Django: Session]] 的安全一节中。
Django 的注册流程相对复杂。下面选择在 admin 界面中新建用户的流程,来梳理下这其中的逻辑。

如果你用的是默认的 Django 模板,那么 Django 的 auth 模块是默认启用的;如果你没有用,参考 [[官方文档|https://docs.djangoproject.com/en/3.0/topics/auth/#installation]] 打开 auth,并 [[打开 admin 功能|https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#overview]]。

执行过初始化时的 `python manage.py migrate` 后,会在数据库建立 `auth_user` 表用来存放用户信息,对应 `django.contrib.auth.models.User`。将 Django server 运行起来,打开新建用户的页面,写入用户名密码:

{{ django-auth-add-user }}

这个页面是由 `django.contrib.auth.admin.UserAdmin` 通过 Django admin 提供的定制能力创建的。页面内容主要定义在:

```python
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    add_form_template = 'admin/auth/user/add_form.html'
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2'),
        }),
    )
    add_form = UserCreationForm
    # ...
```

* `add_form_template` 定义了页面模板
* `add_fieldsets` 定义了什么字段需要填写
* `add_form` 定义了提交的数据由哪个 `Form` 来验证及处理

提交数据后,处理逻辑来到了 `django.contrib.auth.forms.UserCreationForm`。这段逻辑比较重要:

```python
from django.contrib.auth.models import User

class UserCreationForm(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'password_mismatch': _('The two password fields didn’t match.'),
    }
    password1 = forms.CharField(
        label=_("Password"),
        strip=False,
        widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}),
        help_text=password_validation.password_validators_help_text_html(),
    )
    password2 = forms.CharField(
        label=_("Password confirmation"),
        widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}),
        strip=False,
        help_text=_("Enter the same password as before, for verification."),
    )

    class Meta:
        model = User
        fields = ("username",)
        field_classes = {'username': UsernameField}

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self._meta.model.USERNAME_FIELD in self.fields:
            self.fields[self._meta.model.USERNAME_FIELD].widget.attrs['autofocus'] = True

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(
                self.error_messages['password_mismatch'],
                code='password_mismatch',
            )
        return password2

    def _post_clean(self):
        super()._post_clean()
        # Validate the password after self.instance is updated with form data
        # by super().
        password = self.cleaned_data.get('password2')
        if password:
            try:
                password_validation.validate_password(password, self.instance)
            except forms.ValidationError as error:
                self.add_error('password2', error)

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user
```

Django form 对数据做校验的流程看 [[官方文档|https://docs.djangoproject.com/en/3.0/ref/forms/validation/#form-and-field-validation]]。这段代码的重点是:

# `clean_password2()` 中校验了用户两次输入的密码是否一致
# `_post_clean()` 是个内部 hook,会在做完全部校验后执行。这里对密码做了额外校验(比如长度不能太短、不能跟用户名太相似、不能是常见密码)。放在 `_post_clean()` 是因为 Django 在这里已经 prepopulate 了(即生成好了还未保存进数据库)一个 User 实例 `self.instance`,它包含了用户名等信息,可以给 password validator 做用户名相似性的校验
# 最后 `save()` 将用户数据保存到数据库。它先用了 `commit=False` 来生成一个 `django.contrib.auth.models.User` 的实例,再调用 `set_password()` 将密码字段从明文(`self.cleaned_data["password1"]`)转成密文再存入数据库(下面详谈)

如果你不用这个 `UserCreationForm`,''要实现自己的注册逻辑'',那么你可以参考它实现类似的字段校验,并且在存入数据库时也一样调用 `set_password()`。

`set_password()` 的行为描述在 [[官方文档|https://docs.djangoproject.com/en/3.0/topics/auth/passwords/]],具体如下:

{{ Django: Auth: Password Hashing }}

代码比较冗长,不再列出。

!! See Also

* [[Django: Auth: Customizing]]
Django 支持第三方账号登录(如 Google、微信)。

<<.todo "考察下 [[python-social-auth|https://python-social-auth.readthedocs.io/en/latest/index.html]] 及 [[django-allauth|https://django-allauth.readthedocs.io/en/latest/index.html]]。同时要考虑整合它的各个 flow,如注册时验证邮箱、重置密码等。同时考虑能否兼容 DRF 的场景。DRF 有一个第三方 [[jazzband/dj-rest-auth|https://github.com/jazzband/dj-rest-auth]] 库,但我担心它的成熟度和后续支持能力不行。">>
[[wemake-django-template|https://wemake-django-template.readthedocs.io/]] 提供了一些好的实践:

* [[Django 页|https://wemake-django-template.readthedocs.io/en/latest/pages/template/django.html]]:管理配置、秘密信息、安全性等
* [[Linter|https://wemake-django-template.readthedocs.io/en/latest/pages/template/linters.html]]
* [[Security|https://wemake-django-template.readthedocs.io/en/latest/pages/template/security.html]]

Django 中有非常多的类,比如 Model、View、Form 等。它们各自有各自的职责边界。

!! Model Manager and Model

观察下面的例子:

```python
class ActiveManager(models.Manager):
    def active(self):
        return self.filter(active=True)

class Product(models.Model):
    name = models.CharField(max_length=32)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    slug = models.SlugField(max_length=48)
    active = models.BooleanField(default=True)
    in_stock = models.BooleanField(default=True)
    date_updated = models.DateTimeField(auto_now=True)

    tags = models.ManyToManyField(ProductTag, blank=True)

    objects = ActiveManager()
		
    def tag_count(self):
        return self.tags.count()

    def __str__(self):
        return f"{self.name} ({self.pk})"
```

重点在 `ActiveManager.active()` 以及 `Product.tag_count()`。可以看出前者是针对于 model 列表的操作,后者则是针对单个 model 的操作。

!! Form

Form 类应该只关心数据的 HTML 展现、检验、清洗。它里面不应该有业务逻辑。业务逻辑应该在 View 中实现。同时由于 Form 类拿不到 request object,因此它想做业务逻辑也很难。

`django.contrib.auth.forms.AuthenticationForm` 是一个例子,用户提交用户名密码后,`AuthenticationForm` 的 `clean()` 函数会对用户名密码做验证。 

!! View

业务逻辑应该在 View 层实现。
!! 使用 ORM 时的 SQL 性能问题

SQL 查询数据缓慢,有可能是几个原因:

* 数据库表缺乏一些必要的索引
* Django ORM 生成的 SQL 不够好
* 没有正确地使用 Django ORM

调试思路主要是将 Django ORM 生成的原始 SQL 显示出来,再进行分析。显示原始 SQL 的方法有:

* 使用 Django Debug Toolbar / Django Debug Panel
* 使用 Django Extensions 的 `shell_plus`
* 在 Django 的 logging 配置里,将 `django.db` 配置为 logger,并使用 `DEBUG` 的 log level
* 使用 `django.db.connections` 提供的原始信息

!! 处理抛异常

Django 的异常信息页面已经提供了非常详细的信息,对农副产品问题很有帮助。同时你可以使用 [[Django Extensions|Django: Third Party Library]] 中提供的 `runserver_plus` 命令,使 Werkzeug 内嵌到 Django 的内置服务器中,这样可以在抛异常时的每一帧函数上做调试。
!! Environment-Specific Variables

根据 [[12-factor|https://12factor.net/]],环境相关的变量都应该从环境中读取。django-environ 可以做这个事情,比如下面的例子,从运行环境的 `.env` 文件读取变量:

```python
# `environ' is from django-environ
import environ

env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)
env.read_env('.env')
DEBUG = env('DEBUG')
REDIS_URL = env('REDIS_URL')
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [REDIS_URL]},
    }
}
DATABASES = {
    "default": env.db()
}
EMAIL_CONFIG = env.email_url('EMAIL_URL')
```

<<.warning "`.env` 理所当然不应该被上传到代码仓库。">>
Django 做数据筛选。

!! 基础

Django 的 queryset 支持各种 [[filter 操作|https://docs.djangoproject.com/en/3.2/topics/db/queries/#retrieving-specific-objects-with-filters]],而且支持 chaining:

```python
Entry.objects.filter(
    headline__startswith='What'
).exclude(
    pub_date__gte=datetime.date.today()
).filter(
    pub_date__gte=datetime.date(2005, 1, 30)
)
```

!! 使用请求参数来 filter

一个常见的场景是 ''根据用户的请求参数(HTTP query param)来筛选出返回的数据''。框架所需要做的事情有:

* 校验请求参数
* 按用户设定的筛选规则构建 queryset
** 这一步是 ''核心'',将过程式的筛选逻辑变成声明式
* 形成数据库结果集

流行的实现是 [[django-filter|Django: Third Party Library: django-filter]] 库。
Django 中的 form 相关功能,即是为了解决围绕用户输入产生的表单提交的一系列问题。

!! 从用户视角看表单提交

# 浏览器收到 HTML 中的 `<form>` 和各类 `<input>`,渲染出表单供用户填写
# 用户填写后,点提交按钮,浏览器发送 POST 请求到服务端
#* 如果提交的表单数据有误,页面刷新后仍在表单页,并且显示哪些字段出错
#* 如果提交的表单数据正常,页面重定向到成功后的页面

这里 Django 用了 [[Post/Redirect/Get|https://en.wikipedia.org/wiki/Post/Redirect/Get]] 的 pattern。因为假如没有 redirect 过程且提交后的页面 URL 不变,此时用户点刷新按钮时,一些老的浏览器会重新发 POST 请求。

!! Django 提供的能力

官方 [[文档|https://docs.djangoproject.com/en/2.2/topics/forms/]] 提到 Form 体系解决了这些问题:

* preparing and restructuring data to make it ready for rendering,大体上是指字段的定义
* creating HTML forms for the data,指定义好的字段如何渲染成 HTML 表单,同时生成的表单也会做出错提示
* receiving and processing submitted forms and data from the client,指检验和清洗用户提交的数据

Django 提供了这些机制:

* [[Form class|https://docs.djangoproject.com/en/2.2/ref/forms/api/#django.forms.Form]] 和 [[Forms API|https://docs.djangoproject.com/en/2.2/ref/forms/api/]],用来表示表单的结构化数据,同时提供框架给用户定义检验和清理逻辑
* [[FormView|https://docs.djangoproject.com/en/2.2/topics/class-based-views/generic-editing/#basic-forms]],封装了一个标准的处理用户 POST/GET 表单页面的过程
* 模板中的 `form` 变量,用来生成实际的 HTML 表单
* FormSet?

!! Form class

!!! Basic Example

一个最简单的例子:

```python
# forms.py
from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)
```

类似于 Django 的 `Model` 类在定义数据库数据的 schema,`Form` 类是在定义数据的 HTML 表单中展现。`Model` 中的字段对应的是数据库的列,而 `Form` 中的字段对应的是它的 HTML 展现,即各种 `<input>` 标签。

当你将上面的 `NameForm` 生成一个空的 `Form` 实例传给模板引擎:

```html
<form action="/your-name/" method="post">
    {{ form }}
    <input type="submit" value="Submit">
</form>
```

最终会被 Django 转换成 HTML 表单:

```html
<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" maxlength="100">
    <input type="submit" value="OK">
</form>
```

可以观察到:

* `CharField` 在 HTML 上的默认展现是一个 text 类型的 `<input>`
* `label` 字段变成 `<label>` 标签
* `max_length` 属性变成 `<input>` 中的一个长度限制的属性;同时当用户提交这个字段的数据时,Django 也会对其长度做校验

这便是 `Form` 类所解决的核心问题。

!!! Bound v.s. unbound

当我们将 `Form` 实例传到模板中时,大部分情况下这个 `Form` 实例都是未填充数据(unbound)的,比如说 `name` 字段的值为空。这是因为出现表单的场景中,大部分是我们希望用户来填。但是有一些情况,适合预先将值填充到表单中:

* 在编辑一个已有的数据时,比如作为管理员编辑帖子标题
* 有一些数据是从别的地方获取的,并不需要用户填写时
* 当用户之前在这个页面已经有提交过数据时,
** 比如用户新写了一篇帖子,点击保存后仍然希望处于编辑状态
** 比如用户上一次提交的表单数据有误时,后台在它提交后,应该返回原有的数据及相应的错误提示

这引出了 bound 和 unbound 的概念。一个 `Form` 实例只能处在 bound 或者 unbound 状态:

```python
>>> f = ContactForm()
>>> f.is_bound
False
>>> f = ContactForm({'subject': 'hello'})
>>> f.is_bound
True
```

差异在于:

* Bound 的 form,它已经有了数据,因此可以做数据校验,同时渲染成 `<input>` 标签时也是带有值的
* Unbound 的 form,它还没有数据,无法做数据校验,渲染成 `<input>` 时值为空或者是指定的默认值

!!! Validation

`Form` 提供了校验数据正确性的方法 `is_valid()`,以及一系列自定义校验、清洗规则的能力,具体看 [[官方文档|https://docs.djangoproject.com/en/2.2/ref/forms/api/#using-forms-to-validate-data]]。

!!! Widget

`Form` 中定义的每一种 `Field`,都有对应的 [[Widget|https://docs.djangoproject.com/en/2.2/ref/forms/widgets/]] 类代表它的展现,比如 `CharField` 默认对应的是 `TextInput`。你可以修改你的字段所用的是 widget 类,比如让你的 `message` 字段使用 `Textarea` widget 而不是 `TextInput` widget,这样它渲染成 HTML 时会变成 `<textarea>` 而不是 `<input type="text">`。

!! The View

如果用传统的 function-based view,一个典型的表单 view 像这样:

```python
def contact_us(request):
    if request.method == 'POST':
        form = forms.ContactForm(request.POST)
        if form.is_valid():
            form.send_mail()
            return HttpResponseRedirect('/')
    else:
        form = forms.ContactForm()
    return render(request, 'contact_form.html',  {'form': form})
```

但 Django 提供了一个 [[FormView|https://docs.djangoproject.com/en/2.2/topics/class-based-views/generic-editing/#basic-forms]] 简化了这个过程。上面的代码可以完整地换成 `FormView` 来这样表达:

```python
class ContactUsView(FormView):
    template_name = "contact_form.html"
    form_class = forms.ContactForm
    success_url = "/"
		
    def form_valid(self, form):
        form.send_mail()
        return super().form_valid(form)
```

!! Template

[[官网文档|https://docs.djangoproject.com/en/2.2/topics/forms/#working-with-form-templates]] 给出了简单易懂的说明。

在渲染成表单的 HTML 过程中,主要的问题是需要跟 CSS 框架结合,因此 Django 提供了几个能力:

* 默认的 `{{ form }}` 会生成仅带 `<label>` 和 `<input>` 的 HTML。可以用 `{{ form.as_table }}` `{{ form.as_p }}` `{{ form.as_ul }}` 分别生成被 `<tr>` `<p>` `<li>` 包裹的每个字段。我觉得这个功能用途一般
* 可以把每个字段的标签 ID、帮助信息和错误信息等,单独拿出来做展示。官网有文档

!! Forms from models

直接将 Model 用于 Form 的一种机制,省去了重复定义字段的过程:

```python
>>> from django.forms import ModelForm
>>> from myapp.models import Article

# Create the form class.
>>> class ArticleForm(ModelForm):
...     class Meta:
...         model = Article
...         fields = ['pub_date', 'headline', 'content', 'reporter']

# Creating a form to add an article.
>>> form = ArticleForm()

# Creating a form to change an existing article.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)
```

!! Form Assets

一些 widget 往往需要额外的 CSS 和 JS 配合。Django 提供了机制让你定义这些额外依赖,并且让你方便在模板中使用它:

```python
from django import forms

class CalendarWidget(forms.TextInput):
    class Media:
        css = {
            'all': ('pretty.css',)
        }
        js = ('animations.js', 'actions.js')
```

```python
>>> w = CalendarWidget()
>>> print(w.media)
<link href="http://static.example.com/pretty.css" type="text/css" media="all" rel="stylesheet">
<script type="text/javascript" src="http://static.example.com/animations.js"></script>
<script type="text/javascript" src="http://static.example.com/actions.js"></script>
```

你可以在模板中用 `{{ form.media }}` 来生成上面的三行 `<link>` / `<script>`。`{{ form.media }}` 似乎没有官网上有明确的文档,不知道是不是 Django 团队的疏忽。

!! Formset

Formset 即是多个 form 组合起来的一个对象,而多个 form 意味着你可以同时在页面操作多个 model 实例。[[Practical Django 2 and Channels 2]] 中有一个例子,是实现一个购物车页面,上面有多件商品,你可以同时修改所需的数量。
这里讲述如何开始一个新的 Django 工程,方便后续开新项目时不用再去思考。

!! 外部现有项目模板

* [[cookiecutter-django|https://github.com/pydanny/cookiecutter-django]]: 整合了非常多繁杂的构建工具、库、框架等
* [[wemake-django-template|https://github.com/wemake-services/wemake-django-template]]: 相对简单,仅后端(无前端资源)

!! 自己维护的手工方式

使用:

* 最新 Python 及 Django 版本
* Poetry 作为环境管理器

步骤:

# 安装最新 Django `pip install --user --upgrade Django`
# 确保 poetry 已经安装,没有的话 `sudo pacman -S python-poetry`
# 执行下面脚本:<div>

```bash
$ mkdir <your_project_name>
$ cd <your_project_name>
$ django-admin startproject <your_project_name> .
$ poetry init
$ poetry add Django
```
</div>
数据迁移。

[[Practical Django 2 and Channels 2]] 的第三章给了一个手写 Migration 文件的例子,可以把非 Django 自动生成、非 DDL 层面或者仅数据层面的变更,用 migration 管理起来:

```
$ ./manage.py makemigrations main --empty -n productname_capitalize
```

```python
from django.db import migrations

def capitalize(apps, schema_editor):
    Product = apps.get_model('main', 'Product')
    for product in Product.objects.all():
        product.name = product.name.capitalize()
        product.save()
				
class Migration(migrations.Migration):
    # ...
    operations = [
        migrations.RunPython(
            capitalize,
            migrations.RunPython.noop
        ),
    ]
```

我觉得这是个很好的实践。把数据变更的过程都在 migration 文件中体现出来。

[[null|https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.Field.null]] 和 [[blank|https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.Field.blank]] 是 Django model 中的 field 的参数。

null 是纯数据库相关的,表示该 field 对应的数据库字段可以为 NULL,跟 Django 本身的逻辑没有关系。blank 跟数据库无关,仅跟 [[Django Form|Django: Form]] 的数据校验有关,如果 blank 为 True,则提交表单数据到 Django form 时 Django 可以接受该字段没有值。

对于非关系字段,要表达一个字段「没有值」的最佳实践是:

* 对于字符串类型的 field(`CharField` 及 `TextField`),不要置 null 为 True,使用 blank 为 True 即可,避免需要同时判断 null 及空字符串
* 对于其他类型,应该 ''同时'' 置 null 和 blank 为 True。因为:
** 一些类型的初始值往往不表示空,比如你给 `IntegerField` 置 0 不能表示它为空
** 一些类型没有合乎逻辑的初始值,比如你很难说 `DateField` 的初始值是多少

对于关系字段:

* `ForeignKey` 可以同时置 null 及 blank 为 True,表示可以无关联的外键(参考 [[这里|https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ForeignKey.on_delete]])
* `OneToOneField` 跟 `ForeignKey` 一致
* `ManyToManyField` 字段无法置 null 及 blank 为 True,因为它并不对应一个数据库字段,而是对应一张单独的数据表
排序时将 null 值排在前面或者后面。

Django 1.11 给 F expression 加了这个 [[能力|https://docs.djangoproject.com/en/dev/ref/models/expressions/#using-f-to-sort-null-values]]。我是参考了 StackOverflow 的 [[帖子|https://stackoverflow.com/questions/15121093/django-adding-nulls-last-to-query]] 发现的。例子如下:

```python
books = Book.objects.order_by(
    F('publication_year').desc(nulls_last=True),
    F('publication_month').desc(nulls_last=True),
    F('publication_day').desc(nulls_last=True),
)
```

使用 [[django-cors-headers|https://github.com/adamchainz/django-cors-headers]] 来配置 [[跨域访问|HTTP: CORS]] 相关的 HTTP 头。
Django 如何 [[防范 CSRF|https://docs.djangoproject.com/en/dev/ref/csrf/]]。

!! 实现原理

实现逻辑在 `django.middleware.csrf.CsrfViewMiddleware` 中。

默认实现:

# 用户第一次向 Django 服务发起请求后,收到的回包中会带有一个 `csrftoken` cookie。这个 cookie 的值是根据服务端 secret 加盐生成的,如:<div>

```http
Set-Cookie: csrftoken=lE3I...; expires=Tue, 27 Apr 2021 00:06:45 GMT; Max-Age=31449600; Path=/; SameSite=Lax
```

对于后续的请求,这个 cookie 的值不会变,有效期会刷新。用户如果从未登录状态变为登录状态,为了安全考虑,Django 会调用 `rotate_token` 更新这个 cookie 值
</div>
# 对于使用 POST 的 `<form>` 表单,必须在 template 中加入 `{% csrf_token %}` 语句,它会自动生成一个 hidden input 嵌入表单中:<div>

```html
<input type="hidden" name="csrfmiddlewaretoken" value="0c90d...">
```

这个 token 的值与 cookie 中的不一样,是同个 secret 加不同的盐生成的,并且盐作为字符串的前一半附在 token 中,使得后面服务端可以 unsalt
</div>
# 用户点击提交时,FORM 表单及 cookie 中的 CSRF token 都被带上来。它们在后台被去盐(unsalt)后比对,如果一样,则表示请求安全;不一样时,返回 HTTP 403 Forbidden。在 HTTPS 下时,Referer 头也会被校验

<<.info "对于密码学部分我未深究,在这方面没有积累。">>

上面描述的是传统的表单式提交,但是现在 SPA 盛行,也可能有通过 JS 发出请求的情况。对于这种情况,将 CSRF token 在 POST 体中带上在实现上往往比较啰嗦,而且接口也不一定都用 `application/x-www-form-urlencoded`。因此 Django 也可以接受你将 CSRF token 放在 `X-CSRFToken` 头上,这种情况下你可以用 JS 读 cookie 中的 token 而不是 `<input>` 中的 token。同时注意,如果页面的域名与 API 域名不同,也要设置好 [[CORS|HTTP: CORS]] 规则。

!! 使用

除了上文提到的主要流程,Django 还提供了一些 decorator 来控制具体的 view 要不要经过 CSRF 的校验。

!! 设计考量

这里面有几个设计上的考虑,Django 的文档没有表达,我写下自己的理解。

<div class="box">

''在通过 JS 发异步登陆请求的场景下,Django 比对的是请求中的 `X-CSRFToken` 头及 token cookie;但前者实际上也来源于后者,这样做是否安全?''

是安全的。攻击者除非使用 XSS 将恶意代码注入到你的页面中,不然它没有办法使用 JS 去读取到 cookie 中的 token,也就无法构造恶意请求。

但是 token 的 cookie 仍应限制好域名范围。之前大公司中,有一些因为子域名安全防范不严引起的攻击。比如 qq.com 下发了域名范围为 `.qq.com`(即针对全部子域名生效)的身份 cookie,同时没有设置 HttpOnly。假如此时 f.qq.com 的安全措施做得不好,被黑客 XSS 攻击了,那黑客可以在 f.qq.com 中获得用户全站的身份 cookie。黑客往往喜欢找大公司中不再有团队维护的页面做攻击。

</div>

<div class="box">

''固定的、非表单中的 CSRF token,为啥要通过 cookie 下发?''

应该是为了提供 JS 发异步请求的支持。对于 SPA 场景,使用的是 React 等框架,并不使用 Django template,没法把 CSRF token 带下来;那 JS 只能去读 cookie 中的 token。

Django 为了平衡便利与安全(比如开发阶段的 debug server 往往没有上 HTTPS),这个 cookie 并没有设置上 HTTP only 及 secure。

如果你没有使用 JS 发请求的需要,也可以修改 Django 配置:

* 将 cookie 设置为 HTTP only,减少被 XSS 时的影响(但 XSS 是无论如何都应该防下来的)
* 使用服务端的 session 来保存,不再下发给客户端

如果你的生产环境上 HTTPS,可以区分不同环境给 cookie 设置上 secure flag。

</div>

<div class="box">

''Django 将 CSRF token 通过 cookie 下发,是否增加了被 CSRF 的可能性?''

对于现代浏览器,它们能理解 Django 在 cookie 的 SameSite 上配置了 Lax,这可以做到很好的防护。但即使是未支持 SameSite 的浏览器,Form 中的 csrf token 也可以防住攻击。

但是假如你的站点被 XSS 攻击,那这些防范措施都没有作用,黑客可以以用户身份做任何事情。这个时候他也不需要费劲去搞 CSRF。

</div>

<div class="box">

''Token 为什么要加盐?''

如果不加盐,每个 CSRF token 都是一样的,失去了保护意义。

同时它可以防暴力爆破。Django 是开源软件,token 的生成过程是公开的,如果不加盐,黑客可以预先生成一个 secret 对应生成后的 token 的彩虹表,然后通过 token 反查出 secret,于是服务端安全不复存在。

</div>

<div class="box">

''为什么 Django 默认不将 CSRF 保护与具体的会话关联在一起?''

文档里有 [[提及|https://docs.djangoproject.com/en/dev/ref/csrf/#is-it-a-problem-that-django-s-csrf-protection-isn-t-linked-to-a-session-by-default]]。是为了支持匿名会话,即用户不登录也可以使用。所以如果你用默认的 cookie 实现而不是用 session,那 session 的 middleware 不启用也没有关系。

</div>

提供 JS / CSS 等静态文件的服务。

一般有几种做法:

* 使用 nginx,性能最高
* 使用 Python 库 [[whitenoise|http://whitenoise.evans.io/]]:
** 自动输出压缩后的内容,如 gzip 或者 Brotli 格式的
** 自动设置缓存相关的 HTTP 头
** 性能可以,但是不如 nginx
* 使用第三方在线服务,如 Amazon S3、CDN
Django session 系统的实现。

先看 Django [[官方文档|https://docs.djangoproject.com/en/3.2/topics/http/sessions/]] 理解其提供的功能。Session 系统实现细节很多,比如支持匿名 session 时,要考虑用户从匿名变登陆后,服务端 session 数据的保持等。因此先理解该系统提供的功能是必要的。

下面结合代码讲解一个请求到 Django 后的整个处理流程。

!! 用户首次打开 Django 站点

此时用户请求中的 cookie 并不带 session ID(cookie key 为 `sessionid`)。假如 Django 在处理此请求过程中并没有向 `request.session` 写入数据,那回包也不会下发 session ID cookie。

假如用户后续使服务端 Django 写入了 session 数据,比如用户在未登陆状态下将物品添加进了购物车,那么 Django 会生成 session ID 并通过 cookie 下发给用户。

如果用户后续登陆了,这些 session 数据会被保留。

!! 功能划分

Session 中间件的代码位于 `django.contrib.sessions.middleware` 包,主要由两块组成:

* `middleware.py`:
** 处理请求包中的 session cookie
** 根据 session 的属性(是否 browser session,过期时间多长等),向回包写入 session cookie,以及 Vary 头等
* `backends` 包:
** 安全相关的处理,比如校验 session 是否属于该 user,配合 auth 模块防范 session fixation 等
** 提供 `request.session` 供操作 session 数据
** 从持久性存储(backend)读取和写入
** 实现内置的 serializer 来序列化 session data

`request.session` 是一个 dict-like 对象,封装了对底层 session store 的调用,使用户并不用关心底层细节。比如用户将物品加入购物车,你可以这样写:

```python
request.session['cart'].append({'sku': abc, 'quantity': 1})
```

!! 请求带 Session Cookie 到后台

先通过 session middleware 的 `process_request()`:

```python
# django.contrib.sessions.middleware.SessionMiddleware.process_request
def process_request(self, request):
    session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
    request.session = self.SessionStore(session_key)
```

之后框架对 `request.session` 的操作(比如 `.get()`)均由 session store 处理。大多数的逻辑都在 SessionBase 中处理。下面的逻辑在 `django.contrib.sessions.backends.base.SessionBase` 中。

当你使用 `request.session.get()` 时:

```python
def get(self, key, default=None):
    return self._session.get(key, default)
```

`self._session` 是一个 lazy load 的属性,会调用 `self.load()`:

```python
def _get_session(self, no_load=False):
    """
    Lazily load session from storage (unless "no_load" is True, when only
    an empty dict is stored) and store it in the current instance.
    """
    self.accessed = True
    try:
        return self._session_cache
    except AttributeError:
        if self.session_key is None or no_load:
            self._session_cache = {}
        else:
            self._session_cache = self.load()
    return self._session_cache

_session = property(_get_session)
```

由于存储跟具体的 `SessionStore` 有关,`SessionStore` 需要继承 `SessionBase`,并实现这些方法:

```python
def exists(self, session_key):
    """
    Return True if the given session_key already exists.
    """
    raise NotImplementedError('subclasses of SessionBase must provide an exists() method')

def create(self):
    """
    Create a new session instance. Guaranteed to create a new object with
    a unique key and will have saved the result once (with empty data)
    before the method returns.
    """
    raise NotImplementedError('subclasses of SessionBase must provide a create() method')

def save(self, must_create=False):
    """
    Save the session data. If 'must_create' is True, create a new session
    object (or raise CreateError). Otherwise, only update an existing
    object and don't create one (raise UpdateError if needed).
    """
    raise NotImplementedError('subclasses of SessionBase must provide a save() method')

def delete(self, session_key=None):
    """
    Delete the session data under this key. If the key is None, use the
    current session key value.
    """
    raise NotImplementedError('subclasses of SessionBase must provide a delete() method')

def load(self):
    """
    Load the session data and return a dictionary.
    """
    raise NotImplementedError('subclasses of SessionBase must provide a load() method')

@classmethod
def clear_expired(cls):
    """
    Remove expired sessions from the session store.

    If this operation isn't possible on a given backend, it should raise
    NotImplementedError. If it isn't necessary, because the backend has
    a built-in expiration mechanism, it should be a no-op.
    """
    raise NotImplementedError('This backend does not support clear_expired().')
```

''一个用户 session 的数据结构是'':

* Session key:用站点 SECRET 及用户 hash 过的密码再 hash 出来的字符串
* Session data:服务端存储的业务数据,即 `request.session` 操作的数据
** 这个数据由落入存储时要再经过 `SessionBase.encode()`,后面安全一节详谈
* Expire age:读取及设置过期 ''时长''(比如 30 天)的能力

''过期时长在这些地方被使用'':

* 具体的 session store 会使用:
** Database store 将过期时间存入数据库,用于未来判断该 session 是否仍然有效
** Redis store(非内置)可以用其设置 key 的 exipre time
* middleware.py 中为 cookie 设置有效时间

但具体的 session store 可能用 ''过期时长'' 或 ''过期时间'' 来落存储(`.save()`),只要它们 `.load()` 时能转换成过期时长即可。比如数据库适合用过期时间,这样方便 SQL 做筛选;Redis 适合用过期时长,方便设置 expire。

!! 安全

安全分几块:

* Session 存储相关
* 用户登陆态相关

!!! Session 存储相关

上文提到 session 数据分 3 块:session key,session data 及 expire age。其中:

* Session key:
** 需要通过 cookie 给到前端
** 需要存储到 session store,使 store 可以通过此 key 筛选出 session data
** Django 使用随机生成的 32 位字符串实现
* Expire age 敏感度较低,一般无需特殊处理

Session data 单独拿出来讲。因为 Django 支持以 cookie 作为 session store,因此 session data 需要通过 cookie 在 client 与 server 间传输。为此 Django 对 session data 做了压缩、加了签名,而且不管是不是 cookie 作为 store 都会执行此逻辑。代码在 `SessionBase` 的 `.encode()` 及 `.decode()` 处。

`encode()` 的处理很复杂。下面 Django 3.2 的处理流程。最终生成的 `signed_value` 被写入 store:

```
# django.core.signing.Signer.sign_object
value = base64_encode(
    compress(
        serializer.dump(
            session_data_dict
        )
    )
)

# django.core.signing.TimestampSigner.sign
value_with_timestamp = value + ":" + now_timestamp

# django.core.signing.Signer.signature
signature = base64_encode(
    salted_hmac(
        some_fixed_salt, value_with_timestamp, settings.SECRET as key, "sha256"
    )
)

# django.core.signing.Signer.sign
signed_value = value_with_timestamp + ":" + signature
```

这套流程体现了 Django 的 ''设计理念'',在官方文档这 [[一节|https://docs.djangoproject.com/en/3.2/topics/http/sessions/#using-cookie-based-sessions]] 中的 WARNING 处描述。重点是:

* SECRET 作为盐保证了只有你的站点能生成合法的 signature
** 假如你用 DB 作为 store,而 DB 被攻破,那么:
*** 黑客无法伪造 session data
*** 即使黑客使用自己的 session data 覆盖别人的,也不起作用(下文详述)
* Session 数据没有被加密
** 假如你用 DB 作为 store,而 DB 被攻破,那么 session data 可以被解出来,黑客还可以知道 session 属于哪个用户(下文详述)

!!! 用户登陆态相关

安全这块跟 auth 模块 ''紧密相关''。登陆相关的实现入口在 `django.contrib.auth.get_user`。

用户登录成功后,Django auth 模块会在 `request.session` 中写入 3 个数据,例如:

|!_auth_user_id |`1` |
|!_auth_user_backend |`django.contrib.auth.backends.ModelBackend` |
|!_auth_user_hash |`23b67b81196ced88b99560372436906edfa5b3bf` |

其中 `_auth_user_hash` 是以固定串加上站点 `SECRET_KEY` 为盐,对用户存储在数据库中的密码(哈希过的,见 [[Auth: Authentication: Password]])生成的 HMAC 哈希值。代码实现在 `django.contrib.auth.base_user.AbstractBaseUser.get_session_auth_hash`。

这个 hash 值存在的意义是:

* 登陆的用户每次有请求过来时,Django 会校验其 session 中的 hash 与 password 算出来的值是否一致;如果不一致,会将当前的 session 清除,`request.user` 置 None,用户的登陆态即消失
** 处理逻辑的入口在 `django.contrib.auth.middleware.AuthenticationMiddleware.process_request`
* 用户在修改密码后,会将其原有的 session 清理并生成新的,然后就新的 hash 写入 session
** 结合上一点,修改密码后,用户的各 session 都会在下次请求时被清除

另外 auth 模块也处理 session fixation(详见 [[Session Management]])。用户被黑客注入 session key 后,当用户发起登陆请求时,Django 会校验其 session key 关联的 `_user_auth_hash` 是否属于此用户(这是有可能的,比如未受攻击情况下,在未登录状态下同时打开了两个登录页面,其中一个成功登录,又在另一个上做登录时),如果不属于此用户,会把原有的 session 清理掉,再新建一个 session。这样做使得黑客无法与用户共享同个 session。

!! See Also

* [[Session Management]]
Django 的 signal 听起来很神奇,但是它并不是什么复杂的东西。它看起来像一个事件驱动系统,但是并不像 asyncio 那样有复杂的调度过程,而仅仅是同步地在某些操作发生时调用。

它的流程大概是这样:

* 信号定义者:在框架代码中定义信号(使用 `Signal` 类),并在适当时机发送信号(`signal.send()`)以触发信号处理函数
* 信号使用者:一般在业务配置(`AppConfig`)中注册信号处理函数(`signal.connect()`),当信号被发送时,这些处理函数会被 Django 框架执行

举一个 Django auth 中的例子,无关代码被略去:

```python
## 定义
# django.contrib.auth.signals 中定义了 user_logged_in signal
from django.dispatch import Signal
user_logged_in = Signal(providing_args=['request', 'user'])

# django.contrib.auth.login 处的代码,表明 login 最后被调用时,最后会触发信号
def login(request, user, backend=None):
    # ...
    user_logged_in.send(sender=user.__class__, request=request, user=user)

## 使用
# Django Auth 中本身也使用了这个信号,用于用户登录时更新其最后登录时间
# django.contrib.auth.apps.AuthConfig.ready 
class AuthConfig(AppConfig):
    def ready(self):
        from .models import update_last_login
        user_logged_in.connect(update_last_login, dispatch_uid='update_last_login')
```
!! Development Experience

* [[Django Extensions|https://github.com/django-extensions/django-extensions]]:提供一系列实用的 manage.py 命令,最实用的是 `shell_plus`, `runserver_plus` 和 `graph_models`,分别需要额外安装 ipython,werkzeug 及 pydotplus
* [[Django Debug Toolbar|https://github.com/jazzband/django-debug-toolbar]]:在渲染出来的页面上提供了非常详尽的内部信息,比如 SQL 耗时等,非常实用。对于 AJAX 请求,在 Django 1.x 时代可以用 [[django-debug-panel|https://github.com/recamshak/django-debug-panel]],但这个项目已死,不支持 Django 2.0 及以上版本

!! HTML

* django-tables2 配合 django-filter,可以做出一个有排序和筛选功能的 HTML 表格
* django-widget-tweaks 可以方便 widget 与 CSS 框架配合

!! Testing

* [[factory_boy|https://github.com/FactoryBoy/factory_boy]]:帮你生成测试数据的

!! Front-end Intergration

* [[django-webpack-loader|https://github.com/owais/django-webpack-loader]]:Django with webpack
!! Development Experience

* [[Django Extensions|https://github.com/django-extensions/django-extensions]]:提供一系列实用的 manage.py 命令,最实用的是 `shell_plus`, `runserver_plus` 和 `graph_models`,分别需要额外安装 ipython,werkzeug 及 pydotplus
* [[Django Debug Toolbar|https://github.com/jazzband/django-debug-toolbar]]:在渲染出来的页面上提供了非常详尽的内部信息,比如 SQL 耗时等,非常实用。对于 AJAX 请求,在 Django 1.x 时代可以用 [[django-debug-panel|https://github.com/recamshak/django-debug-panel]],但这个项目已死,不支持 Django 2.0 及以上版本
* [[Silk|https://github.com/jazzband/django-silk]],非常好的 profiler,可以用来定位一个请求在各阶段的耗时

!! Filter

* [[django-filter|Django: Third Party Library: django-filter]]

!! HTML

* django-tables2 配合 django-filter,可以做出一个有排序和筛选功能的 HTML 表格
* django-widget-tweaks 可以方便 widget 与 CSS 框架配合

!! Testing

* [[factory_boy|https://github.com/FactoryBoy/factory_boy]]:帮你生成测试数据的

!! Front-end Intergration

* [[django-webpack-loader|https://github.com/owais/django-webpack-loader]]:Django with webpack
[[django-filter|https://django-filter.readthedocs.io/en/master/index.html]] 库针对的场景是:''根据用户的请求参数(HTTP query param)来筛选出返回的数据''。它做的事情有:

* 校验请求参数(参数由 Filter 定义)
* 按用户设定的筛选规则构建 queryset
** 这一步是 ''核心'',将过程式的筛选逻辑变成声明式
* 形成数据库结果集

django-filter 还可以用于 [[Django REST Framework]]。

!! 使用示例

```python
# 通过 FilterSet 定义用于筛选的请求参数。这个例子支持这些参数:
# price__lt, price__gt, release_date, release_date__year__gt
class ProductFilter(django_filters.FilterSet):
    class Meta:
        model = Product
        fields = {
            'price': ['lt', 'gt'],
            'release_date': ['exact', 'year__gt'],
        }

# View 函数实现
def product_list(request):
    # 将用户请求参数(request.GET)及基础 queryset 提供给 ProductFilter
    f = ProductFilter(request.GET, queryset=Product.objects.all())
    return render(request, 'my_app/template.html', {'filter': f})
```

ProductFilter 会提供一个 Form(`.form`),也可以通过其 `.qs` 访问到其根据请求参数生成的 queryset。模版的示例如下:

```html
{% extends "base.html" %}

{% block content %}
    <form method="get">
        {{ filter.form.as_p }}
        <input type="submit" />
    </form>
    {% for obj in filter.qs %}
        {{ obj.name }} - ${{ obj.price }}<br />
    {% endfor %}
{% endblock %}
```

!! 核心概念

django-filter 的核心概念有:

* FilterSet:表示一组 filter
* Filter:
** 每个 filter 代表一个过滤条件
** Filter 有类型,如 `BooleanFilter`,它们有对应的 Django form field,如 `django.forms.fields.NullBooleanField`
** django-filter 使用 Django Form 的能力对请求参数做 validation

至于 Widget 和 Form 的能力,由于我不使用 Django 输出 HTML,没有去关注。

!! 仅显示用户自己发表的内容

在 UGC 应用中,经常需要拉取用户自身的内容。这个可以通过 [[编写|https://django-filter.readthedocs.io/en/master/guide/usage.html#filtering-the-primary-qs]] 一个自定义的 base queryset 来实现:

```python
class ArticleFilter(django_filters.FilterSet):
    class Meta:
        model = Article
        fields = [...]

    @property
    def qs(self):
        parent = super().qs
        author = getattr(self.request, 'user', None)

        return parent.filter(author=author)
```

!! 对单个 Filter 实现自定义的筛选逻辑

通过 Filter 类提供的 [[method|https://django-filter.readthedocs.io/en/master/ref/filters.html#method]] 参数:

```python
class F(FilterSet):
    """Filter for Books by if books are published or not"""
    published = BooleanFilter(field_name='published_on', method='filter_published')

    def filter_published(self, queryset, name, value):
        # construct the full lookup expression.
        lookup = '__'.join([name, 'isnull'])
        return queryset.filter(**{lookup: False})

        # alternatively, you could opt to hardcode the lookup. e.g.,
        # return queryset.filter(published_on__isnull=False)

    class Meta:
        model = Book
        fields = ['published']
```

!! 通过多个 Filter 做组合筛选

django-filter 并没有给出解决方案。可能的方法有以下几种,但都不是很理想。Django Form 你可以实现一个 `clean()` 函数来做跨多个 field 的 [[validation|https://docs.djangoproject.com/en/3.2/ref/forms/validation/]],比如 field A 的值为 "email" 时 field B 必须是个合法的 Email 地址。django-filter 应该实现一个类似的机制。

!!! 实现自定义的 base queryset

为你的 FilterSet [[实现|https://django-filter.readthedocs.io/en/master/guide/usage.html#filtering-the-primary-qs]] 一个 base queryset。框架在调用 `FilterSet.qs` 时,已经对请求参数(Filter 来表达)做过校验了。缺点是 `.qs` 是用来表达 base queryset 的,而不是用来做筛选逻辑的。

!!! 通过 Filter 的 method 做 hack

django-filter 调用各 filter 定义的 method 参数来构建 queryset 时,各 filter(请求参数)已经通过 validation 了。可以用这样的方式做 hack:

```python
class NoteFilterSet(filters.FilterSet):
    topic = filters.ModelChoiceFilter(queryset=Topic.objects.all(), method='filter_topic', label='Topic')
    recursive = filters.BooleanFilter(label='Recursive', method='filter_recursive')

    def filter_topic(self, queryset, name, value):
        """
        根据 topic 筛选 note。如果请求参数中 recursive 为 true,则筛选指定的 topic 及其子 topic。
        django-filter 不支持多 filter 同时起作用,因此这里用了 self.form 来获取 recursive 的值。
        """
        recursive = self.form.cleaned_data.get('recursive')
        if recursive:
            return queryset.filter(topics__in=list(value.descendants(include_self=True)))
        else:
            return queryset.filter(topics__in=[value])

    def filter_recursive(self, queryset, name, value):
        """
        这里的 recursive 参数不单独做 filter,它在 filter_topic 中被使用。
        使用这个函数使得 django-filter 不尝试去为 recursive 寻找相对应的 field。
        """
        return queryset
```

并不优雅,但是可以运行。

!!! 不在 django filter 上做此类逻辑

比如 DRF 搭配 django-filter 时,可以在 DRF 的 [[get_queryset()|https://www.django-rest-framework.org/api-guide/generic-views/#get_querysetself]] 做这种逻辑。好处是灵活;代价是可能需要自己实现 query param 的校验逻辑。
!! Django Class-based-view

因为 Django 内置的 class-based view 有着复杂的继承结构。你继承这些 View 时,如果有想重写的函数,你往往需要在它的好几个基类 / mixins、甚至好几个文件中翻阅,才能找到你想修改的函数

[[Django Class-based-view Inspector|http://ccbv.co.uk/]] 这个网站,将 Django 内置的 class-based view(例如 `DetailView`)的所有基类的函数聚合在一起,并描述函数的功能。这会很大程度方便你找到所需要的类。

Django 针对 CRUD 做了很多 generic view。官方 [[文档|https://docs.djangoproject.com/en/2.2/topics/class-based-views/generic-display/]] 详细描述了思路和用法。[[API|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/]] [[文档|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/]] 讲了具体的执行流程。

核心点在于,Django 预设了一些常用场景:

* 编辑:
** 用户要新建元素时,需要一个 HTML 表单来填写内容,提交后后台需要做数据校验、持久化以及重定向到成功页。于是有了 [[CreateView|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/#django.views.generic.edit.CreateView]]
** 用户编辑元素时,与新建非常类似,区别仅在于给用户的 HTML 表单的是 prepopulated 的(已经有值的)。于是有了 [[UpdateView|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/#updateview]]
** 用户点击网页上的删除入口时,应该弹出一个确认删除页,这个页面中用户可以做最终的删除操作。于是有了 [[DeleteView|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-editing/#deleteview]]
* 查看:
** 用户查看一批元素,即列表页,[[ListView|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/#listview]]
** 用户查看单个元素,即详情页,[[DetailView|https://docs.djangoproject.com/en/2.2/ref/class-based-views/generic-display/#detailview]]

并且 Django 提供了大量的自定义能力。





Docker 可以切割成下面几块进行理解。

!! Docker Engine

{{ docker-engine-components }}

Docker Engine is a client-server application with these major components:

* A server which is a type of long-running program called a daemon process (the `dockerd` command).
* A REST API which specifies interfaces that programs can use to talk to the daemon and instruct it what to do.
* A command line interface (CLI) client (the docker command).

!! Docker Architecture

{{ docker-architecture }}

这个图,可以看出 Container, Image 和 Registry 之间的关系:

* Conatiner 是上一节 Docker engine 描述的东西,它一般是通过某个 image 部署而来
* Image 是 Docker engine 根据你的 Dockerfile 构建出来的一个二进制包。Docker 用了一种我搞不懂的机制,保证了同一个 Dockerfile 构建出来同样的 image(未确认过)
* Registry 类似于 PyPi,是一个 Dockerfile 跟 Image 的仓库,你可以通过 Registry 拉到 image

大多数的 Image 都不是 base image,他们都是基于某个 parent image 构建出来的,比如 [[Redis|https://github.com/docker-library/redis/blob/14e48621e40c6b6c84e474e28b06430a3261916a/3.2/alpine/Dockerfile]],里面第一行 `FROM alpine:3.7` 表示它是基于 `alpine:3.7` 这个 image 构建的。Base image 一般都有一行 `FROM scratch`,这个 `scratch` 并不是一个真实的 image,不能被 pull。流行的 base image 有 Debian 系的 `jessie-slim` 和 Alpine。

这些 base image 是怎样构建出来的,我还看不懂。看 Github 上 `jessie-slim` 的 [[Dockerfile|https://github.com/debuerreotype/docker-debian-artifacts/blob/132a85df5e5e1528b46bcd44e8bfcc9d82ffce2d/jessie/slim/Dockerfile]],不明白这个 `rootfs.tar.xz` 的内容,怎样保证就能运行在 Container 的环境中?比如各种驱动怎样保证呢?

!! Service, Task, Node, Stack, and Swarm

{{ docker-service }}

Service 表示一组服务。比如上图,你想要有一个 nginx 作为 load balancer,于是你定义了一个有 3 个实例(replica)的 nginx 服务。

这个服务被分割成 3 个 task,每个 task 都要起一个容器去运行 nginx。每个容器即是这个 nginx 服务的一个结点。

一个 stack 表示一组相互关联的 service。比如你有两个服务,一个 nginx 作 LB,一个 Django 作应用服务器,这两个服务是相互关联的。那么你可以写一个 `docker-compose.yml` 文件,再通过 `docker stack` 命令部署上去。

由于往往有多个容器运行不同服务,需要一套机制来管理不同的容器结点,因此 Docker Swarm 产生了:

{{ docker-swarm }}

Swarm 定义了一个 manager 结点和一些 worker 结点。在不同容器中通过 `docker swarm` 命令成为 manager 结点或者加入另外一个 manager 结点组成 swarm。这个机制于 Docker Stack 相辅相成,有了 Docker Swarm 后,stack 才可以在 manager 结点上,通过 API 与各个 worker 通讯,按 `docker-compose.yml` 定义的服务去部署节点。

!! The Underlying Technology

这块我无力深入,只把需要理解的内容纪录下来。

* [[Namespace|Linux: Namespaces]]:实现不同容器间,进程、网络、IPC、文件系统装载、用户系统等隔离
* Control groups:实现资源分配
* Union file systems:让文件系统分层,比如一层可写的覆盖在一层只读的上面

!! References

* [[Docker Overview|https://docs.docker.com/engine/docker-overview/]]
* [[How services work|https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/]]
* [[Swarm mode key concepts|https://docs.docker.com/engine/swarm/key-concepts/]]
在容器宿主机上获取容器 CPU 及内存使用率。

!! 方案一:使用 docker 命令行

示例代码:

```bash
docker stats --no-stream $(docker ps --format={{.Names}} | grep ${CONTAINER_NAME}) \
  --format "{{.CPUPerc}}:{{.MemPerc}}:{{.MemUsage}}" | head -n 1 | \
  while IFS=: read cpu_percent mem_percent mem_usage;
  do
    echo $mem_usage | while IFS=' / ' read mem_used mem_total
    do
      # mem_used / mem_total 可能有这几种单位:
      # https://github.com/docker/go-units/blob/1364ead0d8e38649c7d8d8920d1eafeaf5064071/size.go#L22
      # 但是他们会带一个 B 表示字节,如 7.527MiB 。${mem_used::-1} 去掉最后的 B,使其可以被 numfmt 理解。
      mem_used_kb=$(echo ${mem_used::-1} | numfmt --from iec-i --to-unit Ki)
      mem_total_kb=$(echo ${mem_total::-1} | numfmt --from iec-i --to-unit Ki)
    done
  done
```

方案优点:

* 利用 `docker stats` 来获取计算好的 CPU / Mem 内存占用,相对方便

方案缺点:

* `docker stats` 输出的数据不够可编程(比如 `MemUsage` 字段输出 `7.42 MiB / 512 MiB`,仍然需要自己去做解析)
* Bash 脚本操纵数据能力差,不得不引入 `numfmt`, `jo` 等工具用来解析单位、生成 JSON 等
* Bash 脚本难写,一个 split string 就写得很别扭,编码、调试时间增加

!! 方案二:使用 Docker Engine API

这个方案使用 Docker Engine API 来获取 `docker stats` 所展现的数据。

```bash
CONTAINER_ID=$(curl -s --unix-socket ${DOCKER_SOCK_PATH} -H "Content-Type: application/json" "http:/v1.24/containers/json?filters=\{\"name\":\[\"${CONTAINER_NAME}\"\]\}" | jq -r ".[0].Names[0][1:]")
STATS_JSON_DATA=$(curl --unix-socket ${DOCKER_SOCK_PATH} -H "Content-Type: application/json" http:/v1.24/containers/${CONTAINER_ID}/stats?stream=false)
```

`STATS_JSON_DATA` 便存储了 Docker API 返回的资源占用 JSON 数据([[参考|https://docs.docker.com/engine/api/v1.26/#operation/ContainerStats]])。然后你需要模仿 Docker 命令行的做法([[参考|https://github.com/moby/moby/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go#L175]]),把这些数据计算成我们实际需要的资源占用数据。

方案优点:

* 比直接用 Docker 命令行轻量及快速

方案缺点:

* 难以仅用 Bash 完成所有任务,需要额外写一个 Go 程序来做 JSON 处理和计算
* 未来 `docker stats` 的计算方法如果改变,可能需要随之变化
* 需要考虑 API 兼容性([[参考|https://docs.docker.com/engine/api/v1.26/#section/Versioning]]),比如 Docker 1.12.6 版本对应 Docker API 1.24 版本。你需要收集 TSF 的所有容器运行环境的 Docker 版本,来判断用哪个 API 版本
在 TSF 公有云上做了次实验,使用的是 TKE 初始化的计算节点。

!! 修改配置

改动前:

```
[root@VM_0_8_centos ~]# ps aux | grep dockerd
root      2153  2.0  0.7 587840 62104 ?        Ssl  Mar11 450:45 /usr/bin/dockerd --log-driver=json-file --ip-masq=false --log-level=warn --storage-opt=overlay2.override_kernel_check=true --registry-mirror=https://mirror.ccs.tencentyun.com --log-opt=max-file=10 --log-opt=max-size=100m --live-restore=true --iptables=false --bip=169.254.32.1/28 --storage-driver=overlay2

[root@VM_0_8_centos ~]# cat /etc/docker/dockerd 
IP_MASQ="--ip-masq=false"
LOG_LEVEL="--log-level=warn"
STORAGE_OPT="--storage-opt=overlay2.override_kernel_check=true"
LOG_DRIVER="--log-driver=json-file"
LOG_OPT="--log-opt=max-file=10 --log-opt=max-size=100m "
LIVE_RESTORE="--live-restore=true"
IPTABLES="--iptables=false"
BIP="--bip=169.254.32.1/28"
STORAGE_DRIVER="--storage-driver=overlay2"
REGISTRY_MIRROR="--registry-mirror=https://mirror.ccs.tencentyun.com"
```

该机器上无 `/etc/docker/daemon.json` 文件存在;`~/.docker/config.json` 中仅有 Auth 信息,无影响 logging 的配置。

改动 `/etc/docker/dockerd`,将 LOG_DRIVER 配置为 [[journald|https://docs.docker.com/config/containers/logging/journald/]]:

```
[root@VM_0_8_centos ~]# cat /etc/docker/dockerd 
IP_MASQ="--ip-masq=false"
LOG_LEVEL="--log-level=warn"
STORAGE_OPT="--storage-opt=overlay2.override_kernel_check=true"
# LOG_DRIVER="--log-driver=json-file"
LOG_DRIVER="--log-driver=journald"
# LOG_OPT="--log-opt=max-file=10 --log-opt=max-size=100m "
LIVE_RESTORE="--live-restore=true"
IPTABLES="--iptables=false"
BIP="--bip=169.254.32.1/28"
STORAGE_DRIVER="--storage-driver=overlay2"
REGISTRY_MIRROR="--registry-mirror=https://mirror.ccs.tencentyun.com"
```

重启 Docker Daemon:`systemctl restart dockerd`,可以观察到启动的 dockerd 已经使用 journald 作为 log driver:

```
root     12450  6.2  0.5 684452 42704 ?        Ssl  10:58   0:00 /usr/bin/dockerd --log-driver=journald --ip-masq=false --log-level=warn --storage-opt=overlay2.override_kernel_check=true --registry-mirror=https://mirror.ccs.tencentyun.com --live-restore=true --iptables=false --bip=169.254.32.1/28 --storage-driver=overlay2
```

!! 观察容器信息

`docker inspect` 一个在改动前运行的容器:

```
docker inspect 303eff6f0c83
# 观察到 LogConfig 仍然是之前的 json-file:
"LogConfig": {
    "Type": "json-file",
    "Config": {
        "max-file": "10",
        "max-size": "100m"
    }
}
```

在 K8S 上重新部署这个容器后:

```
docker inspect 36b4fc3bd0e9
# 观察到 LogConfig 变成 journald 了。。
"LogConfig": {
    "Type": "journald",
    "Config": {}
}
```

此时 `/var/log/pods` 下不再有此 pod 的日志;`kubectl logs` 也会报失败。
在 TSF 公有云上做了次实验,使用的是 TKE 初始化的计算节点。

!! 修改配置

改动前:

```
[root@VM_0_8_centos ~]# ps aux | grep dockerd
root      2153  2.0  0.7 587840 62104 ?        Ssl  Mar11 450:45 /usr/bin/dockerd --log-driver=json-file --ip-masq=false --log-level=warn --storage-opt=overlay2.override_kernel_check=true --registry-mirror=https://mirror.ccs.tencentyun.com --log-opt=max-file=10 --log-opt=max-size=100m --live-restore=true --iptables=false --bip=169.254.32.1/28 --storage-driver=overlay2

[root@VM_0_8_centos ~]# cat /etc/docker/dockerd 
IP_MASQ="--ip-masq=false"
LOG_LEVEL="--log-level=warn"
STORAGE_OPT="--storage-opt=overlay2.override_kernel_check=true"
LOG_DRIVER="--log-driver=json-file"
LOG_OPT="--log-opt=max-file=10 --log-opt=max-size=100m "
LIVE_RESTORE="--live-restore=true"
IPTABLES="--iptables=false"
BIP="--bip=169.254.32.1/28"
STORAGE_DRIVER="--storage-driver=overlay2"
REGISTRY_MIRROR="--registry-mirror=https://mirror.ccs.tencentyun.com"
```

该机器上无 `/etc/docker/daemon.json` 文件存在;`~/.docker/config.json` 中仅有 Auth 信息,无影响 logging 的配置。

改动 `/etc/docker/dockerd`,将 LOG_DRIVER 配置为 [[journald|https://docs.docker.com/config/containers/logging/journald/]]:

```
[root@VM_0_8_centos ~]# cat /etc/docker/dockerd 
IP_MASQ="--ip-masq=false"
LOG_LEVEL="--log-level=warn"
STORAGE_OPT="--storage-opt=overlay2.override_kernel_check=true"
# LOG_DRIVER="--log-driver=json-file"
LOG_DRIVER="--log-driver=journald"
# LOG_OPT="--log-opt=max-file=10 --log-opt=max-size=100m "
LIVE_RESTORE="--live-restore=true"
IPTABLES="--iptables=false"
BIP="--bip=169.254.32.1/28"
STORAGE_DRIVER="--storage-driver=overlay2"
REGISTRY_MIRROR="--registry-mirror=https://mirror.ccs.tencentyun.com"
```

重启 Docker Daemon:`systemctl restart dockerd`,可以观察到启动的 dockerd 已经使用 journald 作为 log driver:

```
root     12450  6.2  0.5 684452 42704 ?        Ssl  10:58   0:00 /usr/bin/dockerd --log-driver=journald --ip-masq=false --log-level=warn --storage-opt=overlay2.override_kernel_check=true --registry-mirror=https://mirror.ccs.tencentyun.com --live-restore=true --iptables=false --bip=169.254.32.1/28 --storage-driver=overlay2
```

!! 观察容器信息

`docker inspect` 一个在改动前运行的容器:

```
docker inspect 303eff6f0c83
# 观察到 LogConfig 仍然是之前的 json-file:
"LogConfig": {
    "Type": "json-file",
    "Config": {
        "max-file": "10",
        "max-size": "100m"
    }
}
```

在 K8S 上重新部署这个容器后:

```
docker inspect 36b4fc3bd0e9
# 观察到 LogConfig 变成 journald 了。。
"LogConfig": {
    "Type": "journald",
    "Config": {}
}
```

此时 `/var/log/pods` 下不再有此 pod 的日志;`kubectl logs` 也会报失败。
[[GCR|https://cloud.google.com/container-registry/]] 的 Google 的 container registry 服务。Kubernetes、Istio 相关的镜像 host 在这上面。Google 服务被墙,在国内无法正常访问到。有这些解决办法:

* USTC host 了一个 GCR 的镜像
* 参考 [[Docker: Speedup Docker Registry Image Pulling]] 中描述的使 Docker 走 HTTP proxy 的方法
* 在境外的 VPS 上先 `docker pull` 下来镜像,再 `docker save` 成 tar 包拿到境内的机器上,再 `docker load` 导入进来

!! USTC host 的 GCR 镜像的使用方法

USTC host 了一个 GCR 的镜像,相关讨论在这个 [[issue|https://github.com/ustclug/mirrorrequest/issues/91]] 上,暂无官方服务声明(参考 [[这里|https://mirrors.ustc.edu.cn/help/]])。

对于 `gcr.io` 域名的镜像,将域名替换即可:

|!原地址 |`gcr.io/<namespace>/<image>:<tag>` |
|!转换后 |`gcr.mirrors.ustc.edu.cn/<namespace>/<image>:<tag>` |

对于 `k8s.gcr.io` 域名的镜像,转换规则奇怪一点:

|!原地址 |`k8s.gcr.io/<image>:<tag>` |
|!转换后 |`gcr.mirrors.ustc.edu.cn/google_containers/<image>:<tag>` |

比如:

|!原地址 |`k8s.gcr.io/heapster-amd64:v1.5.4` |
|!转换后 |`gcr.mirrors.ustc.edu.cn/google_containers/heapster-amd64:v1.5.4` |
这里列举一些 Docker 镜像仓库服务,方便做个人服务 / 日常功能测试。

!! Docker Hub

[[Docker Hub|https://hub.docker.com/]] 是官方的镜像仓库。用 Docker 命令行 push 镜像时,如果你不指定域名,默认就是传到 Docker Hub。国内速度不错。
在 `docker build` 时经常有一个场景,比如使用 Debian 系镜像时需要 `apt install` 装包,使用 Go 时需要 `go get` 拉库。但是这些操作往往需要访问国外服务器,很慢甚至有些被墙。这时候我们期望容器里的进程可以访问宿主机的代理。

正常的做法是,给容器环境设置 `http_proxy` 环境变量,使其指向宿主机的代理。大多数程序,无论是 `apt` 还是 `go get`,都会理解这个环境变量。所以:

''如何设置环境变量?''([[官方文档|https://docs.docker.com/network/proxy/]])

* 对于 Docker 1.13.0(API 1.25+)及以上版本,可以在 `~/.docker/config.json` 中写入 "proxies" 配置,Docker 会将其转换为环境变量带入容器内:<div>

```json
{
  "proxies": {
    "default": {
      "httpProxy": "http://127.0.0.1:8001",
      "httpsProxy": "http://127.0.0.1:8001",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}
```

</div>

* 对于 Docker 1.13.0 以下版本,可以在 Dockerfile 中使用 `ENV` 指令,或者 `docker run --env` 中指定

<<.warning "上面的方式设置的环境变量,不仅对 `docker build` 生效,也对 `docker run` 生效。这导致我曾经在使用 pupeteer 时,未设置 `noProxy`,脚本总是通过代理去连接 Chrome 开的 DevTools WebSockets 服务上(因为走了代理),从而无法连上,定位了好久。">>

''如何在容器内访问宿主机的端口?''

* 对于 Windows 或 MacOS,Docker 提供了 `host.docker.internal` 这样一个域名,可以解析成宿主机的 IP。因此你只需要在 Dockerfile 中设置 `http_proxy` 环境变量,并在使用完后将其重置:<div>

```dockerfile
FROM node:12-alpine
ENV http_proxy=http://host.docker.internal:8001 
RUN apk add --update bash
ENV http_proxy=
```

</div>
* 对于 Linux 环境下,不支持 `host.docker.internal`,可以:
** Docker 1.13.0(API 1.25+)及以上版本,
*** 在 `docker build` 时,可以使用 `docker build --network=host` 来使用 host 的网络
*** 在 `docker-compose build` 时,可以在 3.0 版本的 `docker-compose.yml` 中写入 `network` 配置:<div>

```
version: '3'
services:
  web:
    build: 
      context: .
      // add network field
      network: host
```

</div>
** Docker 1.13.0 以下版本,可以参考这个 [[SO 答案|https://stackoverflow.com/a/31328031/1189076]] 使用 `ip route` 命令来获取。但不一定可靠:<div>

```bash
hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip
```

</div>
如果访问 Docker [[官方 registry|https://hub.docker.com/]] 慢,有这些办法:

* 使用国内的 Docker Hub 镜像
* 使 Docker daemon 走 HTTP 代理

!! 使用国内的 Docker Hub 镜像

由于 Docker Hub 镜像服务非常烧带宽和流量(也就是非常烧钱),各厂商并不愿意免费对公众提供这类服务。很多厂商一开始提供,但是后面服务慢慢劣化或者不再对公众提供,比如 Azure 只允许自己机房的 IP 访问,Docker CN 提供的不再可用,七牛也要下架它的镜像服务。

目前推荐使用的是阿里云的服务。阿里云的镜像服务地址并不是公开的,需要用户注册成为阿里云用户,登陆到它的容器镜像服务的 [[控制台|https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors]] 去开启,然后会生成一个专属的镜像地址。我的地址放在了 Enpass 中。

不推荐使用的:

* Azure 的源,参考 [[这里|https://github.com/Azure/container-service-for-azure-china/blob/master/aks/README.md#22-container-registry-proxy]];已不再对公众开放
* 中科大提供的源,参考这 [[两份|https://mirrors.ustc.edu.cn/help/dockerhub.html]] [[帮助|https://lug.ustc.edu.cn/wiki/mirrors/help/docker]];速度和可用性相对不稳定
* Docker CN 提供的 [[源|https://www.docker-cn.com/registry-mirror]];不再提供支持

应用上国内源有几个办法:

* 修改 Docker daemon 配置文件
* 修改 Dockerfile / 部署配置中的镜像地址为国内源

!!! 修改 Docker daemon 配置文件

对于使用 systemd Linux 发行版,在配置文件 `/etc/docker/daemon.json` 中加入:

```json
{
  "registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
```

其他 Linux 发行版及 Windows、macOS 看 USTC 维护的 [[文档|https://mirrors.ustc.edu.cn/help/dockerhub.html]]。

对于 Minikube,参考这个 [[issue|https://github.com/kubernetes/minikube/issues/2638#issuecomment-376130363]]:

```bash
minikube ssh
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
```

还可以使用阿里云修改过的 minikube,会把默认的 registry 设成阿里云的镜像,参考 [[这个说明|https://yq.aliyun.com/articles/221687]]。

!!! 修改 Dockerfile / 部署配置中的镜像地址为国内源

对于 Dockerfile,可以把:`FROM python:3` 改为 `FROM <id>.mirror.aliyuncs.com/library/python:3`。

在各种部署配置中(比如 Kubernetes 的 deployment)定义的 image,也可以改成国内镜像的 image 地址。比如:

```yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: details-v1
spec:
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      containers:
      - name: python
        image: python:3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
```

可以把其中的 `image`,从 `python:3` 改为 `<id>.mirror.aliyuncs.com/library/python:3`。

!! 使 Docker daemon 走 HTTP 代理

Docker daemon 会 respect `HTTP_PROXY`, `HTTPS_PROXY` 及 `NO_PROXY` 环境变量。你需要在 daemon 启动时设置它们。对于 systemd 启动的 Docker daemon,参考 Docker [[官方文档|https://docs.docker.com/config/daemon/systemd/#httphttps-proxy]],通过 systemd 的 service 文件将环境变量设置好。

对于 minikube,启动时通过 `--docker-env` 传 `http_proxy` `https_proxy` 环境变量进去,但是要注意网络访问的连通性,参考 [[这里|https://kubernetes.io/docs/getting-started-guides/minikube/#using-minikube-with-an-http-proxy]]。

!! 其他流行 registry 的国内镜像

除了 Docker Hub 之外,还有一些流行的 Docker registry 服务:

* gcr.io:Google 的服务。Istio 框架托管在这上面;k8s 的一些组件也托管在上面
* quay.io:未调研
* mcr.microsoft.com:未调研

这些 registry 有些访问慢、有些被墙。日常可能会用到的是 gcr.io,中科大有提供 [[反代|https://github.com/ustclug/mirrorrequest/issues/187]],但不一定稳定。使用方法是修改镜像地址:

|!原地址                         |!修改后                              |
|gcr.io/''xxx''/''yyy'':''zzz'' |gcr.mirrors.ustc.edu.cn/''xxx''/''yyy'':''zzz'' |
|k8s.gcr.io/''xxx'':''yyy''     |gcr.mirrors.ustc.edu.cn/google-containers/''xxx'':''yyy'' |

在 `docker build` 时经常有一个场景,比如使用 Debian 系镜像时需要 `apt install` 装包,使用 Go 时需要 `go get` 拉库。但是这些操作往往需要访问国外服务器,很慢甚至有些被墙。这时候我们期望容器里的进程可以访问宿主机的代理。

正常的做法是,给容器环境设置 `http_proxy` 环境变量,使其指向宿主机的代理。大多数程序,无论是 `apt` 还是 `go get`,都会理解这个环境变量。所以:

''如何设置环境变量?''([[官方文档|https://docs.docker.com/network/proxy/]])

* 对于 Docker 1.13.0(API 1.25+)及以上版本,可以在 `~/.docker/config.json` 中写入 "proxies" 配置,Docker 会将其转换为环境变量带入容器内:<div>

```json
{
  "proxies": {
    "default": {
      "httpProxy": "http://127.0.0.1:8001",
      "httpsProxy": "http://127.0.0.1:8001",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}
```

</div>

* 对于 Docker 1.13.0 以下版本,可以在 Dockerfile 中使用 `ENV` 指令,或者 `docker run --env` 中指定

<<.warning "上面的方式设置的环境变量,不仅对 `docker build` 生效,也对 `docker run` 生效。这导致我曾经在使用 pupeteer 时,未设置 `noProxy`,脚本总是通过代理去连接 Chrome 开的 DevTools WebSockets 服务上(因为走了代理),从而无法连上,定位了好久。">>

''如何在容器内访问宿主机的端口?''

* 对于 Windows 或 MacOS,Docker 提供了 `host.docker.internal` 这样一个域名,可以解析成宿主机的 IP。因此你只需要在 Dockerfile 中设置 `http_proxy` 环境变量,并在使用完后将其重置:<div>

```dockerfile
FROM node:12-alpine
ENV http_proxy=http://host.docker.internal:8001 
RUN apk add --update bash
ENV http_proxy=
```

</div>
* 对于 Linux 环境下,不支持 `host.docker.internal`,可以:
** Docker 1.13.0(API 1.25+)及以上版本,
*** 在 `docker build` 时,可以使用 `docker build --network=host` 来使用 host 的网络
*** 在 `docker-compose build` 时,可以在 3.0 版本的 `docker-compose.yml` 中写入 `network` 配置:<div>

```
version: '3'
services:
  web:
    build: 
      context: .
      // add network field
      network: host
```

</div>
** Docker 1.13.0 以下版本,可以参考这个 [[SO 答案|https://stackoverflow.com/a/31328031/1189076]] 使用 `ip route` 命令来获取。但不一定可靠:<div>

```bash
hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip
```

</div>
在容器宿主机上获取容器 CPU 及内存使用率。

!! 方案一:使用 docker 命令行

示例代码:

```bash
docker stats --no-stream $(docker ps --format={{.Names}} | grep ${CONTAINER_NAME}) \
  --format "{{.CPUPerc}}:{{.MemPerc}}:{{.MemUsage}}" | head -n 1 | \
  while IFS=: read cpu_percent mem_percent mem_usage;
  do
    echo $mem_usage | while IFS=' / ' read mem_used mem_total
    do
      # mem_used / mem_total 可能有这几种单位:
      # https://github.com/docker/go-units/blob/1364ead0d8e38649c7d8d8920d1eafeaf5064071/size.go#L22
      # 但是他们会带一个 B 表示字节,如 7.527MiB 。${mem_used::-1} 去掉最后的 B,使其可以被 numfmt 理解。
      mem_used_kb=$(echo ${mem_used::-1} | numfmt --from iec-i --to-unit Ki)
      mem_total_kb=$(echo ${mem_total::-1} | numfmt --from iec-i --to-unit Ki)
    done
  done
```

方案优点:

* 利用 `docker stats` 来获取计算好的 CPU / Mem 内存占用,相对方便

方案缺点:

* `docker stats` 输出的数据不够可编程(比如 `MemUsage` 字段输出 `7.42 MiB / 512 MiB`,仍然需要自己去做解析)
* Bash 脚本操纵数据能力差,不得不引入 `numfmt`, `jo` 等工具用来解析单位、生成 JSON 等
* Bash 脚本难写,一个 split string 就写得很别扭,编码、调试时间增加

!! 方案二:使用 Docker Engine API

这个方案使用 Docker Engine API 来获取 `docker stats` 所展现的数据。

```bash
CONTAINER_ID=$(curl -s --unix-socket ${DOCKER_SOCK_PATH} -H "Content-Type: application/json" "http:/v1.24/containers/json?filters=\{\"name\":\[\"${CONTAINER_NAME}\"\]\}" | jq -r ".[0].Names[0][1:]")
STATS_JSON_DATA=$(curl --unix-socket ${DOCKER_SOCK_PATH} -H "Content-Type: application/json" http:/v1.24/containers/${CONTAINER_ID}/stats?stream=false)
```

`STATS_JSON_DATA` 便存储了 Docker API 返回的资源占用 JSON 数据([[参考|https://docs.docker.com/engine/api/v1.26/#operation/ContainerStats]])。然后你需要模仿 Docker 命令行的做法([[参考|https://github.com/moby/moby/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go#L175]]),把这些数据计算成我们实际需要的资源占用数据。

方案优点:

* 比直接用 Docker 命令行轻量及快速

方案缺点:

* 难以仅用 Bash 完成所有任务,需要额外写一个 Go 程序来做 JSON 处理和计算
* 未来 `docker stats` 的计算方法如果改变,可能需要随之变化
* 需要考虑 API 兼容性([[参考|https://docs.docker.com/engine/api/v1.26/#section/Versioning]]),比如 Docker 1.12.6 版本对应 Docker API 1.24 版本。你需要收集 TSF 的所有容器运行环境的 Docker 版本,来判断用哪个 API 版本
[[GCR|https://cloud.google.com/container-registry/]] 的 Google 的 container registry 服务。Kubernetes、Istio 相关的镜像 host 在这上面。Google 服务被墙,在国内无法正常访问到。有这些解决办法:

* USTC host 了一个 GCR 的镜像
* 参考 [[Docker: Task: How to Speed up Docker Pull]] 中描述的使 Docker 走 HTTP proxy 的方法
* 在境外的 VPS 上先 `docker pull` 下来镜像,再 `docker save` 成 tar 包拿到境内的机器上,再 `docker load` 导入进来

!! USTC host 的 GCR 镜像的使用方法

USTC host 了一个 GCR 的镜像,相关讨论在这个 [[issue|https://github.com/ustclug/mirrorrequest/issues/91]] 上,暂无官方服务声明(参考 [[这里|https://mirrors.ustc.edu.cn/help/]])。

对于 `gcr.io` 域名的镜像,将域名替换即可:

|!原地址 |`gcr.io/<namespace>/<image>:<tag>` |
|!转换后 |`gcr.mirrors.ustc.edu.cn/<namespace>/<image>:<tag>` |

对于 `k8s.gcr.io` 域名的镜像,转换规则奇怪一点:

|!原地址 |`k8s.gcr.io/<image>:<tag>` |
|!转换后 |`gcr.mirrors.ustc.edu.cn/google_containers/<image>:<tag>` |

比如:

|!原地址 |`k8s.gcr.io/heapster-amd64:v1.5.4` |
|!转换后 |`gcr.mirrors.ustc.edu.cn/google_containers/heapster-amd64:v1.5.4` |
如果访问 Docker [[官方 registry|https://hub.docker.com/]] 慢,有这些办法:

* 使用国内的 Docker Hub 镜像
* 使 Docker daemon 走 HTTP 代理

!! 使用国内的 Docker Hub 镜像

由于 Docker Hub 镜像服务非常烧带宽和流量(也就是非常烧钱),各厂商并不愿意免费对公众提供这类服务。很多厂商一开始提供,但是后面服务慢慢劣化或者不再对公众提供,比如 Azure 只允许自己机房的 IP 访问,Docker CN 提供的不再可用,七牛也要下架它的镜像服务。

目前推荐使用的是阿里云的服务。阿里云的镜像服务地址并不是公开的,需要用户注册成为阿里云用户,登陆到它的容器镜像服务的 [[控制台|https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors]] 去开启,然后会生成一个专属的镜像地址。我的地址放在了 Enpass 中。

不推荐使用的:

* Azure 的源,参考 [[这里|https://github.com/Azure/container-service-for-azure-china/blob/master/aks/README.md#22-container-registry-proxy]];已不再对公众开放
* 中科大提供的源,参考这 [[两份|https://mirrors.ustc.edu.cn/help/dockerhub.html]] [[帮助|https://lug.ustc.edu.cn/wiki/mirrors/help/docker]];速度和可用性相对不稳定
* Docker CN 提供的 [[源|https://www.docker-cn.com/registry-mirror]];不再提供支持

应用上国内源有几个办法:

* 修改 Docker daemon 配置文件
* 修改 Dockerfile / 部署配置中的镜像地址为国内源

!!! 修改 Docker daemon 配置文件

对于使用 systemd Linux 发行版,在配置文件 `/etc/docker/daemon.json` 中加入:

```json
{
  "registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
```

其他 Linux 发行版及 Windows、macOS 看 USTC 维护的 [[文档|https://mirrors.ustc.edu.cn/help/dockerhub.html]]。

对于 Minikube,参考这个 [[issue|https://github.com/kubernetes/minikube/issues/2638#issuecomment-376130363]]:

```bash
minikube ssh
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://<id>.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
```

还可以使用阿里云修改过的 minikube,会把默认的 registry 设成阿里云的镜像,参考 [[这个说明|https://yq.aliyun.com/articles/221687]]。

!!! 修改 Dockerfile / 部署配置中的镜像地址为国内源

对于 Dockerfile,可以把:`FROM python:3` 改为 `FROM <id>.mirror.aliyuncs.com/library/python:3`。

在各种部署配置中(比如 Kubernetes 的 deployment)定义的 image,也可以改成国内镜像的 image 地址。比如:

```yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: details-v1
spec:
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      containers:
      - name: python
        image: python:3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
```

可以把其中的 `image`,从 `python:3` 改为 `<id>.mirror.aliyuncs.com/library/python:3`。

!! 使 Docker daemon 走 HTTP 代理

Docker daemon 会 respect `HTTP_PROXY`, `HTTPS_PROXY` 及 `NO_PROXY` 环境变量。你需要在 daemon 启动时设置它们。对于 systemd 启动的 Docker daemon,参考 Docker [[官方文档|https://docs.docker.com/config/daemon/systemd/#httphttps-proxy]],通过 systemd 的 service 文件将环境变量设置好。

对于 minikube,启动时通过 `--docker-env` 传 `http_proxy` `https_proxy` 环境变量进去,但是要注意网络访问的连通性,参考 [[这里|https://kubernetes.io/docs/getting-started-guides/minikube/#using-minikube-with-an-http-proxy]]。

!! 其他流行 registry 的国内镜像

除了 Docker Hub 之外,还有一些流行的 Docker registry 服务:

* gcr.io:Google 的服务。Istio 框架托管在这上面;k8s 的一些组件也托管在上面
* quay.io:未调研
* mcr.microsoft.com:未调研

这些 registry 有些访问慢、有些被墙。日常可能会用到的是 gcr.io,中科大有提供 [[反代|https://github.com/ustclug/mirrorrequest/issues/187]],但不一定稳定。使用方法是修改镜像地址:

|!原地址                         |!修改后                              |
|gcr.io/''xxx''/''yyy'':''zzz'' |gcr.mirrors.ustc.edu.cn/''xxx''/''yyy'':''zzz'' |
|k8s.gcr.io/''xxx'':''yyy''     |gcr.mirrors.ustc.edu.cn/google-containers/''xxx'':''yyy'' |
* [[Portainer|https://github.com/portainer/portainer]]: 基于 web 的 GUI 界面,非常详细地查看 Docker 运行环境相关的一切信息
!! Docker run 报建 endpoint 失败

如:

```cmd
docker run --rm hello-world
docker: Error response from daemon: failed to create endpoint jolly_kare on network bridge: failed to add the host (veth1d85371) <=> sandbox (vethbc264f6) pair interfaces: operation not supported.
```

这大概率是因为你升级了 kernel 但是没重启。参考 [[这里|https://github.com/moby/moby/issues/27426]]。

!! 做了端口映射将容器内端口映射到宿主机上,但是访问失败

如下面 8080 (container) => 10000 (host),但是访问宿主机 10000 端口时报 connection reset:

```cmd
docker run -d -ti -p 10000:8080 onlyice/public-wiki
```

原因是容器内的应用程序监听在 localhost 上,导致无法对外服务。
如果在公司网络中,需要代理才能访问外网,参考这个 [[帖子|https://mandie.net/2017/12/10/docker-for-windows-behind-a-corporate-web-proxy-tips-and-tricks/]] 来做配置。
文档工具。可能考虑点:

* 网盘属性
* 在线编辑
* Docs 跟 Sheet 混排
* Markdown Support
* 动态特性,比如动态显示剩余天数

!! 在线文档 + 网盘

* Dropbox + Paper
* OneDrive + Office 365
* Google Drive + Google Docs

!! 多功能文档工具

* [[Notion|https://www.notion.so/]]: So many kinds of blocks
* [[Coda|https://coda.io/welcome]]: 看起来也很智能

!! 码农工具

* [[VuePress|https://vuepress.vuejs.org/zh/]]: 非常好看的文档网站工具,静态生成,不需要服务器
* [[ReadMe|https://readme.io/documentation]]
管理 dotfiles,用 [[yadm|https://yadm.io/]]。使用方法很简单,直接看文档即可。

现在的 Dotfiles 放在 GitHub 的 [[私有仓库|https://github.com/onlyice/dotfiles]] 中。

yadm 有 [[alt|https://yadm.io/docs/alternates]] 功能,可以针对同一文件,在不同设备使用不同的文件。

这个功能,最好按设备来,同时兼顾操作系统。考虑几点:

* 我将同时使用 Linux 和 macOS
* 不同的设备有做出区别的需要,比如 `kglobalshortcutsrc` 这种,里面包含 Widget ID,在不同机器上不一样
* 笔记本即在家用又在公司用,在公司里用有一些不同的配置需求,比如在公司要给 SVN 配 proxy server,在家里不用

yadm 提供了 CLASS, OS, HOSTNAME, USER 等多层条件,用来选择文件。因此:

* 使用 CLASS 区分设备:
** `pc1`: 家里的台式机电脑
** `nb1`: Dell 燃 7000 笔记本电脑
** `wsl1`: 家里的台式机电脑上的 Arch Linux WSL(不再使用)
** `wsl2`: 公司的台式机电脑上的 Arch Linux WSL(不再使用)
** `wsl3`: Dell 笔记本电脑上的 Arch Linux WSL(不再使用)
** `mac1`: 公司发的 15 存 Macbook Pro(不再使用)
* 使用 OS 区分操作系统(暂未使用,等有了 Macbook 再考虑下)
* 不使用 HOSTNAME 区分设备:
** WSL 上的 host name 往往跟着宿主 Windows 走(比如家里的台式机叫 `DESKTOP-V8LAOO3`,公司的 `onlyicelin-PC8`),可以灵活定制的情况不多,比如公司入域的设备可能不方便改 host name
** Mac 系统的 host name(比如 onlyice's Macbook Pro)与 Windows 的不太一致,不费力去修改成一致的观感

比如 `.xprofile` 中放了跟 DPI 相关的匹配,而家里的 `pc1` 设备用了 4K 显示屏,其他的设备是 1080P 显示屏,那么需要区分开:

* `pc1`:`~/.xprofile##c.pc1`
* 其他:`~/.xprofile##` (`##` 表示默认的)

CLASS 通过 `yadm` 命令行配置:

```bash
yadm config local.class pc1
```
目前我了解到的比较好的几个下载站有(排名分先后):

# https://gen.lib.rus.ec/
# https://sciarium.com/
# https://www.salttiger.com/ :中文网站, 国内网盘下载速度块,我在这上面找到了高质量的 //C++ Primer 5th Ed.//
# https://scanlibs.com/
# https://www.jiumodiary.com/:针对国内网盘搜索
# [[IT eBooks|http://it-ebooks.info/]]:这个站是开得比较久的,界面没有其他的好看,但是里面的书籍很全。可惜现在不能下载了。
# [[Ebook-dl|http://ebook-dl.com/]]:感觉内容维护得比较好,搜索、下载都很方便
# [[1Bookcase|https://1bookcase.com/]]:相对比较新的站,里面新书的资源似乎比较多,而且还有非 IT 类的书籍。但是一些老书(比如 2010 年前出版的书)搜不到,而且下载是跳另外一个网盘,相对费时间

参考:

# V2EX:[[从哪买正版外文书?|https://www.v2ex.com/t/319285]]

多对多关系下,API 输出的 `ManyToManyFields` 字段的值需要是排好序的,这应该怎么做?

具体场景是:一个图书系统中,一本图书可能有多个作者,但是作者间是有先后顺序的,比如 Harry Potter 中 J.K. Rowling 应该排在前面,而封面插画作者 Mary GrandPré 应该排在后面。

!! 如何在 Django Models 中实现 author 带顺序

`models.py` 做了简化后是这样:

```python
class Book(models.Model):
    title = models.CharField(max_length=200)
    authors = models.ManyToManyField('BookAuthor', through='BookAuthorRelation')

class BookAuthor(models.Model):
    name = models.CharField(max_length=120)

class BookAuthorRelation(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='ordered_authors')
    author = models.ForeignKey(BookAuthor, on_delete=models.CASCADE, related_name='ordered_books')
    role = models.CharField(max_length=50)

    class Meta:
        order_with_respect_to = 'book'
```

上面用了一个关联表 `BookAuthorRelation` 来存储一个作者在某本书中的角色,以及它在这本书的作者列表中排第几位。排序的字段是通过 `Meta` 中的 `order_with_respect_to` 加上的,这是 Django 提供的一个 [[特性|https://docs.djangoproject.com/en/3.0/ref/models/options/#order-with-respect-to]],会自动给数据库表加上一个 `_order` 的字段。比如这个例子中,DB 的数据是这样的:

|!id |!role |!author_id |!book_id |!_order |
|2 |illustrator |2927 |1 |1 |
|3 |author |1077326 |1 |0 |

同时我给 `BookAuthorRelation` 中的 `book` 字段加上了 `related_name` 为 `ordered_authors`,这会有这样的效果:

```python
>>> from main.models import Book
>>> b = Book.objects.get(pk=1)
b
<Book: Harry Potter>

# 这个顺序是错的。直接访问 `authors` 字段时,Django 并不会帮你按 `_order` 排序,而是隐式地按 DB 中的 `id` 排了序
>>> list(b.authors.all())
[<BookAuthor: Mary GrandPré>, <BookAuthor: J.K. Rowling>]

# 这个顺序是对的,会启用 Django 的 `order_with_respect_to` 功能;同时会有 role 信息
list(b.ordered_authors.all())
[<BookAuthorRelation: Harry Potter => J.K. Rowling>, <BookAuthorRelation: => Mary GrandPré>]
```

!! 如何实现 Book 的 API 输出时带的 authors 信息是正确排序的?

我们希望 Book 的 API 接口中,也把相应的作者信息,作为 [[嵌套的数据|https://www.django-rest-framework.org/api-guide/relations/#nested-relationships]] 带下去。一般的做法是:

```python
class BookAuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = BookAuthor
        fields = ['id', 'name']

class BookSerializer(serializers.ModelSerializer):
    authors = BookAuthorSerializer(many=True, read_only=True)
		
    class Meta:
        model = Book
        fields = ['id', 'title', 'authors']
```

这样输出的数据中,`authors` 的顺序是错的,Mary GrandPré 会排在 J.K. Rowling 前面:

```json
{
    "id": 1,
    "title": "Harry Potter",
    "authors": [
        {
            "id": 2927,
            "name": "Mary GrandPré"
        },
        {
            "id": 1077326,
            "name": "J.K. Rowling"
        }
    ]
}
```

并且所需要的 `role` 信息也没带上。


我们可以通过 `ordered_authors` 提供的正确的顺序及 role 信息。这是一个利用了 [[SerializerMethodField|https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield]] 来提供自定义格式的字段值的能力:

```python
class BookSerializer(serializers.ModelSerializer):
    authors = fields.SerializerMethodField(read_only=True)

    def get_authors(self, obj: Book):
        """Authors should be in ordered"""
        return [
            {'id': o.author_id, 'name': o.author.name, 'role': o.role}
            for o in obj.ordered_authors.all()
        ]
		
    class Meta:
        model = Book
        fields = ['id', 'title', 'authors']
```

此时输出的数据是正确顺序并带有 role 信息的:

```json
{
    "id": 1,
    "title": "Harry Potter",
    "authors": [
		    {
            "id": 1077326,
            "name": "J.K. Rowling",
            "role": "author"
        },
        {
            "id": 2927,
            "name": "Mary GrandPré",
            "role": "illustrator"
        }
    ]
}
```
查询某一元素下的一批元素。比如:

* 查询某个作者写的图书
* 查询某个班级的学生

对于使用 [[ModelViewSet|https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset]] 的情况,可以用 [[自定义动作|https://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing]] 来实现。自定义动作即是指,除了 `ModelViewSet` 默认提供 create、retrieve、update、destroy 及 list 动作外,自定义新的动作。比如下面这个例子,`books` 函数实现了查询某一作者下的图书:

```python
class BookAuthorViewSet(viewsets.ModelViewSet):
    queryset = BookAuthor.objects.all()
    serializer_class = BookAuthorSerializer

    @action(methods=['GET'], detail=True)    # 1
    def books(self, request, pk=None):
        try:
            author = BookAuthor.objects.get(id=pk)
        except BookAuthor.DoesNotExist:
            return Response({"error": "Author not found."}, status=status.HTTP_404_NOT_FOUND)

        books = author.book_set.order_by(
            F('publication_year').desc(nulls_last=True),
            F('publication_month').desc(nulls_last=True),
            F('publication_day').desc(nulls_last=True),
        )
				
        page = self.paginate_queryset(books)
        if page is not None:
				    # 2
            serializer = BookSerializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        else:
				    # 3
            serializer = BookSerializer(books, many=True)
            return Response(serializer.data)
```

代码解释:

# `detail=True` 表示是针对单个元素而不是列表的查询
# 如果 page 非 None,表示该项目 [[启用了分页|https://www.django-rest-framework.org/api-guide/pagination/#setting-the-pagination-style]],因此输出分页的结果;否则
# 输出完整的内容
<<.todo "调研下 [[jazzband/dj-rest-auth|https://github.com/jazzband/dj-rest-auth]] 的实现。">>

如何在 DRF 中实现注册新用户功能。

首先应该理解 Django 原有的 [[流程|Django: Auth: Signup]]。DRF 与 Django 的注册流程不同的是:

* Django 有现成的 `UserCreationForm`,校验表单中提交的用户名密码信息并实际保存到数据库;DRF 没有,需要自己实现
* Django 的 `<form>` 中需要带有 csrf token,但 DRF 中不需要带;如果用户在未登陆状态,对它实施 CSRF 攻击意义也不大

下面的实现上重度参考了 [[Django: Auth: Signup]] 中 Django 本身的实现,以及这个 StackOverflow [[帖子|https://stackoverflow.com/a/29391122/1189076]]。实现的重点写在注释中。

!! Serializer 实现

```python
# app/serializers.py
from rest_framework import serializers
from django.contrib.auth import get_user_model, password_validation

# get_user_model 可以获得 custom user model
UserModel = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    # password1 及 password2 表示用户在注册表单中,填写的「密码」和「确认密码」两个位置
    # write_only 因为它不需要出现在读接口中
    # input_type 使它在 DRF 的 browsable API 页面中是一个 <input type="password"> 而不是 <input type="text">
    # min_length 及 max_length 是额外的要求,因为 Django 默认只限制密码长度为 128 位,看这里:
    #   django.contrib.auth.base_user.AbstractBaseUser
    password1 = serializers.CharField(
        label="Password", write_only=True, style={'input_type': 'password'},
        min_length=8, max_length=20
    )
    password2 = serializers.CharField(
        label="Password confirmation", write_only=True, style={'input_type': 'password'},
        min_length=8, max_length=20
    )

    def validate_password1(self, value):
        # 生成一个 UserModel 对象传进去,password validation 才可以做密码跟用户名的相似度检查
        password_validation.validate_password(
            value, UserModel(username=self.initial_data['username'], email=self.initial_data['email'])
        )
        return value

    def validate(self, data):
        # 多 field 组合校验,在这里做
        if data['password1'] != data['password2']:
            raise serializers.ValidationError("The two password fields didn't match")
        return data

    def create(self, validated_data):
        user = UserModel.objects.create(
            username=validated_data['username'],
            email=validated_data['email'],
        )
        # set_password 会对明文密码做 hash
        user.set_password(validated_data['password1'])
        user.save()

        return user

    class Meta:
        model = UserModel
        fields = ("id", "username", "email", "password1", "password2")

        extra_kwargs = {
            # Django 默认的 django.contrib.auth.base_user.AbstractBase 对用户名长度限制宽松,这里加强
            'username': {
                'max_length': 16, 'min_length': 6,
                'help_text': 'Required. 6 to 16 characters required. Letters, digits and @/./+/-/_ only.'
            },

            # Django 默认非必填,这里要求必填
            'email': {'required': True},
        }
```

!! Views 实现

```python
# app/views.py
from django.contrib.auth import get_user_model
from rest_framework import permissions
from rest_framework.generics import CreateAPIView

from app.serializers import UserSerializer


class SignupView(CreateAPIView):
    model = get_user_model()
    permission_classes = [
		    # 使用 AllowAny 使匿名用户也可以注册。
				# DRF 默认的权限会使得匿名用户无法调用 POST 方法。
        permissions.AllowAny
    ]
    serializer_class = UserSerializer
```

!! Urls 配置

```python
# project/urls.py
from app.views import SignupView

urlpatterns = [
    # ...
    path('signup/', SignupView.as_view(), name='signup'),
]
```


<<.warning "这个实现还有一些不足之处,比如 Django 默认的 user 实现中,email 是可以重复的。应该写一个 custom user 将其转为不可重复。">>
<<.todo "补充下 session 方式的具体实践,比如 CSRF token 的 cookie 怎样下发到前端。补充下 OAuth 的实践。">>

!! 认证方式

DRF 的各种 [[认证方式|https://www.django-rest-framework.org/api-guide/authentication/]]。

!!! BasicAuthentication 和 TokenAuthentication

最简单的两种:

|!认证方式            |!BasicAuthentication                  |!TokenAuthentication |
|请求方应该带的头示例 |`Authentication: Basic 9d2f234` |`Authentication: Token f91de4` |
|认证失败时返回 |`WWW-Authenticate: Basic realm="api"` |`WWW-Authenticate: Token` |
|说明 |比较鸡肋 |需要为每个用户生成单独的 Token |

BasicAuthentication 不用多说,现实中线上的产品应该不会有人用这种模式。即使用,也应该在 HTTPS 基础上用。

DRF 的 TokenAuthentication 比较鸡肋。[[django-rest-knox|https://github.com/James1345/django-rest-knox]] 指出了它存在的问题:

* Token 是按用户的维度来设计,而不是按会话来。这意味着同一个 token 在用户的不同浏览器、设备间共享。一旦 token 在服务端被删除,则全部客户端都需要重新登陆
* Token 在服务端的数据库中没有加密保存。一旦泄露问题很大
* 没有内建的 token 过期机制

[[django-rest-knox|https://github.com/James1345/django-rest-knox]] 在实现上比 DRF 的好,但是它也 ''没有解决 [[login CSRF|Web Security: CSRF]] 的问题''。这篇博客 [[文章|http://v1k45.com/blog/modern-django-part-4-adding-authentication-to-react-spa-using-drf/]] 详细讲述了如何用 knox 配合 React 实现注册登陆流程。 

!!! SessionAuthentication

稍微复杂但是一样鸡肋的方式是,利用 Django 默认的 [[SessionAuthentication|Django: Session]]。这种机制存在几个问题:

* 当你使用「不安全」的 HTTP 方法(`PUT` `PATCH` `POST` 或 `DELETE`)时,你需要带上 Django 的 CSRF token;Django 的 [[文档|https://docs.djangoproject.com/en/3.0/ref/csrf/#ajax]] 描述了如何操作
* 有别于 Django 默认都需要 CSRF token 的行为,DRF 针对匿名用户下的请求不需要验证 CSRF token(一般是不敏感的读请求)。但是对登录的 view 则一定要上 CSRF token 校验(参考 [[Web Security: CSRF]] 中的 Login CSRF)



!!! RemoteUserAuthentication 和自定义认证方式

DRF 也支持 Django 的 RemoteUserAuthentication,还支持自定义认证方式。

''最主流最实用的,应该是 OAuth2 和 JWT 方式。待研究。''

ECMAScript 2015 (ES6) 是 JS 史上最大的改动。这里给出相关的信息来源:

* [[ES6 Overview in 350 Bullet Points - Ponyfoo|https://ponyfoo.com/articles/es6]]:快速检索相关的知识点
* [[ES6 In Depth - Mozilla Hacks|https://hacks.mozilla.org/category/es6-in-depth/]]:Mozilla 员工写的深入解读
参考 ECMAScript 的 [[Wikipedia 条目|https://en.wikipedia.org/wiki/ECMAScript]]。

|! |!时间 |!支持程度 |
|!ECMAScript 3 (ES3) |December 1999 |广泛支持 |
|!ECMAScript 5 (ES5) |December 2009 |<<es5-compatibility-table>> |
|!ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015) |June 2015 |<<es6-compatibility-table>> |
|!ECMAScript 7 (ES7) / ECMAScript 2016 (ES2016) |June 2016 |<<es-next-compatibility-table>> |

从 ECMAScript 2016 开始,官方不再用类似 ES5 / ES6 这种版本号的方式称呼 ES 规范,而是用年代号。

主要聚焦于:

# 日常使用、使用编辑所使用的编辑器
# 写作工具,主要使用 Markdown 格式

! 编辑器

!! VSCode <<plat-win>> <<plat-linux>>

[[VSCode]],微软良心作品,速度快<<footnote "[1]" "比 Atom 快,比 Sublime Text 和 Vim 稍慢">>,编辑能力方便且强大,搭配插件可以作为一个轻便的 IDE。同时界面非常漂亮。微软在这上面投入挺足,很注重社区意见。

!! Vim <<plat-win>> <<plat-linux>>

[[Vim]] 是编辑器界的瑞士军刀。学习成本太高,主要熟悉日常编辑命令,以加快编辑速度。可以一定程序上减少手指的劳损。

! 写作工具

!! Typora <<plat-win>> <<plat-linux>>

最优雅的 Markdown 写作工具。在 Markdown 语法和可视化效果间做了不错的权衡,而且排版效果不错,功能简单而强大,可以做到沉浸式地写作。而且 Typora 的 PDF 输出 ''非常赞'',格式美观优雅,对于过宽的表格,会自动缩小字体以呈现更美观的排版。

存在的问题是,似乎不完全兼容 GitHub Favoured Markdown,而且没有好的工作区机制,多文档写作时比较蛋疼。

!! Web-based Markdown Editor

这类服务大多数中文排版效果很差。同时最好能跟网盘(Dropbox / Google Drive)打通。主要有两个应用可以考虑:

# [[马克飞象|https://maxiang.io/]]:中文排版好,但是只能同步到印象笔记<<footnote "[2]" "收费功能">>,无法同步 Dropbox
# [[StackEdit|https://stackedit.io/]]:可以同步 Dropbox,中文排版相当一般。体验还不错。


[[Electron|https://www.electronjs.org/]] 是目前最流行的跨平台桌面应用框架。

!! 快速上手

npm 安装 Electron 包时,会下载个预编译好的 Electron 环境。这个过程可能很慢,你可以使用环境变量使其走代理:

```shell
# Linux
export ELECTRON_GET_USE_PROXY=1
export GLOBAL_AGENT_HTTP_PROXY=http://127.0.0.1:8001

# Windows Powershell
$env:ELECTRON_GET_USE_PROXY="1"
$env:GLOBAL_AGENT_HTTP_PROXY="http://127.0.0.1:8001"
```

写代码时先下一个 [[Electron API Demos|https://github.com/electron/electron-api-demos]],里面提供了最常用的功能的代码示例。然后用 [[electron-quick-start|https://github.com/electron/electron-quick-start]] 创建代码骨架开搞。

!! 打包

打包使用 [[Electron Forge|https://www.electronforge.io/]]。这有一份示例的配置(`package.json` 中):

```json
{
  "name": "voice-dictation",
  // ...
  "config": {
    "forge": {
      "packagerConfig": {},
      "makers": [
        {
          "name": "@electron-forge/maker-zip"
        },
        {
          "name": "@electron-forge/maker-deb",
          "config": {
            "options": {
              "name": "Voice Dictation",
              "productName": "Voice Dictation",
              "maintainer": "Zhiheng Lin",
              "homepage": "https://blog.zhiheng.io/",
              "icon": "./img/voice-control-512.png"
            }
          }
        },
        {
          "name": "@electron-forge/maker-wix",
          "config": {
            "name": "Voice Dictation",
            "language": 2052,
            "manufacturer": "Zhiheng Lin"
          }
        }
      ]
    }
  }
}
```

打包时,针对不同平台的包需要用不同机器打,无法支持交叉编译。不同格式的作用:

* Zip:全平台都可以打,但无安装过程,不够友好
* Deb:打出来的包可以容易的转成 Arch Linux 包。一个示例的 `PKGBUILD`:<div>

```
# Maintainer: Zhiheng Lin <onlyice0328@gmail.com>

pkgname=electron-voice-dictation-bin
pkgver=1.0.0
pkgrel=0
pkgdesc="Electron desktop app for easy voice dictation"
arch=('x86_64')
license=('MIT')
url='https://blog.zhiheng.io'
depends=('libappindicator-gtk3')
optdepends=()
source=("voice-dictation_1.0.0_amd64.deb")
sha256sums=('515b6c6782eca849d971217df69864321d204cf145124b2df016290b26ecf089')

package() {
    cd "$pkgdir"
    tar -xf "$srcdir"/data.tar.xz
}
```

</div>
* Wix:在 Windows 上推荐的打包方式。但似乎应用名不能是中文。另外需要安装 [[Wix Toolset|https://wixtoolset.org/]] 并配置环境变量:<div>

```shell
# Windows: For building MSI package using WiX
$env:PATH="$env:PATH;C:\Program Files (x86)\WiX Toolset v3.11\bin"
```
</div>

!! 代码参考

我写了一个桌面语音识别工具,代码在 [[GitHub|https://github.com/onlyice/electron-voice-dictation]] 上。
日常使用的 Emoji 列表。

!! 用于笔记的简单标识

从 [[这里|https://emojipedia.org/symbols/]] 摘取的:

* ⚠️ Warning
* ❗ Exclamation Mark
* ❓ Question Mark
* ✅ Check Mark Button
* ❎ Cross Mark Button
* 💯
企业家、创业家。

摘录自 [[StackExchange|https://unix.stackexchange.com/a/170499]]:

* ''login'' shell: A login shell logs you into the system as a spiecified user, necessary for this is a username and password. When you hit <kbd>ctrl+alt+F1</kbd> to login into a virtual terminal you get after successful login: a login shell (that is interactive). Sourced files:
** `/etc/profile` and `~/.profile` for Bourne compatible shells (and `/etc/profile.d/*`)
** `~/.bash_profile` for bash
** `/etc/zprofile` and `~/.zprofile` for zsh
** `/etc/csh.login` and `~/.login` for csh

* ''non-login'' shell: A shell that is executed without logging in, necessary for this is a current logged in user. When you open a graphic terminal in gnome it is a non-login (interactive) shell. Sourced files:
** `/etc/bashrc` and `~/.bashrc` for bash

* ''interactive'' shell: A shell (login or non-login) where you can interactively type or interrupt commands. For example a gnome terminal (non-login) or a virtual terminal (login). In an interactive shell the prompt variable must be set (`$PS1`). Sourced files:
** `/etc/profile` and `~/.profile`
** `/etc/bashrc` or `/etc/bash.bashrc` for bash

* ''non-interactive'' shell: A (sub)shell that is probably run from an automated process you will see neither input nor outputm when the calling process don't handle it. That shell is normally a non-login shell, because the calling user has logged in already. A shell running a script is always a non-interactive shell, but the script can emulate an interactive shell by prompting the user to input values. Sourced files:
** `/etc/bashrc` or `/etc/bash.bashrc` for bash (but, mostly you see this at the beginning of the script: `[ -z "$PS1" ] && return`. That means don't do anything if it's a non-interactive shell)
** depending on shell; some of them read the file in the `$ENV` variable



暴露内网服务到公网,也称内网穿透。

比如你现在有几台内网的服务器,你想访问它们但是被公司防火墙策略挡住访问不到。假如这几台服务器可以访问公网,或者有另外一台服务器,你们两边都可以访问得到,那么可以用下面这些软件。

!! frp

[[frp|https://github.com/fatedier/frp]] 是一个非常流行的开源内网穿透服务。你在内网机器上搭 frp client,在外网机器搭 frp server,就可以实现连通。frp server 还带有一个网页 dashboard。

如果你不知道要用哪个,就用它。

!! ngrok

[[ngrok|https://ngrok.com/]] 也是一个比较流行的工具 / 服务。
!! Editor

[[Rainglow Color Theme|https://rainglow.io]] 提供了非常多的好看的 color theme (color scheme),还支持非常多的编辑器,很良心。里面 Gloom,Box UK 等都很好看。

[[adapta|https://github.com/adapta-project/adapta-gtk-theme]] 主题中 Adapta Nokto 非常合我心意,VSCode 内置。

!! Arch Linux

Arc 主题([[GTK|https://github.com/NicoHood/Arc-theme]], [[KDE|https://github.com/PapirusDevelopmentTeam/arc-kde]])非常好看,Arch Linux 上首选,搭配 [[papirus-icon-theme|https://github.com/PapirusDevelopmentTeam/papirus-icon-theme]]。

Login Screen (SDDM) 用 NixOS Theme,在系统设置里面可以直接装。
[[FastAPI|https://github.com/tiangolo/fastapi]] 是在 Python 3.5+ 后备受关注的项目。它利用了 type hints 做 validation 等功能,性能很高。

同时它的作者写了一个 cokkiecutter [[模板|https://github.com/tiangolo/full-stack-fastapi-postgresql]],应将它作为最佳实践。

[[Fault Injection|https://en.wikipedia.org/wiki/Fault_injection]],中文「错误注入」,是指向一个系统注入错误,来测试整体系统的健壮性。

Fault injection 在不同的研究者中有不同的结构。[[chaostoolkit|https://github.com/chaostoolkit/chaostoolkit]] 将其大致分为:

* Infrastructure fault injection,基础设施层面的,比如关注云环境(比如 AWS、Azure 或者 Google Cloud Engine)可用性的,关注容器调度、资源编排可用性的(比如 Kubernetes)
* Applicatoin fault injection,应用程序层面的,比如调用某些第三方服务失败、延迟增长等

我目前主要关注的是应用程序层面的。实践过 Toxiproxy。

!! Toxiproxy

有一些工具可以实现网络请求的错误注入。我使用过 [[Toxiproxy|https://github.com/Shopify/toxiproxy]]。

Toxiproxy 由两部分组成:

* Server: 一个代理,提供 HTTP API 及配置文件供外部添加要访问的上下游、破坏规则等
* CLI / client library: 与 server 进行交互

Toxiproxy 有两个典型的使用场景:

* 使用 Toxiproxy 的库,配合测试代码进行测试。比如下面代码,是针对 Toxiproxy 中定义的一个上流 mysql_master,将向它的请求都加上一秒延迟:<div>

```ruby
Toxiproxy[:mysql_master].downstream(:latency, latency: 1000).apply do
  Shop.first # this takes at least 1s
end
```
</div>
* 使用 Toxiproxy CLI 操纵 server,不使用库

下面演示一个场景,将一批请求的延时时间变大。

# 使用 Python 内置 HTTP Server 起一个文件 server:<div>

```bash
onlyice@onlyice-pc1 ~/workspace/stories-json
> $ ls
chapter-1.json  chapter-2.json  chapter-3.json  chapter-4.json  chapter-5.json  story.json

> $ python -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```
</div>
# 启动 Toxiproxy server,并使用 CLI 添加随机 200±50ms 延时:<div>

```bash
# 在第一个终端中运行起 server
> $ toxiproxy-server

# 在另外的终端,新建一个代理,监听(`-l`, listen)8001 端口,并使其上游(`-u`, upstream)为 8000 端口
> $ toxiproxy-cli create story-server -l localhost:8001 -u localhost:8000
Created new proxy story-server
# 新建新的 “毒药”(toxic),设置延时为 200±50ms
> $ toxiproxy-cli toxic add story-server -t latency -a latency=200 -a jitter=50
Added downstream latency toxic 'latency_downstream' on proxy 'story-server'
```
</div>
# 使用 curl 分别测试 Toxiproxy proxy server 的访问速度和直接连接的访问速度。可以看到 Toxiproxy 的加入了延迟:<div>

```bash
> $ curl -L --output /dev/null --silent --show-error --write-out 'lookup:        %{time_namelookup}\nconnect:       %{time_connect}\nappconnect:    %{time_appconnect}\npretransfer:   %{time_pretransfer}\nredirect:      %{time_redirect}\nstarttransfer: %{time_starttransfer}\ntotal:         %{time_total}\n' http://localhost:8000/story.json                                            
lookup:        0.001063
connect:       0.001496
appconnect:    0.000000
pretransfer:   0.001575
redirect:      0.000000
starttransfer: 0.003968
total:         0.004098
> $ curl -L --output /dev/null --silent --show-error --write-out 'lookup:        %{time_namelookup}\nconnect:       %{time_connect}\nappconnect:    %{time_appconnect}\npretransfer:   %{time_pretransfer}\nredirect:      %{time_redirect}\nstarttransfer: %{time_starttransfer}\ntotal:         %{time_total}\n' http://localhost:8001/story.json
lookup:        0.000810
connect:       0.001156
appconnect:    0.000000
pretransfer:   0.001217
redirect:      0.000000
starttransfer: 0.211397
total:         0.232331
```



类似 `~/.bashrc` 的文件位置在 `~/.config/fish/config.fish`。

Fish 的脚本文件语法跟 Bash 不兼容,遇到不会写的参考官网的 [[tutorial|http://fishshell.com/docs/current/tutorial.html]]。

!! 与 IDEA 系不兼容问题

IDEA 系(PyCharm, CLion, etc)IDE,在选择 Fish 作为 shell 时,打开集成的终端时会报 Unable to open universal variable file。

解决办法是在 IDE 设置,Tools > Terminal 中,把 Shell integration 项去掉。


|!Name |Fluent Python |
|!Author |Luciano Ramalho |
|!Edition |1st |
|!Release Date |July 2015 |
|!ISBN-13 |978-1-4919-4600-8 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

在 Goodreads 闲逛时看到有一本去年出版的 Python 书—— //Fluent Python// 很受好评,刚好 Google Play Books 上面也有,于是下载了样章下来看。昨天看完第一章,感觉很赞,值得安利一下。

这本书主要面向的是有经验的 Python 程序员,主要强调 Python 里面比较独特、与其他流行语言不一样的语言特性。

这本书的特点是写得很深入浅出,代码例子很简洁容易跟上,又能够清楚地讲解内容。而且在书里面穿插了很多相关的背景故事和文化,让你更了解某些语言特性是基于什么考虑设计出来的,读起来就像是有个高手在跟你聊天一样。同时里面有很多延伸阅读的内容,作者把他觉得相关的好书、网页文章甚至是 StackOverflow 回答推荐了出来,非常生动有趣,而且很容易找到方向做更深入的研究。

这一章讲了一些 Python 的特殊方法(`__getitem__`, `__len__` 等),以及它们背后的设计意图。

> You can think of the data model as a description of Python as a framework.

这句话实在说得太 ''贴切'' 了。

> It formalizes the interfaces of the building blocks of the language itself, such as sequences, iterators, functions, classes, context managers, and so on.

Python 的特殊函数是一种函数语言本身的接口。可以用来构建序列、迭代器、函数等等。

!! 一副 Pythonic 的卡牌

书中实现了一副卡牌的 Python 类。并且通过实现 `__len__`, `__getitem__` 得到了获取长度、切片操作等能力。还可以使用标准库 `random.choice()` 的能力,从这副卡牌中随机抽选一张,不用重复造轮子。

甚至 `reversed`, `in` 操作符也被可以自动支持。Python framework 的威力使得你实现了特殊函数后,就能很好的配置上 Python 的各种语法和标准库。

!! 特殊函数是怎么使用的

特殊函数很少会被直接调用。唯一一个会被经常调用的是父类的 `__init__` 函数。

举 `__len__` 为例,你不需要主动调用这个函数: `a.__len__()`,你只需要使用 `len(a)`。对于一些内置类型,比如 `list`, `str`, `bytearray`,调用 `len()` 时并不会有函数调用发生,Python 会直接返回这些内置类型的 C 结构中的 `ob_size` 字段。对于这里内置类型存在的不一致行为,作者祭出大招 Zen of Python:

> Special cases aren't special enough to break the rules.
> Although practicality beats purity.

真是怎样讲都是你的道理。不过我觉得这种设计其实挺好的。

不推荐在自己的代码里面写这类特殊函数 `__foo__`,因为他们有可能在以后被语言本身使用。

!! 数学运算的相关函数

实现 `__abs__`, `__add__` 和 `__mul__`,可以有一种 C++ 里面重载运算符的效果。

!! 字符串表示

`__repr__` vs. `__str__`:

#`__repr__` 是用来调试或者打 log 的,需要反映这个结构的内部组成
# `__str__` 是给用户看的、更友好的字符串表示

有个好的实践是,`__repr__` 的输出就像初始化这个类的实例一样,如:

```python
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)

>>> a = Vector(3, 4)
>>> print(repr(a))
"Vector(3, 4)"
```

同时留意下 `__repr__` 函数中的 `%r`,这是必要的,可以用来区分 '3'(字符串) 和 3 (数字)。

!! 文化

!!! `__getitem__` 怎样发音?

有些人这样讲:under-under-getitem,作者推荐读作 dunder。书里面有个故事讲述了来源。

!!! "Magic Method" vs "Special Method"

有些别的语言也有类似双下划线函数这样的实现,他们有的把这种函数叫做 "Magic Method"。作者觉得恰恰相反,这些函数不是魔幻的,他们是实实在在地提供了一套 metaobject protocol (不知如何翻译) 给开发者利用的。

然后作者黑了把 JavaScript,认为它设计得很挫,连把 object 里面的某个属性设成只读都实现不了(直到 2009 年的 ECMAScript 5.1 规范),它认为 JavaScript 的很多设计才是真正的 "magic"。

!!! Metaobject, Aspect-oriented programming

这部分也是延伸阅读,不是太懂,如果有精力有兴趣再了解下。
这一章主要读 Python 中的序列类型。

Python 之父 Guido 在搞 Python 之前,对一门叫 ABC 的语言投入了很多。Python 的很多被视为 Pythonic 的特性跟 ABC 有关联。

按序列中存放的数据类型,可以把序列分为两类:

* Container sequences: 序列中的存的元素是引用,指向另外一个 Object。比如 `list`, `tuple`
* Flat sequences: 序列中的元素不是引用,是同一种数据类型,比如 `str`, `bytes`, `array.array`

又可以按是否可变分为两种类型,mutable 与 imutable。

! List comprehensions 与 map/filter

作者认为 list comprehensions 也可以用内置函数 `map`/`filter` 来实现,但是后者可读性差,而且性能并不比 list comprehensions 高很多。

! Tuple 并不只是不可变的 list

Python 的 tuple 容易被认为只是不可变的 list,但是它有几个设计上的意图

!! Tuple 作为纪录(record)

比如下面的例子,等号右边的 tuple 就是一条纪录,保存了东京相关的一些信息:

```python
city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
```

tuple 作为纪录时,纪录中的 Field 名称是缺失的,可以用 `collection.nametuple` 来创建带名称的 tuple。`collection.nametuple` 以比较小的性能开销实现了 tuple 带名称,同时还有 `asdict()` 函数,将 tuple 转为 `OrderedDict`。

!! Tuple Unpacking

tuple 经常配合 `*` 做 unpacking。各种花式用法:

```python
>>> x, y = (10, 24)
>>> x
10

>>> t = (20, 8)
>>> divmod(*t)
(2, 4)

>>> a, b, *rest = range(5)
>>> rest
[2, 3, 4]
>>> a, b, *rest = range(3)
>>> rest
[3]

>>> metro_area = ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> name, cc, pop, (latitude, longitude) = metro_area
>>> latitude
35.689722
```

<<.tip "`_` 经常被用作一个 dummy variable,用来接收 tuple unpacking 中的无用部分。一般来讲用这个变量是合乎惯例(convention)的,但是在一些 I18N 的场景,这个变量被用来作特殊的用途。Python 标准库中的 `gettext` 就是一个例子。">>

tuple 的接口与 list 基本类似,只是比 list 少了一些修改自身的函数,比如 `append`, `pop`, `sort` 之类。

! Slice

!! Slice Object

`[start:stop:step]` 其实是个 slice 对象。调用 `seq[start:stop:step]` 时,其实是调用 `seq.__getitem__(slice(start, stop, step))`。可以将 slice 命名以提升可读性:

```python
events = """2015-09-10 Teacher's Day
2015-10-01 National Day"""

DATE = slice(0, 10)
EVENT = slice(11, None)
for event in events.split('\n'):
    date, event = event[DATE], event[EVENT]
```

!! Slice 高级形式

Python 还提供了其实几种形式的 slice,但是他们比较少出现在标准库中,大多数是给第三方数学库使用。

如多维 slice:

`seq[start1:stop1, start2:stop2]`

实际上是调用 `seq.__getitem__((slice(start1, stop1), slice(start2, stop2))`。

省略号表示法 `...`,如 `seq[1, ...]`。它跟一个 `Ellipsis` 类有关,暂不深究。

!! Slice 可以用来对序列做修改

```python
>>> l = list(range(10))
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l[2:5] = [20, 30]
>>> l
[0, 1, 20, 30, 5, 6, 7, 8, 9]
>>> del l[5:7]
>>> l
[0, 1, 20, 30, 5, 8, 9]
>>> l[3::2] = [11, 22]
>>> l
[0, 1, 20, 11, 5, 22, 9]
>>> l[2:5] = 100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
>>> l[2:5] = [100]
>>> l
[0, 1, 100, 22, 9]
```

! `+` 与 `*` 操作符应用在序列上

这些操作比较直观易懂:

```python
>>> l = [1]
>>> l * 5
[1, 1, 1, 1, 1]
>>> l + [2]
[1, 2]
>>> 'ab' + 'cd'
'abcd'
>>> 'ab' * 5
'ababababab'
```

但是留意一下,如果序列中的元素是引用类型,那么 `*` 操作符复制的时候也是引用。这种情况下,复制出来的元素,它们其实指向同一个 Object:

```python
>>> l = [[1]] * 3
>>> l
[[1], [1], [1]]
>>> l[0].append(2)
>>> l
[[1, 2], [1, 2], [1, 2]]
```

!! `+`, `*` 与 `+=`, `*=`

对于序列类型,一般来讲,`+` / `*` 操作符返回的结果是个新的Object,即不会修改操作符左右两个操作数;而 `+=` / `*=` 会修改左侧被赋值的操作数。这是一个 Python 中的惯例(convention)。

这几个操作符由一些特殊函数实现:

* `+` => `__add__`
* `*` => `__mul__`
* `+=` => `__iadd__` (in-place addition)
* `*=` => `__imul__` (in-place multiple)

! `list.sort()` 与内置函数 `sorted`

这里又引入了一个惯例(convention),内置函数的 `sorted`, `reverse` 等等,不会对作为参数的序列做修改。而序列本身的 `sort`, `reverse` 函数,会对序列做修改。

! `bisect`

`bisect` 库做的是,对于一个已经排好序的序列,使用二分查找给出一个新元素插入该序列时的位置(`bisect.bisect`),或者实际地将这个元素插入(`bisect.insort`)。应用场景看下面的例子。

!! 一个按区间打分的例子

```python
>>> def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
        i = bisect.bisect(breakpoints, score)
        return grades[i]

>>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
['F', 'A', 'C', 'C', 'B', 'A', 'A']
```

来自 Python 官方文档的例子,写得简洁明了,按区间分级这么容易地解决了,值得借鉴。但是 `breakpoints` 参数的默认值是个可变类型(list)这并不是个好的实践。

! Flat Sequences

`list` 这种 container sequence 存的是对象的引用,在一些场景下性能不行,所以需要有一些存对象本身的序列类型,比如 `array.array`。

这些类似也被作者称为 flat sequences,但是这个词是他自己创造的。这些类型的序列其中的元素都必需是同个类型的。

!! `array.array`

这种序列类型只能存一些基本类型。它的好处在于序列化/反序列化速度快。比如把 1000000 个浮点数的 `array.array` 序列化成文件 / bytes 速度飞快。

!! Memory Views

内置的 `memoryview` 类主要用于操作其他数据结构(如 `array.array`, `list`)的内存空间,而不需要预先复制一份。这本来是个在 NumPy 中引入的概念,后来被移植到了 Python 标准库,但是去掉了跟数学相关的操作。还没深入了解这个库的用法,也许以后研究数据科学时会有机会。下面把书中的一段代码例子搬进来,增进理解:

```python
>>> numbers = array.array('h', [-2, -1, 0, 1, 2])
>>> memv = memoryview(numbers)
>>> len(memv)
5
>>> memv[0]
-2
>>> memv_oct = memv.cast('B')
>>> memv.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5] = 4
>>> numbers
array('h', [-2, -1, 1024, 1, 2])
```

后面书里又顺带介绍了 NumPy 跟 Scipy,并且给了一个简单的代码示例。这些内容不记入笔记了,在学习 //Python for Data Analysis// 时再仔细说明。

! Deque 与其他队列

Deque 是 double ending queue(双端队列)的简称。对于需要在序列前端插入/删除元素的场景,它比 `list` 快很多。而且它可以设置一个最大的元素个数,插入时如果超出最大个数,另外一端的数据会被清除。

Python 同时为多线程编程引入了几个线程安全的 Queue 类,如 `Queue`, `LifoQueue` 以及 `PriorityQueue`。它们也可以设置最大元素个数,但是行为与 Deque 不太一样;如果插入时队列已达最大个数,那么这个插入请求会阻塞,等待队列元素被其他线程取出。

同样,`multiprocessing` 模块中也提供了一些 Queue 类用来做进程间通讯。`asyncio` 实现了同样功能的类,用于异步网络编程。

`heapq` 自己本身不维护一个队列,而是提供了一些函数,让你可以将一个可变的序列变成 heap queue / priority queue。

! Slice 为啥是左闭右开?

Dijkstra 大师写了一篇 [[帖子|https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html]] 说明过这个问题,对于 2, 3, ..., 12 这个序列,下面哪一种表示法更优雅?

# 2 <= i < 13
# 1 < i <= 12
# 2 <= i <= 12
# 1 < i < 13

大师的帖子我看不太懂,但是大意是这样:这个下界跟上界之差应该表示序列的长度,所以 3,4 排除掉。同时 i 用来描述第一个元素时,它应该是个自然数,所以第一个元素用 0 来描述更优雅,所以对于上界应该用 <=,所以应该用第 1 种表示法。

! 扩展阅读

作者认为 Python Cookbook 第 2 版跟第 3 版都值得一读。第 2 版是以 Python 2.4 为基础写的,但是很多内容现在还适用。第 3 版做了相当多的重写,大多数强调了 Python 3 的新特性。

Python 的内置 `sorted` 和 `list.sort` 使用的排序算法是 Timsort。这种算法会根据数据的特点选择插入排序或者合并排序来实现排序。因为现实世界中的数据大多数是相对有序的,所以这种算法效率较高。Java / Android 也用了 Timsort。Timsort 的发明者 Tim Peters 也是 Python 的核心贡献者,还写了 Zen of Python。
这一章主要读 Python 中的 `dict` 和 `set`,比较基础。

! `dict` 比较相等时是基于内容的

```python
>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>> a == b == c == d == e
True
```

! `setdefault` 函数可以用来处理不存在的 Key

当你的 `dict` 的 `value` 为可变元素时(比如 `list`),`setdefault` 往往是个好东西。

比如你有一堆人员信息,想按年龄分组时,不用 `setdefault` 的做法:

```python
persons_by_age = {}
for person in persons:
    if person.age not in persons_by_age:
        persons_by_age[person.age] = [person]
    else:
        persons_by_age[person.age].append(person)
```

这样写不如 `setdefault` 优雅:

```python
persons_by_age = {}
for person in persons:
    persons_by_age.setdefault(person.age, []).append(person)
```

`setdefault` 在这个 key (`person.age`) 不存在时,自动建一个空列表。

! 用 `__missing__` 函数处理 key 不存在时的行为

这个能力很少需要用到。

默认的 `dict` 实现,有 `__getitem__` 时(也就是做 `d[k]` 操作时),如果 key 不存在,而且当前的 `dict` 实例有实现 `__missing__` 函数时,会调用 `__missing__` 函数并返回其结果。

比如书中实现了一个例子,用来实现传入 `int` 型 key 时,也查他对应的 `str(key)`:

```python
class StrKeyDict0(dict):
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        else:
            return self[str(key)]

    def __contains__(self, key):
        return key in self.keys() or str(key) in self.keys()
```

留意几点:

* `__missing__` ''只会''在 `__getitem__` 时才会调用。所以你还需要实现 `__contains__` 用来做 `in` 判断。
* `__contains__` 中不能直接用 `key in self` 来判断,因为 `in` 操作符就是调用 `__contains__`,会引起函数递归调用
* `self.keys()` 在 Python 2 中返回的是一个 `list`,`in` 遍历时性能差;在 Python 3 中返回的是一个 view,跟 set 的结构类似,`in` 的性能好

这个例子写起来并不方便,Python 里面又实现了一个 `UserDict` 类用来方便用户扩展。`UserDict` 在其内部维护了一个 `dict` 属性 `self.data`,所有数据操作都对它进行:

```python
class StrKeyDict(collections.UserDict):
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key)
        return self[str(key)]

    def __contains__(self, key):
        return str(key) in self.data

    def __setitem__(self, key, item):
        self.data[str(key)] = item
```

留意一下我们的 `__contains__` 函数不再需要蛋疼地去取 `self.keys()` 了。

! 不可变的 `dict`

Python 实现了一个 `types.MappingProxyType`,用来实现只读的 `dict`。

```python
>>> from types import MappingProxyType
>>> d = {1: 'A'}
>>> d_proxy = MappingProxyType(d)
>>> d_proxy
mappingproxy({1: 'A'})
>>> d_proxy[1]
'A'
>>> d_proxy[2] = 'x'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'mappingproxy' object does not support item assignment
>>> d[2] = 'B'
>>> d_proxy[2]
'B'
```

留意下 `d`  发生变化时会反映到 `d_proxy` 上。这也说明了为啥它是个 "proxy"。

! 其他实用的 `dict` 变种

!! `collections.OrderedDict`

`dict` 的 keys 按插入顺序排序。

!! `collections.ChainMap`

可以传入多个 dict 构造一个 ChainMap。查询这个 ChainMap 时,按传入的 dict 顺序去查,如果这几个 dict 都查不到,再抛 `KeyError`。

传入的 dict 后续发生数据变化时,也会反映到 ChainMap 上。

!! `collections.Counter`

方便用来计数。

!! `collections.defaultdict`

另外一种形式实现默认 value。

! `set` 的操作符

`set` 有一堆操作符挺有意思,实现了丰富的集合操作。日常编码时可以考虑下。需要留意下的是,`set` 的操作符要求两个操作数都是 `set`,但是它有个同样功能的函数,可以接受任意的 iterable:

```python
>>> s = {1, 2, 3}
>>> z = {2, 3, 4}
>>> l = [3, 4, 5]
>>> s & z
{2, 3}
>>> s & l
TypeError: unsupported operand type(s) for &: 'set' and 'list'
>>> s.intersection(l)
{3}
```

! `dict` 和 `set` 底层实现

这部分内容是本章重点。

`dict` 和 `set` 都用了哈希表作为其底层实现。

{{dict-hashtable-flowchart.png}}

!! Key 需要是 hashable 的

因为使用了哈希表,所以 `dict` / `set` 的 Key 需要是 hashable 的。一个对象想要是 hashable,必须实现几个条件:

# 它必须实现 `__hash__` 函数,返回一个整型,并且在它的生命周期内总是返回同一个值
# 它必须实现 `__eq__` 函数以支持相等判断
# 如果 `a == b` 为真,那么 `hash(a) == hash(b)` 也需要为真
#* 反之,如果 `hash(a) == hash(b)`,并不意味着 `a == b`(原因如下)

为什么需要 `__hash__` 又需要 `__eq__`?因为不同的对象可能有同个 hash 值,此时它们仍可以加进同个 dict / set 中。但是在查找时(`d[key]`)时,Python 就需要把同个 hash 的对象都拿出来,再用 `__eq__` 来做比较,从而定位到正确的对象。

Python 标准库中,可变类型都不是 hashable 的,不可变类型都是 hashable 的。但是对于 tuple 来讲,它里面的元素需要全部是 hashable 的,它才是 hashable 的:

```python
>>> a = (1, "Hello", {1, 2})
>>> hash(a)
TypeError: unhashable type: 'set'
>>> b = (1, "Hello", frozenset({1, 2}))
>>> hash(b)
6191337126678801885
```

另外,用户定义的类型都是 hashable 的,因为它的 hash 值是它的 `id()`,不同实例间的 `id()` 值不一样。

<<.warning "如果你的自定义类型实现的 `__eq__` 函数,你也必须实现一个合适的 `__hash__` 函数,并且保证 `a == b` 为真时, `hash(a) == hash(b)` 也为真。不然你的这个类型的实例与 `dict` / `set` 一起工作时,会有不确定的行为。同时,如果你的自定义类型不想支持 hashable,那么你要显示实现 `__hash__` 函数,使其抛出一个 `TypeError`。" >>

!! `dict` / `set` 有显著的内存消耗

由于哈希表要实现快速的搜索,所以它需要保持稀疏,会占用较多的内存空间。

Python 会预先分配一片空间,当这片空间不足够使用时(并不一定是满了,有可能是足够密集了),它又会把数据都拷贝到另外一片更大的空间。拷贝后计算一个 key 的 bucket 位置的方式会发生变化(参考前面的图)。

同时,`dict` 在保存数据库纪录之类的场景,会比 tuple 有更多的内存消耗。比如每一个 Record,在 tuple 里面并不需要保存 field name,但是在 dict 里面需求。

用户自定义类型在底层实现上,也使用了 `dict` 来维护其属性。书中后面的章节会说明如何用 `__slots__` 来节省空间。

!! 其他值得说明的点

* Key 的顺序跟插入顺序有关
* 遍历的过程不要插入新元素
这章主要讲字符串处理。

PyCon 2014 有个 slide 讲得非常好,比之前的 UniPain 更简单明了。放在 `Dropbox/Journey/Resources/Python/character-encoding-and-unicode.pdf`。它也有一个对应的 [[视频|https://www.youtube.com/watch?v=Mx70n1dL534]]。

! Character Issues

“字符串”(string)是一个由字符(character)组成的序列。但是重点是,字符(character)是指什么。

Unicode 标准的基本理念是,将标识一个字符是什么,从字符的字节表示(byte representation)中脱离出来。

* 字符的标识在 Unicode 标准中叫 Unicode code point。code point (码点?)是一个数字,范围在 0 到 1114111 (Unicode 6.3)。每个字符都有一个唯一的 Unicode code point。
* 字符的最终字节表示,取决于具体使用了什么编码。

Python 3 有两个表示字符串的基础类型,一个是 `str`,表示 Unicode 字符串;一个是 `bytes`,表示被编码(encode)过的字符串。

! Byte Essentials

```python
>>> cafe = bytes('café', encoding='utf_8')
>>> cafe
b'caf\xc3\xa9'
>>> cafe[0]
99
>>> cafe[:1]
b'c'
>>> cafe_arr = bytearray(cafe)
>>> cafe_arr
bytearray(b'caf\xc3\xa9')
>>> cafe_err[0]
99
>>> cafe_arr[-1:]
bytearray(b'\xa9')
```

取下标和切片方面,有一些细节值得注意:

* `bytes` 和 `bytearray` 类型,取下标操作(`cafe[0]`)返回的是一个 0~255 的整数;取切片(`cafe[:1]`)时,返回的结果还是原类型,即 `bytes` 和 `bytearray`
* `str` 类型比较特殊,取下标和取切片都是返回 `str` 类型
* `str` 类型是 Python 的内置序列类型中,`s[0] == s[:1]` 唯一成立的

对于 `bytes` 和 `bytearray` 被 `print` 的结果,里面即有 ASCII 字符也有 `\x` 的 16 进制表示。本来 `bytes` 表示的是一段字符序列,全部用 16 进制显示出来也不过份,但是这里应该是照顾了可读性,所以将 ASCII 字符打印出来了。规则如下:

# 如果字符是可打印的 ASCII 字符,以 ASCII 字符的形式显示
# 如果不是可打印的,但是是 `\` 可转义的(如 `\n`, `\t`),以这种形式显示
# 其他字符以 `\xXX` 的 16 进制形式出现

`str` 类型的 `print` 结果均是显示字符的 Unicode 字符表示。比如 `é` 还是以 `é` 显示。但是这个 `print` 结果最终还是打到终端出来,所以终端的编码对它有影响。比如我的终端使用的是 UTF-8 编码,如果有一些 Unicode 字符没有对应的 UTF-8 编码,那么应该会展示成 `\uXXXX` 的形式。

实现了 buffer protocol 的类型有 `bytes`, `bytearray`, `memoryview`, `array.array`。

从一个实现了 buffer protocol 的对象初始化 `bytes` / `bytearray` 时总会有数据拷贝;而用同样的方式初始化 `memoryview` 时则不会有。

!! Structs and Memory Views

Structs 是用来做 Python 数据结构跟 C/C++ Struct 之间的相互转换的。书中的这个示例代码很好,用了 `memoryview` 去取前十个字节:

```python
>>> import struct
>>> fmt = '<3s3sHH'
>>> with open('filter.gif', 'rb') as fp:
...     img = memoryview(fp.read())
...
>>> header = img[:10]
>>> bytes(header)
b'GIF89a+\x02\xe6\x00'
>>> struct.unpack(fmt, header)
(b'GIF', b'89a', 555, 230)
>>> del header
>>> del img
```

! Basic Encoders/Decoders

{{different-encodings}}

这个图可以看出,有些编码格式(如 ascii, gb2312)并不能编码全部的字符,这也是产生 `UnicodeEncodeError` / `UnicodeDecodeError` 的主要原因。Python 提供了一些参数,用来指定编解码失败时的行为:

```python
>>> city = 'São Paulo'
>>> city.encode('utf_8')  
b'S\xc3\xa3o Paulo'
>>> city.encode('utf_16')
b'\xff\xfeS\x00\xe3\x00o\x00 \x00P\x00a\x00u\x00l\x00o\x00'
>>> city.encode('iso8859_1')  
b'S\xe3o Paulo'
>>> city.encode('cp437')  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../lib/python3.4/encodings/cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character '\xe3' in
position 1: character maps to <undefined>
>>> city.encode('cp437', errors='ignore')  
b'So Paulo'
>>> city.encode('cp437', errors='replace')  
b'S?o Paulo'
>>> city.encode('cp437', errors='xmlcharrefreplace')  
b'S&#227;o Paulo'
```

而且这些行为还可以通过 [[`codecs.register_error`|https://docs.python.org/3/library/codecs.html#codecs.register_error]] 来扩展。

!! How to Discover the Encoding of a Byte Sequence

怎样知道一串字节序列的编码呢?答案是:你没办法知道,除非有人告诉你。

但是不同的编码类型编出来的内容各有特点,所以可以大致推测出某段字节序列的编码。[[Chardet 库|https://pypi.python.org/pypi/chardet]] 做的就是这个事情。

<<.tip "BeautifulSoup4 中提供了 [[UnicodeDammit|https://www.crummy.com/software/BeautifulSoup/bs4/doc/#unicode-dammit]] 库,也是用来猜测编码类型的。实现原理似乎跟 Chardet 不一样,也可以参考一下。">>

!! BOM: A Useful Gremlin

UTF-16 编码在这上面的处理有点意思。它可以编成 Big Endian 也可以编成 Little Endian。对于 Big Endian,它编码出来的字节序列会在前面加上 ZERO WIDTH NO-BREAK SPACE (U+FEFF) `\xFEFF`;对于 Little Endian,会在前面加上 \xFFFE。但是 Unicode 码表中是没有 U+FFFE 的,所以程序遇到 UTF-16 字节序列时,可以看看前两个字节是 `\xFEFF` 还是 `\xFFFE`,来判断是大端小端。

!! Encoding Defaults: A Madhouse

这部分值得一看。说的是各种情况下 Python 用的默认字符编码。

结论是:

* 打开 (Linux API `open`) 文件,或者 stdin / stdout / stderr 重定向到文件时,默认用的编码是 `locale.getpreferredencoding()`
* stdin / stdout / stderr 如果没有重定向到文件,且 `PYTHONIOENCODING` 环境变量被指定时,默认编码使用环境变量定义的;如果环境变量未指定,则使用的编码继承自你的控制台(这里细节还没弄清楚)
* bytes <=> str 的隐式转换,默认用的是 `sys.getdefaultencoding()` 的编码。但是据说 Python 3 很少有这类隐式转换。Python 2 就有很多
* 如果传给 `open` 函数的文件名参数是个 str,那么它会被使用 `sys.getfilesystemencoding()` 所表示的编码转成 bytes,再传给系统 API。如果文件名参数是个 bytes,则不会有转换,直接传给系统 API

终级结论是:不要依赖默认的编码类型,总是显式地指定它。

但是就算你搞定了 Unicode,还有可怕的 Unicode Normalization (正规化)问题等着你。

! Normalizing Unicode for Saner Comparisons

Unicode 里面有个叫 [[组合字符|https://en.wikipedia.org/wiki/Combining_character]](combining characters)的东西,它使得字符串的比较变得麻烦:

```python
>>> s1 = 'café'
>>> s2 = 'cafe\u0301'
>>> s1, s2
('café', 'café')
>>> len(s1), len(s2)
(4, 5)
>>> s1 == s2
False
```

[[\u0301|http://www.fileformat.info/info/unicode/char/0301/index.htm]] 是个变音符号,`é` 和 `e\u0301` 被称作 “canonical equivalents”。Unicode 规范中定义了 Unicode Normalization 来解决这个问题,Python 标准库中 [[`unicodedata.normalize`|http://devdocs.io/python~3.5/library/unicodedata#unicodedata.normalize]] 是相应的实现。规范定义了四种 Normalization 的方法:NFC, NFD, NFKC, NFKD,每一种都可以解决字符串比较的问题:

```python
>>> from unicodedata import normalize
>>> s1 = 'café'  # composed "e" with acute accent
>>> s2 = 'cafe\u0301'  # decomposed "e" and acute accent
>>> len(s1), len(s2)
(4, 5)
>>> len(normalize('NFC', s1)), len(normalize('NFC', s2))
(4, 4)
>>> len(normalize('NFD', s1)), len(normalize('NFD', s2))
(5, 5)
>>> normalize('NFC', s1) == normalize('NFC', s2)
True
```

Unicode 的 [[文档|http://unicode.org/reports/tr15/#Norm_Forms]] 描述了这几种 Normalization Form:

|!Form |!Description |
|Normalization Form D (NFD) |Canonical Decomposition |
|Normalization Form C (NFC)	|Canonical Decomposition, followed by Canonical Composition |
|Normalization Form KD (NFKD) |Compatibility Decomposition |
|Normalization Form KC (NFKC) |Compatibility Decomposition, followed by Canonical Composition |

简单的说,NFD 把字符串分解成字符和组合字符,而 NFC 把字符和组合字符组成成最短的同义字符串。大部分西文键盘敲出来的字符是 NFC 形式的,而且 NFC 是 [[W3C 推荐的正规化形式|https://www.w3.org/TR/charmod-norm/#choice-of-normalization-form]]。

<<.tip "后面如果有需要解决这类问题的时候,W3C 这个文档似乎是个不错的参考,它有一个论证为何选择 NFC 的过程。">>

有些单个符号在 NFC 正规化后,会变成另外一个视觉上一致的符号。比如电阻的符号 Ω 会变成 Greek uppercase omega。

NFKD 和 NFKC 中的 K 表示 compatibility,因为他们会影响所谓的 compatibility characters。比如会把 `½` 转成 `1/2`,`4²` 会被转成 `42`。这两种形式可能会影响字符串的显示格式。一般的应用场景,是在搜索和建数据索引时。不是很理解这两种形式存在的意义是什么。

!! Case Folding

Case folding 做是的把字符串转成小写,并且做一些额外的转换。它的应用场景,是做大小写无关的字符串比较。有一部分字符会被转成视觉上一致的其他符号,如 `µ` 从 `MICRO SIGN` 转成 `GREEK SMALL LETTER MU`。

作者写了 [[一些代码|https://github.com/fluentpython/example-code/blob/master/04-text-byte/sanitize.py]] 用来做字符串的规格化,而且还做了 [[IPython Notebook 页面|https://github.com/fluentpython/notebooks/blob/master/04-text-byte/sanitize.ipynb]],实在太良心了!

! Sorting Unicode Text

Python 标准库 locale 对于地区相关的字符串排序做得并不好,依赖于 OS 实现和其他一些奇怪的条件。但是第三方库 PyUCA 是不错的解决方案。UCA 代表 Unicode Collation Algorithm,书里没细说它是个什么东西,有需要再细看。

! The Unicode Database

Unicode 数据库包罗万像,它不仅知道一个符号和它对应的含义,还知道这个符号是不是能打印的、是不是数字、是不是组合字符等。Python 标准库 unicodedata 可以解读这些信息,下面的图是用一段 Python 程序生成的,最后两列分别是 `unicodedata.numeric(char)` 和 `unicodedata.name(char)` 的结果:

{{unicode-database}}

! Dual-Mode str and bytes APIs

在正则表达式中,str 跟 bytes 的表达式,在匹配时的行为不同。bytes 的正则表达式只会匹配 ASCII 字符,而 str 的会匹配各种 Unicode 字符。比如在 [[Tamil 语言|https://en.wikipedia.org/wiki/Tamil_language]] 中表示数字 1729 的 `௧௭௨௯` 就可以被 str 正则表达式匹配出来。

在 OS 相关的函数中,很多都同时接受 str 或者 bytes 作为参数。因为 Linux 的文件系统并没有用 Unicode 存储信息,所以有一些文件名很可能是无法被 decode 成 unicode 的。Python 3 提供了 `fsdecode` 和 `fsencode` 函数,用来做文件名相关的字符串在 str 与 bytes 之间的相互转换。转换时用的编码是 `sys.getfilesystemencoding()`,并且用了 `surrogateescape` 来做错误处理(Linux 上)。

`surrogateescape` 挺有意思的。它使用了 Unicode 中的 Low Surrogate Area(U+DC00 到 U+DCFF)。这个区域仅限程序内部使用,即是说不作为数据在外部交换使用。`fsdecode` 时将不能 decode 成 unicode 的字节以 U+DCXX 的形式存起来,`fsencode` 时再把它解开:

```python
>>> os.listdir('.')  
['abc.txt', 'digits-of-π.txt']
>>> os.listdir(b'.')  
[b'abc.txt', b'digits-of-\xcf\x80.txt']
>>> pi_name_bytes = os.listdir(b'.')[1]  
>>> pi_name_str = pi_name_bytes.decode('ascii', 'surrogateescape')  
>>> pi_name_str  
'digits-of-\udccf\udc80.txt'
>>> pi_name_str.encode('ascii', 'surrogateescape')  
b'digits-of-\xcf\x80.txt'
```

留意上面的 `\udccf` 和 `\udc80`。

延伸阅读里面有一堆相关的好材料。
这章主要讲一些基础的函数式编程。

在一门语言中,如果函数可以满足下面几个条件,那么它就是这个语言中的一等公民(first-class object)。"first-class function" 和 "functions as first-class objects" 表达的是同样的意思。

* Created at runtime
* Assigned to a variable or element in a data structure
* Passed as an argument to a function
* Returned as the result of a function

这章的重点是如何获取函数签名信息,并给了 `bobo` 库作为一个漂亮的例子讲解。

! Treating a Function Like an Object

展示了函数被赋值给对象,函数的 `__doc__` 属性等,以表达函数是个对象。

! Higher-Order Functions

即使用函数作为参数的函数。比如内置的 `sort`:

```python
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
```

同类函数有 `map`, `filter` ,但这两个函数在灵活性和扩展性上不如 list comprehension,Python 社区已经不推荐。

! Anonymous Functions

匿名函数在语法上很受限制,它除了跟高阶函数(Higher-Order Functions)一起搭配使用外,很少有合适的场景:

```python
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=lambda word: word[::-1])
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
```

! The Seven Flavors of Callable Objects

`__builtin__.callable()` Checks.

7 Callable types:

* User-defined functions (`def`, `lambda`)
* Built-in functions (C functions: `len`, `time.strftime`)
* Built-in methods (`dict.get`)
* Methods (functions defined in a class)
* Classes (`point = Point3D()`)
* Class instances (a class defines a `__call__` method)
* Generator functions (we'll talk about this later)

! User-Defined Callable Types

在类中定义一个 `__call__` 类型,可以使类的实例可以当作函数来调用。书中给了一个很实用的使用场景,可以用作做装饰器(decorator),以保存多次调用间的中间状态。比如可以用来缓存一些复杂运算的结果。

! Function Introspection

函数有一些特殊的内部属性,可以被用来观察函数内部。

{{function-attributes}}

其中 `__defaults__`, `__code__`, `__annotations__` 经常被 IDE 或者一些框架用来提取关于函数签名的信息。

! From Positional to Keyword-Only Parameters

Python 3 提供了一个新特性,可以定义一个函数参数,只能作为命名参数被调用。比如:

```python
>>> def f(a, *args, b):
...    return a, b
...
>>> f(1, b=2)
(1, 2)
```

这个例子中,调用时需要给上 `b` 这个命名参数,不然会报错。如果你不想要使用 `a` 之后的位置参数,你也可以把 `args` 省掉:`def f(a, *, b):`。

! Retrieving Information About Parameters

这是本章的重点。

函数的签名信息存在它的 `__defaults__`, `__kwdefaults__`, `__code__` 属性中,但是你不需要自己去解析他们,标准库 `inspect` 做了这个事情。`boto` Web 框架是一个绝佳例子,它利用了参数信息做 HTTP 请求的参数校验:

```python
import bobo

@bobo.query('/')
def hello(person):
    return 'Hello %s!' % person
```

如果你访问 `http://localhost:8080/` 时不带 `person` 参数,`bobo` 会返回 HTTP 403 表示缺少参数。

! Function Annotations

Python 3 提供了一套机制,用来给函数参数和返回值增加元信息:

```python
def clip(text:str, max_len:'int > 0'=80) -> str:
    # ...
```

这些信息会存放在函数对象的 `__annotations__` 中。但是 Python 不会使用这些数据做任何事情,比如参数校验等。这些信息主要被 IDE、静态代码检查器使用。同时 Python 3.5 引入了 Type Hints,给出一个数据规范让 IDE / 其他工具更好地进行代码分析。

`inspect` 模块可以处理他们。像 `bobo` 这些 Web 框架,也可以利用这些信息做参数校验。

! Packages for Functional Programming

!! The operator Module

内置的 `operator` 模块提供了几类函数:

* 表示操作符的函数,比如加法 `add_(a, b)` 函数
* `itemgetter`, `attrgetter`
* `methodcaller` 可以动态调用一个对象的方法,参数也可以预先指定好

```python
>>> from operator import methodcaller
>>> s = 'The time has come'
>>> upcase = methodcaller('upper')
>>> upcase(s)
'THE TIME HAS COME'
>>> hiphenate = methodcaller('replace', ' ', '-')
>>> hiphenate(s)
'The-time-has-come'
```

!! Freezing Arguments with functools.partial

`functools.partial` 的作用跟 `methodcaller` 类似,区别在于一个对函数动手,一个对方法(类里面的函数)动手。它非常''实用'':

```python
>>> import unicodedata, functools
>>> nfc = functools.partial(unicodedata.normalize, 'NFC')
>>> s1 = 'café'
>>> s2 = 'cafe\u0301'
>>> s1, s2
('café', 'café')
>>> s1 == s2
False
>>> nfc(s1) == nfc(s2)
True
```

`functools.partialmethod` 的作用类似,但是用在类内部方法中。

! Furture Reading

Python 之父在设计之初并没有想把 Python 做成一门函数式编程语言,只是他从其他语言借鉴了相应的部分,让他有了一些函数式的特性而已。同时 Python 没有做尾递归优化,可能限制了它在函数式编程上的一些使用。这块内容我还看不懂,后面更深入了解了再回来看看。
这章主要讲函数式编程对比 OOP 编程上的一些优势。

Peter Norvig 在 1996 年发表演讲,认为对于动态语言来讲,23 种设计模式中的 16 种将失去作用或者变得更简单。后来《设计模式》的作者出来说,设计模式主要是针对类似 C++ / SmartTalk 这类静态语言的。

!! Case Study: Refactoring Strategy

这一节中,讲述了如何用函数式编程取代麻烦的 Strategy 模式。

{{strategy-pattern}}

Strategy Pattern 由 context 和 strategy 两部分构成。strategy 是一个运算过程,对于 C++ 这类非函数式语言,它需要用一套「接口(抽象基类)」+「实现」来实现这种效果,利用 OOP 语言的多态能力实现调用不同的代码块(图中三个具体 Promo 类的 `discount()` 函数。但是对于函数式语言,你只需要将计算过程(`discount()` 函数),当作参数传进去就好了。

函数式编程最重要的一点概念,''就是要记得运算过程(函数对象)是可以被传递的''。你可以实现一个函数,它的行为完全由外部传入的函数参数控制。

!! Command

这一节讲 Command 模式如何用函数式编程简化。跟上一节的思路类似。
这章讲的几个点:

* How Python evaluates decorator syntax
* How Python decides whether a variable is local
* Why closures exist and how they work
* What problem is solved by `nonlocal`

看完之后可以实现:

* Implementing a well-behaved decorator
* Interesting decorators in the standard library
* Implementing a parameterized decorator

由于 decorator 这个词的命名,跟 [[设计模式|DesignPattern]] 中的装饰器没什么关系,它与编译器领域中的概念相近。因此下面的笔记中我不用「装饰器」一词,而是直接用 decorator 来表达。

! Decorators 101

decorator 就是个语法糖:

```python
@decorate
def target():
    print('running target()')
```

效果等同于:

```
def target():
    print('running target()')
target = decorate(target)
```

! When Python Executes Decorators

一个 decorated function(比如上一节中的 `decorate`),在 import time(也就是它所处的模块被加载时)就被执行了。比如:

```python
def register(func):
    print('running register(%s)' % func.__name__)
    return func

@register
def f1():
    print('running f1()')
```

上面这段代码,被解释器加载时就会输出 `running register(f1)`,在 `f1` 被调用时才输出 `running f1()`。

! Decorator-Enhanced Strategy Pattern

怎样用 decorator 来更优雅地解决上一章中的问题,即用 decorator 来获得几个 promo 函数对象,以加入 promos 列表:

```python
# old solution
promos = [fidelity_promo, bulk_item_promo, ...]

# new solution
promos = []
def promotion(promo_func):
    promos.append(promo_func)
    return promo_func

@promotion
def fidelity(order):
    """5% discount for customers with 1000 or more fidelity points"""
    # ...

@promotion
def bulk_item(order):
    """10% discount for each LineItem with 20 or more units"""
    # ...
```

! Variable Scope Rules

这节只讲了一个简单的规则。详细的规则可以参考 [[官方文档|https://docs.python.org/3/reference/executionmodel.html]]。这节的内容比较重要。

Python 使用的是块作用域。什么是一个 //块// 呢?

> A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition.

所以函数体是一个块,但是 `if` 的分支语句不是一个块。

Python 解释器如何解释一个变量呢?它会先从本地块开始找,如果找不到,就一层一层往更外面的块作用域找,最后找到全局作用域。如果还没有,就会抛出 `NameError`。如果一个函数体里面定义了一个变量,但是在定义它之前就使用了,那会抛出一个 `UnboundLocalError`:

```python
a = 2

def f1():
    print(a)    # 会抛 UnboundLocalError
    a = 3
```

`a` 被解释器认为是当前函数作用域中的变量,但是它还没被定义,所以会抛 `UnboundLocalError`。

<<.tip "JavaScript 在这块的规则与 Python 类似,但是 JavaScript 可以声明而不定义变量(`var a;`)(Python 没有这种语法),所以它有一个 [[Variable Hoisting|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting]] 机制来解释这种问题。同时 JavaScript 对错误非常容忍,访问同个作用域未初始化的变量时返回 `undefined`,而不会像 Python 这样抛 `UnboundLocalError`。">>

有两个关键字可以打破这个解析变量名的过程:`global` 和 `nonlocal`。如果你给一个变量声明了 `global`,那解释器会直接在全局块找这个变量;如果声明了 `nonlocal`,那解释器就不会在这个声明所在的块里面去找变量,而是直接在最靠近的块去找:

```python
a = 2

def f1():
    global a    # a 此时指全局块中的 a
    print(a)    # 这里不会抛异常,会输出 2
    a = 3       # 修改的是全局的 a
```

`nonlocal` 的例子在下一节的 closure 中会讲。

! Closures

书里面用了两个例子对比,来说明什么是 closure。

如果你需要实现一个动态计算平均数的功能,你会怎样实现呢?效果如下:

```python
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0
```

即是,你需要在 `avg` 这个计算过程以外,有一个地方存放之前的数据(在这个例子中的 10, 11, 12)。

第一种实现:用 callable class instance 来保存中间变量 `series`,中间数据随着 `avg` 变量的存在而存在:

```python
class Averager():
    def __init__(self):
        self.series = []
    def __call__(self, new_value):
        self.series.append(new_value)
        total = sum(self.series)
        return total/len(self.series)

>>> avg = Averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0
```

第二种实现,用 closure:

```python
def make_averager():
    series = []
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)
    return averager

>>> avg = make_averager()
>>> avg(10)
10.0
>>> avg(11)
10.5
>>> avg(12)
11.0
```

closure 这个例子很有意思,它把中间数据 `series` 放在计算过程 `averager` 的外面一层的函数中。而 Python 是一门动态语言,使用了引用计数来做垃圾回收;虽然 `make_average` 执行完了,但是只要 `averager` 函数对象和 `series` 变量可以被引用到,那么它们就不会被回收。

所以什么是 ''closure'' 呢?一图胜千言:

[img[closure]]

> To summarize: a closure is a function that retains the bindings of the free variables that exist when the function is defined, so that they can be used later when the function is invoked and the defining scope is no longer available.

free variables 是那些它自己的 local scope 已经被销毁了的变量。上面的 `series` 可以通过 `avg.__code__.co_freevars`, `avg.__closure__` 访问到。

<<.info "Closure 跟匿名函数经常混在一起,是因为有些语言的闭包经常使用匿名函数来实现,比如 JavaScript。在闭包中,使用匿名函数或者具名函数都是可以的,比如前面的 Python 例子就用了具名函数 `averager`。(不过 Python 语言没有匿名函数的特性)">>

! The nonlocal Declaration

上面已经讲到 `nonlocal` 关键字的含义。那么什么时候需要用它?

```python
def make_averager():
    count = 0
    total = 0
    def averager(new_value):
        count += 1
        total += new_value
        return total / count
    return averager

>>> avg = make_averager()
>>> avg(10)
Traceback (most recent call last):
  ...
UnboundLocalError: local variable 'count' referenced before assignment
>>>
```

这里为什么会抛异常呢?原因是 `count`, `total` 都是整数,是不可变类型。意味着它们没有实现 `__iadd__` 函数,于是 `count += 1` 等同于 `count = count + 1`([[参考|https://docs.python.org/3/reference/datamodel.html#object.__iadd__]]),于是在 `averager` 函数块里又定义了一个新变量 `count`。但是 `count + 1` 又提前使用了这个变量,于是报 `UnboundLocalError`。

解决办法是使用 `nonlocal`:

```python
def make_averager():
    count = 0
    total = 0
    def averager(new_value):
        nonlocal count, total
        count += 1
        total += new_value
        return total / count
    return averager
```

但是这个关键字只在 Python 3 才有。Python 2 的话需要一些 walkaround,比如在上层块里面定义一个词典(可变类型)供下层块使用。

! Implementing a Simple Decorator

这节定义了一个计算函数运行时间的 decorator,然后具体使用上了。比较简单。但是有一个问题是,被 decorated 的函数,它的 `__name__`, `__doc__` 等变量也被替换了,于是会有:

```python
@clock
def snooze(seconds):
    time.sleep(seconds)

>>> snooze.__name__
'clocked'
```

这个时候可以用标准库的 `functools.wraps` decorator 来解决,它会把被装饰的函数的几个属性拷过去:

```python
def clock(func):
    @functools.wraps(func)
    def clocked(*args, **kwargs):
        # ...

@clock
def snooze(seconds):
    time.sleep(seconds)

>>> snooze.__name__
'snooze'
```

! Decorators in the Standard Library

!! Memoization with functools.lru_cache

第一个介绍的是 `functools.lru_cache`。这是一个非常方便的装饰器,对于一些运行缓慢的函数,可以把运行结果缓存起来。比如下面的 `fibonacci` 函数:

```python
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-2) + fibonacci(n-1)

if__name__=='__main__':
    print(fibonacci(6))
```

如果不对 `fibonacci` 的计算结果做缓存,这个计算是非常慢的,因为有很多不必要的重复计算(`fibonacci(4)` 就算了 2 次)。

给 `fibonacci` 加了 `@functools.lru_cache()` 装饰器,可以很高效率地提高速度,减少了不必要的计算。

`lru_cache` 缓存的依据是函数参数,默认缓存 128 个结果。同时注意它是个返回 decorator 函数的函数,所以你在加 `@functools.lru_cache()` 时,不能漏掉括号。

!! Generic Functions with Single Dispatch

<<.tip "我对 `singledispatch` 的理解还不够深,感觉它似乎有更多内涵。同时它跟 ABC (abstract base class) 那套机制有关系。现在不是太理解,书后面会讲 ABC。">>

`singledispatch` 针对的场景是,一些需要理解参数类型的函数过程。它可以实现一个函数针对不同参数有不同的行为:

```python
>>> fun("test.", verbose=True)
Let me just say, test.
>>> fun(42, verbose=True)
Strength in numbers, eh? 42
>>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
Enumerate this:
0 spam
1 spam
2 eggs
3 spam
>>> fun(None)
Nothing.
>>> fun(1.23)
0.615
```

`singledispatch` 可以你不需要写一堆 if/else 来判断类型走分支。具体的实现方式看文档就可以了,这里不描述。

这种场景看起来跟面向对向中的接口(Interface)类似,为不同的类型定义一个共同的接口。Python 也可以有类似的实现,但是 `singledispatch` 有一些优势:

# 对于一些内置类型,你不好去给它实现接口函数。比如在 int 类型中实现一个新的方法,这是不好的实践;如果继承一个新类出来,又把问题搞复杂了。
# Python 提倡 duck typing,即不关心具体的类型而关注协议(比如内置的 `len`, `sort` 函数),用 `singledispatch` 可以实现这种 generic function(比如前面代码例子中的 `fun`),而且不需要像内置函数一样要求在各个类中实现 dunder 函数(比如 `__len__`)。

扩展阅读:

# [[PEP 443 -- Single-dispatch generic functions|https://www.python.org/dev/peps/pep-0443/]]: 讲了这个设计的由来,以及一些相近的实现(没太看明白)
# [[What single-dispatch generic functions mean for you|http://lukasz.langa.pl/8/single-dispatch-generic-functions/]]: 它讲述了一些具体的应用场景(UI widgets, serialization formats and protocol handlers),以及怎样在 class method 中使用 `singledispatch`。


! Variables Are Not Boxes

[img width=600 [variable-are-label-instead-of-box]]

这个比喻非常棒。

! Identity, Equality, and Aliases

* `a is b` 对比的是 `id(a) == id(b)`,`id` 函数不能重载,在 CPython 里面指的是变量所在的内存地址(在其他实现里可能不一样)
* `a == b` 对比的是 `a.__eq__(b)`

! Copies Are Shallow by Default

浅复制与深复制。`list(l)` / `l[:]` 这种是浅复制;深复制由 `copy.deepcopy` 提供。如果想要有自定义的复制实现,可以实现 `__copy__()` / `__deepcopy__()` 函数。参考 `copy` 模块的文档。

! Function Parameters as References

关于 Python 调用函数时的参数传递机制,可以用 //call by sharing// 来表达。即是说:

> The parameters inside the function become aliases of the actual arguments.

这意味着如果函数参数是可变类型时,在函数内对其进行操作,会影响函数外的变量:

```python
>>> def f(a, b):
...     a += b
...     return a
...
>>> a = [1, 2]
>>> b = [3, 4]
>>> f(a, b)
[1, 2, 3, 4]
>>> a, b  
([1, 2, 3, 4], [3, 4])
```

<<.tip "这跟 Java 的 call by reference 机制是类似的(但是 Java 对于原始类型,使用的是 call by value)。">>

!! Mutable Types as Parameter Defaults: Bad Idea

函数的参数默认值,不应该是可变类型,因为会被不同的函数实例共享:

```python
>>> def append_f(l=[]):
...    l.append('1')
...    return l
...

>>> append_f(['0'])
['0', '1']    # 正常
>>> append_f()
['1']         # 正常
>>> append_f()
['1', '1']    # 不正常
```

!! Defensive Programming with Mutable Parameters

call by sharing 使得如果你的函数接受一个可变类型的参数时,你需要跟调用方协定,是否可以改变参数指向的 object 的值。如果你不想改变参数的值,那么考虑把参数复制一份到函数内部的作用域中:

```python
def Bus:
    def __init__(self, passengers=None):
        if passengers is None:
            self.passengers = []
        else:
            self.passengers = list(passengers)   # 复制一份
```

! del and Garbage Collection

CPython 使用的 GC 是引用计数。当一个对象不再能被访问到时,它的引用计数会变成 0,然后马上被垃圾回收<<footnote "[1]" "未来的 CPython 实现可以改变这一点">>。`del` 可以解除一个变量与其关联的对象的绑定,这样会使该对象的引用计数减少。

<<.warning "不要依赖于 CPython 的垃圾回收机制。不同的 Python 实现,使用的 GC 策略是不一样的。CPython 使用了引用计数,但是 Jython / IronPython 分别使用了他们宿主的 GC 机制,所以行为上跟 CPython 不一致。比如 Jython 实现上,一个 object 无法被访问到时,它也不会马上被回收,而在 CPython 中它会马上被回收。">>

! Weak References

> Weak references to an object do not increase its reference count. The object that is the target of a reference is called the referent. Therefore, we say that a weak reference does not prevent the referent from being garbage collected.

[[weakref|https://docs.python.org/3/library/weakref.html]] 模块封装了一些操作 weak reference 的方法。根据它的文档,weakref 的常用场景是:

> A primary use for weak references is to implement caches or mappings holding large objects, where it’s desired that a large object not be kept alive solely because it appears in a cache or mapping.

我暂时没有看到太多适用的场景。

! Tricks Python Plays with Immutables

CPython 对一些不可变类型做了特殊处理,以加速对它的使用。比如:

# 对于一个 tuple t,`t[:] is t` 为真
# 对于 frozenset,`fs.copy() is fs` 为真
# `s1 = 'a'`, `s2 = 'a'`, `s1 is s2` 为真

这种机制叫做  //interning//。Wikipedia 上有一个 [[String interning|https://en.wikipedia.org/wiki/String_interning]] 条目。
这章描述了一些常见的 dundle function,通过 Python 的 Data Model 实现一个 Pythonic Object。

! Object Representations

Python 3 有几个用来做 object representation 的函数:

* `repr()` <=> `__repr__`:给开发者读的,返回 `str`
* `str()` <=> `__str__`:给用户读的,返回 `str`
* `bytes()` <=> `__bytes__`:表示一个 object 的二进制形式,返回 `bytes`
* `format()` <=> `__format__`:自定义的输出函数,主要用在 `str.format()` 和 `format()` 内置函数上

! An Alternative Constructor

区别于 `__init__`,用 classmethod 来初始化一个函数,以提供多种初始化的形式:

```python
class Vector2d:
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    @classmethod
    def frombytes(cls, octets):
        typecode = chr(octets[0])
        memv = memoryview(octets[1:]).cast(typecode)
        return cls(*memv)
```

注意,这里的 `frombytes()` 函数的命名,是参照标准库中 `array.array.frombytes()` 命名的。我也观察到一些第三方的库使用了 `fromxxx` 的命名方式。这可以说是一种 Pythonic 的命名方式。

! classmethod Versus staticmethod

classmethod 有个非常实用的场景,是给一个类提供额外的构造能力(如上面的 `frombytes`)。作者认为 staticmethod 没有应用场景,因为跟普通函数一模一样;如果你的函数跟某个类非常相关,那么在这个类附近写这个函数就好了,没必要用 staticmethod。我有点赞同。

! Formatted Display

定义 `__format__` 函数,可以在使用 built-in `format()`, `str.format()` 这些函数时,对你的类进行自定义的字符串输出。

! A Hashable Vector2d

如果想把一个类放进 set 或作为 dict 的 key,需要让它 ''hashable''。官方推荐的方式是将各个属性的 hash 值异或(bitwise XOR)起来:

```python
def __hash__(self):
    return hash(self.x) ^ hash(self.y)
```

一个实例的 hash 值不应该被改变(想想你已经把它用在 set 里面后,再改变 x, y 会引起的问题)。所以 `x`, `y` 也不应该被改变。可以用 `@property` 实现对类属性的只读控制,从而实现 ''immutable'':

```python
class Vector2d:
    typecode = 'd'
    def __init__(self, x, y):
        self.__x = float(x)
        self.__y = float(y)
    @property   
    def x(self):
        return self.__x
    @property
    def y(self):
        return self.__y
    def __iter__(self):
        return (i for i in (self.x, self.y))
```

使用 immutable 来达到 hashable 并不是语言强制的,但是它通常是一个好的实践。

! Private and “Protected” Attributes in Python

Python 并没有提供类属性的 private / protected 机制。但是它在 name mangling 上做了一些事情,来避免一些错误的访问。

```python
class A:
    def __init__(self):
        self.__a = 1
        self._a = 2
    def say(self):
        print(self.__a)
        print(self._a)
```

```python
>>> a = A()
>>> a.__dict__
{'_a': 2, '_A__a': 1}
>>> a.say()
1
2
```

可以看到带有双下划线的 `__a` 被装饰成 `_A__a`。在 `A` 类外部(甚至是子类)访问 `__a` 是会报错的。这样提供了一个机制来 ''避免'' (而非 ''限制'')错误的访问(你仍然可以用 `_A__a` 来访问到它)。

但是 `__a` 这种并不被推崇,因为引入了隐式的规则。不要使用它。用单下划线这种即可。

! Saving Space with the `__slots__` Class Attribute

```python
class Vector2d:
    __slots__ = ('__x', '__y')
    typecode = 'd'
```

`__slots__` 变量定义了一个类的所有属性。存在 `__slots__` 后,你无法为一个类实例动态地新增属性。所以 Python 解释器会使用 `tuple` 结构来保存类属性,而不再用 `dict`。这可以节约 ''很多'' 内存开销。但是 `__slots__` 还带来一些不便,比如子类需要重复声明 `__slots__`,`__dict__` 属性消失,`__weakref__` 也需要特别对待等。

大多数情况下你不需要使用它。一般情况下它适用于类似数据库纪录的数据结构。如果你要用它,注意多看看文档。

! Overriding Class Attributes

Python 类中有 class attributes 和 instance attributes 之分:

```python
class Demo:
    a = 1   # class attribute
    def __init__(self):
        self.b = 2    # instance attributes

>>> d1 = Demo()
>>> d2 = Demo()
>>> print(d1.a)
1
>>> d1.a = 3   # create instance attributes a, shadow class attribute a
>>> print(d1.a)
3
>>> print(d2.a)
1
```

Instance attributes 会覆盖同名的 class attributes。同时你在子类中以 class attribute 形式声明父类的同名 class attribute,也会覆盖掉父类的。这个机制可以用于继承和扩展已有的类。
这章主要构建了一个教学 Vector 类,对 Python 的数据模型做了更深入的探讨。每一节的内容都比较相关,因此我不再按章节写笔记,而是总的写在一起。

! Slicing

```python
def __getitem__(self, index):
    cls = type(self)
    if isinstance(index, slice):
        return cls(self._components[index])
    elif isinstance(index, numbers.Integral):
        return self._components[index]
    else:
        msg = '{cls.__name__} indices must be integers'
        raise TypeError(msg.format(cls=cls))
```

调用 `v1[0]` 时传入的是整数,调用 `v1[0:3]` 这种传入的是 `slice` 对象。方括号中的 `0:3` 可以说是一种 slice literal。

`S.indices(len) -> (start, stop, stride)` 这个函数非常实用,它可以把 negative index 转成正的,方便你做一些操作:

```python
>>> slice(None, 10, 2).indices(5)
(0, 5, 2)
>>> slice(-3, None, None).indices(5)
(2, 5, 1)
```

! Dynamic Attribute Access

Python 的 instance attribute 存在类的 `__dict__` 中,class attributes 存在类的 `__class__` 中。当你访问某个 attributes 时,Python 会先从这两个地方找变量,如果没找到会调用 `__getitem__` 函数。

所以要实现 Dynamic Attribute Access,你要实现 `__getitem__` 函数,同时最好实现配套的 `__setitem__` 函数。

! Hashing

如果你想把一个类实例作为 `set` `dict` 的 key,你需要让他不可变 <<footnote "[1]" "但是又没法严格限制外部代码访问内部数据,比如 `Vector` 类中的 `_component`,有点尴尬">>,同时保证它的 `hash()` 值在整个生命周期保持不变。

一般的实现方式是,将类中的 attributes 先 hash 再异或,对于多个 attributes 的情况,''map reduce'' 很适合这种场景:

```python
def __hash__(self):
    hashes = map(hash, self._components)
    return functools.reduce(operator.xor, hashes, 0)
```

{{fluent-python-map-reduce}}

! Python 3 vs Python 2

Python 3 把很多内置函数从生成一个 list,变成返回一个 iterator,比如 `map` `zip` 等。这对内存和性能都有很大帮助。

! The Awesome zip

`zip` 内置函数可以把多个 iterable 像拉链一样重组:

```python
>>> list(zip(range(3), 'ABC'))
[(0, 'A'), (1, 'B'), (2, 'C')]
```

但是它在最短的 iterable 消耗完就停止了。你可以用 `itertools.zip_longest` 提供默认值,使最长的 iterable 也可以被 zip:

```python
>>> list(zip(range(3), 'ABCD'))
[(0, 'A'), (1, 'B'), (2, 'C')]
>>> from itertools import zip_longest
>>> list(zip_longest(range(3), 'ABCD', fillvalue=-1))
[(0, 'A'), (1, 'B'), (2, 'C'), (-1, 'D')]
```

! The Search for a Pythonic Sum

Future Reading 里面有一个''值得一看''的故事,讲述大家在讨论 [[Pythonic way to sum n-th list element?|https://mail.python.org/pipermail/python-list/2003-April/218568.html]] 的故事。当时 Python 并没有 `sum` 内置函数,于是一些有 OOP 经验的人使用了 `functools.reduce` 和 `lambda` 来写:

```python
>>> my_list = [[1, 2, 3], [40, 50, 60], [9, 8, 7]]
>>> import functools
>>> functools.reduce(lambda a, b: a+b, [sub[1] for sub in my_list])
60
```

但是这实在是太丑了,即有 `lambda` 又有 `reduce`,还有 list comprehension。于是大家写出了优化版本:

```python
>>> functools.reduce(lambda a, b: a + b[1], my_list, 0)
60
>>> functools.reduce(operator.add, [sub[1] for sub in my_list], 0)
60
```

但是 `reduce` 会使得求和 (sum) 的意图不明。有人觉得这样写还不如直接:

```python
>>> t = 0
>>> for sub in my_list:
...     total += sub[1]
>>> t
60
```

对此有两段评论说得好:

> I like Evan Simpson’s code but I also like David Eppstein’s comment on it:
>> If you want the sum of a list of items, you should write it in a way that looks like “the sum of a list of items”, not in a way that looks like “loop over these items, maintain another variable t, perform a sequence of additions”. Why do we have high level languages if not to express our intentions at a higher level and let the language worry about what low-level operations are needed to implement it?
> Then Alex Martelli comes back to suggest:
>> “The sum” is so frequently needed that I wouldn’t mind at all if Python singled it out as a built-in. But “reduce(operator.add, …” just isn’t a great way to express it, in my opinion (and yet as an old APL’er, and FP-liker, I should like it—but I don’t).

最终导致 3 个月后 Python 添加了内置的 `sum` 函数。于是可以:

```python
>>> sum([sub[1] for sub in my_list])
60
```

这也说明了为何 Python 3 把 `map` `reduce` 放到 `functools` 里面而不放在内置函数中。它们缺乏表达能力。

! Protocol v.s. Interface

Python 里面的 dunder 函数,只能算做一种 protocol,而非 interface。protocol 像是一种不太强的约定,而 interface 是一种强的约定。比如我实现了 `__getitem__` 来取下标,但是如果对于我的类,slicing 并没有意义,那我可以不实现对 slice 的处理。而 interface 表示你必须实现它约定的一系列函数。
这一章主要讲 ABC 的机制。但是处处提醒读者 ''不要'' 随意自定义新的 ABC,而是使用已有的 ABC:

> ABCs,  like  descriptors  and  metaclasses,  are  tools  for  building frameworks. Therefore, only a very small minority of Python developers can create ABCs without imposing unreasonable limitations and needless work on fellow programmers.

! Interfaces and Protocols in Python Culture

对于 Python 来说(或者对于大部分动态语言来说),接口(interface)是用类的一些公共 attibutes (method or data attributes) 来表达的。

Protocol 是不正式的 interfaces,它是靠文档和约定(convention)来定义的。比如 "a file-like object" 是一个实现了 `.read()` 函数的类。而且它不保证一整套函数都实现了,比如一个支持 slicing 的 sequence 类,它有可能没有长度这个概念,于是它可以不实现 `__len__` 函数。

! Python Digs Sequences

Python 总是尽力去实现基础的 protocol(这个表达可能不好)。比如下面这个类:

```python
class Foo:
    def __getitem__(self, pos):
        return range(0, 30, 10)[pos]
        
>>> f = Foo()
>>> for i in f:
...     print(i)
0
10
20
>>> 10 in f
True
```

这个类并没有实现 `__iter__`, `__contains__` 函数,但是也可以被使用在相应的语法中,因为聪明的 Python 会把 `__getitem__` 作为一个 fallback 去遍历。

! Monkey-Patching to Implement a Protocol at Runtime

这节在我看来不是 best practise。它通过 hack 进一个 `__setitem__` 函数到 `FrenchDeck` 类中来使这个类支持被 `random.shuffle()` 操作。这意味着 hack 进去的函数必需知道 `FrenchDeck` 类的内部实现是怎样的,而且它还使用了类里面的私有变量。但是这也展示了一种可能性,后面写代码时可以权衡下。

! Alex Martelli’s Waterfowl

Alex Martelli 的故事很长且难看懂,主要是从特种的分类学出发,描述其分类从按语音(phonetics)到按其 DNS 序列的吻合程度(cladistics)的演变。里面有一段提到 ABC 的好处,即可以 `register` 而不需要继承,使得减少了很多继承带来的耦合性:

> Among the many conceptual advantages of ABCs over concrete classes (e.g., Scott Meyer’s “all non-leaf classes should be abstract”—see Item 33 in his book, More Effective C++), Python’s ABCs add one major practical advantage: the `register` class method, which lets end-user code “declare” that a certain class becomes a “virtual” subclass of an ABC (for this purpose the registered class must meet the ABC’s method name and signature requirements, and more importantly the underlying semantic contract—but it need not have been developed with any awareness of the ABC, and in particular need not inherit from it!). ''This goes a long way toward breaking the rigidity and strong coupling that make inheritance something to use with much more caution than typically practiced by most OOP programmers…''

! Subclassing an ABC

> Python does not check for the implementation of the abstract methods at import time
(when the frenchdeck2.py module is loaded and compiled), but only at runtime when
we actually try to instantiate FrenchDeck2.

Python 只会在运行时,实例化一个类时才去检查它是否实现了它的 ABC 父类要求的函数。

{{python-abc-mutable-sequence}}

图中的斜体部分,表示虚函数,是你需要实现的函数。Python 的 ABC 也会向提供一些函数供你使用,比如 `MutableSequence` 中的 `append` 是不需要你实现的,你只需要实现 `insert` 函数,`append` 函数就会调用它来实现自身逻辑。

同时,对于 ABC 默认实现的函数,你也可以写自己的版本覆盖它,实现更好的性能。比如 `Sequence` 类的 `__contains__` 函数,默认实现是遍历 sequence,你可以写一个性能更好的版本替代它。

! ABCs in the Standard Library

Python 中最重要的 ABC 分布在两个地方:

* `collections.abc`,[[官方文档|https://docs.python.org/3/library/collections.abc.html]]
* `numbers`,[[官方文档|https://docs.python.org/3/library/numbers.html]]

书中的 UML 图比较直观地表示了各 ABC 间的关系。

<<.warning "`decimal.Decimal` 没有注册在 `numbers.Real` 中。因为 Decimal 的精度跟普通符点数不一样。">>

! Defining and Using an ABC

上代码:

```python
import abc
class Tombola(abc.ABC):

    @abc.abstractmethod
    def load(self, iterable):
        """Add items from an iterable."""

    @abc.abstractmethod
    def pick(self):
        """Remove item at random, returning it.
        This method should raise `LookupError` when the instance is empty."""

    def loaded(self):
        """Return `True` if there's at least 1 item, `False` otherwise."""
        return bool(self.inspect())

    def inspect(self):
        """Return a sorted tuple with the items currently inside."""
        items = []
        while True:
            try:
                items.append(self.pick())
            except LookupError:
                break
        self.load(items)
        return tuple(sorted(items))
```

划重点:

# ABC 中可以提供具体的函数实现。但是函数实现必须依赖于公开接口,而不能有私有数据
# 用了 `@abstractmethod` 的函数,也可以有具体实现,只是子类仍然需要写一个自己的版本;不过子类可以调用父类的同名函数,不用重头写起
# `pick` 函数抛出一个 `LookupError` 是''有意为之'',因为 `LookupError` 有两个子类 `IndexError` 和 `KeyError`,方便子类抛出更具体的异常。虽然没有具体机制去约束之类可能抛出的异常,但是子类还是应该与父类保持一致

`@abc.abstractmethod` 可以叠 `@classmethod`, `@staticmethod`, `@property`,只需要 `@abc.abstractmethod` 在最内层。

!! A Virtual Subclass of Tombola

`register` 让一个类声明自己实现了 ABC 所要求的接口,而不需要继承它。特点:

* 能过 `issubclass` `isinstanceof` 检查
* Python 解释器不会在任何时刻检查它的接口是否实现(甚至是在子类实例初始化时)

! How the Tombola Subclasses Were Tested

演示了一把怎样用 doc test 来测试一个 reStructuredText 文档中的测试样例。

! Geese Can Behave as Ducks

`Sized` 用了 `__subclasshook__`,会用来做 `ABCMeta.__subclasscheck__`:

```python
class Sized(metaclass=ABCMeta):
    __slots__ = ()
    
    @abstractmethod
    def __len__(self):
        return 0
        
    @classmethod
    def __subclasshook__(cls, C):
        if cls is Sized:
            if any("__len__" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented
```

所以:

```python
>>> class Struggle:
...     def __len__(self): return 23
...
>>> from collections import abc
>>> isinstance(Struggle(), abc.Sized)
True
>>> issubclass(Struggle, abc.Sized)
True
```

但是这个 `__subclasshook__` 适用的范围很小。自己写的代码不要用它。比如 `dict` 虽然实现了 Sequence 所要求的 `__len__` `__getitem__` `__iter__`,但是它不是 Sequence,因为它的内部元素不是有序的。所以 `dict` 的实现上不会用 `__subclasshook__` 做动态的 dunder function 判断。


! Soapbox

Strong versus weak typing

> If the language rarely performs implicit conversion of types, it’s considered strongly typed; if it often does it, it’s weakly typed. Java, C++, and Python are strongly typed. PHP, JavaScript, and Perl are weakly typed.

Static versus dynamic typing

> If type-checking is performed at compile time, the language is statically typed; if it happens at runtime, it’s dynamically typed. Static typing requires type declarations (some modern languages use type inference to avoid some of that). Fortran and Lisp are the two oldest programming languages still alive and they use, respectively, static and dynamic typing.

这节把强 / 弱类型、静态 / 动态类型做了描述。所以 Python 是强类型 + 动态类型。
! Subclassing Built-In Types Is Tricky

CPython 中用 C 写的内置类型,如 `list` `dict` `str`,在继承行为上跟纯 Python 类不一致。比如:

```python
>>> class DoppelDict(dict):
...     def __setitem__(self, key, value):
...         super().__setitem__(key, [value] * 2)
...
# __init__ 函数无视了子类定义的 __setitem__,这是不合理的
>>> dd = DoppelDict(one=1)
>>> dd
{'one': 1}

# 这个是合预期的
>>> dd['two'] = 2
>>> dd
{'one': 1, 'two': [2, 2]}

# update 函数又无视了子类的 __setitem__
>>> dd.update(three=3) 
>>> dd
{'three': 3, 'one': 1, 'two': [2, 2]}
```

如果你想要弄一个 custom dict,用 `collections.UserDict`。同理还有 `UserList` `UserStr`。

Soapbox 中的「Misbehaving Built-ins: Bug or Feature?」一节,提到了 built-in 类型行为不一致的问题。作者觉得是基于性能和扩展性考虑的折衷行为。毕竟你很少需要 subclass 一个 dict,但是你几乎每天都在用 dict 本身。所以性能上的考虑优于扩展性。

! Multiple Inheritance and Method Resolution Order

{{mro-of-tkinter-text-class}}

这是 `tkinter` 库中的 `Text` 类的 MRO 解析顺序图。图中应该从右到左看,比如 `Widget` 是 `Text` 的第一个父类,`XView` 是第二个。代码中 `Text` 的继承顺序如下:

```python
class Text(Widget, XView, YView):
    ...
```

! Coping with multiple inheritance

这是本章的''重点''。我觉得写得非常好。

1. Distinguish Interface Inheritance from Implementation Inheritance

When dealing with multiple inheritance, it’s useful to keep straight the reasons why subclassing is done in the first place. The main reasons are:

* Inheritance of interface creates a subtype, implying an “is-a” relationship.
* Inheritance of implementation avoids code duplication by reuse.

Interface inheritance is the backbone of a framework.

2. Make Interfaces Explicit with ABCs

3. Use Mixins for Code Reuse

If a class is designed to provide method implementations for reuse by multiple unrelated subclasses, without implying an “is-a” relationship, it should be an explicit mixin class.

Conceptually, a mixin does not define a new type; it merely bundles methods for reuse. ''A mixin should never be instantiated'', and concrete classes should not inherit only from a mixin. Each mixin should provide a single specific behavior, implementing few and very closely related methods.

4. Make Mixins Explicit by Naming

5. An ABC May Also Be a Mixin; The Reverse Is Not True

6. Don't Subclass from More Than One Concrete Class

Scott Meyer 在 //Effective C++// 有更激进的说法:"all non-leaf classes should be abstract"。

7. Provide Aggregate Classes to Users

这一点,Django REST Framework 的 `ModelViewSet` ([[代码|https://github.com/encode/django-rest-framework/blob/7855d3bd8b607ed8aed1a2266b35e3e3ef265288/rest_framework/viewsets.py#L164]])让我印象深刻。

8. “Favor Object Composition Over Class Inheritance.”

如 `UserDict` 就是一个好的例子。

! A Modern Example: Mixins in Django Generic Views

Django 的各种 class-based view,是充分利用了 Python 的继承和 ABC 能力的典型例子。DRF 也是。比如 `TemplateView` 继承了:

* `TemplateResponseMixin`:提供了渲染模板成 `HttpResponse` 的能力
* `ContextMixin`:提供了获得 context 的能力
* `View`:提供了通用的 View 函数能力(虽然你不需要用它)

! Further Reading

如果有时间,仔细看看这里面推荐的内容。

内容:

* 关于 `super` 的争论
* 怎样用好多重继承
* 面向对象设计的好书推荐:Grady Booch's Object Oriented Analysis and Design

Soapbox 讨论了各语言对类继承做的选择。
操作符重载,也是通过一些 dundle 函数来实现的。比如 `__add__`, `__radd__` 等。操作符分为一元(unary)和二元(binary / infix),重载函数长得像:

```python
class Vector:
    def __neg__(self):
        return Vector(-x for x in self)

    def __add__(self, other):
        pairs = itertools.zip_longest(self, other, fillvalue=0.0)
        return Vector(a + b for a, b in pairs)
```

二元操作符,有正向反向之分,比如对于 `+`,有:

* `Vector([1, 2]) + [3]`:调用了 `Vector.__add__` 函数
* `[3] + Vector([1, 2])`:调用 `Vector.__radd__` 函数

关于 `a+b` 会怎么执行,这个图描述得很清楚:

{{ flowchart-for-computing-a+b }}

同时二元操作符都有 in-place 版本,比如 `__iadd__`,即 `+=` 操作符对应的函数。

写操作符重载函数很 trivial,需要写时具体看看书中建议。比较值得关注的是,如果二元操作符的两个值并不适合做操作(比如 'str' + [1, 2, 3]),你的相应 `__add__` 函数需要返回 `NotImplemented` 常量(而不是抛出 `NotImplementedError` 异常)。

对于用于比较的操作符,他们不需要专门的 reverse method,如下图:

{{ rich-comparison-operator }}

如何写 `__add__` 和 `__iadd__`,书中有个不错的例子:

```python
import itertools   
from tombola import Tombola
from bingo import BingoCage


class AddableBingoCage(BingoCage):   
    def __add__(self, other):
        if isinstance(other, Tombola):   
            return AddableBingoCage(self.inspect() + other.inspect())   
        else:
            return NotImplemented
            
    def __iadd__(self, other):
        if isinstance(other, Tombola):
            other_iterable = other.inspect()   
        else:
            try:
                other_iterable = iter(other)   
            except TypeError:   
                self_cls = type(self).__name__
                msg = "right operand in += must be {!r} or an iterable"
                raise TypeError(msg.format(self_cls))
        self.load(other_iterable)
        return self
```

作者总结了下:

* `__add__`: The result is produced by calling the constructor AddableBingoCage to build a new instance.
* `__iadd__`: The result is produced by returning self, after it has been modified.

Future Reading 和 Soapbox 部分,大多数内容涉及到不同语言对于操作符重载的选择和讨论。比如 Java 和 Go 就不支持操作符重载。Java 作者觉得 C++ 里操作符重载被滥用了,写了一堆不可理解的(not sensible)代码出来,它宁愿牺牲掉这块特性。
这节写得很赞,如果这块知识生疏了,值得重新看看回顾下。

! Why Sequences Are Iterable: The iter Function

```python
class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)

    def __getitem__(self, index):
        return self.words[index]   

    def __len__(self):   
        return len(self.words)

    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)
```

Python 解释器需要遍历(iterate)一个 object `x` 时,会先调用 `iter(x)` 来返回一个 iterator。`iter` 会:

# Checks whether the object implements `__iter__`, and calls that to obtain an iterator.
# If `__iter__` is not implemented, but `__getitem__` is implemented, Python creates an iterator that attempts to fetch items in order, starting from index 0 (zero).
# If that fails, Python raises `TypeError`, usually saying “C object is not iterable,” where C is the class of the target object.

但是 `__getitem__` 这个行为,只是为了向后兼容,并不被提倡(也没被 deprecated)。Python 的内置 sequence 类型,都有实现 `__iter__` 函数。`Iterable` 这个 ABC 的 `__subclasshook__` 中,只判断一个类型有没有 `__iter__` 函数,而不判断 `__getitem__` 相关。所以上面的 `Sequence` 类并不能通过 `issubclass(Sequence, abc.Iterable)` 判断。如果你想判断一个对象是否可以被遍历,当前(Python 3.4)最佳做法是调用 `iter(x)` 看看有无抛出 `TypeError` 异常。

! Iterables Versus Iterators

; iterable
: Any object from which the `iter` built-in function can obtain an iterator. Objects implementing an `__iter__` method returning an iterator are iterable. Sequences are always iterable; as are objects implementing a `__getitem__` method that takes 0-based indexes.

''Python obtains iterators from iterables.''

下面两段代码演示了 Python 的 iterate 机制:

```python
>>> s = 'ABC'
>>> for char in s:
...     print(char)
...
A
B
C

# the code above is equivalent to below
>>> s = 'ABC'
>>> it = iter(s)
>>> while True:
...     try:
...         print(next(it))
...     except StopIteration:
...         del it
...         break
...
A
B
C
```

`Iterator` 的 ABC 定义了两个函数,`__next__` 和 `__iter__`。`__next__` 在被内置函数 `next(it)` 调用,它需要返回下一个元素,或者抛出 `StopIteration` 异常。`__iter__` 一般来说直接返回 `self`,即 `iter(it) is it`,使得 iterator 本身也 iterable。

; iterator
: Any object that implements the __next__ no-argument method that returns the next item in a series or raises  StopIteration when there are no more items. Python iterators also implement the  __iter__ method so they are iterable as well.

! Sentence Take #2: A Classic Iterator

将上面的例子改造一下,引入了 iterator:

```python
import re
import reprlib

RE_WORD = re.compile('\w+')

class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)
        
    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)
        
    def __iter__(self):   
        return SentenceIterator(self.words)   
        
class SentenceIterator:
    def __init__(self, words):
        self.words = words   
        self.index = 0   
        
    def __next__(self):
        try:
            word = self.words[self.index]   
        except IndexError:
            raise StopIteration()   
        self.index += 1   
        return word   
        
    def __iter__(self):   
        return self
```

这是一个比较啰嗦的示例,为的是介绍后面的 generator 机制。

! Sentence Take #3: A Generator Function

```python
import re
import reprlib

RE_WORD = re.compile('\w+')

class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)
        
    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)
        
    def __iter__(self):
        for word in self.words:   
            yield word
```

函数体中带 `yield` 关键字的,即是 generator function。generator function 的机制是:

> A generator function builds a generator object that wraps the body of the function. When we invoke `next(…)` on the generator object, execution advances to the next `yield` in the function body, and the `next(…)` call evaluates to the value yielded when the function body is suspended. Finally, when the function body returns, the enclosing generator object raises `StopIteration`, in accordance with the `Iterator` protocol.
> Calling a generator function returns a generator. A generator yields or produces values. A generator doesn’t “return” values in the usual way: the `return` statement in the body of a generator function causes  `StopIteration` to be raised by the generator object.

! Sentence Take #4: A Lazy Implementation

前面的例子并不是 lazy 的。因为 `words` 是提前准备好的。当你只需要前面几个词时,把整串 words 都准备好,可能是对性能和内存的不必要消耗。下面给了一个延迟计算的方法:

```python
import re
import reprlib

RE_WORD = re.compile('\w+')

class Sentence:
    def __init__(self, text):
        self.text = text

    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)

    def __iter__(self):
        for match in RE_WORD.finditer(self.text):
            yield match.group()
```

generator function 很方便,但是 generator expression 更方便。

! Sentence Take #5: A Generator Expression

对于 generator expression,一个容易理解的解释是:

> A generator expression can be understood as a lazy version of a list comprehension: it does not eagerly build a list, but returns a generator that will lazily produce the items on demand. In other words, if a list comprehension is a factory of lists, a generator expression is a factory of generators.

简化后的代码不再由 generator function 返回 generator,而是由 generator expression 产生 generator:

```python
import re
import reprlib

RE_WORD = re.compile('\w+')

class Sentence:
    def __init__(self, text):
        self.text = text
        
    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)
        
    def __iter__(self):
        return (match.group() for match in RE_WORD.finditer(self.text))
```

! Another Example: Arithmetic Progression Generator

之前的例子都是在一个 collection 中遍历 item,现在作者给出一些其他的例子,比如一个类似 `range` 的类:

```python
class ArithmeticProgression:
    def __init__(self, begin, step, end=None):   
        self.begin = begin
        self.step = step
        self.end = end  # None -> "infinite" series
        
    def __iter__(self):
        result = type(self.begin + self.step)(self.begin)      # [1]
        forever = self.end is None   
        index = 0
        while forever or result < self.end:   
            yield result   
            index += 1
            result = self.begin + self.step * index            # [2]
```

这段代码虽然并不是很复杂,但是作者写得很严谨仔细,让我很想把它记下来。作者给代码写了注释:

[1] 处,作者仔细解释了为什么做数据类型的隐式变换,以及他为了写一个地道的变换代码,而去邮件组做了询问:

> This line produces a  result value equal to `self.begin`, but coerced to the type of the subsequent additions. In Python 2, there was a coerce() built-in function but it’s gone in Python 3, deemed unnecessary because the numeric coercion rules are implicit in the arithmetic operator methods. So the best way I could think of to coerce the initial value to be of the same type as the rest of the series was to perform the addition and use its type to convert the result. I asked about this in the Python-list and got an excellent response from [[Steven D’Aprano|https://mail.python.org/pipermail/python-list/2014-December/682651.html]].

[2] 处,作者故意维护了一个 `index` 变量,来避免浮点数运算中误差不段积累:

> [...], instead of simply incrementing the `result` with `self.step` iteratively, I opted to use an index variable and calculate each result by adding `self.begin` to `self.step` multiplied by `index` to reduce the cumulative effect of errors when working with with floats.

! Generator Functions in the Standard Library

作者将分散在各处的函数按功能做了分类,这部分值得翻阅。具体的代码例子,参考书中代码以及 itertools 模块官方文档。

感觉 itertools 的能力难掌握,建议看看 Future Reading 部分提供的延伸阅读,提供了一些 recipes 供参考。

感觉这部分内容,很有函数式编程的意味。

! New Syntax in Python 3.3: yield from

```python
>>> def chain(*iterables):
...     for i in iterables:
...         yield from i
...
>>> list(chain(s, t))
['A', 'B', 'C', 0, 1, 2]
```

`yield from` 看起来像语言糖,但是又不止是语法粮。在第 16 章讲协程时会提到。

! A Closer Look at the iter Function

`iter` 还有个特殊功能。接受一个为 callable 类型的参数,这个 callable 必须是不需要参数的函数。当这个函数执行到返回第 2 个 sentinel 值时,迭代结束:

```python
with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)
```

一旦 `fp.readline` 读到空行或者文件耗尽,则循环结束。

! Soapbox

讨论了 generator function 是否应该用一个新的关键字的问题。Guido 不喜欢用新的关键字。但是作者觉得这里应该用新的关键字,因为 generator function 难以复用:

```python
def f(): 
    x = 0
    while True:
        x += 1
        yield x

# 如果想复用 yield 能力,这样做是有问题的
def f():
    def do_yield(n):
        yield n
    x = 0
    while True:
        x += 1
        do_yield(x)

# 虽然你可以用 yield from do_yield(x),但是跟平时函数调用的语义不符
```
! Do This, Then That: else Blocks Beyond if

`else` 除了用在 `if` / `else` 块中,还可以跟 `for` / `while` / `try` 一起使用。

在 `for` / `while` 后使用,表示循环正常退出:

```python
for item in my_list:
    if item.flavor == 'banana':
        break
else:
    raise ValueError('No banana flavor found!')
```

在 `try` 后使用,表示没有异常抛出。对比这两段代码:

```python
# Code 1
try:
    dangerous_call()
    after_call()
except OSError:
    log('OSError...')

# Code 2
try:
    dangerous_call()
except OSError:
    log('OSError...')
else:
    after_call()

# 这两段代码功能基本一致,但是第二段代码在表义上更清晰
```

`try/except` 这种模式,体现了 Python 更喜欢 EAFP (easier to ask for forgiveness than permission),而不是传统 C 风格的 LBYL (look before you leap)。传统 C 风格的程序需要很多 `if` 来判断操作成功了没,很啰嗦,比如:

```cpp
int main(int argc, char *argv[])
{
    int fd;

    fd = open(argv[1], O_RDONLY);
    if (-1 == fd) {
        printf("\n open() failed with error [%s]\n",strerror(errno));
        return 1;
    }
    // ...
}
```

! Context Managers and with Blocks

`with` 语句,是用来简化 `try/finally` pattern 的,一般用来做资源自动释放。

context manager 跟 `with` 搭配使用,主流有两种写法,一种基于类,一种用函数。

```python
class LookingGlass:
    def __enter__(self):   
        import sys
        self.original_write = sys.stdout.write
        sys.stdout.write = self.reverse_write
        # 在 __enter__ 中返回的内容,会被成 as 后的值
        return 'JABBERWOCKY'
        
    def reverse_write(self, text):   
        self.original_write(text[::-1])
        
    def __exit__(self, exc_type, exc_value, traceback):
        # sys.exc_info() 返回的内容即是 (exc_type, exc_value, traceback),
        # 这不是巧合,因为大家经常在 finally 块中调用 sys.exc_info() 来判断做什么 clean-up
        import sys
        sys.stdout.write = self.original_write   
        if exc_type is ZeroDivisionError:   
            print('Please DO NOT divide by zero!')
            return True  # 返回 True 表示异常已经被处理好。否则异常还会被抛出。

>>> from mirror import LookingGlass
>>> with LookingGlass() as what:   
...      print('Alice, Kitty and Snowdrop')   
...      print(what)
...
pordwonS dna yttiK ,ecilA   
YKCOWREBBAJ
>>> what   
'JABBERWOCKY'
>>> print('Back to normal.')   
Back to normal.

# 第二种写法,用函数,yield 前的类似 __enter__,后面类似 __exit__
import contextlib

@contextlib.contextmanager
def looking_glass():
    import sys
    original_write = sys.stdout.write   
    def reverse_write(text):   
        original_write(text[::-1])
    sys.stdout.write = reverse_write   
    yield 'JABBERWOCKY'   
    sys.stdout.write = original_write   
```

上面的函数写法有个问题,一旦 `with` 块里抛异常,就会通过 yield 继续抛出。把 `yield` 包上 `try` 块可以解决:

```python
@contextlib.contextmanager
def looking_glass():
    import sys
    original_write = sys.stdout.write
    
    def reverse_write(text):
        original_write(text[::-1])
        
    sys.stdout.write = reverse_write
    msg = ''   
    try:
        yield 'JABBERWOCKY'
    except ZeroDivisionError:   
        msg = 'Please DO NOT divide by zero!'
    finally:
        sys.stdout.write = original_write   
        if msg:
            print(msg)
```

同时,在 `yield` 周围包上 `try/finally` 是一种最佳实践,因为你不知道使用者会在 with 块中做什么。

! Future Reading

又有很多好东西。如果要做分享讲 `with` 的特性,可以从里面挖掘材料。
这章主要续上章讲 generator 引入的 `yield` 机制,继续讲协程(coroutines)机制。

`yield` 除了在数据流动中起作用,它更重要的功能是作为一种控制流设施,来实现协同式(与抢占式不同)地多任务:

> Regardless of the flow of data,  yield is a control flow device that can be used to implement cooperative multitasking: each coroutine yields control to a central scheduler so that other coroutines can be activated.

理解这些关键点:

* Coroutine 是如何演化而来的
* Coroutine 的状态、API 设计,如何和背后的控制流转换机制结合
* `yield from` 的作用

补充一个书中没有显式指出的概念,''coroutine function'',即函数体中带有 `yield` / `yield from` 的。调用这种函数时返回的不是函数体中的 `return` 的值,而是一个 coroutine object。这个 object 可以被传递,可以(仅有 `yield from` 时)被 `asyncio` 的 event loop 调度,可以被 `yield from` 等。

! How Coroutines Evolved from Generators

协程如何从 generator 演变而来:

# [[PEP 342 — Coroutines via Enhanced Generators|https://www.python.org/dev/peps/pep-0342/]]
# [[PEP 380 - Syntax for Delegating to a Subgenerator|https://www.python.org/dev/peps/pep-0380/]]

! Basic Behavior of a Generator Used as a Coroutine

```python
def simple_coroutine():
    print('-> start ')
    x = yield
    print('-> received: {}'.format(x))
```

带 `yield` 表达式的函数,你可以调用它,获得一个 generator:

```python
>>> coro = simple_coroutine()
>>> type(coro)
generator
```

Generator 有 4 个状态,可以通过 `inspect.getgeneratorstata(coro)` 函数获得。含义跟它的字面意义一样

|!状态 |! 调用 `next()` |! 调用 `send()` |
|`'GEN_CREATED'`   |变为 `GEN_RUNNING` |`TypeError: can't send non-None value to a just-started generator` |
|`'GEN_RUNNING'`   |这个状态下,解释器在运行协程内的代码,所以没有调用 `next()` 一说 |同左 |
|`'GEN_SUSPENDED'` |等同于 `send(None)`,变为 `GEN_RUNNING` |变为 `GEN_RUNNING` |
|`'GEN_CLOSED'`    |此时协程的函数体已运行完,抛出 `StopIteration` 异常|同左 |

比如:

```python
>>> coro = simple_coroutine()   # 'GEN_CREATED'
>>> next(coro)					# 'GEN_RUNNING' then 'GEN_SUSPENDED'
-> start
>>> coro.send(1)				# 'GEN_RUNNING' then 'GEN_CLOSED'
-> received 1
>>> next(coro)					# `coro.send(2)` would have the same result
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration:
```

```python
>>> coro = simple_coroutine()   # 'GEN_CREATED'
>>> coro.send(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't send non-None value to a just-started generator
```

一开始的 `next(coro)` 调用,一般被称为 "priming the coroutine",prime 在这里的意思是 "make sth ready for use or action"。

<<.note "`next(coro)` 和 `coro.send(None)` 的功能是完全一致的。">>

第二个例子:

```python
def simple_coro2(a):
    print("-> Started: a = {}".format(a))
    b = yield a
    print("-> Received: b = {}".format(b))
    c = yield a + b
    print("-> Received: c = {}".format(c))
```

! Example: Coroutine to Compute a Running Average

这节描述如何用协程写一个动态计算平均数的程序。相比之前的 generator 写法或者 `__call__` 函数,用协程写更直观和简洁,不依赖 closure 等。

! Decorators for Coroutine Priming

Coroutine 需要 prime 完才能用。作者写了个简单的 decorator 用来自动 prime 协程。

```python
from functools import wraps

def coroutine(func):
    """Decorator: primes `func` by advancing to first `yield`"""
    @wraps(func)
    def primer(*args,**kwargs):
        gen = func(*args,**kwargs)
        next(gen)
        return gen
    return primer
```

! Coroutine Termination and Exception Handling

关于异常处理,有这几个场景:

* Caller 想给 coroutine 发送一个异常。发送异常的原因可能是 coroutine `yield` 出来的值有问题,所以 caller 需要触发 coroutine 中走向异常分支。也可能是其他原因
* Caller 想要感知到 coroutine 中发生的异常

对于 caller 给 coroutine 发送异常的,有 `generator.throw(exc_type[, exc_value[, traceback]])` 函数。Coroutine 中的 `yield` 语句处会抛异常。

对于 caller 想要感知到 coroutine 中发生的异常,如果 coroutine 中没有捕获这个异常,那么异常会向上抛到 caller 中。

关于 coroutine 的停止,如果 caller 想让 coroutine 停止,直接调用 `generator.close()` 即可。

! Returning a Value from a Coroutine

Coroutine 向 caller 传递数据,之前提到的 `yield` 关键字是在 coroutine 还没结束时 `yield` 的。但是如果我们想让 coroutine 像函数一样,在最后执行结束时返回一个值,应该怎么做?

语法上,coroutine 中一样是用 `return` 返回值。由于 `return` 机制设计上晚于 coroutine 本身,为了保持与之前行为的一致性,返回值是从 `StopIteration` 的 `exc.value` 中取得的:

```python
from collections import namedtuple

Result = namedtuple('Result', 'count average')

def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield
        if term is None:
            break
        total += term
        count += 1
        average = total/count
    return Result(count, average)

>>> coro_avg = averager()
>>> next(coro_avg)
>>> coro_avg.send(10)
>>> coro_avg.send(30)
>>> coro_avg.send(6.5)
>>> try:
...     coro_avg.send(None)
... except StopIteration as exc:
...     result = exc.value
...
>>> result
Result(count=3, average=15.5)
```

! Using yield from

这一节以及后面的内容,是这章最 ''重点'' 的内容。这里先用一套教学代码描述 `yield from` 的基本能力:

```python
# BEGIN YIELD_FROM_AVERAGER
from collections import namedtuple

Result = namedtuple('Result', 'count average')


# the subgenerator
def averager():  # <1>
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield  # <2>
        if term is None:  # <3>
            break
        total += term
        count += 1
        average = total/count
    return Result(count, average)  # <4>


# the delegating generator
def grouper(results, key):  # <5>
    while True:  # <6>
        results[key] = yield from averager()  # <7>


# the client code, a.k.a. the caller
def main(data):  # <8>
    results = {}
    for key, values in data.items():
        group = grouper(results, key)  # <9>
        next(group)  # <10>
        for value in values:
            group.send(value)  # <11>
        group.send(None)  # important! <12>

    # print(results)  # uncomment to debug
    report(results)


# output report
def report(results):
    for key, result in sorted(results.items()):
        group, unit = key.split(';')
        print('{:2} {:5} averaging {:.2f}{}'.format(
              result.count, group, result.average, unit))


data = {
    'girls;kg':
        [40.9, 38.5, 44.3, 42.2, 45.2, 41.7, 44.5, 38.0, 40.6, 44.5],
    'girls;m':
        [1.6, 1.51, 1.4, 1.3, 1.41, 1.39, 1.33, 1.46, 1.45, 1.43],
    'boys;kg':
        [39.0, 40.8, 43.2, 40.8, 43.1, 38.6, 41.4, 40.6, 36.3],
    'boys;m':
        [1.38, 1.5, 1.32, 1.25, 1.37, 1.48, 1.25, 1.49, 1.46],
}


if __name__ == '__main__':
    main(data)
```

当第一次执行到 <9> 处时,代码走进 `grouper` 中的 `yield from` 语句,然后会走进 `averager` 中,到 `yield` 语句时被 suspended。此后 `main` 函数中 `next()` 和 `send()` 操作,都会通过 `grouper` 作为管道输送到 `averager` 中。下面的图描述了这一过程:

{{ yield-from-code-explained }}

`grouper` 中虽然没有 `yield` 语句(只有 `yield from`),但是它也是 generator,也遵循 generator 的规则。这里的有几个关键点:

* `yield from` 后面接的是一个 generator,会执行这个 generator 中的代码直到 `yield` 把 coroutine suspend
* `grouper` 代码体执行结束时也会抛 `StopIteration`。这里作者为了容易处理,在 <6> 处加了个 `while True`,用来避免 `group.send(None)` 时抛异常。我觉得不是太好,这意味着 `main` 中每一次循环结束后,在 <7> 处都会有一个没有实际作用的 generator 实例被产生,然后随着下一次循环开始又被回收掉
* 如果 subgenerator 一直没有执行完,那么 delegating generator 会一直被 suspend 在 `yield from` 处,直到被垃圾回收
* delegating generator 也需要 priming

还有一个点是,`yield from` 的对象可以是另外一个 generator,也可以是任意 iterable 的对象:

```python
>>> def chain(*iterables):
...     for it in iterables:
...         yield from it
...
>>> s = 'ABC'
>>> t = tuple(range(3))
>>> list(chain(s, t))
['A', 'B', 'C', 0, 1, 2]
```

需要注意的是,对于 `chain` 返回的 generator,你不能使用 `.send()` 带一个非 `None` 的值去访问,会抛 `AttributeError: 'str_iterator' object has no attribute 'send'`,导致 generator 异常而结束。

! The Meaning of yield from

Fluent Python 在前文中提到一个设计上的问题,即 coroutine 和 generator 在语法上用了 `def`,但是事实上他们又不像函数一样可以被嵌套调用。`yield from` 出现用来解决这个问题,它使得:

* Generator 可以方便地包裹 generator
* Caller 可以把数据通过外层 generator 传递到内层 generator 中,反之亦然
* 内层 generator 抛出异常后可以一层一层传递到 caller 中
* Generator 给 caller 传递数据的方式,除了在未结束前通过 `yield` 传递外,还可以用 `yield from` 将结束时的返回值给到 caller

简单(但是不完整)地说:

> “When the iterator is another generator, the effect is the same as if the body of the subgenerator were inlined at the point of the yield from expression. Furthermore, the subgenerator is allowed to execute a return statement with a value, and that value becomes the value of the yield from expression.”

完整的规则在这里不作摘录,需要时翻书。

`yield from` 还会带来发生异常方面的差异。如果 caller `close()` 掉 subgenerator,对于 delegating generator 来说,只有一个 `yield from` 并不能让它感知到 subgenerator 是正常做完,还是被 `close()` 掉的(它只能感知到再 `next()` 会抛 `StopIteration`。因此特性作者设计出了一种机制,如果 caller `close()` 掉 subgenerator 时,delegating generator 会收到 `GeneratorExit` 异常。

对于 iterable 被 `yield from` 的情况,事情又变复杂了。plain iterator 并不支持 `.send()`, `.throw()`, `.close()`,需要 `yield from` 在处理时有额外的支持,比如 delegating generator 收到 `GeneratorExit` 异常时,需要判断 subgenerator 有无 `close` 属性,有的话再进行调用。但这些细节不是很必要去了解,特性设计者来处理这些 cornor case,使用者就可以享受比较一致的上层模型。

! Use Case: Coroutines for Discrete Event Simulation

这节要做一个离散事件模拟器(Discrete Event Simulation)。

!! About Discrete Event Simulations

书中对 DES (Discrete Event Simulation) 的描述很清晰直观:

> In a DES, the simulation “clock” does not advance by fixed increments, but advances directly to the simulated time of the next modeled event. 

比如回合制游戏是 DES 的例子,玩家每一个操作对应 DES 中的一个事件,会使整个系统发生变化。而玩家不操作时,一些状态是没有变化的。实时游戏则不是 DES 的例子。

!! The Taxi Fleet Simulation

这大概是这章最重要的一个例子,书中用了大量篇幅描述。代码在 [[GitHub|https://github.com/fluentpython/example-code/blob/master/16-coroutine/taxi_sim0.py]] 上。这个例子值得一看,重点在于:

* 仅用单线程配合协程完成对离散事件的模拟
* 协程(或者说 generator)会产生一些事件,比如 taxi 离开车库,接到客人等,这些事件通过 `yield` 给到 caller
* Caller(相对于协程而言)维护一个 ''优先级队列'',将事件放入这个队列中。这个队列的排序规则决定了哪些事件会先被处理
* Caller 处理事件时,同时会 `send()` 数据给 generator ''指导'' 它做事情或者产生下一个事件
* Caller 发现 generator 抛了 `StopIteration` 时做相应的处理

我觉得这个例子中,作者应该把 caller 跟 coroutine 之间的交互、各自的职责描述出来,但是他没有。我觉得普通人写起这种代码来很纠结,不够能直观地理解逻辑应该放在 caller 还是 coroutine。

! Further Reading

照例是非常多好的协程相关的材料。可惜我没有能力去深入阅读,也感觉难以在工程上直接用协程,只在理解框架上会有一些帮助。所以不深入看了。

! Soapbox

!! Raise from lambda

作者表示 Python 语言设计中,对于 keyword 的使用太过谨慎。举了几个例子:

* `for` / `while` / `try` 都可以搭配一个 `else` 子句,这是对 `else` 的滥用,应该新使用一个 `then` 关键字
* `def` 可以表示函数定义,还可以表示 generator 和 coroutine,这也非常地不好。这几者在使用上差异很大
* `yield from` 则是最大的混乱。这完全应该用新的关键字,却将已有的两个关键字连起来作为一个新的语义。作者担心后面有 `raise from lambda` 这种奇葩语法出现

但是后面的 `async`, `await` 关键字可以部分解决这上面提到的混乱。
这一章主要讲 `features` 模块是如何把并发抽象成一个简单易用的模型。这里的内容对接下来的 `asyncio` 模块有帮助。

重点是:

* 关注 `Future` 这种模型的设计思想、使用方法
* 总结出常见场景的实用代码片断,便于快速使用

! Example: Web Downloads in Three Styles

演示了两个下载多图片的程序,一个是顺序下载,一个是用 `futures` 开线程池下载。线程池的核心代码如下:

```python
def download_many(cc_list):
    workers = min(MAX_WORKERS, len(cc_list))
    with futures.ThreadPoolExecutor(workers) as executor:   #1
        res = executor.map(download_one, sorted(cc_list))   #2
    return len(list(res))   #3
```

这里面有几点值得注意:

* `#1` 处的 `with` 块会在执行结束时调用 `executor.__exit__` 方法,这里面会调用 `executor.shutdown(wait=True)` 来等待各线程执行完成
* `#2` 处返回了一个生成器,用来取所有的执行结果
* `#3` 中 `list(res)` 会遍历 `res` 这个生成器,这个过程实际上是调用每个 `Future` 的 `.result()` 方法(下文描述)。如果有哪个任务在执行过程中抛出异常,它在被 `next()` 到时也会将异常抛出

在上面的例子我们并不直接操作 future 对象。在标准库中有两个 Future 类:`concurrent.futures.Future` 和 `asyncio.Future`。一个 Future 实例表示的是一个''可能完成也可能没有完成的,被延迟的计算过程''。原文是:

> an instance of either Future class represents a deferred computation that may or may not have completed.

这个概念与 Twisted 中的 `Deferred`,Tornado 中的 `Future`,以及 JavaScript 中的 `Promise` 类似。

Future 的作用是封装了对一个延迟(对比于实时 blocking)计算的后续操作,使得你可以把它放进一个队列里,再去队列中查询它的状态(成功或失败)和计算结果等。一般 `Future` 对象应该由并发框架(如 `asyncio`, `concurrent.futures`)去生成,而不由用户手工去生成。因为 `Future` 对象代表的计算过程如果不被执行,就失去了它的意义。而计划执行 Future 对象的工作往往由并发框架去做。

`Future` 对象的基本操作:

* `.done()`: 查询是否结束
* `.add_done_callback()`: 要求结束时执行相应 callback
* `.result()`: 查询执行完返回的结果,或者其中抛出的异常(reraise);在 Future 执行过程中调用此函数时会 block,如果执行完则不会

上面的代码例子中,`Future` 对象仅在 `executor.map()` 内部使用,暴露给用户的是它的结果。

```python
def download_many(cc_list):
    cc_list = cc_list[:5]   
    with futures.ThreadPoolExecutor(max_workers=3) as executor:   
        to_do = []  #1
        for cc in sorted(cc_list):   
            future = executor.submit(download_one, cc)   
            to_do.append(future)   
            msg = 'Scheduled for {}: {}'
            print(msg.format(cc, future))   
            
        results = []
        for future in futures.as_completed(to_do):  #2
            res = future.result()  #3
            msg = '{} result: {!r}'
            print(msg.format(future, res))
            results.append(res)
    return len(results)
```

这段代码演示了对 `Future` 对象的直接访问,值得关注的点:

* `#1` 中的 `to_do` list 存储了一组 `Future` 实例
* `#2` `futures.as_completed()` 接受一个包含 `Future` 实例的 iterable 实例,并返回一个 generator。一旦有 `Future` 对象执行结束,这个 generator 就会将其 yield 出
* `#3` `future.result()` 会取出结果。并且由于这个 future 是执行结束的,`.result()` 操作不会 block

! Blocking I/O and the GIL

存在 GIL (Global Interpreter Lock) 的原因是,CPython 解释器本身不是线程安全的,所以同时只能有一个线程在执行 Python 字节码。但是 C 写的 Python 扩展库可以手动释放 GIL。同时标准库中涉及到 I/O 操作的函数、`sleep()` 函数都会释放 GIL。这是为何 Python 的多线程在做 I/O 操作(比如上面例子中的下载图片)时可以起到加速作用的原因。但是对于 CPU 密集型的操作,Python 的多线程就没什么作用,需要用多进程。

! Launching Processes with concurrent.futures

对多 CPU 密集型操作,`futures` 库提供了 `ProcessPoolExecutor`。用法跟 `ThreadPoolExecutor` 类型,区别在于可以不手动指定 worker 数量,默认是 CPU 的核数。

! Experimenting with Executor.map

这里面的例子又展示出 `executor.map` 的另一种惯常写法:

```python
def main():
    display('Script starting.')
    executor = futures.ThreadPoolExecutor(max_workers=3)   
    results = executor.map(loiter, range(5))   
    
    # 遍历 result 会调用其中每一个 Future 的 `.result()`,如果任务还没完成会 block
    for i, result in enumerate(results):
        display('result {}: {}'.format(i, result))
```

遍历 result 返回的结果,会保证跟你传给 `executor.map()` 的任务顺序是一样的。这意味着如果第一个任务很久才完成,那么 `for` 循环会在第一个任务处等很久。如果你不要求顺序,可以用上一个例子的 `futures.as_completed`。

! Downloads with Progress Display and Error Handling

进度条显示,可以用 [[tqdm|https://github.com/tqdm/tqdm]] 库。异常处理,在调用 `future.result()` 时包裹 try-catch。另外有个惯常用法时,在 `executor.submit()` 后把生成的 `Future` 作为 key 放进 `dict`(如下文的 `to_do_map`)中,这样 `Future` 乱序完成后,你还可以获得这个任务相关联的信息。示例代码如下,做了简化:

```python
def download_many(cc_list, base_url, verbose, concur_req):
    with futures.ThreadPoolExecutor(max_workers=concur_req) as executor:   
        # 用来存储 Future => country code,方便 Future 完成后查询
        to_do_map = {}
        for cc in sorted(cc_list):
            future = executor.submit(download_one, cc, base_url, verbose)
            to_do_map[future] = cc
            
        done_iter = futures.as_completed(to_do_map)   
        for future in done_iter:   
            try:
                res = future.result()   
            except requests.exceptions.HTTPError as exc:   
                error_msg = 'HTTP {res.status_code} - {res.reason}'
                
            if error_msg:
                cc = to_do_map[future]   
                print('*** Error for {}: {}'.format(cc, error_msg))
```

! Threading and Multiprocessing Alternatives

如果 `concurrent.future` 的方法对你来说缺乏灵活性,那你可以用 `threading` 模块搭载 `Thread`, `Lock`, `Semaphore` 来做你的解决方案。可以用线程安全的 `queue` 模块来传递数据。CPU 密集型程序,可以用多进程的 `multiprocessing` 来解决,它提供了一些在进程中传递数据的设施。

! Further Reading

给了很多相关材料:

* 还有什么其他并发模型?
* 怎样理解 GIL?
* 每样更方便使用多进程和多线程?
> Concurrency is about dealing with lots of things at once.
> Parallelism is about doing lots of things at once.
> — Rob Pike, Co-inventor of the Go language

Rob Pike 阐述了并发(concurrency)和并行(parallelism)的区别。简单的例子是,「并发」是让单核 CPU 能跑非常多进程的原因;「并行」是多核 CPU 能同行参与计算的原因。

In this chapter we’ll see:

* A comparison between a simple threaded program and the asyncio equivalent, showing the relationship between threads and asynchronous tasks
* How the `asyncio.Future` class differs from `concurrent.futures.Future`
* Asynchronous versions of the flag download examples from Chapter 17
* How asynchronous programming manages high concurrency in network applications, without using threads or processes
* How coroutines are a major improvement over callbacks for asynchronous programming
* How to avoid blocking the event loop by offloading blocking operations to a thread pool
* Writing `asyncio` servers, and how to rethink web applications for high concurrency
* Why `asyncio` is poised to have a big impact in the Python ecosystem

<<.warning "Python 在后来提供了 `async` / `await` 关键字用来替代 `@ayncio.coroutine` 以及 `yield from`。下面的很多代码例子已经不是最佳实践,但是原理仍然是可行的。">>

! Thread Versus Coroutine: A Comparison

通过对比同一个程序用线程写和用 `asyncio` 写的区别来引入 `asyncio`。

线程版:

```python
def slow_function():   
    # pretend waiting a long time for I/O
    time.sleep(3)
    return 42

def supervisor():   
    signal = Signal()
    spinner = threading.Thread(target=spin,
                               args=('thinking!', signal))
    print('spinner object:', spinner)
    spinner.start()
    result = slow_function()
    signal.go = False
    spinner.join()
    return result
```

`asyncio` 版:

```
@asyncio.coroutine
def slow_function():   
    # pretend waiting a long time for I/O
    yield from asyncio.sleep(3)
    return 42

@asyncio.coroutine
def supervisor():
    # asyncio.async(…) schedules the spin coroutine to run, wrapping it in a Task
    # object, which is returned immediately.
    spinner = asyncio.ensure_future(spin('thinking!'))   
    
    print('spinner object:', spinner)   
    
    # 需等待 slow_function 中的 sleep 结束后才被 event loop 调度,继续执行
    result = yield from slow_function()
    
    spinner.cancel()
    return result
```

这里的 ''核心'' 是:

* 线程作为一种抢占式多任务(preemptive multitasking)的模型,不同的线程间能否被运行是由 CPU 进行调度的
* `asyncio` 使用了协作式 (cooperative) 或称非抢占式 (non-preemptive) 多任务,因此设计了协程和 event loop 概念,由 event loop 驱动多个协程去工作;每个协程能被调度到的前提是,之前的协程主动让出了 CPU 或者没有其他协程

因此 ''API 设计'' 上:

* 线程需要:
** 起新的线程,如 `spinner.start()`
** 线程间通信,如 `signal.go = False`(虽然它并不是操作系统层面的通信,而是在 GIL 体系下的通信)
** 等待线程结束,如 `spinner.join()`
** 线程间并没有父子关系,所以没有父线程终止子线程之说,因此也没有 API 去做这个事情
* `asyncio` 需要:
** 把新的任务放进 event loop 中调度,如 `asyncio.ensure_future()`;由于任务由 event loop 调度,因此你也不需要手动告诉 event loop 要执行这个任务(不需要 `task.start()`;放进 event loop 即表示要执行
** 主动让出 CPU 的机制,如 I/O 调用,如 `asyncio.sleep(3)`
** 简单的同步机制,或称等待某一任务完成的能力,如 `yield from`,以及后面提到的 `await`
** 告诉某个协程可以停止运行的机制,如 `spinner.cancel()`

线程(抢占式)与协程(非抢占式)两种模型的 ''区别'':

* 在线程中,scheduler 可能在线程运行的任意时刻打断线程,因此你需要各种机制(如加锁)来保护关键数据,避免数据处于不完整的状态
* 在协程中,仅有 `yield` / `yield from` 时,scheduler 才能拿到控制权,因此设计上避免了打断;即使你调用了 `task.cancel()` 函数,也仅在 `task` 中调用了 `yield` 时才会抛出异常,因此数据不会有中间状态

`asyncio` 的 coroutine 概念会比普通 coroutine 要严格一点:

> A coroutine suitable for use with the asyncio API must use `yield from` and not `yield` in its body. Also, an asyncio coroutine should be driven by a caller invoking it through yield from or by passing the coroutine to one of the asyncio functions such as asyn cio.async(…) and others covered in this chapter. Finally, the @asyncio.coroutine decorator should be applied to coroutines.

<<.tip "为啥 asyncio coroutine 里面一定要使用 `yield from` 而不能是 `yield`?">>

!! `asyncio.Future`: Nonblocking by Design

`asyncio.ensure_future()` 底下调用的是 `BaseEventLoop.create_task(…)`,它以一个协程为参数,调度它去运行,同时返回一个 `asyncio.Task`。而这个 `asyncio.Task` 是 `asyncio.Future` 的子类。

`asyncio.Future` 和 `concurrent.futures.Future` 不能互用,但是它们 API 设计上是很像的:

* 加入调度的 API 类似,分别是 `BaseEventLoop.create_task(…)` 和 `Executor.submit(…)`
* 一样有 `.done()`, `.add_done_callback()`, `.result()` 方法

但是实际的惯常用法,并不太一样。`asyncio.Future` 的 `.result()` 方法是 non-blocking 的,因为整个 asyncio 体系都是 non-blocking 的。如果这个 `asyncio.Future` 还没有完成,调用 `.result()` 会抛 `asyncio.InvalidStateError` 异常出来。

如果要等待 `asyncio.Future` 完成,使用 `yield from`,它即不堵塞 event loop,也可以返回内层的协程的返回值。这导致 `.add_done_callback()`, `.done()`, `.result()` 这些方法一般不被需要到。

<<.note "在 `asyncio` 体系中,`yield from` 被用来将控制权给回 event loop。">>

!! Yielding from Futures, Tasks, and Coroutines

在 asyncio 体系中,`Future` / `Task` 和 coroutine 是紧密联系的。比如 `res = yield from foo()`,`foo()` 可以是一个 [[coroutine function|FluentPythonCh16]],也可以是个返回 `Future` / `Task` 实例的普通函数。

<<.tip "看看 `Future` / `Task` 的 `__iter__` 函数实现,可能是它们可以被 `yield from` 的原因。">>

如果想在控制台上跑一小段 `asyncio` 代码,可以这样写:

```python
>>> import asyncio
>>> def run_sync(coro_or_future):
...     loop = asyncio.get_event_loop()
...     return loop.run_until_complete(coro_or_future)
...
>>> a = run_sync(some_coroutine())
```

<<.tip "作者写书时用的 Python 是 3.4 版本。3.7 版本可以用 [[asyncio.run()|https://docs.python.org/3/library/asyncio-task.html#asyncio.run]] 来做这件事情,更加简单。">>

! Downloading with asyncio and aiohttp

这一段又给出一个运行 ''多协程'' 的惯常用法:

```python
@asyncio.coroutine
def download_one(cc):   
    image = yield from get_flag(cc)   
    show(cc)
    save_flag(image, cc.lower() + '.gif')
    return cc
    
def download_many(cc_list):
    loop = asyncio.get_event_loop()
    to_do = [download_one(cc) for cc in sorted(cc_list)]   
    
    # 这一行是重点,返回一个协程,它的作用是 to_do 中的协程全部结束后它才结束
    wait_coro = asyncio.wait(to_do)
    
    res, _ = loop.run_until_complete(wait_coro)   
    loop.close()  
```

<<.warning "如果你用了一些框架,它来管理 event loop 的话,那你不应该调用 `loop.close()`,比如一些 GUI 框架。">>

作者总结了 `yield from` 的两大规则:

* Every arrangement of coroutines chained with yield from must be ultimately driven by a caller that is not a coroutine, which invokes `next(…)` or `.send(…)` on the outermost delegating generator, explicitly or implicitly (e.g., in a  for loop).
* The innermost subgenerator in the chain must be a simple generator that uses just yield—or an iterable object.

比如上面例子中,

* 协程们最终都是由 `loop.run_until_complete(…)` 来驱动;`run_until_complete(…)` 本身不是一个协程函数
* 最内层的 subgenerator 只会用 `yield` / iterable;我猜它也可能是一段 C 的函数,一样实现 yield 的能力,有空深挖下 [[asyncio transports|https://docs.python.org/3.7/library/asyncio-protocol.html]]
* 即使是 `yield from aiohttp.request(…)`,最终估计也是 `yield` asyncio 库里面的某些函数

! Running Circling Around Blocking Calls

这一段写得 ''非常好''。很值得一看,同时内容的演进手法也很赞。

读一次 L1 cache 的时间如果是 3 秒,那么读一次网络设备数据的时间约为 7.6 年。因此同步、阻塞型程序,如果涉及到 I/O 操作,CPU 基本上就不在经常在等不在干活。解决这个问题一般是两个思路:

* 每个阻塞操作都在单独的线程做;缺点是资源消耗很大
* 每个阻塞操作都变成事件驱动式的异步调用

对于异步调用,很早前就有类似的机制,如硬件中断(但是这并不表示编程语言的异步调用机制就是构建在硬件中断上的)。Callback 和 event loop 的底层实现,可以利用操作系统的各种基础设施,如中断、线程、polling、后台进程等等。比如 Node.js 为了实现异步的文件操作 API,在底层用 `libeio` 实现了个线程池用来支持这个操作。因为当时(2014 年)的操作系统还没有提供可靠的、通用的异步文件操作 API。

<<.tip "目前 `asyncio` 库本身并不提供异步文件 API(参考[[这里|https://github.com/python/asyncio/wiki/ThirdParty#filesystem]])。[[aiofiles|https://github.com/Tinche/aiofiles]] 提供了异步文件 API 接口,底层是用线程实现的。作者在本书里提到可以使用 `loop.run_in_executor(None, …)` 起个新的线程写,可能写书时 `aiofiles` 还没成为主流。">>

! Enhancing the asyncio downloader Script

这里给 `asyncio` 版的下载国旗例子加上进度条和错误控制。代码没有太多特别。但是值得注意的是 `asyncio.Semaphore` 的使用,它支持 context manager,但是需要以 `yield from` 的形式来使用:

```python
semaphore = asyncio.Semaphore(concur_req)
with (yield from semaphore):
    image = yield from get_flag(base_url, cc)
```

不过这种形式已经被 deprecated,目前推荐的方式是 `async with lock`,它跟 `with (yield from semaphore)` 功能相同,但是语法上更清晰。

另外 `asyncio.as_completed` 中返回的 `Future` 结构,跟传入的并不是同一个;这个行为与 `concurrent.futures` 中的不一致。所以内层 coro 抛异常时,考虑使用自定义的 Exception 类将相关信息一起带出来。

! From Callbacks to Futures and Coroutines

这节为了说明 `asyncio` 的协程模型带来的好处,先举了 JavaScript 的 callback hell 作为对比。JS 的 callback 模型中,需要传两个 callback 函数,分别表示操作成功和失败后的 callback,整个逻辑非常难维护。协程非常好地解决了这个心智负担。

但是协程也带来了自己的问题。比如在这个体系中,你必须都使用协程函数,而不能使用普通函数,这意味着之前的大量历史代码不能在这套体系中使用。

! Writing asyncio Servers

用 TCP 和 HTTP 写一个查询 Unicode 字符的程序。

!! An asyncio TCP Server

这节给了一个 TCP Server 的代码示例,用了 asyncio Streams API。需要写时再参考即可。Stream API 是高层封装,底层是 Transports and Protocols API,和 Twisted 的 API 很像。

!! An aiohttp Web Server

给了一个使用 `aiohttp` 写一个简单 HTTP Sever 的代码示例。

这两个 server 中的关键点是,将启动 server 的协程扔进 event loop 的过程变得隐晦起来:

```python
# TCP 版
def main(address='127.0.0.1', port=2323):
    loop = asyncio.get_event_loop()
    server_coro = asyncio.start_server(handle_queries, address, port, loop=loop)  # 1
    server = loop.run_until_complete(server_coro)
    loop.run_forever()

# HTTP 版
@asyncio.coroutine
def init(loop, address, port):
    app = web.Application(loop=loop)
    app.router.add_route('GET', '/', home)
    handler = app.make_handler()
    server = yield from loop.create_server(handler, address, port)  # 3
    return server.sockets[0].getsockname()


def main(address="127.0.0.1", port=8888):
    loop = asyncio.get_event_loop()
    host = loop.run_until_complete(init(loop, address, port))  # 2
    loop.run_forever()
```

这里面的代码看起来让人很模糊。比如 <1> 处的 `asyncio.start_server()` 返回的 coroutine object,为啥传给下一行的 `loop.run_until_complete()` 不会引起 server 开始进入 `while` 循环去服务客户端请求,而需要再调用一个 `loop.run_forever()`?为啥 <2> 处的调用可以马上返回 `host`,而不是在 <3> 处开始服务?

原因是,`loop.create_server()` 事实上是生成一个任务放进 loop 中准备被调度。而最终的 `loop.run_forever` 才让这个 server 真正服务起来。`asyncio.start_server()` 底层也是调用的 `loop.create_server()`。

! Futher Reading 

* [[Guido’s “Deconstructing Deferred”|https://groups.google.com/forum/#!msg/python-tulip/ut4vTG-08k8/PWZzUXX9HYIJ]] 说明了 asyncio 的 Future 设计上为啥跟 Twisted Defered 不同;asyncio 在很多设计上参考了 Twisted
购买了 The App Brewery 上的 [[Flutter 课程|https://www.appbrewery.co/courses/enrolled/548873]]。据说是与 Google 合作开发的。此时 Flutter 1.5 刚发布。


Flutter 的初次安装使用让我感觉很不顺。

<div class="box">

''使用国内的 pub 及 Flutter 镜像:''

设置这两个环境变量可以使安装过程中拉取 Flutter 文件、以及后面拉取 Dart 包,都走国内的镜像,速度很快:

```bash
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
```

由于 Android Studio 和终端都需要用它,将他们设置进 `$HOME/.config/plasma-workspace/env/flutter.sh` 中,并在 `~/.zshrc.local` 中 source 此文件。这两个文件都已经被 [[管理起来|Dotfiles Management]]。

</div>

<div class="box">

''Android sdkmanager 只能用 JDK 8:''

`flutter doctor -v` 会调用 Android sdkmanager 来判断 Android license 的接受情况,''但是 sdkmanager 只能运行在 JDK 8 上''(因为更高的版本移除了 `javax.xml.bind.annotation.XmlSchema` 等 Java EE 的类)。

</div>

<div class="box">

''创建 Flutter 项目时卡住:''

使用 Android Studio 创建 Flutter 项目时,底层是调用的 `flutter create`,它默认会调用 `flutter pub get` 去拉 Dart 的包及其依赖。你需要保证上文提到的 Flutter 及 Dart 镜像的环境变量有被配置,不然拉包时的网络问题会导致进度条一直在走(底层是因为它拉包拉很久,不停重试)。

</div>

Flutter 主要有这几种 widget:

* Stateless
* Stateful
* Inherited

Flutter 的思路大量借鉴了 React。Stateless widget 类似于没有本地 state 的 React 组件(pure component);Stateful 则是有本地 state 的。Inherited 则类似于 React 的 context(不过我没有深入过)。

Flutter 的 widget 用来描述 app 的 UI 结构。渲染 UI 时,Flutter 会递归地解析 widget 嵌套,然后构建一棵 element tree。

!! Stateless

Stateless widget 是一个 const 类,它的所有属性都是 final 的。如:

''定义'':

```dart
class DogName extends StatelessWidget {
    final String name;
    
    const DogName(this.name);
    
    @override
    Widget build(BuildContext context) {
        return Text(name);
    }
}
```

''使用'':

```dart
class DogApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            title: 'My Dog App',
            home: Column(
                children: [
                    DogName('Rocky'),
                    DogName('Jimmy'),
                ]
            )
        );
    }
}
```

[img width=800 [flutter-stateless-widget-tree]]

!! Stateful Widget

例子:

```dart
class ItemCounter extends StatefulWidget {
  final String name;

  ItemCounter({this.name});

  @override
  _ItemCounterState createState() => _ItemCounterState();
}

class _ItemCounterState extends State<ItemCounter> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: () {
          setState(() {
            count++;
          });
        },
        child: Text('${widget.name}: $count'));
  }
}
```

Stateful Widget 分为两部分:

* ''Widget object'' 负责:
** 保存不会变的值,比如上面的 `name`
** 创建 state object
* ''State object'' 负责:
** 保存会变化的值,比如上面的 `count`
** 构建 child widgets(通过 `build` 方法)

[img width=800 [flutter-stateful-widget-tree]]

!!! 为什么 stateful widget 和 state 是分开的两个类?

> You might wonder why `StatefulWidget` and `State` are separate objects. In Flutter, these two types of objects have different life cycles. `Widgets` are temporary objects, used to construct a presentation of the application in its current state. `State` objects, on the other hand, are persistent between calls to `build()`, allowing them to remember information.

`State` 是要被存进 element tree 的,而 widget 不被存入 element tree。

''那为什么 `build()` 函数是在 state 中而不是 widget 中呢?''我 ''不靠谱猜测'' 是 Flutter 运行时发现 state 中的属性有变化时,想要能快速地找到相应的 `build()` 函数来构建新的展示。

!! Flutter 的 UI 重绘机制

对于 stateful widget,当调用 `setState()` 时,Flutter 会把该 widget 标记为 dirty 进行重新渲染。

但假如某个 stateful widget 是一个 widget 列表构成的:

```dart
[DogName('Rocky'), DogName('Jimmy')]
```

如果使用代码对两个 `DogName` widget 位置改变,Jimmy 跑到前头,那 Flutter 是否能正确绘制出来呢?答案是否定的。''因为 Flutter 为了绘制效率,并不会销毁原先的两个 DogName widget 去重绘,而是判断变化后的 widget 的类型和 key 是否相同。''由于这个场景中没有使用 key,而 widget 类型又不变,因此没有被正确绘制。你需要指定 key:

```dart
class DogName extends StatelessWidget {
    final String name;
    
    // 留意这里加了 key 参数
    const DogName({Key key, this.name}) : super(key: key);
    
    @override
    Widget build(BuildContext context) {
        return Text(name);
    }
}

[DogName(name: 'Rocky', key: 1), DogName(name: 'Jimmy', key: 2)]
```

!! Widget Lifecycle

对于 `StatefulWidget`,当框架把 state object 加进 element tree 时,会调其 `initState()` 函数;当 state object 不再被需要时,框架会调用它的 `dispose()`。`initState()` 需要先调用 `super.initState()`;`dispose()` 一般会在结尾调 `super.dispose()`。

!! Inherited Widget

这种 widget 可以方便地将数据从 widget tree 上端传至下端:

```dart
class FrogColor extends InheritedWidget {
  const FrogColor({
    Key key,
    @required this.color,
    @required Widget child,
  }) : assert(color != null),
       assert(child != null),
       super(key: key, child: child);

  final Color color;

  static FrogColor of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<FrogColor>();
  }

  @override
  bool updateShouldNotify(FrogColor old) => color != old.color;
}

class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FrogColor(
        color: Colors.green,
        child: Builder(
          builder: (BuildContext innerContext) {
            return Text(
              'Hello Frog',
              style: TextStyle(color: FrogColor.of(innerContext).color),
            );
          },
        ),
      ),
    );
  }
}
```

比如上面的 `FrogColor`:

* 它并没有 `build()` 方法,不需要描述具体的子 widget 的展示,只需要提供 `children` 变量让使用者定义子 widget
* 它虽然在 widget tree 中作为一个节点,但作用仅限于存储一个 `color` 变量,供子节点使用
* 子节点一旦使用了 `FrogColor.of()`(底层是 `context.dependOnInheritedWidgetOfExactType()`)后,一旦 FrogColor 中的数据发生变化(`updateShouldNotify()` 为 true 时),子节点就会被重绘

!! 参考

* [[Introduction to widgets - Flutter Official Docs|https://flutter.dev/docs/development/ui/widgets-intro]]
* [[Flutter Widgets 101 - YouTube|https://www.youtube.com/playlist?list=PLOU2XLYxmsIJyiwUPCou_OVTpRIn_8UMd]]
* [[InheritedWidget class - widgets library - Dart API|https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html]]
字体。

!! 免费可商用字体

英文字体可以在 [[Font Squirrel|https://www.fontsquirrel.com/]] 找。[[SlidesCarnival|https://www.slidescarnival.com/]] 中的 PowerPoint 模板中使用的字体都是免费可商用的。

中文字体选择不多,首选 Noto CJK 和方正的四款字体。

! 字体

!! 中文字体

|!字体渲染效果 |!Windows |!Linux (with Infinality) |
|Microsoft Yahei |好 |一般 |
|Source Han Sans / Noto Sans CJK SC<<ref "[1]">> |好 |一般 |
|WenQuanYi |差 |差 |

<<footnotes "[1]" "Noto Sans CJK SC 的中文部分用的是 Source Han Sans">>

在 Windows 平台上:

* 低字号时雅黑比 Noto Sans 锐利,Noto Sans 有点糊
* 高字号时 Noto Sans 更美观

在 Linux 平台上:未对比。

!! 英文字体

!!! Sans

Open Sans 首选,全平台上都不错。Noto Sans (derived from Droid Sans) 与 Open Sans 很相近,字型更可辨(比如 I vs l)。

!!! Sans Serif

没有特别的喜好,感觉 PT Serif 不错。

!!! Monospace

Windows 平台上首选 Consolas。Linux 下,Noto Sans Mono (derived from Droid Sans Mono) 在 Konsole 下渲染很不错,字型相较 Consolas 更简洁。

IntelliJ 系列 IDE 因为用了 Settings Sync 在全平台同步,使用 Noto Sans Mono 作为统一字体,它在不同平台上都有不错的渲染。

! 字体渲染

要改善字体渲染效果,最简单的办法是买个 27 寸 4K 屏幕,不管什么系统都好看。

!! Chrome

CSS 设置 `-webkit-font-smoothing` 对字体渲染很有帮助,但是这个选项已经被 CSS 标准废弃:

```css
body {
  -webkit-font-smoothing: subpixel-antialiased !important;
  font-family: 'Open Sans', 'Noto Sans CJK SC';
}
```

!! Windows

Windows 下现阶段没有除系统自带的 ClearType 之外的字体渲染调整方法。MacType 现在不被积极维护。不过 Win 10 的字体渲染已经相当不错。

!! Linux

在 Arch Linux 上,可以用 AUR 中的 [[ttf-opensans|https://aur.archlinux.org/packages/ttf-opensans/]] 来安装 Open Sans 字体。同时在 `Dropbox/Fonts/MicrosoftYahei` 中有微软雅黑的字体,手动装上去就 OK 了。

以前 Linux 的字体渲染是个相当折腾人的活,需要用 Infinality 的补丁来优化字体渲染<<footnote "[2]" "作者已经不怎么维护了">>。但是 Freetype 2.7 开始,显示效果已经非常赞了。 Freetype 2.7.0 在 2016 年 7 月发布,宣称支持类似 Windows 下的 DirectWrite / ClearType 的渲染效果。所以没有必要再去折腾 Infinality 了。

!!! 使用 Infinality 优化字体渲染(''过时'')

自己去调 `fonts.conf`  ([[Arch Wiki|https://wiki.archlinux.org/index.php/font_configuration#Fontconfig_configuration]] | [[Man Page|https://www.freedesktop.org/software/fontconfig/fontconfig-user.html]]) 是非常不理智的行为。直接用 Infinality 就好了。参考它的 [[Arch Wiki 条目|https://wiki.archlinux.org/index.php/Infinality]] 进行安装和配置。

同时注意,Infinality 的配置可能存在一些问题,会导致一些汉字渲染出来偏瘦,比如「的」字。参考这个 GitHub [[Issue|https://github.com/bohoomil/fontconfig-ultimate/issues/182]] ,你需要在 `/etc/profile.d/infinality-settings.sh` 加入:

```bash
export INFINALITY_FT_STEM_ALIGNMENT_STRENGTH=0
export INFINALITY_FT_STEM_FITTING_STRENGTH=0
# export INFINALITY_FT_STEM_SNAPPING_SLIDING_SCALE=0
# export INFINALITY_FT_AUTOHINT_SNAP_STEM_HEIGHT=0
# export INFINALITY_FT_AUTOHINT_HORIZONTAL_STEM_DARKEN_STRENGTH=0
export INFINALITY_FT_AUTOHINT_INCREASE_GLYPH_HEIGHTS=false
```

!!! Java 相关

Java 程序(如 PyCharm, CLion)的字体渲染又有不一样的机制,跟系统的字体渲染效果差很多。但是也有解决办法,主要参见 Arch Wiki 中的 [[Java Runtime Environment 条目|https://wiki.archlinux.org/index.php/Java_Runtime_Environment_fonts#Anti-aliasing]]。其中比较好的办法是从 AUR 中 安装 `jre8-openjdk-infinality` 以及 `jre8-openjdk-headless-infinality`。

安装完后,Java 程序(如 PyCharm)的字体渲染就跟原生的程序一样了。


|!Name   |Fullstack React |
|!Author |Fullstack React Book Team |
|!Edition |Newest |
|!Release Date |December 2016 |
|!ISBN-13 |N/A |
|!Medium |[[网站|https://www.fullstackreact.com/]] |
|!Rating |{{!!rating}} |

这本书是电子书([[官方网站|https://www.fullstackreact.com/]]),暂时没有实体书出版(2016 年 12 月),我看的是 Revision 20。

这本书前 4 章感觉写得不错,但是第 5 章 Advanced Component 开始,跟第 6 章的 Forms 感觉写得很差,就是在罗列知识点,没有通俗易懂地串起来。应该是多个人一起写的。看完 Forms 后,后续的章节没有继续看的必要了,是在罗列一些 React 相关的生态 (比如 `create-react-app`, React Router, Redux 等)。这部分内容去相应的组件网站上看更合适。


React core fundamentals:

# Think about and organize your app into components
# JSX and the render method
# Data flow from parent to children through props
# Event flow from children to parent through functions
# State vs props
# How to manipulate state
# Utilizing React lifecycle methods
React application development flow: 

# ''Break the app into components''
# Build a static version of the app
# ''Determine what should be stateful''
# ''Determine in which component each piece of state should live''
# Hard-code initial states
# Add inverse data flow
# Add server communication

我将最重要的几步加粗了。

React 的 event flow (aka. inverse data flow) 有点烦,子 component 的事件必须一层一层传达到拥有数据的父 component。比如下面的例子,`onFormClose` 是从父 component 传递下来的:

```js
<button
  className='ui basic red button'
  onClick={this.props.onFormClose}
>
  Cancel
</button>
```
这一章主要讲了怎样从服务端拿到数据。比较重要的点是:

# Fetch API (v.s. traditional AJAX)
# Lifecycle of React components
!! Why Not Modify the Actual DOM?

# It's hard to keep track of changes
# It can be slow

React 的 Virtual DOM 实现可以知道他对应的真实 DOM 有了哪些变更,以便实现局部的更新,让 UI 更新效率变快。

''React’s Virtual DOM is a tree of `ReactElements`.'':

```js
var mountElement = document.querySelector('#root');
// Third argument is the inner text
var boldElement = React.createElement('b', null, "Text (as a string)");
ReactDOM.render(boldElement, mountElement);
```

!! JSX

JSX 是 JavaScript Syntax Extension 的简写。它用一种简单的语法创建 React Element。书里面的内容在 [[JSX: Core Concepts]] 里都有提及,主要是官方文档加一些演绎。
!! Intro

这一节写得非常赞,摘录一些在这里。这体现了 Facebook 在设计 React Component 时的一些 ''核心理念''。

The goal of a ReactComponent is to

* `render()` a ReactElement (which will eventually become the real DOM) and
* attach functionality to this section of the page

“Attaching functionality” is a bit ambiguous; it includes attaching event handlers, managing state, interacting with children, etc. In this chapter we’re going to cover:

* `render()` - the one required function on every ReactComponent
* `props` - the “input parameters” to our components
* `context` - a “global variable” for our components
* `state` - a way to hold data that is local to a component (that affects rendering)
* Stateless components - a simplified way to write reusable components
* `children` - how to interact and manipulate child components
* `statics` - how to create “class methods” on our components

!! `render()`

# `render()` Returns a `ReactElement` Tree
# The `render()` function’s job is to provide React a virtual representation of a native DOM component.
# `render()` should return a `single` child element or
# return a falsy value (`null` or `false`). (React will render an empty `<noscript />` element)
# `render()` should be side-effect free to make the component reusable.

!! `props`

!!! `PropTypes` 做数据校验

`PropTypes` 是 React 做基本的 ''数据校验'' 的机制:

```js
const Component = React.createClass({
  propTypes: {
    name: React.PropTypes.string,
    totalCount: React.PropTypes.number
  },
  // ...
})
```

可以对 JS 基本类型做校验,也可以对复杂类型(如 `React.PropTypes` 提供了 `function`, `array`, `arrayOf` 等类型)做校验。同时你也可以写自定义的校验函数。

!!! `getDefaultProps()` 提供默认值

`getDefaultProps()` 提供了一种 ''默认值'' 的机制:

```js
const Counter = React.createClass({
  getDefaultProps: function() {
    return {get
      initialValue: 1
    }
  },
  // ...
});
```

此时 `<Counter />` 与 `<Counter initialValue={1} />` 是一样的效果。这种机制可以让使用此 Component 的用户关注少一些细节,又提供了一定的灵活性。

<<.warning "`getDefaultProps()` 只在 Counter 对象被创建时调用一次。这个 component 的不同实例共享同一份默认值数据。">>

!! `context`

`context` 机制类似全局变量,大部分情况下是不被推荐使用的。它的原理大概是:父 component 定义并拥有一个 context,context 中的值是由这个父 component 的 state / props 决定的;子 component 显式声明要使用父 component 的 context。此时父 component 的 state / props 一旦变化,会即时更新 context,使用此 context 的子 component 也会被重新渲染。
 
!! `state`

Practical guide:

> One way that we can mitigate and minimize the complex states is by building our apps with a single stateful component composed of stateless components: components that do not keep state.

!!! Stateless State

stateless state 是一个结合了函数式编程思想的概念。比如下面就是一个使用了 stateless state 的 component(官方叫它 [[functional components|https://facebook.github.io/react/docs/components-and-props.html#functional-and-class-components]]):

```js
const Header = function(props) {
  return (<h1>{props.headerText}</h1>)
}
```

Header 函数返回的是一个 ReactElement,它的行为跟 class components 中的 render 函数类似。Functional Components 鼓励 ''重用''。

!! `children`

设想你有一个 component 长这个样子:

```js
class Page extends React.Component {
  render() {
    return (
      <Container>
        <Article headline="An interesting article" />
        <Article headline="Another interesting article" />
      </Container>
    )
  }
}
```

`Conatiner` component 并不知道它里面是什么,有几个 `Article` 等等,你可以用 `this.props.children` 来指代他们:

```js
class Container extends React.Component {
  render() {
    return (
      <div className="container">
        {this.props.children}
      </div>
    );
  }
}
```

实际运行时,`this.props.children` 可能是单个 ReactElement,也可能是多个 ReactElement (以数组形式)。

React 针对 Children 的场景提供了很多工具函数,以提供更编程化的能力:`React.Children.map()`, `React.Children.forEach()`, `React.Children.toArray()`。

!! `statics`

component 的 `statics` 函数,就像类的静态函数一样。需要用时看下文档就好,很简单。
Forms 这一章写得很啰嗦,直接看代码就好了。

这章写的也不一定是最佳实践,有一些问题:

# React 给了 refs 用来拿表单的各 input 的值,但是书里又不提供这种机制,这是为何?
# 书里对输入数据做校验时,即有单个 Field 的校验,也有整个 Form 的校验,但是代码用了一些蛋疼的办法关联起来
# Redux 在这章并不是详细讲。如果还没入门 Redux,需要先去看后面章节的详细介绍
# 感觉不如直接看 React 官方文档,以及一些好代码


<iframe src="https://www.gcores.com/radios/95312/embed" width="480" height="400" allowtransparency="true" border="0" frameborder="0" style="width:600px;height:530px;"></iframe>

<<.note "这篇文章同时也发布在博客上。">>

GADIO Pro 节目,关于游戏的信仰-Jonathan blow的创作哲学。

这是我今年听过最好的播客节目。没有之一。[[重轻老师|https://www.g-cores.com/users/31418]] 真心是知识渊博又很有感染力,上回听他讲西部世界也听得我激动万分。这次讲 Jonathan Blow 的故事,也是太太精彩了……

!! Braid & Portal

Braid(时空幻境)这个游戏发布在 2008 年。我 2009 年上大学。大学的时候慢慢有了独立游戏这个概念,也玩了一些觉得很赞的独立游戏。Braid 是我觉得非常赞的游戏,还记得当时,宿舍的人围着看我打到半夜,终于通关时那种激动感。游戏里面想表达的内容给人一种很隐晦的感觉,我当时做了一些搜索,只知道游戏跟原子弹有关系,但是限于当时的知识水平和英文能力,没能找到更多的信息。

{{braid-cover}}

直到今天听到这个节目,才知道这个 idea 居然源于 Blow 早年打到一个觉得非常棒的游戏 Trinity,真的是把我惊呆了。Blow 对于好作品的执着真是无处不在,他在玩到 Trinity 这么多年后,还做了款游戏来向它致敬,真的是超乎常人想象。到后面听到他被 Brian Moriarty 的演讲感染,并花长达 7 年时间按自己对好游戏的理解开发 The Witness,真的完美诠释了「偏执而长情」。

Braid 真的是很特别的游戏。我当年通关后很想写一篇关于游戏机制的文章,但是没有落实下来。Braid 在游戏中的每个世界中,先给你介绍一个简单的游戏机制,然后再引导你通过这个机制去完成关卡,这种感觉真的非常美妙。「设计一个系统,用最少的人工痕迹(contrivance)给予最大的真实。」这是我以前总结不出来的描述。比如同样结构的这个关卡,在不同的游戏世界中,通关的方式需要根据那个世界的机制达成,这实在是太精妙了:

{{braid-gameplay}}

跟 Blow 一样,我也非常喜欢 V 社的 Portal 系列。这是我认为最佳的解谜游戏之一,游戏机制非常简单,但是关卡设计得如此巧妙,即引导你解出谜题,又会让你有「Eureka!」的感觉。

{{portal-cover}}

!! 糟糕的游戏

Blow 认为之前很火的社交游戏(比如「开心农场」),实际上玩家并不是在玩游戏,而是背后的游戏策划在把玩家当游戏玩。这时候我不得不说,鹅厂大部分游戏都是数值策划在玩玩家,而不是玩家在玩游戏。曾经很期待的魂斗罗,用少得可怜的游戏性,加上巧妙的数值设计,让我感受到原来游戏可以用这么多小红点、这么无聊又费时间、就算你是人民币玩家你也会卡关这几大体验。我很不满被策划当猴甩,也不满魂斗罗这么好的 IP 被做成这么差的游戏。还有未上线的红警手游,又让我看到一个被浪费掉的 IP,一套无聊又精心设置好的小红点和数值系统。Bullshit。

!! 好的游戏

近几年鹅厂做得好的游戏,在我看来只有王者。王者虽然也有很多讨厌的小红点,但是还是看出策划努力在设计新英雄、新技能,来丰富游戏玩法和体验。

!! 我很失望……

写这篇文章,是觉得这个世界需要很多像 Blow 这样的人,去做出好的事情。但是现在看到的,糟糕的东西实在太多了。

我很怀念初高中时的鹅厂产品,QQ 每次客户端更新都有很多很赞的功能(我还记得刚玩到窗口抖动时的开心感),把非常棒的设计带得还不懂得分辨美丑的我。空间让我感受到原来 web 技术可以创造出这么强大和美观的应用。

但是看现在,一个擅长用户体验的公司,却连一个多端消息同步都做不好。各种功能令人感觉破碎和不可靠。一些产品经理以骚扰用户为己任,不断地给你点不完的小红点、不想看的短视频。很多很明显做了会影响体验和口碑的事情,还是不停地有人去做。So sad。
<iframe src="https://www.gcores.com/radios/97874/embed" width="480" height="400" allowtransparency="true" border="0" frameborder="0" style="width:600px;height:530px;"></iframe>

GADIO Pro 节目,斯金纳箱 - 游戏成瘾背后的行为主义心理学。

这期节目跟游戏设计非常有关系,里面的实验 / 故事也有启发性。

如果下面的笔记不足够让你回忆起内容,去机核页面上看它的 Show Notes。

* 巴甫洛夫实验:给狗食物吃的同时,让蜂鸣器响起来。结果后面狗听到蜂鸣器声音就开始流口水
* 小艾伯特实验:11 月大小孩摸弄小白鼠,一开始不害怕,但是后面每当他摸弄时就给予巨大响声,小孩就很害怕小白鼠了;再 ''泛化'' 成看到白色的东西都害怕,比如兔子、白色毛绒大衣
* 伯尔赫斯·弗雷德里克·斯金纳(Burrhus Frederic Skinner,1904-1990),美国心理学家,新行为主义学习理论的创始人,也是新行为主义的主要代表。斯金纳引入了操作条件性刺激。
* 正强化,负强化
* 读书时被老师体罚是负强化。负强化不如正强化。负强化的刺激一旦消失,相应的应对行为也会慢慢消退
* 正强化的例子:炉石时抽卡包时的动画效果
* 随机性:人类难以抗拒未知的诱惑
* 及时反馈,及时强化,可以塑造行为
* 挂机游戏(Clicker Heroes,旅行青蛙)将行为主义学的理论应用到极致

自动方式:使用我做的 [[gatsby-template|https://gitlab.com/onlyice/gatsby-template]]。

手工方式:

# 安装 Gatsby CLI<div>

```shell
npm install -g gatsby-cli
```
</div>
# 新建工程<div>

```shell
gatsby new <project-name> https://github.com/gatsbyjs/gatsby-starter-hello-world
```
</div>
# 配置 [[以绝对路径方式去 import|https://www.gatsbyjs.org/packages/gatsby-plugin-root-import/]]
# 整合 [[TailwindCSS|https://www.gatsbyjs.org/docs/tailwind-css/]] 及 [[Bulma|https://www.gatsbyjs.org/docs/bulma/]]

!! Resources

* [[git - the simple guide|http://rogerdudler.github.io/git-guide/index.html]]
* [[A Visual Git Reference|http://marklodato.github.io/visual-git-guide/index-en.html]]








`go build` 命令,会把当前目录树下的 go 文件编译出来,放在 `$GOPATH/pkg` 的相应目录中。go 编译出来的可执行文件比较大,因为会包含 go runtime 在其中。

go 的内置库,有一些提供了带 cgo 和不带 cgo 两个版本,参考 [[Golang: Runtime]],有详细描述。Go 默认使用 cgo 版本,如果想不用,可以置环境变量 `CGO_ENABLED=0`:

```bash
CGO_ENABLED=0 go build
```

但是并不是 `CGO_ENABLED=0` 之后,就一定能编出完全无其他依赖的静态二进制文件。比如有些代码依赖 `libpcap`,而 `libpcap` 又没有纯 Go 的实现,那么 `CGO_ENABLED=0` 是会编译失败的,默认编出来的程序会依赖 `libpcap` 的动态库。大概率很难编出纯静态的。

!! 跨平台编译(Cross Compiling)

Go 是可以跨平台编译的。比如在 Linux 上编 Windows 上的 binary:

```bash
GOOS=windows GOARCH=386 go build -o hello.exe hello.go
```

这个命令可以看 Go 支持的平台:

```bash
$ go tool dist list
android/386
android/amd64
...
```

[[mitchellh/gox|https://github.com/mitchellh/gox]] 是个简单的工具,类似 `go build`,但是可以一次性把各平台的 binary 都编译出来。

!! 参考

* [[也谈 Go 的可移植性|https://tonybai.com/2017/06/27/an-intro-about-go-portability/]]
[[urfave/cli|https://github.com/urfave/cli]] 很不错,简单易用,GitHub 上有很多 code snippets。但是众人提了个 [[issue|https://github.com/urfave/cli/issues/85]] 要求参数支持 required 标记,好几年了都没有实现……

[[spf13/cobra|https://github.com/spf13/cobra]] 文档写得不够简单,处理参数不知道怎么快速搞,不太喜欢。

Go 在查询数据库时的选型。

一般编程语言中会有 ORM 和非 ORM 方式去访问数据库,比如 Python 中的 Django ORM 和 mysqlclient。对于这类语言,ORM 有一个好处是兼容了多种数据库。

但 Go 标准库中的 sql 模块就已经定义了一个规范,要求各种数据库的 driver 遵循。

这篇 [[文章|https://eli.thegreenplace.net/2019/to-orm-or-not-to-orm/]] 也认为 ORM 仅在简单的 CRUD 中节省了工作量,但是增加了学习 ORM 库的成本。

我倾向于用:

* 内置的 `database/sql`,搭配 `sqlx` 扩展
* [[jmoiron/sqlx|https://github.com/jmoiron/sqlx]]:对 Golang 的 SQL 模块的扩展
* [[jackc/pgx|https://github.com/jackc/pgx]]:PG 的 driver

ORM 的话,[[GORM|http://gorm.io/index.html]] 是目前最流行的选择。
Golang 的 `database/sql` 中并没有具体数据库的实现,而是定义了一套接口规范,要求 DB 的 driver 实现必须遵循。Driver 由第三方实现,官方维护了一套 [[driver 列表|http://golang.org/s/sqldrivers]]。这篇文章描述 `database/sql` 中的接口和机制。

!! 顶层对象 `sql.DB`

`sql.DB` 对象通过 `sql.Open()` 函数获得:

```go
db, err := sql.Open("pgx", connectionString)
```

它不代表一个数据库连接;它仅代表一个数据库实体,不管它是通过 TCP 连接的,还是本地文件亦或放在内存中。它的职责是:

* 通过数据库 driver 打开和关闭与数据库的连接
* 维护连接池

实际的连接会 lazily 发生在有查询等操作时。

设计文档中提到:

<<<
Handle concurrency well. Users shouldn’t need to care about the database’s per-connection thread safety issues (or lack thereof), and shouldn’t have to maintain their own free pools of connections. The &lsquo;sql&rsquo; package should deal with that bookkeeping as needed. Given an `*sql.DB`, it should be possible to share that instance between multiple goroutines, without any extra synchronization.
<<<

`sql.DB` 并不是设计用来频繁 `Open()` 和 `Close()` 的。它屏蔽了底层连接管理,使得用户不用去自己维护连接池;并且可以在不同的 go routine 间共享,而不需要使用额外的同步机制。

DB 的 [[接口文档|https://golang.org/pkg/database/sql/#DB]] 提到:

<<<
`DB` is a database handle representing a pool of zero or more underlying connections. It’s safe for concurrent use by multiple goroutines.

The sql package creates and frees connections automatically; it also maintains a free pool of idle connections. If the database has a concept of per-connection state, such state can be reliably observed within a transaction (Tx) or connection (Conn). Once `DB.Begin` is called, the returned Tx is bound to a single connection. Once `Commit` or `Rollback` is called on the transaction, that transaction’s connection is returned to DB’s idle connection pool. The pool size can be controlled with `SetMaxIdleConns`.
<<<

!! Driver 的实现

!!! Driver 如何注册自己

比如 jackc/pgx 库,使用它时需要 `import`:

```go
import (
    "database/sql"
    _ "github.com/jackc/pgx/v4/stdlib"
)
```

`import` 的过程中 pgx 会去调用 `database/sql` 接口去做注册:

```go
// File: $HOME/go/pkg/mod/github.com/jackc/pgx/v4@v4.10.0/stdlib/sql.go
func init() {
    pgxDriver = &Driver{
        configs: make(map[string]*pgx.ConnConfig),
    }
    fakeTxConns = make(map[*pgx.Conn]*sql.Tx)
    sql.Register("pgx", pgxDriver)
    // ...
}
```

!!! 如何选择 `database/sql` 接口与 driver 自定义的接口

Driver 往往也自己定义了一套接口,而且一般会比 `database/sql` 功能更多或者性能更佳。

如果你需要一套代码对接多种数据库,同时不需要用到 driver 自己接口提供的额外能力时,建议只用 `database/sql` 的接口。这也减少了学习成本。

!! 简单代码

```go
package main

import (
    "database/sql"
    "fmt"
    _ "github.com/jackc/pgx/v4/stdlib"
    "log"
    "net/url"
    "os"
)

func main() {
    u := &url.URL{
        Scheme: "postgresql",
        User:   url.UserPassword("squirrel", "iloveice"),
        Host:   "localhost",
        Path:   "squirrel",
    }

    db, err := sql.Open("pgx", u.String())
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    var greeting string
    err = db.QueryRow("select 'Hello, world!'").Scan(&greeting)
    if err != nil {
        fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err)
        os.Exit(1)
    }

    fmt.Println(greeting)
}
```

!! 查询请求

```go
var (
    id int
    name string
)
rows, err := db.Query("select id, name from users where id = ?", 1)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

err = rows.Err()
if err != nil {
    log.Fatal(err)
}

for rows.Next() {
    err := rows.Scan(&id, &name)
    if err != nil {
        log.Fatal(err)
    }
    log.Println(id, name)
}

```

关键点:

* `db.Query` 提交查询语句
* `rows.Next()` 及 `rows.Scan()` 配合遍历和读取结果
* `rows.Err()` 可以在未读取数据的前提下得到查询错误,但它只能得到类似数据库 server 返回的错误。对于 `sql.ErrNoRows`,如果你还没有 `Scan()`,这个方法不会返回错误;如果 `Scan()` 了,它也会返回错误。如果 `rows.Err()` 不为 nil,调用 `rows.Scan()` 也会抛出
* `rows.Close()` ''会使得当前数据库请求使用的连接被释放回连接池''。如果你用 `rows.Next()` 遍历完集合,`rows.Close()` 会被隐式地调用;但是假如没有遍历完,那么 `defer rows.Close()` 能保证函数结束后有调用。在已经是 close 的情况下再调用 `rows.Close()` 也不会出错

如果 `db.Query` 中有多个 SELECT 语句,可以用 `rows.NextResultSet()`。

`Rows.Scan()`([[文档|https://golang.org/pkg/database/sql/#Rows.Scan]])是其中比较复杂的部分。它的功能比较多样,可以把一个 SQL 类型值转换为 Go 的类型值。特别的一点是,如果 SQL 中是字符串(比如 VARCHAR),而且字符串存的是数字,你可以把它 scan 进一个数字类型,Go 会帮你做这个转换(比如 `strconv.ParseInt()`)。

!! Prepared 查询

```go
stmt, err := db.Prepare("select id, name from users where id = ?")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()
rows, err := stmt.Query(1)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
    // ...
}
if err = rows.Err(); err != nil {
    log.Fatal(err)
}
```

不同数据库的 prepare 语句中的点位符不一样:

```
MySQL               PostgreSQL            Oracle
=====               ==========            ======
WHERE col = ?       WHERE col = $1        WHERE col = :col
VALUES(?, ?, ?)     VALUES($1, $2, $3)    VALUES(:val1, :val2, :val3)
```

!! 单行查询

```go
var name string
err = db.QueryRow("select name from users where id = ?", 1).Scan(&name)
if err != nil {
    if err == sql.ErrNoRows {
        // there were no rows, but otherwise no error occurred
    } else {
        log.Fatal(err)
    }
}
fmt.Println(name)
```

```go
stmt, err := db.Prepare("select name from users where id = ?")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()
var name string
err = stmt.QueryRow(1).Scan(&name)
if err != nil {
    if err == sql.ErrNoRows {
        // there were no rows, but otherwise no error occurred
    } else {
        log.Fatal(err)
    }
}
fmt.Println(name)
```

<<.info "查询的错误是在 `Scan()` 处抛出的,而不是 `QueryRow()`。">>

!! 修改数据

`INSERT`, `UPDATE`, `DELETE` 这种不返回纪录的语句,用 `Exec()` 来执行:

```go
_, err := db.Exec("DELETE FROM users")  // OK
```

搭配 prepared statement:

```go
stmt, err := db.Prepare("INSERT INTO users(name) VALUES(?)")
if err != nil {
    log.Fatal(err)
}
res, err := stmt.Exec("Dolly")
if err != nil {
    log.Fatal(err)
}

lastId, err := res.LastInsertId()
if err != nil {
    log.Fatal(err)
}
rowCnt, err := res.RowsAffected()
if err != nil {
    log.Fatal(err)
}
log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)
```

<<.warning "不要用 `db.Query()` 来做这类操作,它会返回 Rows 结构,会期望你调用 `Rows.Close()` 释放连接。但这种情况下可能会忘掉这个调用。">>

!! 事务

```go
db, err := sql.Open("pgx", u.String())
if err != nil {
    log.Fatal(err)
}
defer db.Close()

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}
// 这是一个 trick。一般函数实现中,当出错时就 return err 给调用方了,
// 此时 `tx.Rollback()` 就会被自动调用。虽然这个例子中用了 `log.Fatal()` 
// 而不是 return err。如果一个 tx 已经 Commit,那调用 Rollback 时会返回
// ErrTxDone。忽略即可。
defer tx.Rollback()

_, err = tx.Exec(`
CREATE TABLE films3 (
    code        char(5) PRIMARY KEY,
    title       varchar(40) NOT NULL,
);`)
if err != nil {
    log.Fatal(err)
}

err = tx.Commit()
if err != nil {
    log.Fatal(err)
}
```

事务的实现,是从 `db.Begin()` 获得一个 Tx 对象,以 `tx.Commit()` 或 `tx.Rollback()` 结束。隔离级别由 driver 决定,或者由 `db.BeginTx()` 传参设置。

<<.warning "在事务中,不要使用 `db.Exec()` 去做修改操作,而应该使用 `tx.Exec()`。`db.Exec()` 做的操作不在事务范围内。">>

!! 错误处理

各接口返回的 `err` 有错误信息。但具体的错误码跟 driver 是绑定的,`database/sql` 不做规范。比如:

```go
if driverErr, ok := err.(*mysql.MySQLError); ok {
    if driverErr.Number == mysqlerr.ER_ACCESS_DENIED_ERROR {
        // Handle the permission-denied error
    }
}
```

查询单行数据时,有一个特殊的错误,用来判断有没有查到数据:

```go
var name string
err = db.QueryRow("select name from users where id = ?", 1).Scan(&name)
if err != nil {
    if err == sql.ErrNoRows {
        // there were no rows, but otherwise no error occurred
    } else {
        log.Fatal(err)
    }
}
fmt.Println(name)
```

当出现连接错误时,`database/sql` 会自动重试(重试一次,一共试两次)。次数定义在 `database/sql/sql.go` 中的 `maxBadConnRetries`。

!! 处理 null

当某一列的数值可能是 null 时,你要用 `sql` 包中对应的 Null 类型:

```go
for rows.Next() {
    var s sql.NullString
    err := rows.Scan(&s)
    // check err
    if s.Valid {
       // use s.String
    } else {
       // NULL value
    }
}
```

Null 类型并不是很多,比如没有 `sql.NullUint64`。如果需要,你可以拷贝 `sql` 包中的代码做类似的实现。

另外的方法是,通过 SQL 中的函数(比如 `COALESCE`):

```go
rows, err := db.Query(`
    SELECT
        name,
        COALESCE(other_field, '') as otherField
    WHERE id = ?
`, 42)

for rows.Next() {
    err := rows.Scan(&name, &otherField)
    // ..
    // If `other_field` was NULL, `otherField` is now an empty string. This works with other data types as well.
}
```

!! 注意事项

''批量操作'':`database/sql` 还不支持批量操作。有一个 [[issue|https://github.com/golang/go/issues/5171]] 在关注这个问题。

''可能会导致资源耗尽的操作'':

* 频繁地 `sql.Open()` 和 `db.Close()`,会导致单个 `sql.DB` 维持的连接池无法被复用,可能导致机器的网络资源被消耗完(比如一堆 TCP 连接保持在 `TIME_WAIT` 状态)
* 查询数据时,没有遍历完所有行,也没有调用 `rows.Close()`,导致连接无法返回连接池
* 使用 `Query()` 去做 `INSERT`, `UPDATE`, `DELETE` 等操作,却不对返回的 `rows` 做 `Close()` 操作。这种情况下应该用 `Exec()` 代替 `Query()`
* Prepared statements 在数据库层面,需要 driver 跟 DB server 有三次交互。频繁的使用 prepared statement,配合 sql 包本身的重试机制,可能会引起问题(但我觉得问题不大)

''单次执行多条语句时连接复用问题'':当多次请求(`Query()` / `Exec()`)时,如果不同语句之间有上下依赖关系(比如 MySQL 中,经常有先使用 `USE` 语句,再做其他操作的),要注意不同语句执行时是否使用的是同个数据库连接:

* 在事务内用 `Tx` 对象发起的请求,使用同个连接
* 不在事务中时,
** 直接用 `DB` 对象发起的请求,每次请求都随机使用的连接池中的连接,不保证是同样的
** 需要保证同一连接的话,使用 `db.Conn()` 来获得一个连接
```go
conn, err := db.Conn(ctx)
if err != nil {
    log.Fatal(err)
}
defer conn.Close() // Return the connection to the pool.
id := 41
result, err := conn.ExecContext(ctx, `UPDATE balances SET balance = balance + 10 WHERE user_id = ?;`, id)
if err != nil {
    log.Fatal(err)
}
```

''没有多语句支持'':这样的语句的效果是不确定的,看 DB server 如何处理:

```go
_, err := db.Exec("DELETE FROM tbl1; DELETE FROM tbl2") // Error/unpredictable result
```

它可能报错,也可能不报错;可能两条语句都被执行,也可能只执行一条。

''事务内 rows 未被关闭时,连接无法复用'':比如这样的代码:

```go
tx, err := db.Begin()
rows, err := tx.Query("select * from tbl1") // Uses tx's connection
for rows.Next() {
    err = rows.Scan(&myvariable)
    // ERROR! tx's connection is already busy!
    tx.Query("select * from tbl2 where id = ?", myvariable)
}
```

在 `rows` 没有被遍历完,或者没有调用 `rows.Close()` 之前,你是无法使用 `tx` 做新的查询的,因为连接还没有被释放回去。

即使不在事务中,如果你在循环内用 `sql.DB` 做一次新的查询,也无法复用上一次查询的连接:

```go
rows, err := db.Query("select * from tbl1") // Uses connection 1
for rows.Next() {
    err = rows.Scan(&myvariable)
    // The following line will NOT use connection 1, which is already in-use
    db.Query("select * from tbl2 where id = ?", myvariable)
}
```

!! 参考

* [[Go database/sql tutorial|http://go-database-sql.org/]]
* [[SQLInterface - Golang Wiki|https://github.com/golang/go/wiki/SQLInterface]]
* [[pgx tutorial|https://github.com/jackc/pgx/wiki/Getting-started-with-pgx-through-database-sql]]
* [[database/sql package design goal|https://golang.org/src/database/sql/doc.txt]]
[[jmoiron/sqlx|https://github.com/jmoiron/sqlx]] 是一个针对 `database/sql` 的扩展。官方有个 [[文档|http://jmoiron.github.io/sqlx/]] 很好的介绍了它的用法。它的主要功能是:

* 可以方便地把读到的行转换到一个 struct 中
* 支持在使用 prepared statement 中使用命名参数
* 其它一些方便使用的 API(如 `Get` `Select`)

Golang 内置的 [[encoding/gob|https://golang.org/pkg/encoding/gob/]] 实现了序列化 / 反序列化一个 golang 结构的能力。

<<display-pdf path:"/files/archives/2021/04/golang-package-gob.pdf" title:"golang-package-gob.pdf">>

Rob Pike 描述了 gob 的 [[设计理念|https://blog.golang.org/gob]]:

* ''易用'':Go 有反射能力,schema 打包在 buffer 中,decoder 不需要知道 struct 的结构即可解包;因此也不需要一个专门的 "protocol compiler"(比如 [[Protobuf]] 的 protoc)
* ''Go-centric'':因为上面的原因, gob 并不打算实现成各语言通用的
* ''性能'':gob 使用二进制协议(而不是 JSON / XML 这种文本协议)并尽量使编解码高效

同时描述了 gob 与 [[Protobuf]] 理念上的不同:

* PB 只支持 struct,不能只 encode 一个整数或者一个数组
* PB 对 field 的 required / optional 设计比较啰嗦(Rob Pike 写这篇文章时只有 PB2,PB3 部分解决了它说的问题),而 gob 并不要求严格的字段对应,一切 field 都是 optional

!! interface value 的处理

`gob.Encoder` 可以 encode 一个 interface value,但是你需要提前将其具体类型注册;如果不注册具体类型,而又可能有多个类实现同个 interface,那 gob 在解包时并无法知道要将该 interface value 解为什么具体类型。打包好的二进制会包含类型名。比如:

<div class="limit-code-block-height">

```go
package main

import (
	"bytes"
	"encoding/gob"
	"log"
	"math"
)

// Point 实现了 Pythagoras interface
type Point struct {
	X, Y int
}

func (p Point) Hypotenuse() float64 {
	return math.Hypot(float64(p.X), float64(p.Y))
}

type Pythagoras interface {
	Hypotenuse() float64
}

func main() {
	var network bytes.Buffer

	// 注册具体的类型。无论是 encode 还是 decode 的代码都需要注册。
	gob.Register(Point{})

	enc := gob.NewEncoder(&network)
	var p1 Pythagoras = Point{3, 4}

	// 这里需要传 &p1 而不是 p1。如果传的是 p1,gob 打包的是具体的 Point 类型,
	// 而不是 Pythagoras interface 类型。
	// 原因见:https://blog.golang.org/laws-of-reflection(未理解)
	if err := enc.Encode(&p1); err != nil {
		log.Fatal("encode:", err)
	}

	dec := gob.NewDecoder(&network)
	var p2 Pythagoras
	if err := dec.Decode(&p2); err != nil {
		log.Fatal("decode:", err)
	}

	// 打印 {3, 4}
	fmt.Println(p2)
}
```

</div>

!! 扩展性

任何类型实现了下面的接口后,可以实现自定义的二进制格式:

* Encode:`GobEncoder` or `encoding.BinaryMarshaler`
* Decode:`GobDecoder` or `encoding.BinaryUnmarshaler`
!! 参考

如果需要快速回忆 Go 的语言特性:

* 官方的 [[A tour of Go|https://tour.golang.org/welcome/1]]
* 我修改的 [[Go cheatsheet|https://cheatsheets.zhiheng.io/go]]
* 非常不错的 [[教程|https://golangbot.com/learn-golang-series/]]

Go 中的容器类型。





Go 的 array 是定长的;slice 是不定长的。两者长得非常像:

* Array:类型表达为 `[N]T`,N 是长度,T 是类型,如 `[5]int`
* Slice:类型表达为 `[]T`,T 是类型,如 `[]int`

!! 构建

```go
//// Array: [N]T

// l1: 声明但不赋值。此时每个元素都是 zero value
var l1 [5]int

// l2: 声明且赋值
var l2 [5]int = [5]int{4, 2, 1, 3, 5}

// l3 及 l4: 自动推断类型
var l3 = [5]int{4, 2, 1, 3, 5}
l4 := [5]int{4, 2, 1, 3, 5}

// l5: 自动推断类型及长度([5]int)
l5 := [...]int{4, 2, 1, 3, 5}

//// Slice: []T
// s1: 声明但不赋值,空 slice
var s1 []int

// s2: 声明且赋值
var s2 []int = []int{4, 2, 1, 3, 5}

// s3 及 s4:自动推断类型
var s3 = []int{4, 2, 1, 3, 5}
s4 := []int{4, 2, 1, 3, 5}

// s5: 用 make() 构建
//   func make([]T, len, cap) []T
//   func make([]T, len) []T
s5 := make([]int, 5)
```

!! Array 实现

Array 在 Go 的设计中是 ''值类型的''。在 [[Go blog|https://blog.golang.org/slices-intro]] 中这么描述的:

<<<
Go's arrays are values. An array variable denotes the entire array; it is not a pointer to the first array element (as would be the case in C). This means that when you assign or pass around an array value you will make a copy of its contents. (To avoid the copy you could pass a //pointer// to the array, but then that's a pointer to an array, not an array.) One way to think about arrays is as a sort of struct but with indexed rather than named fields: a fixed-size composite value.
<<<

一个 array 变量赋值给其他变量时,值会被拷贝:

```go
a := [...]int{1, 1, 1}
b := a
a[0] = 0
fmt.Println(a, b)
```

```
[0 1 1] [1 1 1]
```

可以修改 array 中的元素值,但是无法改变 array 大小(比如 push / pop)。

!! Slice 实现

Slice 支持以下标索引形式读写元素值。但是对超出长度部分的写入会报 runtime error:

```go
// len(b) 为 2
b := make([]int, 2, 4)
b[0] = 1
b[1] = 2
b[2] = 3   // runtime error
```

Slice 的空值是 nil。`cap()` `len()` 在此情况下会返回 0。

Slice 本质上是指向某块内存区域的结构信息:

[img width=400 [go-slice-internal-1]]

[img width=400 [go-slice-internal-2]]

Slice 支持 slicing 操作,slice 出来的结果仍然是 slice,能被读取但是无法被写入:

```go
b := []int{1, 2, 3, 4}
c := b[2:]             // c: {3, 4}
b[2:] = []int{5, 6}    // compile error
```

Slicing 操作是不复制 slice 中元素的,它生成的 slice 跟原 slice 指向同块区域。因此注意 slicing 后的 len 及 cap:

```go
b := make([]int, 2, 4)
b[0] = 1
b[1] = 2

c := b[2:]

fmt.Printf("len(b): %v, cap(b): %v\n", len(b), cap(b))
fmt.Printf("len(c): %v, cap(c): %v\n", len(c), cap(c))
```

```
len(b): 2, cap(b): 4
len(c): 0, cap(c): 2
```

对 slice 追加数据,需要通过 `append()` 函数。因为 slice 并不实际拥有底下的元素,因此设计上:

* 并不是 `slice.append()`,
* 而是 `slice = append(slice, V)`

因为如果 append 之后超出了原有的 capacity 时,go 会使 capacity 增大:

```go
b := make([]int, 4)
fmt.Printf("len(b): %v, cap(b): %v\n", len(b), cap(b))

b = append(b, 0)
fmt.Printf("len(b): %v, cap(b): %v\n", len(b), cap(b))
```

```
len(b): 4, cap(b): 4
len(b): 5, cap(b): 8
```

当 append 后原有的位置内存不足时,会把数据拷贝到另外一处内存;此时会生成一个新的 slice 对象(`ptr` `len` `cap` 均有变化),赋值给原有的变量 `slice`(可能观察到的 slice 的指针地址是没有变化的,有可能是 Go 把老的对象 GC 了,或者是做了优化)。

!!! Slice 合并

对于两个同类型的 slice `s1` `s2`,如果想把 `s2` 的元素全部追加到 `s1` 后面,可以这样写:

```go
s := append(s1, s2...)
```

因为 `append()` 是个 [[variadic function|Golang: Language: Variadic Function]]。并且这样没有性能问题,go 在实现上并不会把参数一个个 push 进栈里面,而是类似传一个数组进来。

!! 参考

* [[Go Slices: usage and internals - The Go Blog|https://blog.golang.org/slices-intro]]
* [[Arrays, slices (and strings): The mechanics of 'append' - The Go Blog|https://blog.golang.org/slices]]
* [[SliceTricks - golang/go Wiki|https://github.com/golang/go/wiki/SliceTricks]] 提供了 slice 的常见操作示例
!! 参考

* [[Goroutines - Concurrency in Golang|https://golangbot.com/goroutines/]] 及后续教程
* [[Google I/O 2012 - Go Concurrency Patterns|https://www.youtube.com/watch?v=f6kdp27TYZs]]:Rob Pike 的演讲,<<coslink "PDF" "/files/archives/2020/12/Go Concurrency Patterns - Google IO 2012.pdf">>
Go 语言在设计时就将并发作为语言的一大特性。Go 代码跑在一个个 goroutine 中。

Goroutine 事实上是协程(coroutine)换了个马甲。相对于线程:

* Goroutine 比线程轻量(在栈上只需要几 kB),在用户态做切换,并且栈大小可以伸展和收缩,而线程往往需要指定固定的大小
* Goroutine 所需要的线程数非常少。一个线程可能跑几千个 goroutine。当一个 goroutine 被 I/O block 时,Go 有可能为其他 goroutine 的运行创建新的线程,但开发都不需要关心这些细节,Go 做了屏蔽
* Goroutine 之间的通讯用了 channel,channel 的机制从设计上避免了 race condition,使得开发起来很便利

!! 基础例子

```go
package main

import (  
    "fmt"
    "time"
)

func hello() {  
    fmt.Println("Hello world goroutine")
}
func main() {
    // 启动一个独立运行的 goroutine
    go hello()

    // 如果没有这行,hello() 可能不会被执行,因为 main 函数一旦结束,
    // 整个程序就退出了
    time.Sleep(1 * time.Second)

    fmt.Println("main function")
}
```

```
Hello world goroutine
main function
```
Buffered channel 带有缓冲区。

!! 基础

定义时需要指定大小:

```go
// Unbuffered
ch := make(chan type)

// Buffered
ch := make(chan type, capacity)
```

Unbuffered channel 在收发时会阻塞;Unbuffered 则仅在发时缓冲区满、收时缓冲区空情况下会阻塞,其他情况下不会。

收取顺序是先进先出:

```go
func main() {  
    ch := make(chan string, 2)
    ch <- "naveen"
    ch <- "paul"
    fmt.Println(<- ch)
    fmt.Println(<- ch)
}
```

```
naveen  
paul
```

`cap()` 可以查容量,`len()` 查当前 channel 中对象个数:

```
func main() {  
    ch := make(chan string, 3)
    ch <- "naveen"
    ch <- "paul"
    fmt.Println("capacity is", cap(ch))
    fmt.Println("length is", len(ch))
    fmt.Println("read value", <-ch)
    fmt.Println("new length is", len(ch))
}
```

```
capacity is 3  
length is 2  
read value naveen  
new length is 1
```

!! 死锁

可能引起死锁:

```go
func main() {  
    ch := make(chan string, 2)
    ch <- "naveen"
    ch <- "paul"
    ch <- "steve"
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}
```

```
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:  
main.main()  
    /tmp/sandbox274756028/main.go:11 +0x100
```

当代码运行到 `ch <- "steve"` 时,main goroutine 因为 block 转为 sleep 状态,但是 Go 发现当前并没有其他 goroutine 可运行,因此程序无法再继续运行下去,抛出异常。

!! WaitGroup

`WaitGroup` 被用于等待一组 goroutine 完成。它通过维护一个计数实现。使用例子:

```go
func process(i int, wg *sync.WaitGroup) {  
    fmt.Println("started Goroutine ", i)
    time.Sleep(2 * time.Second)
    fmt.Printf("Goroutine %d ended\n", i)
    wg.Done()
}

func main() {  
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        wg.Add(1)
        go process(i, &wg)
    }
    wg.Wait()
    fmt.Println("All go routines finished executing")
}
```

```
started Goroutine  2  
started Goroutine  0  
started Goroutine  1  
Goroutine 0 ended  
Goroutine 2 ended  
Goroutine 1 ended  
All go routines finished executing  
```

其中:

* `wg.Add(1)` 使得 WaitGroup 维护的计数加一
* `wg.Done()` 使计数减一
* `wg.Wait()` 会 block 直到计数为 0

!! Worker Pool

用 buffered channel 可以实现 worker pool。原理很简单:

* 搞两个 buffered channel,一个作为 ''任务队列'',一个作为 ''结果队列''
* 起多个 go routine 作为 worker,从任务队列取任务,将运算结果写入结果队列

代码不做描述,有需要的时候写一个就好了。
Go 并不保证在多个 goroutine 中修改同块数据(critical section)时不会出现竞争条件(race condition):

<div class="limit-code-block-height">

```go
package main  

import (  
    "fmt"
    "sync"
)
var x = 0  

func increment(wg *sync.WaitGroup) {  
    x = x + 1
    wg.Done()
}

func main() {  
    var w sync.WaitGroup
    for i := 0; i < 1000; i++ {
        w.Add(1)        
        go increment(&w)
    }
    w.Wait()
    fmt.Println("final value of x", x)
}
```

</div>

```
final value of x 957
```

看起来 `x = x + 1` 执行了 1000 次,但值只有 957。

Go 在 `sync` 包中提供了基础的同步原语(synchronization primitives),里面有一些传统多线程编程中经常使用的工具,比如锁(Mutex)。用 Mutex 解决上面的问题:

<div class="limit-code-block-height">

```go
package main

import (
	"fmt"
	"sync"
)

var x = 0

func increment(wg *sync.WaitGroup, m *sync.Mutex) {
	m.Lock()
	x = x + 1
	m.Unlock()
	wg.Done()
}
func main() {
	var w sync.WaitGroup
	var m sync.Mutex
	for i := 0; i < 1000; i++ {
		w.Add(1)
		go increment(&w, &m)
	}
	w.Wait()
	fmt.Println("final value of x", x)
}
```

</div>

```
final value of x 1000
```

当 Mutex 被一个 goroutine 调用了 `Lock()` 时,下一个 goroutine 再调用 `Lock()` 就需要等前者 `Unlock()`。

你也可以用一个容量为 1 的 buffered channel 来控制这个过程,不过很不直观:

<div class="limit-code-block-height">

```go
package main

import (
	"fmt"
	"sync"
)

var x = 0

func increment(wg *sync.WaitGroup, ch chan bool) {
	ch <- true
	x = x + 1
	<-ch
	wg.Done()
}
func main() {
	var w sync.WaitGroup
	ch := make(chan bool, 1)
	for i := 0; i < 1000; i++ {
		w.Add(1)
		go increment(&w, ch)
	}
	w.Wait()
	fmt.Println("final value of x", x)
}
```

</div>

Go 语言虽然设计上是建议 share memory by communicating 的,但是像上面这种情况,并不适合用 channel,那用 Mutex 就好。什么场景适合什么就用什么。
`select` 会 block 到指定的一批 channel ready;如果多个 channel ready,会随机选择其中一个。写法很像 `switch`:

```go
select {
// 可以是 receive from channel
case s := <-output:
    fmt.Println(s1)
// 也可以是 send to channel
case c <- "hello":
    // do nothing
case <-done:
    fmt.Println("Done")
}
```

可以有 `default` 分支。效果是如果没有 channel ready,就会走 `default`:

```go
default:
    fmt.Println("None of the other case is ready")
```

!! Patterns

`select` 经常跟 `for` 配合,用来实现超时或者退出功能。

<div class="box">

实现超时功能(来自 <<coslink "这里" "/files/archives/2020/12/Go Concurrency Patterns - Google IO 2012.pdf">>):

```go
func main() {
    c := boring("Joe")
    for {
        select {
        case s := <-c:
            fmt.Println(s)
        case <-time.After(1 * time.Second):
            fmt.Println("You're too slow.")
            return
        }
    }
}
```

注意上面的 `time.After(1 * time.Second)` 是在每次执行 `select` 语句时都会 evaluate 的,意味着 for 循环中的每次 `select` 都会有 1s 超时时间。如果你想设置整个 `for` 循环的超时时间,这样写:

```go
func main() {
    c := boring("Joe")
    timeout := time.After(5 * time.Second)
    for {
        select {
        case s := <-c:
            fmt.Println(s)
        case <-timeout:
            fmt.Println("You talk too much.")
            return
        }
    }
}
```

</div>

<div class="box">

''读数据,当读完时执行清理工作(并不实用):''

```go
readResult:
for {
    select {
    case s <- result:
        fmt.Println(s)
    case <-done:
        cleanUp()
        break readResult
    }
}
```

因为 `break` 默认退出的是最内层的 `for` / `switch` / `select` 语句,因此想 break 掉 for 循环时,需要配合 label(`readResult:`)使用。

<<.warning "不是很推荐这样写。因为当 `result` 和 `done` 同时 ready 时,如果 go 随机选了 `done` 分支来执行,`result` 中的值被漏处理。我认为如果向 `result` 发送完值后,将其 close,再用 for 循环去遍历 `result` 更合理。">>

</div>
!! Channels

Channel 类似 Unix Pipe,是两个 goroutine 之间通信的管道。Channel 带有一个类型,表示通信的数据只能是这种类型。定义一个 channel:

```go
var a chan int
```

此时 `a` 的值是 `nil`,没有什么意义。一般用 `make` 来初始化 channel:

```go
a:= make(chan int)
```

对 channel 有两种操作,都用的是箭头操作符(`<-`):

```
data := <- a // 从 channel a 中读出值并赋值给 data 
a <- data    // 将 data 写入 channel a
```

默认情况下,''对 channel 的读写会阻塞'';比如一个 goroutine 写入了数据,需要等另外一端读取了数据,才能继续运行;反之亦然:

```go
package main

import (  
    "fmt"
)

func hello(done chan bool) {  
    fmt.Println("Hello world goroutine")
    done <- true
}
func main() {  
    done := make(chan bool)
    go hello(done)
    <-done
    fmt.Println("main function")
}
```

运行过程:

```
main                         | hello
====================================================================
go hello(done)               |
                             | fmt.Println("Hello world goroutine")
                             |
(wait for data from done)    | done <- true
<-done                       | (goroutine terminated)
fmt.Println("main function") |
(goroutine terminated)       |
```

!! 死锁

使用 channel 时要注意死锁的情况。一旦向某一 channel 发送了数据,如果没有被读取程序就结束了;或者某一 goroutine 在等待写入 channel 的数据,没有等到程序就结束了,会引起 panic:

```go
package main

func main() {  
    ch := make(chan int)

    ch <- 5
    // 换成接收 <- ch,也会造成死锁
}
```

```
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:  
main.main()  
    /tmp/sandbox249677995/main.go:6 +0x80
```

!! 单向 channel

上面描述的都是双向 channel,可收可发。你也可以定义单向 channel:

* 双向:`chan int`
* 单向:
** 只发:`chan<- int`
** 只收:`<-chan int`

发跟收区别在于 `chan` 关键字变成 `chan<-` 还是 `<-chan`。只发是箭头指向 `chan`;只收是箭头从 `chan` 出来。

这样的代码过不了编译,因为从一个只发的 channel 中读取数据:

```go
func receiveData(recvch chan<- int) {
    fmt.Println(<-recvch)
}
```

```
invalid operation: <-recvch (receive from send-only type chan<- int)
```

!! 关闭 channel 以及使用 for range 读取 channel

关闭一个 channel:

```go
close(ch)
```

判断一个 channel 是否已关闭:

```go
v, ok := <-ch
// ok 为 true 时未关闭,为 false 时已关闭
```

可以用 for 循环消费 channel(但下文描述的 for-range 方式更佳):

```go
for {
    v, ok := <-ch
    if ok == false {
        break
    }
    fmt.Println("Received ", v, ok)
}
```

for-range 方式:

```go
for v := range ch {
    fmt.Println("Received ",v)
}
```
`defer` 语句,会在函数返回后执行:

```go
func main() {
    defer fmt.Println("World")
    fmt.Println("Hello")
}
```

```
Hello
World
```

`defer` 的可以是函数、也可以是实例的方法。

`defer` 时函数或方法的参数,是在 `defer` 语句当时求值(evaluate)的:

```go
package main

import (  
    "fmt"
)

func printA(a int) {  
    fmt.Println("value of a in deferred function", a)
}
func main() {  
    a := 5
    defer printA(a)
    a = 10
    fmt.Println("value of a before deferred function call", a)
}
```

```
value of a before deferred function call 10  
value of a in deferred function 5 
```

同个函数里,先 `defer` 的语句后执行。

!! `defer` 的关键用法

go 中一个常见的 pattern 是出错时函数马上返回 `(nil, err)`。`defer` 一般用于资源释放,使得这种情况下也可以释放资源,而不需要在每个 `return` 前手动释放资源:

```go
func getUserById(id int) {
    var name string
    rows, err := db.Query("select id, name from users where id = ?", 1)
    if err != nil {
        return err
    }
    defer rows.Close()
    
    err = rows.Err()
    if err != nil {
        return err
    }
    
    for rows.Next() {
        err := rows.Scan(&id, &name)
        if err != nil {
            return err
        }
        log.Println(id, name)
    }
}
```


Go 错误处理机制有两种:

* 绝大多数函数返回 `errors`
* 部分无法恢复的情况,比如访问数组不存在的 index,会抛出一个运行时异常,被称为 ''panic''

!! Errors

Go 中有一种 pattern,一个函数返回两个值,分别是操作结果和 err 对象,比如 `os.Open()`:

```go
func Open(name string) (file *File, err error)
```

使用时:

```go
f, err := os.Open("filename.ext")
if err != nil {
    log.Fatal(err)
}
```

!!! 自定义错误

基于字符串、不带其他数据,同时不使用类型来区分错误时:

```go
// simple string-based error
err1 := errors.New("math: square root of negative number")

// with formatting
err2 := fmt.Errorf("math: square root of negative number %g", x)
```

带其他数据或者希望使用类型来区分错误时,可以自定义一个 struct,只要实现了 Go 预先定义的 `error` 接口:

```go
type error interface {
    Error() string
}
```

比如:

```go
type SyntaxError struct {
    Line int
    Col  int
}

func (e *SyntaxError) Error() string {
    return fmt.Sprintf("%d:%d: syntax error", e.Line, e.Col)
}
```

```go
type InternalError struct {
    Path string
}

func (e *InternalError) Error() string {
    return fmt.Sprintf("parse %v: internal error", e.Path)
}
```

假如不带其他数据,可以定义一个 `int` 型错误,比如:

```go
type keyIncorrectError int

func (ki keyIncorrectError) Error() string {
	return "openpgp: incorrect key"
}

// 因为每次的 Error() string 都是一样的,出现这种错误时,该包返回一个固定的
// error 对象(ErrKeyIncorrect)即可。该包函数的调用方判断 err 是否等于 
// ErrKeyIncorrect 即可,而不用 switch / case 来判断 error 类型。
var ErrKeyIncorrect error = keyIncorrectError(0)
```

使用时用 switch / case 语句来判断是哪种错误:

```go
if err := Foo(); err != nil {
    switch e := err.(type) {
    case *SyntaxError:
        // Do something interesting with e.Line and e.Col.
    case *InternalError:
        // Abort and file an issue.
    default:
        log.Println(e)
    }
}
```

!! Panic

Panic 类似于 C++、Java 或 Python 的异常。抛出一个异常,用 `panic()` 函数:

```go
func foo() int {
    panic("something wrong happened")
    return 0
}
```

panic 是针对 goroutine 的。一旦抛出异常,正常的执行流被中断。如果没有调用 `recover()`,程序会 crash 并且打印出堆栈,像这样:

```
goroutine 11 [running]:
testing.tRunner.func1(0xc420092690)
    /usr/local/go/src/testing/testing.go:711 +0x2d2
panic(0x53f820, 0x594da0)
    /usr/local/go/src/runtime/panic.go:491 +0x283
github.com/yourbasic/bit.(*Set).Max(0xc42000a940, 0x0)
    ../src/github.com/bit/set_math_bits.go:137 +0x89
github.com/yourbasic/bit.TestMax(0xc420092690)
    ../src/github.com/bit/set_test.go:165 +0x337
testing.tRunner(0xc420092690, 0x57f5e8)
    /usr/local/go/src/testing/testing.go:746 +0xd0
created by testing.(*T).Run
    /usr/local/go/src/testing/testing.go:789 +0x2de
```

`GOTRACEBACK` 变量可以控制输出信息的详细程度。

!! 子协程的 panic 并不会被父协程 recover

''这个需要特别注意'':

```go
func say(s string) {
    fmt.Println(s)
    time.Sleep(1000 * time.Millisecond)
    panic("saying panic!")
}

func main() {
    defer func(){
        if p:= recover();p!=nil{
            err := fmt.Errorf("internal error:%v", p)
            fmt.Println(err)
        }
    }()
    go say("world")
    say("hello")
}
```

虽然 `main()` 中有 `recover()`,但是程序仍然会 panic 退出。

!! panic 后的恢复

Go 中唯一能停止 panic 将程序 crash 的方式是,在 [[defer 语句|Golang: Language: Defer]] 中调用 `recover()` 函数:

```go
func main() {
    n := foo()
    fmt.Println("main received", n)
}

func foo() int {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    m := 1
    panic("foo: fail")
    m = 2
    return m
}
```

```
foo: fail
main received 0
```

也可以使用命名返回值(named return value),使得 defer 语句中可以指定返回值:

```go
func main() {
    n := foo()
    fmt.Println("main received", n)
}

func foo() (m int) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
            m = 2
        }
    }()
    m = 1
    panic("foo: fail")
    m = 3
    return m
}
```

```
foo: fail
main received 2
```


!! 参考

* [[3 simple ways to create an error · YourBasic Go|https://yourbasic.org/golang/create-error/]]
* [[Error handling best practice · YourBasic Go|https://yourbasic.org/golang/errors-explained/]]
* [[Panics, stack traces and how to recover [best practice] · YourBasic Go|https://yourbasic.org/golang/recover-from-panic/]]
Go 的 interface 定义了一批函数签名。interface 的字面值是:

```go
interface {
	Abs() float64
}
```

使用 `type` 给它一个名字:

```go
type Abser interface {
	Abs() float64
}
```

一个具体的 interface 类型的变量,需要实现 interface 要求的接口:

<div class="limit-code-block-height">

```go
package main

import (
	"fmt"
	"math"
)

type Abser interface {
	Abs() float64
}

func main() {
	var a Abser
	f := MyFloat(-math.Sqrt2)
	v := Vertex{3, 4}

	a = f  // a MyFloat implements Abser
	a = &v // a *Vertex implements Abser

	// In the following line, v is a Vertex (not *Vertex)
	// and does NOT implement Abser.
	a = v

	fmt.Println(a.Abs())
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
	if f < 0 {
		return float64(-f)
	}
	return float64(f)
}

type Vertex struct {
	X, Y float64
}

func (v *Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
```

</div>

Go 的 interface 不需要显示的指定。不需要说像 Java 一样 Class A implement I。只要 struct 中实现了 interface 要求的接口,struct 的对象即可以赋值给 interface 变量。

Interface 变量的内部实现,可以认为是保存了 `(value, type)`:

<div class="limit-code-block-height">

```go
type I interface {
	say()
}

type S struct {
}

func (s *S) say() {
	if s == nil {
		fmt.Println("<nil>")
	} else {
		fmt.Println("hello")
	}
}

func main() {
	var s1 *S
	var i1 I = s1   // (value, type) => (nil, S)

	s2 := S{}
	var i2 I = &s2  // (value, type) => (&s2, S)

	var i3 I        // (value, type) => (nil, nil)

  // Go 允许调用 struct pointer 的方法,即使 pointer 值为 nil
	i1.say()	// <nil>
	s1.say()	// <nil>

  // 正常使用
	i2.say()	// hello

  // 此时 i3 为 nil,也没有关联的 struct 类型,所以无法调用
	i3.say()	// runtime error
}
```

</div>

Go 允许你在 interface 中不指定任意函数签名,使其为 ''空 interface'':

```go
interface{}
```

空 interface 可以用来容纳任意类型的变量,比如:

```go
func main() {
	var i interface{}
	describe(i)   // (<nil>, <nil>)

	i = 42
	describe(i)   // (42, int)

	i = "hello"
	describe(i)   // (hello, string)
}

func describe(i interface{}) {
	fmt.Printf("(%v, %T)\n", i, i)
}
```

判断一个 interface 的值是什么类型,可以用:

```go
t := i.(T)
t, ok := i.(T)
```

上代码很容易理解:

```go
var i interface{} = "hello"

s := i.(string)
fmt.Println(s)         // hello

s, ok := i.(string)
fmt.Println(s, ok)     // hello true

f, ok := i.(float64)
fmt.Println(f, ok)     // 0 false

f = i.(float64) // panic
fmt.Println(f)
```

也可以用 ''type switch'' 来判断类型:

```go
switch v := i.(type) {
case T:
    // here v has type T
case S:
    // here v has type S
default:
    // no match; here v has the same type as i
}
```

```go
func do(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Printf("Twice %v is %v\n", v, v*2)
	case string:
		fmt.Printf("%q is %v bytes long\n", v, len(v))
	default:
		fmt.Printf("I don't know about type %T!\n", v)
	}
}
```

有个典型的使用场景是 `fmt.Stringer`。它定义了一个函数签名(`func String() string`),实现了这个签名的类型可以被 `fmt` 库在打印时调用(类似于 Python 的 `__str__`):

```go
type IPAddr [4]byte

//String() 实现了,当 fmt 做打印时,IPAddr 的值是以 x.x.x.x 形式输出的
func (ip IPAddr) String() string {
	return fmt.Sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3])
}

func main() {
	hosts := map[string]IPAddr{
		"loopback":  {127, 0, 0, 1},
		"googleDNS": {8, 8, 8, 8},
	}
	for name, ip := range hosts {
		fmt.Printf("%v: %v\n", name, ip)
	}
}
```

```
loopback: 127.0.0.1
googleDNS: 8.8.8.8
```

要注意的是,`String()` 函数的 receiver 不能是指针(即不能是 `*IPAddr`)。这篇 [[文章|https://stackoverflow.com/a/16978611/1189076]] 说明了为什么。
Go 中没有 class,只有 struct。struct 的字面值是:

```go
struct {
    X, Y float64
}
```

你需要用 `type` 给它起个名字:

```go
type Vertex struct {
    X, Y float64
}
```

声明及初始化一个 struct:

```go
//// 使用 struct 字面值
// X, Y 为默认的 0
var s1 struct { X, Y float64 }
// 给 X, Y 赋初值
var s2 struct { X, Y float64 } = struct { X, Y float64 } {1, 2}
// 自动推导类型(省掉类型定义)
var s3 = struct { X, Y float64 } {1, 2}
// 省掉 var
s4 := struct { X, Y float64 } {1, 2}

//// 使用 type 定义的类型能简化书写
var v1 Vertex;
var v2 Vertex = Vertex{1, 2}
var v3 = Vertex{1, 2}
v4 := Vertex{1, 2}
```

struct 是一种值类型,它的默认值不是 `nil`,而是其中各属性的 zero-value 所组成的一个 struct。

定义 struct 的方法(method)是带上一个 receiver 参数(`v Vertex`):

```go
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

// 等同于
func Abs(v Vertex) float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
```

Receiver 参数可以是值(`v Vertex`)也可以是指针(`v *Vertex`)。当是值的时候,会复制一次 Vertex 的值;当是指针时,传的是引用。因此如果你要在方法中修改 struct 的属性,要用指针(''大部分情况下都用指针,避免拷贝''):

<div class="limit-code-block-height">

```go
package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v Vertex) Scale1(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func (v *Vertex) Scale2(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v1 := Vertex{3, 4}
	v1.Scale1(10)
	fmt.Println(v.Abs())  // 5,因为 Scale1 不修改 v1 本身的属性

	v1.Scale2(10)         // 等同于 (&v1).Scale2(10),Go 为了方便隐式做了转换
	fmt.Println(v.Abs())  // 50,因为 Scale2 修改 v1 本身的属性

  v2 := &Vertex{3, 4}   // 等同于 (*v2).Scale2(10),Go 为了方便隐式做了转换
  v2.Scale1(10)         // 仍不改变 v2 本身的属性
  v2.Scale2(10)         // 会改变 v2 本身的属性
}
```

</div>

当你定义了一个指针 receiver 的函数时,即使它的 receiver 为 nil,也一样可以调用(''这点与其他语言非常不一样''):

```go
func (v *Vertex) say() {
	if v == nil {
		fmt.Println("<nil>")
	} else {
		fmt.Println("hello")
	}
}

func main() {
	var v1 *Vertex
	v1.say()
}
```

```
<nil>
```
Variadic Function 表示可以接收不定长个参数的函数。比如:

```go
package main

import "fmt"

func sum(nums ...int) {
    fmt.Print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.Println(total)
}

func main() {

    sum(1, 2)
    sum(1, 2, 3)

    nums := []int{1, 2, 3, 4}
    sum(nums...)
}
```

其中 `sum()` 函数即是 variadic function:

* 不定长的参数的类型用 `...T` 表示,如代码中的 `...int`
* Slice 及 array 可以 unpack(借用 Python 的术语,即 Python 中的 `*l` 操作符)成多个参数
*
下面纪录一些使用过的,觉得顺手的 Go 框架、库。如果找新的库,去这些地方看看:

* [[Awesome Go - Libhunt|https://go.libhunt.com/]]
* [[awesome-go|https://github.com/avelino/awesome-go]]
<<.warning "了解下线程安全部分的内容。">>

Go 自置的 log 库不如 Python 的 logging 强大。社区的 log 库跟内置的 log 库模型类似,但是功能更强。内置库的模型:

* 用 flag 控制大致的输出格式。无法像 Python 一样用格式字符串指定具体格式(如 `%(levelname)s %(asctime)s %(module)s %(message)s`)
* Logger 带一个 Out 属性,`io.Writer` 类型,负责具体内容的输出,比如输出到控制台还是文件,由这个决定
* 没有 log level,但多了强行退出用的 `panic`、`fatal`
* 没有带层级的 logger 体系(比如 `a.b.c` 与 `a.b`)

第三方库,看了 [[libhunt|https://go.libhunt.com/categories/504-logging]] 以及 GitHub 上的库:

* [[Sirupsen/logrus|Golang: Logging: logrus]] 功能强大,推广了 structured logging 概念,但不再做大的更新(求稳定)
* [[uber-go/zap|https://github.com/uber-go/zap]] 及 [[rs/zerolog|https://github.com/rs/zerolog]] 是目前功能和性能都比较好的库

Web 框架也往往有内置的 log 实现。但我看了 echo 的实现,觉得很一般。

''我倾向于使用 rs/zerolog'',它的性能非常好,而且文档比 uber-go/zap 丰富太多。
logrus 模型比内置库复杂一点:

* 多了 formatter 结构,可以输出成多种结构化文本,如 `JSONFormatter`。但是社区还是没有类似 Python 的格式字符串 formatter
* 多了 hook 机制,可以按各消息不同的 loglevel 做逻辑,比如 ERROR 消息写 `error.log`,DEBUG 消息写 `debug.log`
* 可以带 context 输出,`logrus.WithFields()`
* 可以判断 writer 是不是终端,如果是,给漂亮的带颜色输出;否则给普通输出
* 不提供 log rotation 能力

!! 基本用法

参考 [[Github|https://github.com/Sirupsen/logrus]]。

!! 默认 context 参数

```go
logger = logger.WithFields(logrus.Fields{"reqId": requestId, "command": c.Command.Name})
logger.Debugf("...")
logger.Fetalf("...")
```

!! 多个输出端

[[rifflock/lfshook|https://github.com/rifflock/lfshook]] 提供了不同 log level 写不同文件的 hook,可以实现同时输出到文件和 stdout:

```go
l := logrus.New()

ex, _ := os.Executable()
logFile := filepath.Dir(ex) + "/tsf-instance-agent.log"
writer := os.Open(logFile, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0755)

l.Hooks.Add(lfshook.NewHook(
	lfshook.WriterMap{
		logrus.DebugLevel: writer,
	},
	&logrus.TextFormatter{},
))
l.Out = os.Stdout

logger = logrus.NewEntry(l)
```

`l.Out = io.MultiWriter(writer, os.Stdout)` 时,stdout 的带颜色输出就不生效了。logrus 没有原生的支持多 writer(也可能是 Go 内置的 log 库带了节奏)。看看这个 Github [[issue|https://github.com/sirupsen/logrus/issues/230]] 有无新动态。

!! Log Rotation

用 [[lestrrat-go/file-rotatelogs|https://github.com/lestrrat-go/file-rotatelogs]] 实现 log rotation。Log rotation 整合多端输出:

```go
func SetupLogging() {
	l := logrus.New()
	l.SetLevel(logrus.DebugLevel)

	ex, _ := os.Executable()
	logFile := filepath.Dir(ex) + "/tsf-instance-agent.log"

	writer, _ := rotatelogs.New(
		logFile+".%Y%m%d",
		rotatelogs.WithLinkName(logFile),

		rotatelogs.WithMaxAge(time.Hour*24*30),
		rotatelogs.WithRotationTime(time.Hour*24),
	)

	l.Hooks.Add(lfshook.NewHook(
		lfshook.WriterMap{
			logrus.DebugLevel: writer,
		},
		&logrus.TextFormatter{},
	))
	l.Out = os.Stdout

	logger = logrus.NewEntry(l)
}
```
Go 在 1.11 提出了 Go Module 作为 Go 的包管理模式。官方文档在 [[这里|https://github.com/golang/go/wiki/Modules]],Quick Start 在 [[这里|https://github.com/golang/go/wiki/Modules#quick-start]]。

Go 并不强制使用 go module。当在本地磁盘查找一个库时,go 有两种做法:

* ''传统方式'':从 `GOPATH` 或者项目的 `vendor` 目录中寻找
* ''go module 方式'':根据 `go.mod`, `go.sum` 来安装或者寻找包。包放在 `$GOPATH/pkg/mod` 中

推荐的实践是:

```shell
go env -w GO111MODULE=on
go env -w GOPROXY="https://goproxy.cn,direct"
```

设置 `GO111MODULE=on` 使得 go 在任何项目都使用 go module 方式;设置 GOPROXY 为 [[七牛运营的中国镜像|https://goproxy.cn/]],下载速度极快。

!! Daily Workflow

Your typical day-to-day workflow can be:

* `go mod init`
* Add import statements to your `.go` code as needed.
* Standard commands like `go build` or `go test` will automatically add new dependencies as needed to satisfy imports (updating `go.mod` and downloading the new dependencies).
* When needed, more specific versions of dependencies can be chosen with commands such as `go get foo@v1.2.3`, `go get foo@master` (`foo@default` with mercurial), `go get foo@e3702bed2`, or by editing `go.mod` directly.

A brief tour of other common functionality you might use:

* `go list -m all` — View final versions that will be used in a build for all direct and indirect dependencies [[details|https://github.com/golang/go/wiki/Modules#version-selection]]
* `go list -u -m all` — View available minor and patch upgrades for all direct and indirect dependencies [[details|https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies]]
* `go get -u ./...` or `go get -u=patch ./...` (from module root directory) — Update all direct and indirect dependencies to latest minor or patch upgrades (pre-releases are ignored) [[details|https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies]]
* `go build ./...` or `go test ./...` (from module root directory) — Build or test all packages in the module [[details|https://github.com/golang/go/wiki/Modules#how-to-define-a-module]]
* `go mod tidy` — Prune any no-longer-needed dependencies from `go.mod` and add any dependencies needed for other combinations of OS, architecture, and build tags [[details|https://github.com/golang/go/wiki/Modules#how-to-prepare-for-a-release]]
* `replace` directive or `gohack` — Use a fork, local copy or exact version of a dependency [[details|https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive]]
* `go mod vendor` — Optional step to create a `vendor` directory [[details|https://github.com/golang/go/wiki/Modules#how-do-i-use-vendoring-with-modules-is-vendoring-going-away]]

如果你到了一个使用了 go modules 的 go 项目代码,你可以运行 `go mod download` 来下载依赖。

!! Go modules 如何维护一个包的多个版本?

Go modules 不同于传统的 Go 的依赖管理方式,它单独在 `$GOPATH/pkg/mod` 下存放它下载的依赖、缓存等:

```shell
$ cd $GOPATH/pkg/mod
$ tree -L 3   # Show 3 levels in maximum
9fans.net
│   └── go@v0.0.0-20181112161441-237454027057
│       ├── acme
│       ├── draw
│       ├── games
│       ├── LICENSE
│       ├── plan9
│       ├── plumb
│       └── README
├── cache
│   ├── download
│   │   ├── 9fans.net
│   │   ├── github.com
│   │   ├── golang.org
│   │   ├── gopkg.in
│   │   ├── go.starlark.net
│   │   ├── go.uber.org
│   │   ├── rsc.io
│   │   └── sumdb
│   ├── lock
│   └── vcs
│       ├── 020616345f7c7f88438c217f9d0e26744bce721c80e4a28f93399a8a4cd2acf1
│       ├── 020616345f7c7f88438c217f9d0e26744bce721c80e4a28f93399a8a4cd2acf1.info
│       ├── 020616345f7c7f88438c217f9d0e26744bce721c80e4a28f93399a8a4cd2acf1.lock
│       ├── 0ab7c7bc964e6f4054247fed3ac8d636309918420efe8a7cabef12d9f9904311
│       ├── 0ab7c7bc964e6f4054247fed3ac8d636309918420efe8a7cabef12d9f9904311.info
│       └── 0ab7c7bc964e6f4054247fed3ac8d636309918420efe8a7cabef12d9f9904311.lock
└── github.com
    ├── labstack
    │   ├── echo
    │   ├── echo-contrib@v0.9.0
    │   ├── echo@v1.4.4
    │   ├── echo@v3.3.10+incompatible
    │   └── gommon@v0.3.0
    └── mattn
        ├── go-colorable@v0.0.0-20170327083344-ded68f7a9561
        ├── go-colorable@v0.1.6
        ├── go-isatty@v0.0.12
        ├── go-isatty@v0.0.3
        ├── go-sqlite3@v1.13.0
        └── go-sqlite3@v2.0.3+incompatible

```

Go 的博客中有一篇 [[Errors are values|https://blog.golang.org/errors-are-values]] 提到了一种错误处理的 pattern。代码示例如下:

好的例子:

```go
scanner := bufio.NewScanner(input)
for scanner.Scan() {
    token := scanner.Text()
    // process token
}
if err := scanner.Err(); err != nil {
    // process the error
}
```

差的例子:

```go
scanner := bufio.NewScanner(input)
for {
    token, err := scanner.Scan()
    if err != nil {
        return err // or maybe break
    }
    // process token
}
```

即是说,对于处理流式数据的接口,没有必要在每次处理一块数据时去判断错误,因为一旦出现错误,整个处理就结束了;而应该在整套处理结束后(不管是因为数据全部处理完了,还是中途出了错),再去判断有无错误发生。

!! 反例

可惜的是,因为需求不同,`database/sql` 中的接口没有遵循这种模式:

```go
for rows.Next() {
    err := rows.Scan(&id, &name)
    if err != nil {
        log.Fatal(err)
    }
    log.Println(id, name)
}
```

虽然有 `rows.Err()` 函数,但是它是用于在不遍历数据的情况下获得错误信息的。如果要遍历数据,仍然需要判断每次 `rows.Scan()` 的返回值。
Go 里面当遍历一个流式集合时,经常使用 `Next()` `Next____()` 这类 API。

比如 `database/sql` 中的 `Rows` 类,当遍历 SQL 查询结果时,使用 `rows.Next()` 切换到下一条结果集;再使用 `rows.Scan()` 读取数据:

```go
rows, err := db.Query("select id, name from users where id = ?", 1)
for rows.Next() {
	err := rows.Scan(&id, &name)
}
```

`Rows.NextResultSet()` 也是类似的 API 设计。
{{ golang-runtime }}

Go 有自己的运行时,不依赖于 C 运行时(如 glibc,参考 [[C Runtime]])。Go 1.5 实现了自举,之前运行时是用 C 写的。

Go 有自己的运行时,意味着 Go 只要在不同的平台都写一份运行时,就比较好实现跨平台的可移植性。这也支持了 Go 可以在不同平台做 [[交叉编译|Golang: Build]]。

但是 Go 为了做跨语言调用,实现了 cgo 工具,以在 Go 语言中编写 C 代码。同时有些内置库也提供了 cgo 的和非 cgo 的版本。比如 `os/user` 包中,同一个 `lookupUser` 函数有两份实现:

```golang
// cgo 实现,代码在 /usr/lib/go/src/os/user/cgo_lookup_unix.go
// 为了简洁省略了部分代码。留意 mygetpwnam_r 是 C 语言提供的接口
func lookupuser(username string) (*user, error) {
    // ...
    err := retrywithbuffer(buf, func() syscall.errno {
        return syscall.errno(c.mygetpwnam_r((*c.char)(unsafe.pointer(&namec[0])),
            &pwd,
            (*c.char)(buf.ptr),
            c.size_t(buf.size),
            &result))
    })
	// ...
    return builduser(&pwd), err
}

// 纯 go 实现,代码在 /usr/lib/go/src/os/user/lookup_unix.go
func lookupUser(username string) (*User, error) {
    f, err := os.Open(userFile)
    if err != nil {
        return nil, err
    }
    defer f.Close()
    return findUsername(username, f)
}
```

Go 默认用了 cgo 版本,并且内置库预编译了一份在 `$GOROOT` 中,比如上述的函数在 `/usr/lib/go/pkg/linux_amd64/os/user.a` 中。默认使用 cgo 的好处是:

* 编译出来的二进制文件更小
* 编译更快

缺点是:

* 依赖于 glibc,导致不同 Linux 机器上,glibc 版本不一致会带来兼容性问题
* 无法在不用 glibc 的发行版上运行,比如 Apline

可用环境变量 `CGO_ENABLED` 来控制 go 编译时用不用 cgo 版本,详情参考 [[Golang: Build]]。

!! 参考

* [[也谈 Go 的可移植性|https://tonybai.com/2017/06/27/an-intro-about-go-portability/]]
由于 Go 内置的 `net/http` 在 HTTP 处理上已经非常完善,因此做 web 开发有两种模式:

* 使用内置的 `net/http`,搭配各类中间件,比如 [[Gorilla Web Toolkit|https://github.com/gorilla]]、[[urfave/negroni|https://github.com/urfave/negroni]]。优点是灵活度高
* 使用框架,比如 Gin、Echo 等。优点是框架本身 battery include,集成了一批 opinionated 的中间件,比如 router、validator 等

但我认为 Go 在 web 上的生态还是大不如其他语言,没有他们长年的积累。比如 php 的 Lavavel、Python 的 Django 以及 Java 的 Spring Boot 等。如果正经做 web,考虑还是用这些语言和框架。
在编写 web server 中,如果你想最终分发的 web server 二进制文件,也可以内嵌相应的静态页面和模板,那么需要使用 go 的 embed 功能。

我并没有详细看要怎么用它。这篇 [[博客|https://blog.carlmjohnson.net/post/2021/how-to-use-go-embed/]] 提供了非常好的可复制粘贴的代码。
流行的选择有 [[Gin|https://gin-gonic.com/]]、[[Beego|https://beego.me/]]、[[Echo|https://echo.labstack.com/]]、[[Buffalo|https://gobuffalo.io/en/]] 等。

''目前 Gin 最流行。当前(2021/01)我认为最好的选择是 Gin。''

我体验过数个框架,在下面描述体验。

V2EX 上有人 [[认为|https://www.v2ex.com/t/730965#r_9862499]]:

```
echo > gin > beego > net/http > iris / goframe / fiber
```

!! Echo

Echo 是我第一个选择的框架。因为之前有听说 Beego 代码比较差,我担心 Gin 的流行度也是因其先发优势,因而选择了没那么流行但是看起来也不错的 Echo。但实际用下来感觉 ''不如人意'':

* 文档不够详细,比如我要做 validation,我需要去翻阅 [[validator|https://github.com/go-playground/validator]] 本身的文档,增加了时间。一样是用 validator 库,Gin 在文档上好一些,节约了时间
* Router 在实现上不支持参数的简单校验。比如你只能设置一个 `/users/:id` 的 pattern,但是没法要求 ID 必须是数字;Gin 虽然也不支持直接设置 route param 的校验,但是有 `ShouldBindUri` 可以做校验
* Echo 的 `echo.Context.Bind()` 不太合理,即处理 route param,又处理 body,这使得一些情况不好处理:<div>

你有一个路由 pattern:`/users/:id`,你想使用 `PUT /users/1` 修改用户信息。代码类似:

```go
type User struct {
	ID   int    `json:"id"`
	Name string `json:"name" validate:"required"`
}

func modifyUser(c echo.Context) error {
	user := User{}
	if err := c.Bind(&user); err != nil {
		return err
	}
}
```

此时如果你的 body 是:

```json
{
  "id": 2
  "name": "P"
}
```

那么 `c.Bind()` 得到的 `id` 是 2 而不是 1。这在我看来很糟糕,把路由参数和 body 的参数混杂在一起。

</div>

!! Buffalo

Buffalo 是我在对 Echo 失望后第一个去了解的框架。Buffalo 和 Gin 都是走大而全路线。Buffalo 的 ''文档让我觉得一般'',而且它的 ORM 是自制的,我怀疑它有没有能力做得很好。网上有文章表示 Buffalo is a mess。

我认为 Buffalo 与 Gin 定位相同,但流行度大不如 Gin,所以没必要用 Buffalo 而应该用 Gin。
Router:

* [[julienschmidt/httprouter|https://github.com/julienschmidt/httprouter]]:据作者自己做的 [[benchmark|https://github.com/julienschmidt/go-http-routing-benchmark]],它的性能非常好,远超下面的 gorilla/mux
* [[gorilla/mux|https://github.com/gorilla/mux]]

其他中间件:

* [[Gorilla Web Toolkit|https://github.com/gorilla]]
* [[urfave/negroni|https://github.com/urfave/negroni]]








<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="255.9102" y1="428.7752" x2="255.9102" y2="116.3116" class="gradient-element">
	<stop offset="0" class="primary-color-gradient" style="stop-color: #FCCF31"></stop>
	<stop offset="1" class="secondary-color-gradient" style="stop-color: #F55555"></stop>
</linearGradient>
<path fill="url(#SVGID_1_)" d="M425.8,392.9c-41.5-7.2-83.5-6.3-117.2,4.1l-50.5,25.5v-4.9h-6.9V416h-5.6
	c-44.7-26.9-97.8-34.7-159.5-23.1v-28.7c0-29.4,23.8-53.2,53.2-53.2H222c14.2,0,26.3,8.8,31.2,21.2h6.9v13.3
	c6.8-24.6,29.3-42.6,56.1-42.6h0c8.9,0,16.1-7.2,16.1-16.1V158.3c0-29.9,24.3-54.2,54.2-54.2h39.2V346L425.8,392.9z"></path>
<path d="M482.7,178.8H378.1c-4.4,0-8,3.6-8,8s3.6,8,8,8h39.6v188.6c-58.5-9.2-110-1-153.6,24.6V138.1
	c42.5-27.9,94.1-37.1,153.6-27.2v45.9c0,4.4,3.6,8,8,8c0.8,0,1.6-0.1,2.3-0.3c0.7,0.2,1.5,0.3,2.3,0.3h43c4.4,0,8-3.6,8-8
	s-3.6-8-8-8H469v-14.2c0-4.4-3.6-8-8-8s-8,3.6-8,8v14.2h-19.2v-44.6c0-3.9-2.7-7.2-6.5-7.9c-66.2-12.4-123.8-2.9-171.3,28.1
	c-47.5-31-105.1-40.5-171.3-28.1c-3.8,0.7-6.5,4-6.5,7.9v22.4H50.3c-4.4,0-8,3.6-8,8v287.8c0,4.4,3.6,8,8,8h203.6
	c0.6,0.1,1.2,0.2,1.7,0.2c0.1,0,0.2,0,0.3,0c0.1,0,0.2,0,0.3,0c0.6,0,1.2-0.1,1.7-0.2H461c4.4,0,8-3.6,8-8V194.8h13.8
	c4.4,0,8-3.6,8-8S487.2,178.8,482.7,178.8z M58.3,142.5H78V366c0,4.4,3.6,8,8,8s8-3.6,8-8V110.9c59.5-9.8,111.1-0.7,153.6,27.2V408
	c-45.9-26.9-100.7-34.7-163.1-23c-4.3,0.8-7.2,5-6.4,9.3c0.8,4.3,5,7.2,9.3,6.4c52.1-9.8,98.4-5.2,137.9,13.6H58.3V142.5z
	 M453,414.4H286.4c39.5-18.8,85.8-23.4,137.9-13.6c2.3,0.4,4.8-0.2,6.6-1.7c1.8-1.5,2.9-3.8,2.9-6.2V194.8H453V414.4z"></path>
<path fill="#FCCF31" class="primary-color" d="M80.7,19.7L19.8,80.7V19.7H80.7z"></path>
<path d="M483.7,50.2c0,4.4-3.6,8-8,8h-15.8V74c0,4.4-3.6,8-8,8s-8-3.6-8-8V58.2h-15.8c-4.4,0-8-3.6-8-8s3.6-8,8-8h15.8V26.4
	c0-4.4,3.6-8,8-8s8,3.6,8,8v15.8h15.8C480.1,42.2,483.7,45.8,483.7,50.2z M30.6,462.1c-5.9,0-10.8,4.8-10.8,10.8s4.8,10.8,10.8,10.8
	s10.8-4.8,10.8-10.8S36.5,462.1,30.6,462.1z M228.4,26.7C213.9,26.7,202,38.5,202,53c0,4.4,3.6,8,8,8s8-3.6,8-8
	c0-5.7,4.7-10.4,10.4-10.4s10.4,4.7,10.4,10.4c0,4.4,3.6,8,8,8s8-3.6,8-8C254.8,38.5,243,26.7,228.4,26.7z"></path>
</svg>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="99.2515" y1="282.3497" x2="408.2476" y2="282.3497" class="gradient-element">
	<stop offset="0" class="primary-color-gradient" style="stop-color: #FCCF31"></stop>
	<stop offset="1" class="secondary-color-gradient" style="stop-color: #F55555"></stop>
</linearGradient>
<path fill="url(#SVGID_1_)" d="M256.4,448.3l-99.8-10.5c-15.9,0-30.2-6.4-40.6-16.8c-10.3-10.2-16.7-24.4-16.8-40.1
	c-0.3-31.9,26.6-42.3,58.4-42.3l98.9,2.4c34.4,0,62.4-50.1,62.4-84.5v-78.3c0-34.4,27.9-51.4,62.4-51.4l26.9-11v268.7
	c0,27.2-22,49.2-49.2,63.9H256.4z M256.4,448.9"></path>
<path d="M256.4,456.9c-57.1,0-94.1-8.4-115.2-15.5c-16.4-5.5-43.8-17.3-43.8-34.5V113.6c0-1.3,0.3-2.4,0.8-3.5
	c-0.5-1.6-0.8-3.3-0.8-5.1c0-17.2,27.4-29,43.8-34.5c21-7.1,58.1-15.5,115.2-15.5c57.1,0,94.1,8.4,115.2,15.5
	C388,76,415.4,87.8,415.4,105s-27.4,29-43.8,34.5c-21,7.1-58.1,15.5-115.2,15.5c-57.1,0-94.1-8.4-115.2-15.5
	c-8.1-2.7-18.9-7-27.8-12.7v78.9c0.3,1.8,7.5,11,35.2,19.9c19.9,6.4,54.7,14,107.8,14c53,0,87.9-7.6,107.8-14
	c27.5-8.9,34.8-18,35.2-19.9v-58.7c0-4.4,3.6-8,8-8s8,3.6,8,8v159.5c0,0.1,0,0.1,0,0.2c-0.4,17-28.1,28.7-44.5,34.2
	c-21.1,7-58.1,15.4-114.4,15.4c-56.3,0-93.3-8.4-114.4-15.4c-8.3-2.8-19.5-7.1-28.5-12.9v79c0.2,1.7,7.2,10.9,34.5,19.8
	c19.8,6.4,54.7,14.1,108.5,14.1s88.7-7.7,108.5-14.1c27.3-8.9,34.2-18.1,34.5-19.9l0-58.7c0-4.4,3.6-8,8-8s8,3.6,8,8V407
	c0,17.2-27.4,29-43.8,34.5C350.6,448.5,313.5,456.9,256.4,456.9z M113.5,306.3c0.3,1.8,7.5,11,35.2,19.9c19.9,6.4,54.7,14,107.8,14
	c53,0,87.9-7.6,107.8-14c27.5-8.9,34.8-18,35.2-19.9v-79c-9.1,5.8-20.2,10.2-28.5,12.9c-21.1,7-58.1,15.4-114.4,15.4
	c-56.3,0-93.3-8.4-114.4-15.4c-8.3-2.8-19.5-7.1-28.5-12.9V306.3z M113.5,105c0.4,1.9,7.5,11,34.5,19.8
	c19.8,6.4,54.7,14.1,108.5,14.1s88.7-7.7,108.5-14.1c27-8.8,34.1-17.9,34.5-19.8c-0.4-1.9-7.5-11-34.5-19.8
	c-19.8-6.4-54.7-14.1-108.5-14.1S167.8,78.7,148,85.2C121,94,113.9,103.1,113.5,105z"></path>
<path fill="#000000" d="M463.9,252.6c0,4.4-3.6,8-8,8h-43c-4.4,0-8-3.6-8-8s3.6-8,8-8h43C460.3,244.6,463.9,248.2,463.9,252.6z
	 M434.4,274.6h-73.8c-4.4,0-8,3.6-8,8s3.6,8,8,8h73.8c4.4,0,8-3.6,8-8S438.8,274.6,434.4,274.6z M483.5,53h-15.8V37.2
	c0-4.4-3.6-8-8-8s-8,3.6-8,8V53H436c-4.4,0-8,3.6-8,8s3.6,8,8,8h15.8v15.8c0,4.4,3.6,8,8,8s8-3.6,8-8V69h15.8c4.4,0,8-3.6,8-8
	S487.9,53,483.5,53z M54.8,64h-3.9v-3.9c0-4.4-3.6-8-8-8s-8,3.6-8,8V64H31c-4.4,0-8,3.6-8,8s3.6,8,8,8h3.9v3.9c0,4.4,3.6,8,8,8
	s8-3.6,8-8V80h3.9c4.4,0,8-3.6,8-8S59.2,64,54.8,64z M50.2,203.2c-5.9,0-10.8,4.8-10.8,10.8s4.8,10.8,10.8,10.8s10.8-4.8,10.8-10.8
	S56.1,203.2,50.2,203.2z M50.2,273.2c-5.9,0-10.8,4.8-10.8,10.8s4.8,10.8,10.8,10.8s10.8-4.8,10.8-10.8S56.1,273.2,50.2,273.2z
	 M50.2,334.2c-5.9,0-10.8,4.8-10.8,10.8s4.8,10.8,10.8,10.8s10.8-4.8,10.8-10.8S56.1,334.2,50.2,334.2z"></path>
<path fill="#FCCF31" class="primary-color" d="M458.4,429.2v-34.7H493v34.7H458.4z M493,481.4v-34.7h-34.7v34.7H493z M439.7,481.4v-34.7h-34.7v34.7H439.7z
	"></path>
</svg>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="399.3633" y1="493.958" x2="399.3633" y2="144.395" class="gradient-element">
	<stop offset="0" class="primary-color-gradient" style="stop-color: #FCCF31"></stop>
	<stop offset="1" class="secondary-color-gradient" style="stop-color: #F55555"></stop>
</linearGradient>
<path fill="url(#SVGID_1_)" d="M349.8,120c-0.4,0-0.7,0-1.1,0c-5.8,0.1-7.4,7.9-2.2,10.3c39.8,18.2,67.6,58.4,67.6,104.9
	c0,24.2-7.4,47.3-21.5,67c-4.5,6.3-9.4,12.1-14.2,17.7c-14.6,17.1-27.2,31.9-27.2,60v52.4c0,16.5-4.4,29.1-13.3,38.6
	c-0.1,0.1-0.3,0.3-0.4,0.4c-6.6,6.7-4.6,18,4,21.7c3.1,1.3,5.9,2.1,8.2,2.1c11.3,0,33.5-18.4,39-24.2c9-9.5,13.3-22.1,13.3-38.6
	v-52.4c0-28.1,12.6-42.9,27.2-60c4.7-5.6,9.6-11.3,14.2-17.7c14.1-19.8,21.6-43.1,21.5-67.5C464.8,171,413.6,120,349.8,120z"></path>
<path d="M349.8,112c-67.9,0-123.2,55.3-123.2,123.2c0,25.9,7.9,50.7,23,71.6c4.8,6.7,10,12.8,14.6,18.2
	c14.1,16.6,25.3,29.7,25.3,54.9v52.4c0,18.6,5.1,33.1,15.5,44.1c3.9,4.2,28.9,26.7,44.9,26.7c16,0,40.9-22.6,44.8-26.7
	c10.4-11,15.5-25.5,15.5-44.1v-52.4c0-0.3,0-0.6,0-1c0.1-0.5,0.2-1.1,0.2-1.6c0-0.4,0-0.8-0.1-1.1c1.1-22.7,11.8-35.4,25.2-51.1
	l0.1-0.2c4.8-5.6,9.8-11.5,14.4-18c15-21,23-45.8,23-71.6C473.1,167.3,417.8,112,349.8,112z M437.1,297.5c-4.3,6-9,11.6-13.6,17
	l-0.1,0.2c-13.2,15.5-25.7,30.2-28.5,54.6h-44.5c-4.4,0-8,3.6-8,8s3.6,8,8,8h43.9v47c0,0.4,0,0.8,0,1.2h-43.9c-4.4,0-8,3.6-8,8
	s3.6,8,8,8H392c-1.8,6.3-4.8,11.6-8.9,15.9c-6.8,7.2-26.4,21.7-33.2,21.7c-6.8,0-26.5-14.6-33.2-21.7c-7.5-7.9-11.1-18.8-11.1-33.1
	v-52.4c0-31.1-14.2-47.7-29.1-65.3c-4.6-5.4-9.4-11-13.8-17.1c-13.1-18.3-20-39.8-20-62.3c0-59.1,48.1-107.2,107.2-107.2
	s107.2,48.1,107.2,107.2C457.1,257.7,450.2,279.3,437.1,297.5z M203.3,265.5c0,4.4-3.6,8-8,8h-67.8c-4.4,0-8-3.6-8-8s3.6-8,8-8h67.8
	C199.7,257.5,203.3,261.1,203.3,265.5z M504.7,120.6l-18.9,18.9c-1.6,1.6-3.6,2.3-5.7,2.3s-4.1-0.8-5.7-2.3c-3.1-3.1-3.1-8.2,0-11.3
	l18.9-18.9c3.1-3.1,8.2-3.1,11.3,0C507.8,112.4,507.8,117.5,504.7,120.6z M225.8,135c-1.6,1.6-3.6,2.3-5.7,2.3s-4.1-0.8-5.7-2.3
	l-47.9-47.9c-3.1-3.1-3.1-8.2,0-11.3c3.1-3.1,8.2-3.1,11.3,0l47.9,47.9C228.9,126.8,228.9,131.9,225.8,135z M500.8,407.7
	c3.1,3.1,3.1,8.2,0,11.3c-1.6,1.6-3.6,2.3-5.7,2.3c-2,0-4.1-0.8-5.7-2.3L460,389.5c-3.1-3.1-3.1-8.2,0-11.3c3.1-3.1,8.2-3.1,11.3,0
	L500.8,407.7z M341.8,82.6V14.8c0-4.4,3.6-8,8-8s8,3.6,8,8v67.8c0,4.4-3.6,8-8,8S341.8,87,341.8,82.6z"></path>
<path d="M154.6,440.2c-4.9-1.1-9.7,2-10.7,6.9c-1.1,4.9,2,9.7,6.9,10.7c0.6,0.1,1.3,0.2,1.9,0.2c1.7,0,3.4-0.5,4.9-1.4
	c2-1.3,3.4-3.3,3.9-5.7c0.5-2.4,0.1-4.8-1.2-6.8C159,442.1,157,440.7,154.6,440.2z M275.1,67c-4.9-1.1-9.7,2-10.7,6.9
	c-1.1,4.9,2,9.7,6.9,10.7c0.6,0.1,1.3,0.2,1.9,0.2c4.2,0,7.9-2.9,8.8-7.1C283.1,72.9,280,68.1,275.1,67z M41.6,274.3
	c0.6,0.1,1.3,0.2,1.9,0.2c1.7,0,3.4-0.5,4.9-1.4c2-1.3,3.4-3.3,3.9-5.7c0.5-2.4,0.1-4.8-1.2-6.8c-1.3-2-3.3-3.4-5.7-3.9
	c-4.9-1.1-9.7,2-10.7,6.9C33.6,268.4,36.7,273.3,41.6,274.3z M199.7,194.9c2-1.3,3.4-3.3,3.9-5.7c1.1-4.9-2-9.7-6.9-10.7
	c-2.4-0.5-4.8-0.1-6.8,1.2c-2,1.3-3.4,3.3-3.9,5.7c-0.5,2.4-0.1,4.8,1.2,6.8c1.3,2,3.3,3.4,5.7,3.9c0.6,0.1,1.3,0.2,1.9,0.2
	C196.5,196.3,198.2,195.8,199.7,194.9z M130.3,394.4c0,4.4-3.6,8-8,8c-11.4,0-20.8,9.3-20.8,20.8c0,4.4-3.6,8-8,8s-8-3.6-8-8
	c0-20.3,16.5-36.8,36.8-36.8C126.7,386.4,130.3,390,130.3,394.4z M80.3,423.2c0,4.4-3.6,8-8,8s-8-3.6-8-8c0-11.4-9.3-20.8-20.8-20.8
	c-4.4,0-8-3.6-8-8s3.6-8,8-8C63.8,386.4,80.3,402.9,80.3,423.2z M80.3,344.4c0,20.3-16.5,36.8-36.8,36.8c-4.4,0-8-3.6-8-8s3.6-8,8-8
	c11.4,0,20.8-9.3,20.8-20.8c0-4.4,3.6-8,8-8S80.3,340,80.3,344.4z M130.3,373.2c0,4.4-3.6,8-8,8c-20.3,0-36.8-16.5-36.8-36.8
	c0-4.4,3.6-8,8-8s8,3.6,8,8c0,11.4,9.3,20.8,20.8,20.8C126.7,365.2,130.3,368.8,130.3,373.2z M54.4,145l11.2-11.2l-11.2-11.2
	c-3.1-3.1-3.1-8.2,0-11.3c3.1-3.1,8.2-3.1,11.3,0l11.2,11.2L88,111.4c3.1-3.1,8.2-3.1,11.3,0c3.1,3.1,3.1,8.2,0,11.3l-11.2,11.2
	L99.3,145c3.1,3.1,3.1,8.2,0,11.3c-1.6,1.6-3.6,2.3-5.7,2.3s-4.1-0.8-5.7-2.3l-11.2-11.2l-11.2,11.2c-1.6,1.6-3.6,2.3-5.7,2.3
	c-2,0-4.1-0.8-5.7-2.3C51.3,153.2,51.3,148.1,54.4,145z M469.4,54.2c0,4.4-3.6,8-8,8h-3.9v3.9c0,4.4-3.6,8-8,8s-8-3.6-8-8v-3.9h-3.9
	c-4.4,0-8-3.6-8-8s3.6-8,8-8h3.9v-3.9c0-4.4,3.6-8,8-8s8,3.6,8,8v3.9h3.9C465.8,46.2,469.4,49.7,469.4,54.2z M234,358.8
	c0,4.4-3.6,8-8,8h-3.9v3.9c0,4.4-3.6,8-8,8s-8-3.6-8-8v-3.9h-3.9c-4.4,0-8-3.6-8-8s3.6-8,8-8h3.9v-3.9c0-4.4,3.6-8,8-8s8,3.6,8,8
	v3.9h3.9C230.5,350.8,234,354.4,234,358.8z"></path>
<g>
	<path fill="#F55555" class="secondary-color" d="M9.4,48.7V26.9h250v21.8H9.4z M259.4,495.1v-21.8H9.4v21.8H259.4z"></path>
	<path fill="#FCCF31" class="primary-color" d="M197.5,453.7l60.9-60.9v60.9H197.5z"></path>
</g>
</svg>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="108.1718" y1="278.612" x2="433.008" y2="278.612" class="gradient-element">
	<stop offset="0" class="primary-color-gradient" style="stop-color: #FCCF31"></stop>
	<stop offset="1" class="secondary-color-gradient" style="stop-color: #F55555"></stop>
</linearGradient>
<path fill="url(#SVGID_1_)" d="M338.2,343.4l-6.7,26.7l57.8,57.8c-11.9,6.5-25.6,10.3-40.2,10.3c-46.2,0-83.9-37.6-83.9-83.9
	c0-0.1,0-0.1,0-0.2c0-8.3,7.6-14.3,15.8-12.9c10.2,1.8,22-4.4,23.3-29.3c2-38.1,44.8-41.5,44.8-41.5c46.2,0,83.9,37.6,83.9,83.9
	c0,14.6-3.7,28.3-10.3,40.2l-57.8-57.8L338.2,343.4z M271,288c-8.1-8.1-21.1-8.6-29.7-1.1L115.8,395.4c-11.5,9.9-9.8,28.3,3.3,35.8
	c18.8,10.8,46,17.4,70-11.3c41.9-50,57.9-66.7,71.3-97.9c13.4-31.2,13.4-31.2,13.4-31.2L271,288z M419.7,120.1l-5.3-3.4l-52.2,51.4
	l21.7,23.6L419.7,120.1z"></path>
<path d="M71,168c0-15.4,3.9-30.6,11.2-44c1.2-2.2,3.4-3.7,5.9-4.1c2.5-0.4,5,0.5,6.8,2.3l54.6,54.6l17.7-4.4l4.4-17.7L117,100.1
	c-1.8-1.8-2.6-4.3-2.3-6.8c0.4-2.5,1.9-4.7,4.1-5.9c13.4-7.4,28.7-11.2,44-11.2c50.6,0,91.9,41.2,91.9,91.9c0,6.2-0.7,12.4-2,18.8
	l14.3,14.3c3.1,3.1,3.1,8.2,0,11.3c-3.1,3.1-8.2,3.1-11.3,0l-17.5-17.5c-2-2-2.8-4.9-2.1-7.7c1.7-6.5,2.6-13,2.6-19.2
	c0-41.8-34-75.9-75.9-75.9c-9,0-18,1.6-26.4,4.7l49.7,49.7c2,2,2.8,4.9,2.1,7.6l-6.7,26.7c-0.7,2.9-3,5.1-5.8,5.8l-26.7,6.7
	c-2.7,0.7-5.6-0.1-7.6-2.1l-49.7-49.7C88.6,150,87,159,87,168c0,41.8,34,75.9,75.9,75.9c4.4,0,8,3.6,8,8s-3.6,8-8,8
	C112.2,259.9,71,218.7,71,168z M349.2,262.5c-4.4,0-8,3.6-8,8s3.6,8,8,8c41.8,0,75.9,34,75.9,75.9c0,9-1.6,18-4.7,26.4l-49.7-49.7
	c-2-2-4.9-2.8-7.6-2.1l-26.7,6.7c-2.9,0.7-5.1,3-5.8,5.8l-6.7,26.7c-0.7,2.7,0.1,5.6,2.1,7.6l49.7,49.7c-8.4,3.1-17.4,4.7-26.4,4.7
	c-41.8,0-75.9-34-75.9-75.9c0-4.4-3.6-8-8-8s-8,3.6-8,8c0,50.6,41.2,91.9,91.9,91.9c15.4,0,30.6-3.9,44-11.2
	c2.2-1.2,3.7-3.4,4.1-5.9s-0.5-5-2.3-6.8l-54.6-54.6l4.4-17.7l17.7-4.4l54.6,54.6c1.8,1.8,4.3,2.6,6.8,2.3c2.5-0.4,4.7-1.9,5.9-4.1
	c7.4-13.4,11.2-28.7,11.2-44C441,303.7,399.8,262.5,349.2,262.5z M281.5,293.3c0.9-2.9,0.2-6-2-8.1L268,273.6l24.5-24.5l29.1,29.1
	c1.6,1.6,3.6,2.3,5.7,2.3s4.1-0.8,5.7-2.3c3.1-3.1,3.1-8.2,0-11.3l-29.1-29.1l58.5-58.5l16.7,16.6c1.8,1.8,4.4,2.6,6.9,2.2
	c2.5-0.4,4.7-2,5.9-4.3l35.1-70.2c1.5-3.1,0.9-6.8-1.5-9.2l-22.6-22.6c-2.4-2.4-6.2-3-9.2-1.5l-70.3,35.1c-2.3,1.1-3.9,3.3-4.3,5.9
	c-0.4,2.5,0.4,5.1,2.2,6.9l16.7,16.7l-94.2,94.2L232,237.5c-2.2-2.2-5.3-2.9-8.2-1.9l-5.5,1.9c-11.6,3.9-30.4,13.4-49.2,24.9
	c-2.1,1.3-3.5,3.4-3.8,5.9s0.6,4.9,2.3,6.6l61.3,61.3c3.1,3.1,8.2,3.1,11.3,0c3.1-3.1,3.1-8.2,0-11.3l-54-54
	c17.1-9.9,30.2-15.8,37.2-18.2l0.8-0.3l13.7,13.8c1.5,1.5,3.5,2.4,5.7,2.4c0,0,0,0,0,0c2.1,0,4.2-0.8,5.7-2.3l105.5-105.5
	c1.5-1.5,2.3-3.5,2.3-5.7c0-2.1-0.8-4.2-2.3-5.7l-14.5-14.5l55.3-27.6l14.5,14.5l-27.6,55.2l-14.5-14.5c-3.1-3.1-8.2-3.1-11.3,0
	L251,268c-1.5,1.5-2.3,3.5-2.3,5.7s0.8,4.2,2.3,5.7l13.8,13.8l-0.2,0.8c-7.2,21.5-39.5,79.2-78.3,117.9
	c-10.6,10.7-22.2,16.7-34.5,17.8c0,0-0.1,0-0.1,0c-2.6,0.3-5.5,0.3-8.8,0c-4.1-0.4-8.2-1.2-12.3-2.6c-14.9-5-25.2-15.1-25.3-15.2
	c-0.1-0.1-0.3-0.2-0.4-0.4c-0.6-0.7-1.6-1.8-2.8-3.4c-0.1-0.1-0.1-0.2-0.2-0.2c-1-1.2-2.2-2.8-3.5-4.7c-5-7.5-11-19.4-11-33.2
	c0-14,6-27.1,17.9-39c18.8-18.8,40.9-34.8,56.1-44.8c3.7-2.4,4.7-7.4,2.3-11.1c-2.4-3.7-7.4-4.7-11.1-2.3
	c-15.8,10.5-38.9,27.1-58.6,46.9c-15,15-22.6,31.9-22.6,50.3c0,17.8,7.5,32.7,13.8,42.2c1.6,2.3,3,4.2,4.3,5.8
	c1.6,2.1,3,3.7,3.7,4.4l0.1,0.2c0.4,0.6,1,1.1,1.5,1.5c3.2,3,14.5,12.9,30.7,18.3c5.2,1.8,10.6,2.9,15.9,3.4
	c2.1,0.2,4.2,0.3,6.1,0.3c2,0,3.9-0.1,5.7-0.3c16.1-1.5,31-9,44.3-22.4c40.6-40.5,74.5-101.4,82.2-124.2L281.5,293.3z"></path>
<path d="M288.1,26.4c0,20.3-16.5,36.8-36.8,36.8c-4.4,0-8-3.6-8-8s3.6-8,8-8c11.4,0,20.8-9.3,20.8-20.8c0-4.4,3.6-8,8-8
	C284.5,18.4,288.1,22,288.1,26.4z M330.1,47.1c-11.4,0-20.8-9.3-20.8-20.8c0-4.4-3.6-8-8-8c-4.4,0-8,3.6-8,8
	c0,20.3,16.5,36.8,36.8,36.8c4.4,0,8-3.6,8-8S334.5,47.1,330.1,47.1z M330.1,68.4c-20.3,0-36.8,16.5-36.8,36.8c0,4.4,3.6,8,8,8
	c4.4,0,8-3.6,8-8c0-11.4,9.3-20.8,20.8-20.8c4.4,0,8-3.6,8-8S334.5,68.4,330.1,68.4z M251.4,68.4c-4.4,0-8,3.6-8,8s3.6,8,8,8
	c11.4,0,20.8,9.3,20.8,20.8c0,4.4,3.6,8,8,8c4.4,0,8-3.6,8-8C288.1,84.9,271.6,68.4,251.4,68.4z M475.6,204h-15.8v-15.8
	c0-4.4-3.6-8-8-8s-8,3.6-8,8V204h-15.8c-4.4,0-8,3.6-8,8s3.6,8,8,8h15.8v15.8c0,4.4,3.6,8,8,8s8-3.6,8-8V220h15.8c4.4,0,8-3.6,8-8
	S480.1,204,475.6,204z M458.5,437.2h-3.9v-3.9c0-4.4-3.6-8-8-8s-8,3.6-8,8v3.9h-3.9c-4.4,0-8,3.6-8,8s3.6,8,8,8h3.9v3.9
	c0,4.4,3.6,8,8,8s8-3.6,8-8v-3.9h3.9c4.4,0,8-3.6,8-8S462.9,437.2,458.5,437.2z M61.7,259.6h-3.9v-3.9c0-4.4-3.6-8-8-8s-8,3.6-8,8
	v3.9H38c-4.4,0-8,3.6-8,8s3.6,8,8,8h3.9v3.9c0,4.4,3.6,8,8,8s8-3.6,8-8v-3.9h3.9c4.4,0,8-3.6,8-8S66.2,259.6,61.7,259.6z"></path>
<g>
	<path fill="#FCCF31" class="primary-color" d="M53.9,61.8H19.3V27.2h34.7V61.8z M109.2,27.2H74.5v34.7h34.7V27.2z M477.2,159.6H499v-56.9h-21.8V159.6z
		 M367,25.8v21.8h56.9V25.8H367z"></path>
	<path fill="#F55555" class="secondary-color" d="M499,25.8v1.8v20v36.9h-21.8V47.6h-35.1V25.8H499z M21.4,475.1V488h237.1v-12.9H21.4z"></path>
</g>
</svg>

图形图像创作。包括矢量图,非矢量图等等。

常用的工具有:

* Adobe Photoshop
* Adobe Illustrator
* GIMP (free, open source; gimp.org)
* Corel PaintShop Pro (for photo editing; paintshoppro.com; Windows only)
* Corel Draw (for vector drawing; coreldraw.com; Windows only)
* Pixelmator (pixelmator.com; Mac only)

浏览器 based:

* SumoPaint (sumopaint.com)
* Pixlr (pixlr.com)
[[gRPC|https://grpc.io/]] 是 Google 出品的 RPC 框架。

文档看这几处:

* [[官网|https://grpc.io/docs/]]:比较简单的原理和入门文档
* GitHub 上的 grpc [[文档|https://github.com/grpc/grpc/tree/master/doc]]
* 各语言实现的文档,比如 grpc-go 的 [[文档|https://github.com/grpc/grpc-go/tree/master/Documentation]]

!! 特点

* 使用 [[Protobuf]] 作为编解码格式(虽然也可以换成其他)
* 调用过程可异步也可同步,具体看各语言的 gRPC 库支持
* 可一发一收,也可多发多收
* 请求中可携带自定义的原信息(metadata)

gRPC 底层默认用了 HTTP 2。一些具体的功能点,比如认证(authentication)、压缩等,未深入研究。
这个网站是我使用 Tiddlywiki 搭建的个人知识库。

使用方法有几种:

* [[Development]] 页放了编程相关的技能点
* 在侧边栏的 Contents 页,是整个 Wiki 的 TOC,你可以顺着它的目录结构了解大致的内容
** 点进去每个分类节点,可以知道这个分类的内容是怎样的,它跟其他相似的分类是怎样区分内容的
** 内容主要在 [[Development]], [[Reading]], [[Productivity]] 中
* 在侧边栏的 Recent 页,可以看到最近新增的内容

如果你也有兴趣搭建一个类似的 Wiki,可以参考 [[TiddlyWiki]] 中的经验。

!! 统计

|!总条目数 |<$count filter="[!is[system]!is[image]]"/> |
|!2021 年 |<$count filter="[!is[system]!is[image]get[created]compare:integer:gteq[20210000000000000]compare:integer:lt[20220000000000000]]"/> |
|!2020 年 |<$count filter="[!is[system]!is[image]get[created]compare:integer:gteq[20200000000000000]compare:integer:lt[20210000000000000]]"/> |
|!2019 年 |<$count filter="[!is[system]!is[image]get[created]compare:integer:gteq[20190000000000000]compare:integer:lt[20200000000000000]]"/> |
|!2018 年 |<$count filter="[!is[system]!is[image]get[created]compare:integer:gteq[20180000000000000]compare:integer:lt[20190000000000000]]"/> |
|!2017 年 |<$count filter="[!is[system]!is[image]get[created]compare:integer:gteq[20170000000000000]compare:integer:lt[20180000000000000]]"/> |
|!2016 年 |<$count filter="[!is[system]!is[image]get[created]compare:integer:gteq[20160000000000000]compare:integer:lt[20170000000000000]]"/> |

按时间排序的所有条目见 [[这里|TiddlyWiki: All Tiddlers sort by Date]]。
! Harvard Positive Psychology 1504

|!Name |Harvard Positive Psychology 1504 |
|!Instructor |Tal Ben-Shahar |
|!Platform |[[Netease Open Course|http://open.163.com/special/opencourse/positivepsychology.html]] |
|!Official Site |[[Harvard|https://positivepsychologyprogram.com/harvard-positive-psychology-course-1504/#positive-psychology-harvard-lecture]] |
|!Slides |[[SlideShare|https://www.slideshare.net/dadalaolang/presentations]], and in Dropbox as well |

哈佛大学的幸福课,在网易公开课上看了视频。课程的内容可以通过看 Dropbox 上的 slides 回顾,幻灯片写得很详细了。Wiki 上主要纪录一些觉得核心的点。

这个课讲的内容可能你都懂,但是你不一定在日常中有执行起来。看视频的''意义''是,你能感受到 Tal 的激情和感染力,有助于将他的理念落实应用下来。

! Lecture 1

这节重复提到了留白(silence)的作用:"Silence gives us a chance to reflect on what we have said and heard"。适当的安静的环境能够帮助你更好的自省(self-reflection)。我在之前的一些个人经历上,也有类似的体会。摆脱不停吸收信息的状态,给自己留一些空白的时刻,往往有意想不到的效果。比如在忙碌的上班后花上半小时去安静地跑步。

自我实现的英文是 "self-actualization"。这门课通俗来说,是在教你成为最好的自己。

transformation 与 information 一样重要:

* transformation: the right question, information: the answer。有时候提好问题更重要。
* 仅有信息是不够的,要把它加工成自己可应用的知识

! Lecture 2

心理学对消极部分的研究,如生气、焦虑等,远远多于积极部分。但是消除了消极情绪,不代表人可以积极起来,不代表人可以感受到幸福。

Tal 大力鼓动大家更关心积极部分。同时提到一个经典的事例。Marva Collins 开设的学校,非常重视帮孩子建立积极的自我认识。她会不停给孩子鼓励和赞赏,但又不是那种毫无根据的赞赏,而是会通过给孩子高强度的任务、帮助他们完成,进而一步步巩固他们对自己积极的认知。这个理念很赞,可以应用在方方面面,也可以帮助到亲密的人。

! Lecture 3

!! Change is possible Vs. Change is illusive

这节举了有名的 Minnesota Twin Studies 作为例子,研究者长期跟踪很多对双胞胎,他们的成长环境完全不一样,但是很多对在长大后有着很类似的性格、喜好和行为。研究者得出结论是:

> It may be that trying to be happier is as futile as trying to be taller and is therefore counterproductive. - Lykken and Tellegan (1996)

但是 Tal 并不这样觉得。他举出 Marva Collins 学校的例子,表示改变的确是存在的。而且他觉得,研究 ''平均水平的人'' 不是最重要的。因为大多数 ''普遍情况'' 都会抹掉其中杰出的例子,而研究杰出者是更重要的事情,因为可以把他们的经验应用到普罗大众上。

后来 Minnesota Twin Studies 的研究者也表示,这个实验带来了很多负面影响,人们应该更聚焦于可以改变的,而不是基因所决定的。

!! Internal factors primarily determine happiness Vs. Happiness is primarily a function of external circumstances

这里又有一个著名的研究,Cambridge-Somerville Youth Study。两组小孩,家境都比较差,一组给当时社会能给的各种资源支持,给了各种优待;另外一组则没有。

结果观察了十年后,两个组在各方面并没有太大的区别。反而优待组,比普通组有更多的酗酒和失业行为。这个实验表示外在环境对追寻快乐的影响,不如内在的因素。

最后 Tal 又阐述了笑容和快乐的传染性。他用一个指数函数来表示快乐的传播可以有多快。


区别于传统的 CMS(如 Wordpress、Drupal),headless CMS 并不提供展示界面,而只提供后台编辑界面,并以 API 形式输出给各种渠道(网站、App 等)使用。[[Contentful|https://www.contentful.com/]] 的官网视频生动了讲述了它的功能。

这些 headless CMS 功能也很强大,并且提供了多种语言的 SDK。而且一些流行的前端框架,如 [[Gatsby]] 也 [[整合|https://www.gatsbyjs.org/docs/headless-cms/]] 了很多 headless CMS。

对于流行好用的 headless CMS 推荐,可以看看 Gatsby 的这个 [[页面|https://www.gatsbyjs.org/docs/headless-cms/]],排前面的应该是比较流行的。

在线服务:

* [[Contentful|https://www.contentful.com/]]

自建:

* [[Strapi]]([[官网|https://strapi.io/]])
把数据以 16 进制表示。

* CLI: 参考 [[Snippets: Shell: Hex Dump]]
* GUI:
** Cross Platform: VSCode 有 [[hexdump for VSCode|https://marketplace.visualstudio.com/items?itemName=slevesque.vscode-hexdump]] 插件
** Windows: [[HxD|https://mh-nexus.de/en/hxd/]] 可能会比 VSCode 的插件性能好一些

但是这些软件都会把中文字符拆成多个不可读的 ASCII 字符,比如:

```
  Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 	
00000000: E7 94 A8 20 60 52 65 71 75 65 73 74 41 74 74 72    g.(.`RequestAttr
00000010: 69 62 75 74 65 60 20 E6 9D A5 E5 AE 9E E7 8E B0    ibute`.f.%e..g.0
00000020: E3 80 82                                           c..
```

这段文本是:

```
用 `RequestAttribute` 来实现。
```

其中的中文都被拆成 3 字节的 UTF-8 展示。
|!Name |High Performance Browser Networking |
|!Author |Ilya Grigorik |
|!Edition |1st |
|!Release Date |September 2013 |
|!ISBN-13 |978-1-449-34476-4 |
|!Medium |[[网站|https://hpbn.co/]] |

之前 brusepeng 介绍过这本书。我在它的 [[网站|https://hpbn.co/]] 试看了一章,发现内容覆盖广且典型,虽然是讲浏览器相关的性能,但是其中涉及的 TCP / UDP,甚至无线网络 / 移动网络都有提及,而且还有 HTTP2 的内容,可以用一种比较实践性的方式了解 HTTP2 相对于 HTTP1 的优化。作者的表达非常通俗易懂、插图精良,看起来轻松不累,值得仔细学习。

下面纪录一些笔记:

|!Name |High Performance MySQL |
|!Author |Peter Zaitsev, Vadim Tkachenko, Baron Schwartz |
|!Edition |3rd |
|!Release Date |March 2012 |
|!ISBN-13 |978-1449314286 |
|!Medium |电子书 |

MySQL’s most unusual and important feature is its storage-engine architecture, whose design separates query processing and other server tasks from data storage and retrieval. This separation of concerns lets you choose how your data is stored and what performance, features, and other characteristics you want.

!! MySQL’s Logical Architecture

[img width=300 [mysql-logical-overview]]

分层:

* 第一层,Connection/thread heandling, authentication, security 等,通常 C/S 架构软件都有的一层
* 第二层,query parsing, analysis, optimization, caching, built-in functions (dates, math, etc.)。任何跨不同存储引擎的功能,都在这层处理,比如存储过程,触发器
* 第三层,存储引擎层,负责读取和写入数据,有一套 storage engine API,如 "begin a transaction", "fetch the row that has this primary key" 等。这一层不做 SQL 解析(但是也有例外,不太重要)

! Connection Management and Security

这是第一层的功能。一些关键概念是:线程池,身份认证(authentication)、授权(authorization)、SSL。

! Optimization and Execution

MySQL 会把 SQL 语句解析成 parse tree,再做一些优化,包括重写语句、判断读表的顺序、选择哪个索引。

Optimizer 会考虑某个库或者表底下的存储引擎是什么,来做一些优化,但是大部分情况是不区分存储引擎的。

在解析 SELECT 语句之前,如果缓存已经有这个语句的查询结果了,MySQL 会直接返回结果。

! Concurrency Control

MySQL 在两个层面上做并发控制,分别是 server 层和存储引擎层。












这里的内容主要摘录自 [[History of Web Programming|http://www.observationalhazard.com/2018/06/history-of-web-programming.html]] 一文。内容未做考证,主要是方便理解现在各种 web 技术为什么是这样子的。

!! Client-Side

第一款浏览器:1990 年,Tim Berners-Lee 发布世界上第一款浏览器 WorldWideWeb。

静态页面:1990-1995 年,当时的网页都是静态的,浏览器主要就是一个 HTML 文档察看器,没有交互能力。1990 年时一台微机 CPU 主频在 50Mhz,内存只有几 M。

Java Applets:1995 年,Java 1.0 发布,带了 applets 功能可以嵌入在浏览器中,提供了动态页面的能力。但是 applets 运行速度实在太慢,各平台上 UI 不一致,微软又在 IE 中绑个了 Java 运行时导致了兼容性问题,所以并没有流行开来。

JavaScript:1995 年,在 Java 发布后不久,JavaScript 也发布了。Netscape Navigator 是第一个浏览器装载了 JavaScript 解释器。但是第一个十年 JS 的应用面比较窄,网页交互比较简单,因为当时 JS 的性能并不好。JIT 还是在 2000s 才引入的。但是 JS 相对轻量灵活,还是迅速流行开来。在最近一个十年里,JS 的性能不断增强,可以在浏览器端承载起更多能力,支撑了 React / Angular 等大型框架。同时也在服务端取得了一些成绩(Node.js)。

VBScript:微软在 1996 年推出的对标 JS 的专有实现。因为是专有软件,在非 IE 平台上有很多问题。由于互联网越来越走向开放,VBScript 没有市场,拼不过 JS。

Flash:Flash 在 1990 年代开始发展,在 96 年被 Macromedia 收购后开始发力,05 年被 Adobe 收购。Flash 在网页上的游戏和流媒体场景是最流行的技术。现在流媒体渐渐被能力完善的 HTML5 取代,但是在网页游戏上还是主流技术。乔布斯指责 Flash 是一种专有、落后的技术,并且拒绝在 iPhone 上搭载 Flash。移动平台没有使用 Flash。

Silverlight:微软开发的用来对标 Flash 的技术,没有什么成绩,不用关心。

TypeScript:微软在 2012 年发布的语言,可以看成带类型的 JavaScript。TypeScript 可以编译成 JavaScript,并且微软设计得很好,在开发者社区口碑很不错。微软自家的 VSCode 是用 TypeScript 写的。Ant Design 也是。

!! Server-Side

CGI / FastCGI:原来大家只会写普通的命令行程序,要写 web 的程序时,它们想到搞容器去解析 HTTP 请求,然后把 HTTP 头、请求体用环境变量传给 CGI 程序。CGI 是每来一个请求 fork 一个进程,FastCGI 是 pre fork 好一堆进程。CGI 程序可以用任意语言编写,只要它遵守输入输出规则(通过环境变量)即可。

Perl:比较灵活地脚本语言,也用 CGI。

PHP:简单粗糙快速。在 HTML 里写脚本实现动态能力。

ASP / ASP.NET:微软开发的对标 PHP 的技术。设计比 PHP 好,但是之前只能在 Windows Server 上运行。

Java:J2EE 在 1996 年发布,到目前仍然很流行且具竞争力,比如 Spring 全家桶。

Ruby, Python:Ruby on Rails 比较早发力,在 2000s 成绩不错,开发非常快速,比 Java 简洁和灵活。Django 等 Python 框架随后发力,也追求简单和生产力,目前流行程度压过 Ruby on Rails。Ruby / Python 做 web 开发更快,但是对中型大型项目,对开发人员要求比较高,不如 Java 那样条条框框多的好招人。

Node.js:在服务端编程没流行开来,复杂的编程模型,有限的处理能力,让它一般只能做一些胶水层,一般在前端页面后层做模板渲染 / API 接口数据透传。不过我的理解可能有限,如果你想看看服务端 Node.js 能做啥,看看阿里做了啥。
Host 文件管理工具。

[[oldj/SwitchHosts|https://github.com/oldj/SwitchHosts]] 提供了一个方便的方式,用来对不同的 hosts 文件做切换。
|!Name |How to Think Straight of Psychology |
|!Author |Keith E. Stanovich |
|!Edition |10th |
|!Release Date |September 29, 2012 |
|!ISBN-13 |978-0205914128 |
|!Medium |PDF |

! Preface

本书的写作动机:介绍批判性思维(Critical Thinking)的技巧,帮忙读者各好地理解心理学。

! Chapter 1: Psychology Is Alive and Well (and Doing Fine Among the Sciences)

!! The Freud Problem

心理学是一门科学。但是构建现代心理学的科学家们几乎不被公众所知。公众知道得最多的弗洛依德不被现代心理学所认可。

弗洛依德的研究方法是不科学的,他相信案例分析可以证明一个理论的真伪,同时他不使用对照实验(controlled experimentation,现代科学研究常用方法)。

!! The Diversity of Modern Psychology

最权威的两个心理学科研机构是:

* American Psychological Association (APA)
* Association for Psychological Science

心理学下属的分类非常多,研究的范围在生物科学到社会科学之间(不包含这两者)。

!! Implications of Diversity

心理学的多样性导致并没有一个一统的理论可以解释一切心理学问题。但是有些科学家尝试在某些细分领域里面做理论的统一,下面就是一个很好的例子:

> These researchers have tried to bring unification to our conceptualization of human psychological processes by viewing them as mechanisms serving critical evolutionary functions such as kinship recognition, mate selection, cooperation, social exchange, and child rearing.

但是其他科学(例如物理、化学)也是没有一个绝对一统的理论的。

!! Unity in Science

很多力量会抵制「心理学是一门科学」的说法,比如一些引导舆论、欺骗大众的势力,甚至是古代的君主。但是这些抵抗很多都被消除。

!! What, Then, Is Science?

# the use of systematic empiricism:使用系统的经验主义
# the production of public knowledge:公共知识的生产
# the examination of solvable problems:检查可求解的问题

后面的内容会对这三个点进行阐述。
|!Name |High Performance Browser Networking |
|!Author |Ilya Grigorik |
|!Edition |1st |
|!Release Date |September 2013 |
|!ISBN-13 |978-1449344764 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

! Speed Is a Feature

影响速度的两个关键因素:latency(延迟)和 bandwidth(带宽):

[img width=600 [latency-and-bandwidth]]

! The Many Components of Latency

影响延迟的因素有很多方面,需要系统地考虑:

* Propagation delay:收发两方的距离除以速度,更重视传输材质的速度,比如光纤,传输速度一般是光速的某个常速倍。比如纽约到旧金山,用光纤要 21ms 才能到达,就是这个速度在起作用
* Transmission delay:把数据推入网络设备(比如路由器)的速度,是数据长度除以设备数据速率,与距离无关。举个例子,你有个无线速率为 1 Mbps 的路由器,那么发一个 10 Mb 的文件需要 10s;如果路由器速率 100 Mbps,那么只需要 0.1s
* Processing delay:网络设备收到包后,检查包头、校验数据、决定下一站等操作所需的时间。这个时间通常很短,但是也存在。还未被处理的包会被放在网络设备的缓冲区中,直到他们被处理
* Queuing delay:包在网络设备缓冲区中等待的时间。比如你有个性能比较差的路由,但是你向它传输了大量的数据,它可能没法处理得很快,于是包必须在缓冲区中等待一段时间

!! Bufferbloat in Your Local Router

Bufferbload 是一种现象,表明 queuing delay 的确在影响网络质量。因为现在新的路由往往有着更大的缓冲区,它们会尽量避免丢包。而这会影响 TCP 的拥塞控制,可能会导致更多的超时重传、更不确定的延迟。有新的算法在着力解决这类问题。

! Speed of Light and Propagation Latency

光纤存在折射率(refractive index),没法达到光速,一般传输同样距离,光纤所需的时间大约是光的 1.4-1.6 倍。光纤 1s 大约能走 200,000,000 米,折射率在 1.5 左右。

光纤的传播速度、与光速进行对比:

|!Route |!Distance |!Time, light in vacuum |!Time, light in fiber |!Round-trip time (RTT) in fiber |
|New York to San Francisco |4,148 km |14 ms |!21 ms |42 ms |
|New York to London |5,585 km |19 ms |!28 ms |56 ms |
|New York to Sydney |15,993 km |53 ms |!80 ms |160 ms |
|Equatorial circumference |40,075 km |133.7 ms |!200 ms |200 ms |

但是上图的数据是基于光纤链路是条直线来算的,事实上并没有这么乐观,链路经常是弯来倒去的。所以 New York 到 Sydney,RTT 往往需要 200-300ms 时间。

但是对用户来说,300ms 的延迟往往难以接受。所以在开发应用程序的每个阶段,网络延迟都是一个重要的考虑因素。

!! Note

传输的延时难以解决,但是可以通过将用户与服务器的距离拉近,来减少总的延时。CDN 就是这样做的。

! Last-Mile Latency

最后一公里延时,是指在离终端用户最近的地方,往往有明显的延时(几十 ms)。这跟 ISP(网络服务供应商)对终端的部署有关系,比如你的社区如果还没有接光纤,那么很可能用的是 ADSL 这种技术,而 ADSL 在延时上(30-65ms)会明显慢于光纤(10-20ms)。而且数据包从社区的设备传输到 ISP 的骨干网(core network),往往又有明显的延时。

! Bandwidth in Core Networks

光纤在带宽方面具有明显的优势,因为每根光纤都可以通过称为波分复用(wavelength-division multiplexing, WDM)的过程承载许多不同的光波长(信道)。因此,光纤链路的总带宽是 每信道数据速率 和 多路复用信道的数量 的倍数。

信道的英文叫 channel。

截至 2010 年初,研究人员已经能够复用 400 多个波长,每个信道的峰值容量为 171 Gbit/s,这意味着单个光纤链路的总带宽超过 70 Tbit/s。

! Bandwidth at the Network Edge

network edge 即是指离用户近的这端。速度受限于终端的部署技术,比如拨号上网、ADSL、光纤等,同时还受限于家里的路由或者 ISP 的路由。

Speedtest 网站可以测试你到本地 ISP 服务器的延迟和带宽。但是不代表你使用其他网络服务时,也能达到相同的带宽。网络拥塞的原因多种多样。

! Delivering Higher Bandwidth and Lower Latencies

未来的优化方向有很多,比如把更多链路换成光纤的,优化 WDM 技术,把数据分布到离用户近的位置等。但是光速的限制是解决不了的,现在的链路能达到 ~2/3 光速,能提升的空间也只有 30% 左右。

因此,在架构、协议设计和应用开发中,需要时刻考虑延迟和带宽因素。


这一部分主要讲 TLS。相关的内容纪录进了 [[HTTPS: Core Concepts]]。
!! Resources

这两份是最好的 HTML 入门材料:

* [[Learn to Code HTML & CSS|https://learn.shayhowe.com/html-css/]]
* [[Learn to Code Advanced HTML & CSS|https://learn.shayhowe.com/advanced-html-css/]]

书籍:

* [[Learning Web Design: A Beginner's Guide to HTML, CSS, JavaScript, and Web Graphics|https://www.amazon.com/Learning-Web-Design-Beginners-JavaScript/dp/1491960205/ref=pd_sbs_14_3/136-8147037-9387834]] 这本书也是非常好的材料,零基础入门且书中帮你挑选出最重要的内容
零碎的 HTML 相关内容。

!! `<head>`

`<head>` 标签内容:https://htmlhead.dev/。

!! `<ol>` 可以有起始数字

当一个有序列表被拆成多段出现在文章中时,这个方法可以保证标号不重新从 1 开始。

```html
<ol start="19">
    <li>a</li>
    <li>b</li>
</ol>
```

效果如下:

<ol start="19">
    <li>a</li>
    <li>b</li>
</ol>

!! Website Templates

如果想做一个漂亮的、响应式的网站,最好的方式是去找 [[网站模板|Website Template]],而不是自己手写。
语义化的 HTML。

!! 实用性

我觉得目前(2019/10)语义化 HTML 并不是特别重要:

* 对于 SEO 而言,语义化标签帮助并不大,反而 [[stucture|https://www.semrush.com/blog/what-is-schema-beginner-s-guide-to-structured-data/]] [[data|https://developers.google.com/search/docs/guides/intro-structured-data]] 会有用一些
* 对于视觉残障者,可能语义化标签会对读屏工具有一定帮助
* 对于开发者,会帮助理解 HTML 文档的结构
* 一些大流量网站还没有使用语义化标签,比如 wikipedia
* 对于标签的使用没有严格定义边界。比如有些人认为文章内的 anchor links 可以用 `<nav>` 表达,但是 MDN 上放在侧边栏(而不是文章主体内)的 anchor links,使用的是 `<aside>`

我觉得懂大致的布局用的标签使用即可。对于 A11Y 的场景再单独研究。

!! 实例例子

先上一个实际例子。这个图左边是网站的实际样子,后边是将其用语义化标签表达的结果:

{{ semantic-html-example }}

图中的标签即是语义化 HTML 所使用的主要标签了。

!! 标签释义

`<header>`, `<footer>` 都比较好理解,页面顶部和底部,一般里面都有些导航栏,可以用 `<nav>`。同时它们不一定仅在页面外层使用,也可以在 `<article>` 或者其他元素中使用,只要有逻辑上的 `<header>` 和 `<footer>` 即可。

`<nav>` 指导航区域。有文章认为文内的 anchor links(一般在 TOC 块中),也可以用 `<nav>`。

[[<section>|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section]] 和 [[<article>|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/article]] 是比较容易混淆的点:

* `<article>` 中的内容应该是可以单独提取出来,独立使用的,比如 RSS 工具可以只看 `<article>` 的内容。典型的使用场景是论坛帖子、杂志/新闻文章、博客文章等
* `<section>` 一般是用于逻辑上独立,又找不到更好的标签来表达的内容

但是对于上面例子,我觉得 `<article>` 用得不好,应该用 `<main>` 更佳。

对于 `<aside>`,它表示与主体关联,但是并非核心的内容。比如文章内的旁注,它不是主要内容,可以用 `<aside>` 包裹 `<p>` 来表达。`<article>` 里可以有 `<aside>` 用来表示 TOC,或者上一篇文章、下一篇文章等。`<aside>` 在展现上并不一定需要是侧边栏,它也可以是在主体内容上方或者下方。

!! 注意点

# 语义化标签的使用不是越多越好,能表达好结构即可,简单的结构可能更利于搜索引擎理解。
# 一个文档最好只有一个 `<h1>`,表达最重要的内容
# 不要将样式应用在语义化标签上(比如给 `<article>` 写个 CSS 样式)。语义化标签仅表示语义。比如用 Bulma 时,你需要用 `<section class="section">` 来应用上 section 的样式

!! 其他常见标签

!!! `<hgroup>`

表示多个 heading 共同代表标题,比如下面这个带主标题和副标题的例子:

```html
<header>
	<hgroup>
		<h1>A history of Pop Will Eat Itself</h1>
		<h2>Introducing the legendary Grebo Gurus!</h2>
	</hgroup>
</header>
```

!!! `<figure>` `<figcaption>`

给图片加标题:

```html
<figure>
	<img src="pwei.png" alt="Old poppies logo" />
	<figcaption>
		The old poppies logo, circa 1987.<br /> <a href="http://www.flickr.com/photos/bobcatrock/317261648/">Original picture on Flickr</a>, taken by bobcatrock.
	</figcaption>
</figure>
```

!! Resources

* [[The Secrets of Semantic HTML5 for Document Structure - SemRush|https://www.semrush.com/blog/semantic-html5-guide/]]:非常推荐
* [[New Structural Elements in HTML5 - Dev.Opera|https://dev.opera.com/articles/new-structural-elements-in-html5/]]:也非常推荐
* [[Modern HTML Semantic Elements|https://clearlydecoded.com/modern-html-semantic-elements]]
* [[Getting to Know HTML - Learn to Code HTML & CSS|https://learn.shayhowe.com/html-css/getting-to-know-html/]]

! Tools

!! [[kanongil/node-hls-tools|https://github.com/kanongil/node-hls-tools]]

* `hlsdump` dump a HLS stream into a single file
* `hlsrecord` download segments of a HLS stream
* `hlsmon` report when new segment appears

微软 Azure 的微服务相关文档中,有几份关于 API 设计及实现的文档,看起来质量非常高(未读):

* [[API design guidance|https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design]]
* [[API implementation guidance|https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-implementation]]

业内有三份比较流行的、可能质量也较高的 HTTP API Design Guidelines:

# [[Google API Design Guideline|https://cloud.google.com/apis/design/]]
# [[Microsoft REST API Guidelines]]
# [[Heroku HTTP API Design Guide|https://github.com/interagent/http-api-design]]

HTTP 动词以外的语义,它的 URL Pattern 参考 Google 规范中提到的 [[Custom Method|https://cloud.google.com/apis/design/custom_methods]]。

[[API Handyman|https://apihandyman.io/]] 总结了一些实用的 API 设计技巧,同时作者写了一本书 [[The Design of Everyday APIs|https://www.manning.com/books/the-design-of-everyday-apis]],可能值得一看。

其他内容:

* [[The Web API Checklist -- 43 Things To Think About When Designing, Testing, and Releasing your API|https://mathieu.fenniak.net/the-api-checklist/]]

我总结的:[[TSF HTTP API Guidelines]]。
当 model 与其他 model 有关系存在时,如何用 RESTful API 表达?有这几种情况:

* 一对一,比如一个人的姓名对其生日
* 一对多,比如专辑对歌曲,某一歌曲仅属于一个专辑
* 多对多,比如帖子对标签,一个帖子可以有多个标签,一个标签也可以有多个帖子

一对一没有太多可讲,容易设计。一对多及多对多比较复杂。

!! 一对多

比如专辑对歌曲的例子。

```json
{
    "album_name": "Undun",
    "artist": "The Roots",
    "tracks": [
        89,
        90,
        91,
        ...
    ]
}
```

```json
{
    "album_name": "Undun",
    "artist": "The Roots",
    "tracks": [
        {"id": 89, "order": 1, "title": "Public Service Announcement", "duration": 245},
        {"id": 90, "order": 2, "title": "What More Can I Say", "duration": 264},
        {"id": 91, "order": 3, "title": "Encore", "duration": 159},
        ...
    ],
}
```

区别在于,对于 `tracks` 字段,第一个方案显示的是其 ID,第二个显示的是其内容。哪一种更好呢?我会认为是第一种。因为无论客户端是 browser 还是 app,客户端侧都会有对基础数据(比如 tracks)的一份缓存,而 tracks 会有其单独的 API 进行查询。此时最好遵循 single source of truth,即 tracks 的数据都在其单独的 API 进行查询,而不在 album 的回包中直接显示。当然这会增加额外的请求量,但也避免了数据不一致(比如新旧区别)造成的问题。

这里的内容主要来自 [[HTTP: The Definitive Guide]] 第 11 章。

网站通常有识别请求用户信息的需求,用来:

* 根据用户的设备显示不同的样式
* 获得用户自定义的数据,比如论坛的发帖
* 做推荐系统等

常用的识别方式:

* HTTP headers that carry information about user identity
* Client IP address tracking, to identify users by their IP addresses
* User login, using authentication to identify users
* Fat URLs, a technique for embedding identity in URLs
* Cookies, a powerful but efficient technique for maintaining persistent identity

!! HTTP headers

|!Header name    |!Header type |!Description ! |
|From            |Request      |User’s email address |
|User-Agent      |Request      |User’s browser software |
|Referer         |Request      |Page user came from by following link |
|Authorization   |Request      |Username and password (discussed later) |
|Client-ip       |Extension (Request) |Client’s IP address (discussed later) |
|X-Forwarded-For |Extension (Request) |Client’s IP address (discussed later) |
|Cookie          |Extension (Request) |Server-generated ID label (discussed later) |

其中 `From` 已经不再使用。`User-Agent` 及 `Referer` 仍然被经常使用。

!! Client IP

非常早期的互联网应用会以 IP 来识别用户。但是后来慢慢废弃了,因为:

* 客户端 IP 只能描述对应的电脑,而不是电脑上的用户;一台电脑可以有多个用户
* 很多 ISP 分配给用户使用的是动态 IP
* 很多用户会用路由器等 NAT 设备,服务端无法知道 NAT 背后的具体设备是什么
* 如果用户的请求经 HTTP 代理,那么服务端看到的是 HTTP 代理的 IP;虽然部分代理会把用户的 IP 以 `X-Forwarded-For` 头带上,但不是所有代理都会

!! User Login (Basic Authentication)

流程如下:

{{ http-basic-auth }}

主流的互联网应用不再使用它:

* 如果不走 HTTPS,那用户的密码是明文暴露的
* 密码的过期策略依赖于浏览器实现
* 登录方式不够友好

!! Fat URLs

即每个链接中都带有用户 ID。如早期亚马逊的链接,留意其中的 `002-1145265-8016838`:

```
<a href="/exec/obidos/tg/browse/-/229220/ref=gr_gifts/002-1145265-8016838">All
  Gifts</a><br>
<a href="/exec/obidos/wishlist/ref=gr_pl1_/002-1145265-8016838">Wish List</a><br>
<a href="http://s1.amazon.com/exec/varzea/tg/armed-forces/-//ref=gr_af_/002-1145265-
  8016838">Salute Our Troops</a><br>
<a href="/exec/obidos/tg/browse/-/749188/ref=gr_p4_/002-1145265-8016838">Free
  Shipping</a><br>
```

这种方式的问题:

* URL 丑陋
* 不停重写 URL 需要耗费大量性能
* 如果用户不小心用了不带 user ID 的 URL,追踪就停止了
* 无法分享 URL,否则会引起混乱
* 无法利用缓存,因为每个用户的 URL 都不一样

!! Cookies

目前的主流方式。在 [[HTTP: Cookie]] 中单独描述。
Cookie 是服务端给浏览器下发的一小串信息;浏览器收到之后,在后续的请求中都会将这串信息带给服务器,这使得服务端可以知道这些请求都来源于同个浏览器(往往也是同个用户)。

!! 用途

来自 [[MDN|https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies]]:

; Session management
: Logins, shopping carts, game scores, or anything else the server should remember
; Personalization
: User preferences, themes, and other settings
; Tracking
: Recording and analyzing user behavior

最常见的场景是 ''维持用户登录态'' 以及 ''实现购物车''。

在 web 技术还不足够发达时,cookie 也是实现浏览器端存储的唯一方式。但是后来发展出来的 Local Storage、Session Storage 和 IndexDB 取代了这一功能。

!! 服务端如何下发 cookie?

在 HTTP 回包的头中加入 `Set-Cookie` 或 `Set-Cookie2`:

```
HTTP/2.0 200 OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

[page content]
```

!! Session cookies v.s. permanent cookies

没有设置过期时间的 cookie 即 session cookie,在浏览器关闭时会被清除:

```
# Session cookie
Set-Cookie: id=a3fWa;

# Permanent cookie
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
```

!! Security

带有 `Secure` 指令的 cookie,仅在网站是 HTTPS 协议时会被传输给服务端。但仍然不要在 cookie 中存放敏感信息,因为 `Secure` 带来的安全性,还依赖于服务端的 [[TLS 安全|HTTPS: Core Concepts]] 做得是否到位。

带有 `HttpOnly` 指令的 cookie,无法被 JS API `Document.cookie` 获取。这可以避免在受到 XSS 攻击时被恶意代码获取。

关于 `SameSite` 字段,设计的目的是为了防 CSRF,在单独的 [[HTTP: Cookie: SameSite]] 中描述。

参考 OWASP 提供的 [[cookie security|https://www.google.com/search?q=cookie+security+owasp]] 内容。

!! Scope of cookies

`Domain` 和 `Path` 指令被用来限定 cookie 的生效范围:

```
Set-Cookie: bid="FgXN3U9Vku4"; path=/; domain=.douban.com; expires=Fri, 16-Apr-2021 02:13:08 GMT
```

`Domain`:

* 如果不指定,则被默认为当面页面的 host,''不包含'' 子域名(比如 `developer.mozilla.org` 之于 `mozilla.org`)
* 如果指定,则总是包含子域名

<<.note "在实际应用中,你经常会发现一些网站返回的是带有 `.` 开头的(如 `.douban.com`)。这是因为被废弃的老规范中,用 `.` 开头的才会包含子域名。但这一行为已经在现行的 RFC 6265 中被废除。网站为了兼容一些实现老规范的浏览器,会在开头加上 `.`,但这个 `.` 会被现代浏览器无视,跟没有加一样。">>

如果指定了 `Path`,则在访问它的子目录时该 cookie 都会被发送。比如指定了 `Path=/docs`,则对 `/docs` `/docs/Web/` 及 `/docs/Web/HTTP` 都生效。

!! Third-party cookies

第三方 cookie,即你在访问一个网页时,网页中的第三方内容(通常是广告追踪代码、Social login widget 等)写入的第三方网站 cookie,一般用来做广告追踪。

广告平台(如 Google AdSense)通过 JS 代码来获取用户设备、当前页面、地理位置等方方面面的信息。

大多数浏览器会有选项让你禁用第三方 cookie。这可能会影响网页功能。很多 AdBlocker 或者浏览器的隐私功能,会拦截第三方 cookie。

Apple 的 Intelligent Tracking Prevention 在防止第三方 cookie 上做得比较激进,以保护用户隐私。

参考:

* [[What’s the Difference Between First-Party and Third-Party Cookies? - ClearCode|https://clearcode.cc/blog/difference-between-first-party-third-party-cookies/]]
* [[What Is Intelligent Tracking Prevention and How Does It Work? [versions 1.0 – 2.3]|https://clearcode.cc/blog/intelligent-tracking-prevention/]]

!! Reference

* [[HTTP cookies - MDN|https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies]]
* [[Set-Cookie - MDN|https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie]]
Cookie 中 SameSite 指令的引入,是为了解决 [[CSRF|Web Security: CSRF]] 问题。

SameSite 做的是当用户在访问 A 网站中,对 B 网站发起请求时的 cookie 控制。比如用户在访问恶意网站 `https://evil.example` 时,页面中含有这样一张图片:

```
<img src="https://bank.example/transfer?from=alex&to=eva" />
<a href="https://bank.example/transfer?from=alex&to=eva">Click Me!</a>
```

此时浏览器会向这个 URL 发起请求。那它应该带上 `bank.example` 网站的 cookie 吗?如果用户在 bank 网站上已经登录,那 cookie 代表了用户的登录状态,此时访问转帐链接会触发真正的转帐,导致用户被黑。SameSite 指令可以控制是否带 cookie 的行为。它有 [[三个取值|https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies]]:

; None
: The browser will send cookies with both cross-site requests and same-site requests.
; Strict
: The browser will only send cookies for same-site requests (requests originating from the site that set the cookie). If the request originated from a different URL than the URL of the current location, none of the cookies tagged with the Strict attribute will be included.
; Lax
: Same-site cookies are withheld on cross-site subrequests, such as calls to load images or frames, but will be sent when a user navigates to the URL from an external site; for example, by following a link.

结合上面的 evil 网站例子,如果 bank 网站上的 cookie 的 SameSite 值被设置成这些场景时,访问 evil 网站会有怎样的行为:

* None:浏览器 ''仍然会'' 将 bank 的 cookie 发送。这会引起用户被黑。
* Strict:浏览器 ''不会'' 将 bank 的 cookie 发送;即使用户点击 "Click Me!" 链接,浏览器也 ''不会'' 发送 bank 的 cookie
* Lax:浏览器 ''不会'' 将 bank 的 cookie 发送;但是用户点击 "Click Me!" 链接,浏览器 ''会'' 发送 bank 的 cookie

Lax 像是一个 relax 版的 strict。这篇 [[文章|https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/]] 总结了不同情况下 cookie 是否会被带上的表格:

|!请求类型  |!代码示例                           |!哪些情况下 cookie 会被发送 |
|Link      |`<a href="..."></a>`                |None, Lax                 |
|Perender  |`<link rel="prerender" href=".."/>` |None, Lax                 |
|Form GET  |`<form method="GET" action="...">`  |None, Lax                 |
|Form POST |`<form method="POST" action="...">` |None                      |
|iframe    |`<iframe src="..."></iframe>`       |None                      |
|AJAX      |`$.get("...")`                      |None                      |
|Image     |`<img src="...">`                   |None                      |

Lax 是理论设计与工程实践的优雅结合。如果将浏览器默认的 SameSite 策略改成 Strict,一定会引起很多老网站无法正常运行。但是设成 Lax 的话,即解决了大部分危险场景,又使得相对安全的场景(访问一个链接、提交一个 GET 请求到 Form 表单等)不受影响。

在编写这篇文章的 2020 年 4 月,当一个 cookie 没有被指定 SameSite 属性时,大部分浏览器默认的实现都是 None。Chrome 80 开始将此值默认设置为 Lax。同时并非所有浏览器都支持 SameSite 指令。参考 [[这里|https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Browser_compatibility]]。

<<.warning "Neither `Strict` nor `Lax` are a complete solution for your site's security.
Cookies are sent as part of the user's request and you should treat them the
same as any other user input. That means sanitizing and validating the input.
Never use a cookie to store data you consider a server-side secret. - https://web.dev/samesite-cookies-explained/">>

!! 什么场景 SameSite 为 None 是适用的?

比如你想将一个 YouTube 视频,以 iframe 播放器形式嵌入到你的网站中。如果 YouTube 设置了 Lax / Strict,会导致用户在你的网站看到此视频时,他在 YouTube 上的已登录状态并不会体现出来。他像是未登录用户,无法点击 iframe 播放器中的「Watch Later」按钮。

!! Reference

* [[SameSite cookies explained - web.dev|https://web.dev/samesite-cookies-explained/]]
* [[SameSite cookie recipes - web.dev|https://web.dev/samesite-cookie-recipes/]]
* [[Using the Same-Site Cookie Attribute to Prevent CSRF Attacks - Netsparker|https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/]]
* [[Cross-Site Request Forgery is dead! - Scott Helme|https://scotthelme.co.uk/csrf-is-dead/]]
为了安全,W3C 定义了 [[同源策略|Web Security: Same-origin Policy]],使得一些场景下,在网站 A 下的代码无法直接访问网站 B 的资源。HTTP 中定义的 CORS,则作为一种控制机制来让服务端限定客户端可以访问哪些资源。

!! 哪些场景适用于 CORS?

CORS 限制的场景有这些:

# Invocations of the [[XMLHttpRequest|https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest]] or [[Fetch APIs|https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API]], as discussed above.
# Web Fonts (for cross-domain font usage in `@font-face` within CSS), [[so that servers can deploy TrueType fonts that can only be cross-site loaded and used by web sites that are permitted to do so.|https://www.w3.org/TR/css-fonts-3/#font-fetching-requirements]]
# [[WebGL textures|https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Using_textures_in_WebGL]].
# Images/video frames drawn to a canvas using [[drawImage()|https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage]].
# [[CSS Shapes from images.|https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/Shapes_From_Images]]

!! CORS 的简单请求

当你从 `foo.example` 向 `bar.other` 发起一个异步请求时(用 `XMLHttpRequest` 或者 Fetch API),浏览器会根据回包中的 `Access-Control-*` 头来判断这个请求是否成功:

```
# 请求
GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example

# 回复
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml

[…XML Data…]
```

重点是:

* 浏览器会自动给请求包带上 `Origin` 头表示发起请求的源
* 服务器回包中的 `Access-Control-Allow-Origin` 头,表示服务端接受任意的来源网站来请求;它也可以是一个具体的 [[源|Web Security: Same-origin Policy]],如 `https://foo.example`

!! Preflight request

CORS 这套机制考虑了安全性,对于不是「''简单请求''」的情况,

CORS 规范中定义了 [[简单请求|https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Examples_of_access_control_scenarios]] 的概念。它是指接口行为相对「简单」的情形,要求:

* HTTP 方法是 `GET`、`HEAD` 或 `POST`
* HTTP 头中仅有限定的一批 header;比如不能有自定义的 `X-*` header
* 当 `POST` 场景时,`Content-Type` 只能是下面其一。这意味着你不能 POST 一个 JSON 的数据:
** application/x-www-form-urlencoded
** multipart/form-data
** text/plain
* 不能使用 `XMLHttpRequest.upload` 或 `ReadableStream`

如果不是简单请求,那意味着你的请求可能 ''不常见或者行为复杂,带有一定的危险''。浏览器会使用 `OPTION` 方法先发送一个 preflight 请求服务端来确认它是否可以发送这个请求,然后再发送实际的请求。例如:

```js
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://bar.other/resources/post-here/');
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
xhr.setRequestHeader('Content-Type', 'application/xml');
xhr.onreadystatechange = handler;
xhr.send('<person><name>Arun</name></person>'); 
```

这段代码中使用了自定义的 `X-PINGOTHER` 头,以及 `Content-Type` 头为「简单请求」定义之外的 `application/xml`,因此浏览器会先发 preflight 请求:

```
# Preflight 请求
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

# Preflight 回包
# Access-Control-Allow-Headers 表示这些头是可以被使用的
# Access-Control-Max-Age 表示这个回包的信息可以用一天
HTTP/1.1 204 No Content
Date: Mon, 01 Dec 2008 01:15:39 GMT
Server: Apache/2
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, Origin
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive

POST /resources/post-here/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
X-PINGOTHER: pingpong
Content-Type: text/xml; charset=UTF-8
Referer: https://foo.example/examples/preflightInvocation.html
Content-Length: 55
Origin: https://foo.example
Pragma: no-cache
Cache-Control: no-cache

<person><name>Arun</name></person>

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:40 GMT
Server: Apache/2
Access-Control-Allow-Origin: https://foo.example
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 235
Keep-Alive: timeout=2, max=99
Connection: Keep-Alive
Content-Type: text/plain

[Some GZIP'd payload]
```

可以看出,CORS 是需要客户端和服务端互相配合的机制。

!! Requests with credentials

如果你希望跨域请求带上对方网站的身份信息(cookie 或者 basic auth),那你可以用 `XMLHttpRequest` 或者 Fetch 接口中提供的控制字段 `withCredentials`:

```javascript
const invocation = new XMLHttpRequest();
const url = 'http://bar.other/resources/credentialed-content/';
    
function callOtherDomain() {
  if (invocation) {
    invocation.open('GET', url, true);
    invocation.withCredentials = true;
    invocation.onreadystatechange = handler;
    invocation.send(); 
  }
}
```

带不带 `withCredentials` 并 ''不影响'' 浏览器判断做不做 preflight。但是如果请求的回包中没有 `Access-Control-Allow-Credentials: true` 头,则浏览器会丢弃该回包并报错。

!! 回包中的其他头字段

除了上述已经出现的头字段,还有一些字段带有控制作用:

; `Access-Control-Expose-Headers`
: 表示客户端代码可以看到的、除了 CORS 定义的一个头列表之外的头字段。比如 `Access-Control-Expose-Headers: X-My-Custom-Header, X-Another-Custom-Header` 表示客户端代码可以看到服务器返回的 `X-My-Custom-Header` 和 `X-Another-Custom-Header`

!! Reference

* [[Cross-Origin Resource Sharing (CORS) - MDN|https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS]]
See [[HTTP: Client Identification]].
|!Name |HTTP: The Definitive Guide |
|!Author |David Gourley |
|!Edition |1st |
|!Release Date |October 2002 |
|!ISBN-13 |9781565925090 |
|!Medium |PDF |
|!Rating |{{!!rating}} |

这本书不会全看,涉及 HTTP 的一些领域的知识时会翻看。看了 client identification 一节时觉得作者实在 ''经验丰富'',比如为什么不用 客户端 IP 作为用户标识,作者足足列了四点:

* 客户端 IP 只能描述对应的电脑,而不是电脑上的用户;一台电脑可以有多个用户
* 很多 ISP 分配给用户使用的是动态 IP
* 很多用户会用路由器等 NAT 设备,服务端无法知道 NAT 背后的具体设备是什么
* 如果用户的请求经 HTTP 代理,那么服务端看到的是 HTTP 代理的 IP;虽然部分代理会把用户的 IP 以 `X-Forwarded-For` 头带上,但不是所有代理都会

这种教科书似的书籍我很喜欢。

<<.warning "留意这本书是在 2002 年出版的。一些内容已经不够新,比如涉及 cookie 在 2011 年有新的规范 [[RFC 6265|https://tools.ietf.org/html/rfc6265]],但本书中只覆盖到了 RFC 2965,后者是被前者取代的老旧规范。">>

! 发包测试工具

!! GUI Tools

* [[Postman|https://www.getpostman.com]]
* [[Insomnia REST Client|https://insomnia.rest/]]

!! Command Line Tools

* [[HTTPie|https://httpie.org/]] 是一个 Python 写的命令行测试工具,非常灵活好用;搭配 [[http-prompt|https://github.com/eliangcs/http-prompt]] 使用更佳
* [[astaxie/bat|https://github.com/astaxie/bat]] 是一个参考 HTTPie 写的 Go 工具,方便部署在没有 Python 环境的机器上

! 抓包工具

参考 [[Packet Capture, Tamper Data and Simulating Request]]。
! Why HTTPS?

以访问 google.com 为例,用上 HTTPS 后:

* Identity:你能确定你是在跟 google.com 在对话,而不是其他伪装成 google 的恶意网站
* Confidentiality:通信过程中,双方发送的内容都不会被人窃取、偷窥(eavesdropping)
* Integrity:中间人无法修改你与 google.com 互相发送的数据(tampering)

HTTPS 可以解决的一些常见问题:

* 保证用户的隐私数据(如密码、信用卡等)不被中间人窃取
* 避免 ISP 向你的网站注入广告等

浏览器中一些高级的 API,只能在 HTTPS 网站上使用,如 Geography、push notifications。HTTP2 要求有 HTTPS。

! 历史

HTTPS 虽然叫 HTTP over SSL (Secure Sockets Layer),但是现在看到的都是 TLS 了。SSL 是 Netscape 在 90 年代中期发明的,但是 Netscape 衰落后 SSL 交给了 IETF,IETF 在 1999 年发布了 TLS,作为 SSL 的继任者。现在(2018 年 1 月),TLS 1.2 是主流的版本,而 1.3 版本还在起草阶段。

! HTTPS 101

对于 HTTPS 的入门知识,HTTP: The Definitive Guide 的第 14 章提供了非常好的文字和插图。

由于计算非对称加密所消耗的 CPU 比对称加密多得多,因此 HTTPS 选择使用非对称加密来建立通信密钥,使用对称加密来加密传输的数据。

简单的描述即是:

# 客户端跟服务器,先用非对称加密协商一个通信密钥
#* 非对称加密过程,客户端用服务器证书中的公钥来进行加解密
# 客户端跟服务器再用之前协商的密钥,以对称加密的形式传输 HTTP 数据

下面描述相对完整的过程。一个完整握手(full handshake)的时序图如下:

{{ full-tls-handshake }}

# ClientHello 时,client 告诉服务器它支持的 TLS 版本、Cipher Suites、SNI(Server Name Indication,后面详述)等信息
# ServerHello 时,server 选择一个 TLS 版本和 chiper suite,并发送证书给 client
# ClientKeyExchange 时,client 校验证书(看 hash、域名、过期时间等),然后随机生成一个 pre-master key,用证书中的公钥进行加密,发给 server。client 和 server 都可以根据这个 pre-master key 来生成一个 session key,用于加密 HTTP 流量
# ChangeCipherSpec 时,client 和 server 互相表示,后面数据用 session key 进行对称加密后传输
# 最后,两边开始传输加密的数据

值得注意的是,ChangeCipherSpec 之前的数据均是明文传输(比如 ClientHello 和 ServerHello)。

P.S. 我对密码学没有研究,关于各种 key 的描述可能有不准确。

! TLS handshake

TLS 主要有两种类型的 handshake:

| |!Key establishment |!Authentication |
|!RSA handshake |RSA |RSA |
|!DH handshake |DH |RSA/DSA |

!! 性能

由快至慢:

# DH 握手,使用非 RSA 证书
# RSA 握手(只能使用 RSA 证书)
# DH 握手,使用 RSA 证书

例如 CluodFlare 用的就是非 RSA 证书,公钥使用的是 ECDSA 算法:

{{ cloudflare-certificate }}

而 GitHub 使用的就是 RSA 证书:

{{ github-certificate }}

!! Forward Secrecy

RSA 握手,会使用同一对公私钥来做 authentication 和加密对称密钥(key establishment)。这使得一旦有攻击者,在中间把两端通信的流量截取下来,同时又获得了服务器的私钥,则通信双方的信息会全部被破解。这种加密方式无法保证 forward secrecy。

而 DH(Diffie-Hellman)握手时,可以实现 authentication 用 server 的公私钥,但是 key establishment 用另外生成的一个 key。它能保证 forward secrecy。

!! Cipher Suites

RSA 握手的 cipher suites,如 TLS_RSA_WITH_AES_128_GCM_SHA256,表示:

* RSA for key establishment
* RSA for authentication
* 128-bit Advanced Encryption Standard in Cipher Block Chaining (CBC) mode for confidentiality
* 256-bit Secure Hashing Algorithm (SHA) for integrity

DH 握手的有 ECDHE-ECDSA-AES256-GCM-SHA384,表示:

* Elliptic Curve Diffie-Hellman Ephemeral (ECDHE) key exchange for key establishment
* Elliptic Curve Digital Signature Algorithms (ECDSA) for authentication
* 256-bit Advanced Encryption Standard in Galois/Counter mode (GCM) for confidentiality
* 384-bit Secure Hashing Algorithm for integrity

目前浏览器和主流的 server 端配置,会更倾向于使用 DH 握手。

用 WireShark 观察浏览器发出的 TLS 握手信息,可以它支持的 cipher suites 及其优先级。

! Chain of Trust

Client 发起 TLS handshake 时,怎样判断 server 不是中间人扮演的呢?比如你访问 google.com,怎样判断你是在跟真的 google.com 对话,而不是一个伪装的呢?答案在证书中。

证书由 CA(Certificate Authority,数字证书认证机构)颁发。而 CA 又分 intermediate CA 和 root CA,一般网站的证书由 intermediate CA 颁发,而 intermediate CA 的证书则由根证书颁发。root CA 的证书则是自已颁发给自己(self-sign):

{{ chain-of-trust }}

举个例子,google.com.hk 的证书路径:

{{ certificate-path }}

其中 Google Internet Authority 是 intermediate CA,GlobalSign 则是 root CA。

「颁发」这个动作,用的是电子签名技术。比如 CA 颁发证书给你的网站,即是用 CA 的私钥加密一段信息放进证书中。客户端拿到证书后用 CA 的公钥进行解密和校验,则可以判断证书是否真的是 CA 所颁发。而 root CA 的公钥会被各操作系统、浏览器内置并且信任。如果你信任你的操作系统、浏览器中绑定的 root CA 信息,那么你也会信任其签名的 intermediate CA 证书和随后的网站证书。这就是信任链的运作模式。

为了提升性能,server 发送证书给 client 时,会把证书路径下的多个证书一起发给客户端做校验。

证书所使用的标准是 X.509 Version 3。

! ALPN extension

TLS 只是一层加密层,它承载的应用数据可以是各种各样,不仅限于 HTTP。ALPN (Application-Layer Protocol Negotiation) 是 client 用来与 server 协商通信层协议的。Client 在 ClientHello 发送它所支持的应用层协议(目前主要是 HTTP2 和 HTTP 1.1),server 从中选择一个,通过 ServerHello 给回。

下面是用 WireShark 抓包的一个例子。ClientHello 中,Chrome 表示它接受 HTTP2 和 HTTP 1.1:

{{ client-alpn }}

ServerHello 中,server 表示它选择了 HTTP2:

{{ server-alpn }}

! SNI

SNI (Server Name Indication) ,是一个 TLS Extension,在 ClientHello 中可以看到它的身影:

{{ sni }}

由于 TLS 握手发生在实际的 HTTP 请求之前,web server 还无法通过 HTTP 头中的 Host 字段来判断用户访问的是哪个网站,因此需要通过 TLS 协议带过去。对于一个 IP 部署多个网站的情况,不同的网站往往使用不同的证书,web server 需要通过 SNI 它才可以判断给哪个证书。

但是 SNI 和证书信息都是明文的,会导致中间人知道你访问的是哪个网站。但是它无法知道你访问网站里面的什么路径、内容。

! TLS Performance Tuning

TLS 性能调优这块,强烈推荐看看 High Performance Browser Networking 的 [[Transport Layer Security (TLS)|https://hpbn.co/transport-layer-security-tls/#enable-tls-false-start]],写得深入浅出、形象生动。我这里是消化后的二手内容。

!! TLS Session Resumption

除去 TCP 三次握手,一个完整的 TLS 握手需要耗 2 个 RTT。TLS 握手主要是 client 跟 server 互相交换加密相关信息,而前一次协商后的结果往往可以用到下一次连接中,因此 TLS 提供了一些机制来降低这里的延时。

第一种机制是,服务端提供一个 session ID 给客户端,并缓存相应的握手信息。客户端下一次连接握手时带上 session ID,如果服务端查到该 ID 的相关握手信息,则可以省去一个完整的 session negotiation,直接用上次的对称密钥做通信。这样节省掉 1 个 RTT:

{{ abbreviated-tls-handshake }}

Session ID 的问题是,现代大规模的网站往往前面有多机做负载均衡,比如多台 nginx 在前端做 TLS 相关的工作,再把请求转发到后端逻辑 server。这样导致 Session ID 的缓存需要能被多台 nginx 访问,带来了额外的运维成本。于是 TLS 给出第二种机制,session ticket,用来解决这个问题。

Session ticket 其实很简单,就是把服务端缓存挪到客户端。Session negotiation 的结果通过服务器下发,然后客户端缓存起来。下一次请求时客户端又带给服务器,如果服务器无异议,则可以直接开始数据传输。

!! TLS False Start

TLS False Start 是 Google 提出来的一项优化,用来减少 TLS 握手的时延。原理是 client 发送 CipherChangeSpec 后立刻发送应用层数据:

{{ tls-false-start }}

TLS False Start 需要浏览器跟 server 都支持,比如:

* 协商的 cipher suite 需要支持 forward secrecy(因为不需要交换 pre-master key?)
* 双方需要支持 ALPN Extention 而不是 NPN(参考:[[为什么我们应该尽快支持 ALPN?|https://imququ.com/post/enable-alpn-asap.html]])

Session Resumption 使得第二次 TLS 握手可以只用 1 个 RTT,但是第一次握手还是需要 2 个 RTT。而 TLS False Start 则使第一次 TLS 握手也只需要占用 1 个 TLS。

!! Certificate Revocation

证书在一些情况下会被 CA 吊销,比如私钥泄漏,证书更换主体等。这个时候需要有一种机制,让客户端不再信任已被吊销的证书。

有几种机制:

* Certificate Revocation List (CRL),即 CA 维护一个庞大的已被回收的证书列表,由客户端定时更新
* Online Certificate Status Protocol (OCSP),即 CA 提供一个服务,让客户端可以实时查某个证书的吊销情况
* OCSP Stamping,下面详述

前两种存在的问题,可以自行考虑,[[这里|https://hpbn.co/transport-layer-security-tls/#certificate-revocation-list-crl]] 也给出了一些看法。

OCSP Stamping 是由 server 定时向 CA 发起 OCSP 请求,并附在 ServerHello 回给客户端,而不是由客户端发起。CA 给的 OCSP 回包会用它的私钥加密,这样 client 拿到这份 OCSP 回包时,可以校验出是 CA 给的。这样有几个好处 client 不直接发 OCSP 给 CA,不会暴露访问历史,不需要自己等待 CA 给回复。

在 WireShark 观察的相关数据如下:

{{ ocsp-stamping }}

! 前端相关

Jerry Qu 的 [[博客|https://imququ.com]] 上提到很多跟前端相关的 HTTPS 内容。前端内容多且繁杂,不同浏览器支持能力不一,在这里就不详述了,只简单讲讲 HSTS 头。

!! HTTP to HTTPS redirect

这个重定向带来了额外的网络延时。可以用 `Strict-Transport-Security` (HSTS) 头,告诉浏览器应该只访问这个网站的 HTTPS 版本。浏览器会忽略在 HTTP 页面下收到的这个文件头,因为攻击者可以窜改这些数据。

HSTS 头同样可以解决一些安全问题。比如你在公共 Wi-Fi 中连接到一个攻击者的热点,你打开 HTTP 版本的网银页面时,攻击者会把页面 302 重定向到一个假的克隆的站点,以盗取密码。如果网银页面启用了 HSTS 头,而且你之前访问过它,那么你在公共 Wi-Fi 中连接时,也会默认走 HTTPS,避开攻击者的攻击。

Chrome 维护了一个 HSTS preload list,即在这个名单中的域名,Chrome 会默认使用 HTTPS。Firefox 和 IE 似乎也使用这个列表。注意这个 preload list 并不在 HSTS 规范中,只是个事实上(de-facto)的规范。

! 安全

这块我没有深入了解,参考:

* [[Transport Layer Protection Cheat Sheet - OWASP|https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html]]
* [[Mozilla Wiki|https://wiki.mozilla.org/Security/Server_Side_TLS#Attacks_on_SSL_and_TLS]]
* [[RFC 7457 - Summarizing Known Attacks on Transport Layer Security (TLS) and Datagram TLS (DTLS)|https://tools.ietf.org/html/rfc7457]]。

! 工具

[[Qualys SSL Labs|https://www.ssllabs.com/]] 能检测不同浏览器 / Server 对于 SSL 的支持能力、安全性等,信息非常详细

Mozilla 提供了非常好的工具,用来检查一个网站支持的 cipher suites、证书路径等:

* [[mozilla/tls-observatory|https://github.com/mozilla/tls-observatory]]
* [[mozilla/cipherscan|https://github.com/mozilla/cipherscan]]

Mozilla 同时提供了一个 [[SSL Configuration Generator|https://mozilla.github.io/server-side-tls/ssl-config-generator/]],用来为不同的 web server 生成安全可靠的配置文件。

[[Is TLS Fast Yet?|https://istlsfastyet.com/]] 网站,提供了各服务器程序(如 nginx)和 CDN 服务(如 Akamai)对 TLS 各优化项的支持能力。

[[Let's Encrypt|https://letsencrypt.org/]] 提供了免费的证书申请渠道和 [[工具|https://github.com/certbot/certbot]],工具可以帮你自动申请证书及修改 web server 配置,非常赞。

! 参考信息

* [[HTTP: The Definitive Guide|http://shop.oreilly.com/product/9781565925090.do]], Chapter 14 Secure HTTP
* [[High Performance Browser Networking - Chapter 4 Transport Layer Security (TLS)|https://hpbn.co/transport-layer-security-tls/]] (highly recommend)
* [[Keyless SSL: The Nitty Gritty Technical Details|https://blog.cloudflare.com/keyless-ssl-the-nitty-gritty-technical-details/]]
* [[TLS Handshake Protocol - MSDN|https://msdn.microsoft.com/en-us/library/windows/desktop/aa380513(v=vs.85).aspx]]
* [[RFC 5246 - TLS 1.2 规范|https://tools.ietf.org/html/rfc5246]]
* [[Security/Server Side TLS - Mozilla Wiki|https://wiki.mozilla.org/Security/Server_Side_TLS]]
* [[Mythbusting HTTPS: Squashing security's urban legends - Google I/O 2016|https://www.youtube.com/watch?v=YMfW1bfyGSY]]
* [[Jerry Qu 的博客|https://imququ.com/]]
* [[The First Few Milliseconds of an HTTPS Connection|http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html]]
!! 权限

EMUI 有比较严格的权限限制,应用初始状态下并不拥有任何权限,需要打开应用时经用户同意才可以。

但是像类似 「Google Play 服务」「Google服务框架」这类应用,它是一个服务,很多权限都被上层应用需要到。因此你需要手动把他们的设为「被信任的应用」。
HyperLogLog 是一种概率数据结构(probabilistic data structure)和算法。用来统计大数据量下的去重元素个数,比如 UV(unique visitor)。

做了一个 <<coslink "幻灯片" "/files/slides/hyperloglog.pdf">> 来讲解:

<<display-pdf path:"/files/slides/hyperloglog.pdf" title:"hyperloglog.pdf">>

<div class="box">

''Redis 的 HyperLogLog 最多占用 12kB 内存,是怎样计算出来的?''

Redis 的 hash 值为 64 位,前 14 位作为桶(register),一共有 2^^14^^ 个桶。每个桶最多纪录 49 个 0,需要 6 位(2^^6^^ 为 64)来纪录。因此需要的存储空间为 2^^14^^ × 6 / 8 = 12kB。

</div>

Hystrix 是一个 Java 库,用于实现 latency and falut tolerance(容许延迟和错误)。针对的 ''场景'' 是:

一个服务可能调用非常多第三方服务,第三方服务有可能出错(client library 有 bug、超时、报错等等);即使它的成功率再高(如 99.99%),由于调用的服务数量多(如 30),也可能导致服务的可用性降低(99.99%^^30^^ = 99.7%)。

Hystrix 将对三方服务的调用包装成一个个 command:

* 每次 command 运行在单独的线程,避免第三方服务故障(比如超时时)将 web 容器(如 Tomcat)的用户线程占满
* Command 的执行结果(成功、失败、超时等)可以被 Hystrix 感知。可以做''短路(circuit break)逻辑'',即失败达到一定阈值时,运行该 command 时不再有实际执行(比如调用第三方服务),而是可以走开发者设置的 fallback 逻辑

Hystrix command 的 ''执行流程'' 如下:

[img width=800 [hystrix-flow]]

核心是 [[circuit breaker 的逻辑|https://github.com/Netflix/Hystrix/wiki/How-it-Works#circuit-breaker]]:

# 当某一 command 中对第三方服务的请求量及错误率到达某个阈值(可配),短路逻辑开启,运行 command 时直接返回错误
# 经过一段时间后(可配),Hystrix 会再次尝试去调用第三方服务,探测其是否恢复

Hystrix 会统计过于一段时间的成功失败,来做为判断依据。

!! 参考

* [[Home · Netflix/Hystrix Wiki|https://github.com/Netflix/Hystrix/wiki]]
* [[How it Works · Netflix/Hystrix Wiki|https://github.com/Netflix/Hystrix/wiki/How-it-Works]]

[[码力全开|https://maliquankai.com/tags/%E5%9B%BE%E6%A0%87%E7%BD%91%E7%AB%99/]] 有介绍不错的图标。

[[Gradientify SVG Icons|https://www.iconshock.com/svg-icons/]] 有不错的渐变图标。我下载了一套 SVG 放在 Eagle 中。有英文文件名可以搜索。在本 wiki 中也建了一个 tag [[Gradientify SVG Icons]],下面放有需要用到的图标,作为 tiddler 的 icon(比如看看 [[MySQL]] 的 field)。





有些内容我觉得他大概率是好的,但是不适合我现在阅读,可能在几年后或者有了更多的体会后才适合。放在这里。

!! Naval Ravikant

[[Naval Ravikant|https://twitter.com/naval]] 有一些关于财富、生活、冥想相关的建议和内容。我觉得在创业后一两年可以看看(也许 30 岁?):

* https://podcastnotes.org/2019/12/18/naval-ravikant-podcast-every-episode/
* https://podcastnotes.org/2019/12/09/naval-ravikant-2019/


! 信息收集

信息收集是一项非常重要的技能。这里列举了一些场景下,如何更快地找到更高质量的信息。

<<tabs "[tag[InformationAcquisition]]" "InformationAcquisitionDevOps" "$:/state/tab">>
<<tabs "[tag[InformationAcquisitionCommon]]" "" "$:/state/tab" "tc-vertical">>
<<tabs "[tag[InformationAcquisitionDevOps]]" "" "$:/state/tab" "tc-vertical">>





Doublewrite(双写)是为了避免出现 partial write(只更新了部分数据)的一种机制。

Doublewrite 会便得当 InnoDB 将页写进 data file 前,先将其写到一块单独的 doublewrite buffer 存储中。写完后才会将页从这块 buffer 中取出,写到 data file 中。

假如没有 partial write,设想下当 MySQL 写一个 16K 的数据落盘时,只写成功了 4K 后,机器掉电了。MySQL 重启后,能检测到这 4K 所在的数据是不完整的,但是它并无法恢复。即使有 [[redo log|InnoDB: Concept: Redo Log]] 也无法恢复,因为 redo log 只纪录发生了什么变化,但是一旦原来的数据被破坏了,也没法通过 redo log 来生成新的数据。

有了 doublewrite 机制后,MySQL 重启时可以尝试 ''恢复''。有两种情况:

* ''doublewrite buffer 本身出现 partial write'':写 buffer 没成功,这些页直接丢弃即可,他们不会被写入 data file
* ''data file 出现 partial write'':可以在 doublewrite buffer 中找到相应的数据恢复

''性能'' 上,启用了 doublewrite 虽然需要将同样的数据写两次,但是由于 doublewrite buffer 的写入是顺序的,而且是批量写再调 `fsync()`,事实上只 ''额外增加 5% - 10% 的消耗''。

如果文件系统或者存储介质自身能保证不出现 partial write,也可以配置 InnoDB 关闭掉 doublewrite。

!! InnoDB's Buffers and Files

[img width=800 [innodb-buffers-and-files]]

!! References

* [[Doublewrite Buffer - MySQL|https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html]]
* [[Innodb Double write - Percona|https://www.percona.com/blog/2006/08/04/innodb-double-write/]]
Doublewrite 是解决崩溃时 ''落盘的数据没写完整'' 的问题。

Redo log 是解决崩溃时 ''还有未完成事务'' 的问题。

他们解决的问题是不一样的。如果 data file 中有 partial write,那 redo log 也无法解决。
Redo log 也叫 transaction log,是基于磁盘的、在崩溃恢复中用于 ''恢复未完成事务'' 的一种机制。MySQL 在重启时,InnoDB 会自动将 redo log 中未完成的事务重做一次

Redo log 的文件名为 `ib_logfile0` `ib_logfile1`,文件数量和大小可配。采用一种 ''循环写'' 的机制(类似 on-disk ring buffer)。当一个事务被提交后,事务中相关的 log 会被批量 flush 到 data file 中,此时这些 log 在文件中的位置可以被新 log 覆盖写。

由于 [[doublewrite|InnoDB: Concept: Doublewrite]] 保证了数据的完整性,因此 redo log 无需纪录变化后的完整数据,只纪录 ''数据变化的部分''。官方文档的描述是:

> ... the redo log encodes ''requests to change table data'' that result from SQL statements or low-level API calls.

!! 与 binlog 的差异

Redo log 是 InnoDB 引擎特有的日志。而 binlog 是 MySQL server 层提供的能力,并不区分存储引擎。

因此,''Binlog 也不纪录未提交的事务。''在崩溃恢复时,仅有 binlog 是无法恢复未提交的事务的,会导致数据丢失。

!! InnoDB's Buffers and Files

[img width=800 [innodb-buffers-and-files]]

!! References

* [[Redo Log - MySQL|https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html]]
* The InnoDB transaction log, Chapter 8, High Performance MySQL, 3rd Edition

这篇文档描述 MySQL 在处理一条修改数据的请求时,写入 redo log 及 binlog 的时序,以及如何达成 crash-safe。

分布式领域有 ''two-phase commit''(2PC,二阶段提交),是一种为了保持多节点一致性的算法。MySQL 在它的内部实现中也大量借鉴了这种想法。以 InnoDB 为例,在 MySQL 收到一条 `COMMIT` 请求后,会有下列的过程发生:

# MySQL 要求存储引擎准备好(prepare)<div>

InnoDB 调用 `innobase_xa_prepare`,此时会将该事务写入 redo log 并保证它刷入了磁盘。此时这批 redo 会被标记为 prepared。

如果此时 MySQL crash 了,即写 redo log 的过程中断了,此时 MySQL 重启后并不会继续提交,而是回到未提交前的状态。
</div>
# 存储引擎准备好后,MySQL 写 binlog<div>

写 binlog 过程如果 crash 了,则 MySQL 重启时再从 redo log 中拿出相应的纪录再重新应用,重启写 binlog 即可。

</div>
# 写完 binlog 后,MySQL 要求存储引擎也提交相应的改动<div>

如果写完 binlog 后就 crash 了,MySQL 仍然能从 binlog 中知道存储引擎应该提交哪些纪录。

InnoDB 在此时会将相应的数据落盘,并将相应的 redo log 标记为 committed。
</div>

!! References

* Fun MySQL fact of the day: everything is two-phase([[网页|https://www.burnison.ca/notes/fun-mysql-fact-of-the-day-everything-is-two-phase]],<<coslink "本地存档" "/files/archives/2020/08/mysql-two-phase-for-binlog-redolog.pdf">>)
* [[日志系统:一条SQL更新语句是如何执行的? - MySQL 实战 45 讲|https://time.geekbang.org/column/article/68633]]
InnoDB 的索引实现。

索引被用来加速数据查询。索引所使用的 B+ 树,在 [[Database: Index]] 中提及。

!! 主键索引和非主键索引

区别:

* 主键索引中,''索引的值和关联的行存储在一起'',也被称为 ''聚簇索引''(clustered index)
* 非主键索引的叶子节点存的是主键的值,也被称为 ''二级索引''(secondary index)。查询时需要多扫描一颗索引树

《高性能 MySQL》中的图片:

[img width=300 [innodb-index]]

掘金的这篇 [[文章|https://juejin.cn/post/6844903886289895438]] 总结得非常好:

<details>
  <summary>展开详情</summary>

<div>

<<<
''聚簇索引与非聚簇索引的特点'':

# 聚簇索引的主键索引,数据行是和索引在一起的
# 非聚簇索引的主键索引,数据行和索引分开存储,索引中保存数据行的地址
# 聚簇索引的二级索引中,保存的是主键索引的值。之所以保存主键索引的值,而不是保存数据行的地址,是因为聚簇索引会发生页分裂,页分裂后数据存储的地址就会发生变化。当页地址发生变化后,只需要维护主键索引的数据即可,不需要维护二级索引,减少了索引的维护工作
# 非聚簇索引的主键索引和二级索引没有什么实质性的区别

''聚簇索引有些优点'':

# 可以把相关的数据保存在一起。比如一个用户的流水记录,按照用户的 ID 建立聚簇索引,这样用户所有的数据都会聚集在一起,因此查询时只需要读少数几个磁盘的数据块就可以获取一个用户所有的数据
# 数据访问更快。聚簇索引的数据行与索引在一起,因此在聚簇索引上搜索时,完成索引的搜索就找到了数据,不需要再进行一次磁盘 I/O
# 使用覆盖索引时可以直接使用页子节点中的主键值,因为二级索引的叶子节点上保存是主键值。

''聚簇索引有些缺点'':

# 插入的速度严重依赖于插入的顺序。如果按照主键的顺序进行插入,插入可以很快。如果不按照主键的顺序进行插入,则可能产生页分裂。页分裂不仅影响插入的速度,而且原来一个页,现在分成两个页来存储,而两个页又没有都存满,占用了更多的磁盘空间。所以这就是为什么 DBA 总是建议在使用 InnoDB 引擎时,使用自增 ID 做主键
# 更新聚簇索引的代价很高,因为每个被更新的行会被移动到新的位置
# 二级索引需要两次查找,因为二级索引中存放的是主键的值,需要再进行一次回表操作
# 二级索引中存储主键的值,可能会导致二级索引占用更大的空间
<<<

</div>

</details>

!! 覆盖索引

当查询时仅需要索引中的数据(比如 ID),MySQL 查完索引就可以给返回,不需要查数据行。这意味着 ''为高频查询建立联合索引是值得的''(比如查 ID 和名字)(如何衡量?)。

!! 最左前缀原则

联合索引 (a, b) 中,在 B+ 树中索引项是按定义的字段顺序排序的。比如下面,数据先按姓名排序,再按年龄排序:

[img width=600 [innodb-leftmost-prefix]]

这意味着,只查姓名时也可以利用这个联合索引。但是查年龄时不行。即是说,''查 (a) 或者 (a, b) 时也可以利用到联合索引 (a, b, c) ''。

''如果你有多个查询场景,尽量使它们可以用同一个联合索引。''

''模糊查询和范围查询都会导致联合索引上该查询列之后的列失效''。比如:

```sql
SELECT * FROM t WHERE a LIKE 'test%' AND b='luck'
```

因为 `a` 使用了模糊查询,因此即使有联合索引 (a, b),也只能利用到 a 无法用 b。

!! 前缀索引

对字符串列做索引时,有时候完整的索引太占用空间。可以选择该列的前几个字符做索引。比如 `key(email(4))`。这样减少了索引的空间,但是增加了回表(即回到主键索引 B+ 树)的次数。

''前缀索引会引起覆盖索引失效'',因为前缀索引的字符串不完整。

!! 参考

* [[Designing Data-intensive Applications Ch03]]
* [[深入浅出索引 - MySQL 实战 45 讲 - 林晓斌|https://time.geekbang.org/column/article/69236]]([[MySQL in Practice]])
* [[MySQL索引|https://juejin.cn/post/6844903886289895438]]


交互式 notebook。

研究这种工具,是因为我需要出一个部署文档,这个文档中提供一句 SQL INSERT 语句,但是里面有参数需要填写。想要有一种交互式的笔记软件,可以让用户在界面上填数据,然后按模板实时地生成最终的文本。

需求是:

* 有基础的模板编程能力,比如定义变量,编写循环、条件分支等
* 可以随着变量值的变化,实时渲染出结果
* 有丰富的 cell 类型,如可以表达 Markdown、HTML、数学公式等
* 可以导出成离线可运行的 HTML 更佳

!! Observable

[[Observable|https://observablehq.com]] 是一个基于 JavaScript 的 notebook 工具。除了导出的离线 HTML 不太方便之外,满足上述的需求点。

可以看看官方提供的 [[Five Minute Introduction|https://beta.observablehq.com/@mbostock/five-minute-introduction]] 快速上手。

[[@mbostock/form-input|https://beta.observablehq.com/@mbostock/form-input]] 提供了方便的函数用于将 HTML 表单的变化与相应的变量值做绑定。

! Intro to Descriptive Statistics

|!Name |Intro to Descriptive Statistics |
|!Instructor |Udacity Team |
|!Platform |[[Udacity|https://classroom.udacity.com/courses/ud827]] |

[[Intro to Descriptive Statistics|https://classroom.udacity.com/courses/ud827]] is a free udacity course. The courseware is located in `Dropbox\Journey\Resources\Courses\2017-Intro-to-Descriptive-Statistics`. Some annotations may be written in the slides.

!! Intro to Research Methods

Concepts: 

* population parameters, sample statistics
* X-axis: independent variable / predicted variable, Y-axis: dependent variable / outcome
* lurking variable, extraneous factor, correlation does not prove causation
* A construct is a variable that is not directly observable or measurable, and units are at the heart of measurement. What units do you think should be used to measure distance? Some possibilities are miles, kilometers, calories expended, state lines crossed, road signs passed, etc.
* operational definition 不一定需要是客观可测量的东西,可以是主观的。可以是自己受试者自己打的分,比如针对睡眠质量给一个 1~10 分的打分体系,1 为最差,10 为最佳。
** 有另外一个例子很奇特,针对随机两组人给安眠药 / Placebo,进行双盲测试。这个测试中的 operation definition 并不是受试者打出的睡眠质量分,而是两组人的睡眠质量分差异。原文:「Note that while the operational definition of quality of sleep is the 10-point scale, the way we actually measure success comes from the difference in quality between groups.」

如何判断一个 histogram 的分布 (distribution) 是 positive skew 还是 negative skew?看它的长尾在哪边。在右边就是 positive,在左边就是 negative。

!! Lesson 17: PS 6: Normal Distribution

> If 33% of scores are less than Score X, then the percentile of Score X is 33%. That's how ''percentile'' is defined!

percentile 的含义比较奇特。这里的 score 指样本里面的某个数据值 (比如身高多少厘米 / 考试多少分这种)。

!! Lesson 18: Sampling Distribution

这章是比较重要的。它用来分析 population 中的 sample means。关键概念:standard error, The Central Limit Theorem 等。

{{population-and-sample}}

Population 和 Sample 一直让我搞不明白。Population 有时候表示 sample 的超集,比如某一学校的学生 (population) 和这一学校中某一年级的学生 (sample);有时候 (比如这个例子),population 像是表示 sample 中可能的值的集合。

{{the-central-limit-theorem}}

The Central Limit Theorem 表示 distribution of sample means 是一条正态曲线。这可以用来''判断一个样本是不是典型的'' (观察它的平均值落在正态曲线的哪里)。
|!Name |MITx: 6.041x Introduction to Probability - The Science of Uncertainty |
|!Instructor |MITx |
|!Platform |[[edX|https://courses.edx.org/courses/course-v1:MITx+6.041x_4+1T2017/course/]] |

Courseware is located at `Dropbox\Journey\Resources\Courses\2017-MITx-6.041x-Introduction-to-Probability`.

!! Unit 1: Probability models and axioms

Countable additivity 一节提到:

> Countable Additivity Axiom:
> If A1, A2, A3,. . . is an infinite ''sequence'' of disjoint events,
> then P(A1 ∪ A2 ∪ A3 ∪ · · · ) = P(A1) + P(A2) + P(A3) + · · ·

这引出了一个概念,叫 ''countable''。''sequence'' 意味着 ''countable''。比如一块正方形区域中的点组成的序列,它就不是 countable 的;因为精度问题,你没法把点一个个列出来。countable 跟序列是有限还是无限的并没有关系,无限长的序列也可以是 countable。
IP forward(IP 转发)是指将对 IP 1 的访问,在底层全部拦截并发往 IP 2。

!! 配置方法

修改 `/etc/sysctl.d/99-sysctl.conf` 中修改或新增 `net.ipv4.ip_forward = 1`,然后执行:

```shell
iptables -t nat -A OUTPUT -d [ip1] -j DNAT --to-destination [ip2]
```

这样就生效了。

注意对 IP table 的修改只对本次启动有效,重启后就没有了。如果需要每次启动都启用,需要使用 Systemd 或者其他机制实现。

!! 应用场景

如果你控制不了应用程序发请求所使用的对端 IP,你可以通过这种方式篡改它。


!! istioctl

`istioctl` 命令的参数长得很像 `kubectl`,比如 `create -f <file_name>` 等。但是它跟 `kubectl` 并不是等价的。它所使用的配置文件格式(比如各种 `route_rules.yaml`),也跟 Kubernetes 的配置不完全兼容。

From [[Should samples use istioctl or kubectl? #652|https://github.com/istio/istio/issues/652]]:

> We cannot force users to use kubectl in a docker swarm or mesos or cloud Foundry or vm only environment. The fact that we reuse kube API server is purely implementation detail.

`istioctl` 设计出来的目的,是为了兼容不同的容器编排工具,而做的一个中间层。比如你可以用 `istioctl`,用一样的命令去操作 Kubernetes 集群或者操作 Mesos(未来会支持)。而 `istioctl` 目前长得像 `kubectl`,只是实现上的细节而已。
!! Key Capabilities

下面的内容是从 Istio 的 Overview 文档中提取的,还缺乏具体的理解:

* Traffic Management: 控制服务间 API 调用的流量
* Observability: 帮助理解服务间的依赖关系,和流量的流向
* Policy Enforcement: 资源访问策略、分配策略
* Service Identity and Security: 

!! Architecture

* Data plane: intelligent proxies (Envoy)
* Control plane: Pilot, Mixer, Istio-Auth, ...

Envoy 运行在 Kunbernetes 上时,通过改写 iptables 规则让流量走到 sidecar proxies 上。

Pilot 似乎是个比较重要的角色:

> Pilot provides service discovery for the Envoy sidecars, traffic management capabilities for intelligent routing (e.g., A/B tests, canary deployments, etc.), and resiliency (timeouts, retries, circuit breakers, etc.).

用人话表达一个请求的过程:

# 一个服务发起对另一个服务的请求
# 请求经过 Pilot,Pilot 上可能配了 A/B Test, canary deployment 啥的,它按规则生成 Envoy data plane API 所需要的数据,让请求通过 Envoy 代理
# 请求通过 Envoy 代理,Envoy 把跟请求相关的属性(比如 TCP 层面的信息、接口返回码、延时等)提取出来,转发给 Mixer 作决策
# Mixer 有一些规则、策略,不知道具体做什么,后面再看

Mixer 这块,主要看官方文档中的 [[Istio Mixer: Adapter Developer's Guide|https://github.com/istio/istio/blob/master/mixer/doc/adapters.md]]。这里我举一些实例辅助理解。

Template 中定义的字段,像是一个 placeholder,供运行时填写实际请求相关的字段,比如:

```protobuf
# mixer/template/listentry/template.proto
message Template {
    // Specifies the entry to verify in the list.
    string value = 1;
}
```

```yaml
# mixer/testdata/config/listcheck.yaml
apiVersion: "config.istio.io/v1alpha2"
kind: listentry
metadata:
  name: appversion
  namespace: istio-system
spec:
  value: source.labels["version"]
```

adapter 需要指定使用哪(几)个 template,在 `GetInfo()` 的 `SupportedTemplate` 中定义。Template 的 Protobuf 文件中有 `template_variety`,表明它是 `Check` 还是 `Report` 等,比如:

```golang
// mixer/template/checknothing/template.proto
option (istio.mixer.adapter.model.v1beta1.template_variety) = TEMPLATE_VARIETY_CHECK;
```

Template 里提供了一个 `value` 字段,供运维配置运行时时,用哪个请求相关的字段填充。这个例子中,会用 `source.labels["version"]` 填充。然后运行时就会生成一个 instance 给 adapter 去取 `value`,也就是调用方的版本号:

```golang
// mixer/adapter/list/list.go
func (h *handler) HandleListEntry(_ context.Context, entry *listentry.Instance) (adapter.CheckResult, error) {
	// 此时你就可以从 entry 中拿到调用方的版本号,做相关的逻辑
}
```

adapter 也有自己的配置,主要跟运行时的业务逻辑有关:

```protobuf
# mixer/adapter/list/config/config.proto
message Params {
    // Where to find the list to check against. This may be ommited for a completely local list.
    string provider_url = 1;

    // Determines how often the provider is polled for
    // an updated list
    google.protobuf.Duration refresh_interval = 2 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];

    // Indicates how long to keep a list before discarding it.
    // Typically, the TTL value should be set to noticeably longer (> 2x) than the
    // refresh interval to ensure continued operation in the face of transient
    // server outages.
    google.protobuf.Duration ttl = 3 [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
    
    // ...
    
    // List entries that are consulted first, before the list from the server
    repeated string overrides = 6;

	// ...
    // Whether the list operates as a blacklist or a whitelist.
    bool blacklist = 8;
}
```

这上面的 `refresh_interval` 表示 `listchecker` 这个 adapter,它会在多长时间去访问 `provider_url` 去刷新黑白名单列表。这上面的配置,可以由运维通过配置文件配置:

```yaml
apiVersion: "config.istio.io/v1alpha2"
kind: listchecker
metadata:
  name: staticversion
  namespace: istio-system
spec:
  # providerUrl: ordinarily black and white lists are maintained
  # externally and fetched asynchronously using the providerUrl.
  overrides: ["v1", "v2"]  # overrides provide a static list
  blacklist: false
```

同时你可以在代码中配置默认值:

```golang
// mixer/adapter/list/list.go
func GetInfo() adapter.Info {
	return adapter.Info{
		Name:               "listchecker",
		Impl:               "istio.io/istio/mixer/adapter/list",
		Description:        "Checks whether an entry is present in a list",
		SupportedTemplates: []string{listentry.TemplateName},
		DefaultConfig: &config.Params{
			RefreshInterval: 60 * time.Second,
			Ttl:             300 * time.Second,
			CachingInterval: 300 * time.Second,
			CachingUseCount: 10000,
			EntryType:       config.STRINGS,
			Blacklist:       false,
		},

		NewBuilder: func() adapter.HandlerBuilder { return &builder{} },
	}
}
```

配置好了 template 所定义的 instance 数据,adapter 所定义的业务逻辑配置,你需要再写一个 rule 把它们串起来,就完成了:

```yaml
apiVersion: "config.istio.io/v1alpha2"
kind: rule
metadata:
  name: checkwl
  namespace: istio-system
spec:
  # If an attribute could be potentially absent, use the '|' operator
  # to provide a default value. In the below example if 'destination.labels'
  # is absent, "unknown" is used in its place (this happens in non kubernetes env).
  match: (destination.labels["app"]|"unknown") == "ratings"
  actions:
  - handler: staticversion.listchecker  # 对应上面配置的 listchecker,里面写了 adapter 配置
    instances:
    - appversion.listentry              # 对应上面配置的 listentry,里面配置了 instance 数据
```

这上面所有可以配置的内容,最终会由运维写进一个 yaml 文件中,再由 `istioctl` 命令应用进这套系统中。

<<.note "`listentry` 跟 `listchecker` 都可以配置多个。多个 `listcheck` 时,运行时就有多个 adapter 实例存在 mixer 中。多个 `listentry` 时,每个请求就有多个 instance 生成给 adapter(当然也看匹配规则)。">>
<<.note "这里的尝试是在 Istio 0.7.1 版本时做的,后续新的版本可能会有差异。">>

这里描述怎样弄一个自定义的 Template。

我的 adapter 名叫 tsfauth,内置的 template 没有合适的,我要弄一个跟它配套使用的 template。

先给 template 建个文件夹:

```bash
mkdir mixer/adapter/tsfauth/template/tsfauthcheck
```

在 `template` 目录下又加了一层 `tsfauthcheck` 目录,是因为 Mixer 的生成代码不好(指下面的 `mixgenbootstrap`),如果不加 `tsfauthcheck` 目录,生成的 `mixer/template/template.gen.go` 里面会有 import 冲突。servicecontrol adapter 也是同样的原因加了最后的目录。

模板名用 `tsfauthcheck` 而不用 `tsfauth`,是因为 Mixer 在解析配置文件时,template 和 handler 是用的同个「命名空间」的。如果两者都用同个名字 `tsfauth`,这时你在 operatorconfig 里面写 `kind: tsfauth`,Mixer 会把它当作是 handler 而不是 template,这样就你无法定义 template instance。`mixer/testdata/config/quota.yaml` 中也是同样的问题,所以它把 adapter 定义为 `memquota`,使用 `quota` 模板。

然后在这个目录中写你的 `template.proto` 文件,格式参考内置的几个。

生成 `descriptor_set` 文件:

```bash
cd mixer/adapter/tsfauth/template/tsfauthcheck
protoc --descriptor_set_out template_proto.descriptor_set -I /home/onlyice/go/src/istio.io/istio/vendor/istio.io/api/ -I . template.proto
```

生成 `template.gen.go`:

把这行代码加入 `mixer/template/inventory.yaml`:

```yaml
../adapter/tsfauth/template/tsfauthcheck/template_proto.descriptor_set: "istio.io/istio/mixer/adapter/tsfauth/template/tsfauthcheck"
```

```bash
cd mixer/template
mixgenbootstrap -f inventory.yaml -o template.gen.go
```

生成 `template_handler.gen.go` 和 `template_handler_service.proto`:

```bash
cd mixer/adapter/tsfauth/template/tsfauthcheck
mixgenproc template_proto.descriptor_set -o template_handler.gen.go -t template_handler_service.proto 
```

生成 `template_handler_service.pb.go` 和文档:

```bash
$GOPATH/src/istio.io/istio/bin/mixer_codegen.sh -f mixer/adapter/tsfauth/template/tsfauthcheck/template_handler_service.proto
```

大功告成,在你的 adapter 的 `GetInfo` 函数中,指定它为 template 就可以了。





[[jsonschema2pojo|http://www.jsonschema2pojo.org/]] 提供了一个方便的工具,用来将一段 JSON 自动生成一堆 POJO 类。配置参考下图:

{{ json-to-java-pojo }}
Java 上 SSH 的库类主要有:[[JSch|http://www.jcraft.com/jsch/]],[[sshj|https://github.com/hierynomus/sshj]]。这篇 [[帖子|https://medium.com/ldclakmal/comparison-of-commons-vfs-sshj-and-jsch-libraries-for-sftp-support-cd5a0db2fbce]] 对比了 sshj、Commons VFS 以及 JSch,摘录里面的表格如下:

{{ comparison-of-java-ssh-libraries }}

总的来说:

* JSch 很老牌,是这个领域的 Java 库的事实标准。主要的 API 是在数年前(可能 2010~2012)设计的,没有 sshj 友好;2018 年仍有 bug fix 修改,质量是比较可靠的
* sshj 是比较新的库,API 设计比 JSch 简洁,但是 [[issue|https://github.com/hierynomus/sshj/issues]] 里积压了一些数年前的(比如 2012, 2014)的,不知道开发者在这方面是否足够积极

同时我调研了 HTTP Proxy 的支持,JSch 和 sshj 都是支持的。

!! Data Types

''Java 的数据类型分为'':

* Primitive:基础类型,比如 int,它的长度(取值范围)在不同平台一致
* Non-primitive:非基础类型,比如 Array,String

''Primitive 包含'':byte, short, int, long, float, double, char, boolean。

''byte v.s. char'':

* byte: 8-bit signed two's complement integer, [-128, 127]
* char: a single 16-bit Unicode Character (UTF-16), default '\u0000', maximum value '\uffff' (65536)

''Literals'':

* Integer:
** in decimal, `16`
** in hexadecimal, `0x1a`
** in binary, `0b11010`
** 没有 8 进制
* Float-point: `E/e` for scientific notation, `D/d` for double, `F/f` for float
** usally, `123.4`
** in scientific notation, `1.234e2`
** in float, `123.4f`
* Char and string: `'Z'`, `"BeginnersBook"`

''未初始化的变量'',如果是基础类型(primitive)的,有默认值 0;非基础类型是 `null`。

Java 没有类似 C/C++/Java 的 trusy value,比如:

```cpp
int i = 1;
if (1) { ... }
```

```python
l = [1]
if l:
    pass
```

Java 则不允许上述的情况,它需要显式地构造出 `if (i == 1)`, `if (!l.empty())`。下面这样会抛 null exception:

```java
Object o = null;
if (o) {}
```

* [[Data Types in Java|https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html]]
* [[Primitive Data Types|https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html]]

!! Operators

Java 的操作符跟 C/C++ 没有什么区别。这里不描述。

!! Control Flows

`if-else` 跟 C/C++ 没有区别。

`switch-case` 中,你可以用这些类似作为判断值用:

* 整型:`byte`, `char`, `short`, `int`,注意 `byte` 跟 `char`,他们虽然常用来表示字符,但是本质上也是个整型
* 枚举类型
* String (JDK 7 开始支持)
* 一些包裹基础类型的特殊类,如 `Character`, `Byte`, `Short` 和 `Integer`

`for` 循环,比起 C/C++ 基本一样,Java 还有一个 enhanced for-loop,类似于 for each 语句:

```java
for (String element : array) {
    System.out.println("Element: " + element);
}
```

`array` 应该是个 iterator。自定义的类也可以通过类似机制来实现。

`while` `do-while` 循环跟 C/C++ 没什么区别。

此外配合 `for` / `while` 循环使用的 `continue`, `break`,后面可以接个 label。

参考:

* [[The switch Statement - Oracle|https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html]]
* [[Using Enhanced For-Loops with Your Classes|https://blogs.oracle.com/corejavatechtips/using-enhanced-for-loops-with-your-classes]]



Java 标准库中的 HashMap 实现。

!! 模型

HashMap 有 ''初始容量(initial capacity)'' 及 ''负载因子(load factor)''。这两个参数最影响性能。默认的初始容量为 16,负载因子为 0.75。向 HashMap 插入数据后,如果数据的数量达到阈值(容量 × 负载因子),HashMap 会做 ''rehashing'',即把容量扩大一倍,并将数据重新 hash 到 bucket 上。

Bucket 是下图中的 16 个格子,里面装了 hash 到这个桶的数据。Bucket 的数量即当前的容量。

[img width=500 [java-hashmap-model]]

每次一个新数据(`key` 表示)插入时,它的 `hashCode()` 会被调用,再对 HashMap 容量(`n` 表示)取余后,落入具体的 bucket 中:

```java
key.hashCode() % n
```

每个数据有这几个属性(对应上图):

* int 型 hash 值
* Key
* Value
* 同 hash 值的下一个数据的指针

!! 冲突时的处理

不同的 key 可能有同样的 `hashCode()`。此时它们会落入同个桶内。JDK 8 之前用链表来连接这些对象;但出于安全考虑(攻击者可能构建一批 hash code 一致的数据,使得查询性能降低到 O(n)),JDK 8 及之后 [[在数据量到达阈值时会使用平衡树替代链表|http://openjdk.java.net/jeps/180]],使得最差情况的查询性能提升为 O(log n)。

由于不同对象可能有同个 hash code,因此对象需要实现 `equals()` 来比较不同的对象。这和 Python [[类似|FluentPythonCh03]]。当在 HashMap 中查找某一 key 时,通过 key 的 hash code 定位到具体的 bucket,再将 bucket 中的 key 一个进行 `equals()` 比较,从而找到需要的 key。

!! 扩容(rehashing)

默认的负载因子为 0.75,是实践中兼顾了时间(负载因子过小会频繁 rehashing 耗费性能)和空间(负载因子过小会导致 bucket 过多,浪费内存)的选择。

在插入一个新数据时,如果 HashMap 中数据量超过阈值(容量 × 负载因子),为了保证插入、删除、和查询时的 O(1) 性能,HashMap 需要扩容。(不扩容就不能保证每个 bucket 的数据都很少,也就不能保证 O(1) 的查询性能。)扩容时容量会翻倍,即桶的量会翻倍,意味着需要重新计算 key 落在哪个 bucket,这个过程即 rehashing。HashMap 会遍历旧的 bucket 数组,将数据挪至新的 bucket 数组中。此时这次插入的性能不是 O(1),变为 O(n)。

!! 参考

* [[Internal Working of HashMap in Java - GeeksforGeeks|https://www.geeksforgeeks.org/internal-working-of-hashmap-java/]]
* [[Load Factor and Rehashing - GeeksforGeeks|https://www.geeksforgeeks.org/load-factor-and-rehashing/]]
OOP 用类(class)和实例(object)来构造系统。

Object:

* An object is an instance of a Class
* Object have two characteristics: ''states'' and ''behaviors''

它的目的还是那几项:封装、继承、多态、抽象。同时 Java 界喜欢讲 message passing,把调用一个类的方法当作传递消息。

参考:

* [[OOP concepts in Java|https://beginnersbook.com/2013/04/oops-concepts/]]
!! Types of Constructor

Constructor 有三种:

* Default constructor:你不写 constructor 时,Java 编译器默认给你加了,`.class` 文件中有;它的行为是什么成员变量都初始化成零值或者 null
* No-arg constructor:没有参数的 constructor
* Parameterized constructor:带参数的

```java
public class Hello {
    string name;
    
    // No-arg constructor
    Hello() { this.name = "World"; }
    
    // Parameteraized constructor
    Hello(string name) { this.name = name; }
}
```

你也可以只实现没有参数的构造函数,或者只实现带参数的。

!! Constructor Chaining

```java
public class Hello {
    string name;
    
    Hello() { this("World"); }   // 调用下面那个构造函数
    Hello(string name) { this.name = name; }
}
```

!! `this` and `super` keywords

`this` 在类的定义体内经常出现:

* `this.name = "World"` 时,`this` 表示运行时的这个类实例(object)本身
* `this("World")` 时,调用的是构造函数
* `this.func()` 时,调用的是实例的方法

`super` 跟 `this` 类似,但它是指向你的父类的东西。

!! Private constructor

构造函数可以是 private 的,主要用来实现单例(Singleton):

```java
public class Singleton {
    private static Singleton obj = null;
    
    private Singleton() {}   // 这样外部代码无法实例化一个 Singleton object
    
    public static Singleton getInstance() {
        if(obj == null) {
            obj = new SingleTonClass();
        }
        return obj;
    }
}
```
Nested class 有两种形式,非静态的和静态的:

```java
class OuterClass {
    ...
    static class StaticInnerClass {
        ...
    }
    class InnerClass {
        ...
    }
}
```

!! 访问规则

* `InnerClass` 可以访问 `OuterClass` 中的其他成员,甚至是 `private` 的
* `StaticInnerClass` 只可以访问 `OuterClass` 中的静态成员

!! 使用场景

`InnerClass` 适用于,只被一个类使用(`OuterClass`),同时逻辑比较内聚,值得被封装成类的场景。`InnerClass` 也可以被外部使用,但是初始化很罗嗦:

```java
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
```

`StaticInnerClass` 可以给外部使用。Effective Java 有一例子:

```java
public class Outer {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;

        public Builder(int age) {
            this.age = age;
        }

        public Builder withName(String name) {
            this.name = name;
            return this;
        }

        public Builder withAge(int age) {
            this.age = age;
            return this;
        }

        public Outer build() {
            return new Outer(this);
        }
    }

    private Outer(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
    
    public Outer getOuter() {
        Outer outer = new Outer.Builder(2).withName("Yang Liu").build();
        return outer;
    }
}
```

!! Shadowing

```java
public class ShadowTest {

    public int x = 0;

    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {
            System.out.println(x);                  // 函数参数中的 x
            System.out.println(this.x);             // 内部类的 x
            System.out.println(ShadowTest.this.x);  // 外部类的 x 
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);    // 输入分别是:23, 1, 0
    }
}
```

参考:

* [[Nested Classes|https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html]]
!! Static Variable, Block, Method

```java
public class ClassDemo {
    // Static variable. Use `ClassDemo.num` when accessed by outside
    static int num;
    int size;

    // Static blocks. Would be executed in sequence before constructor was called
    // You can't assign a value to non-static variable in static blocks.
    static {
        num = 17;
        System.out.println("Executing static block 1");
    }

    static {
        System.out.println("Executing static block 2");
    }

    // Static variable can be changed by instance method, But it's not practical.
    void changeNum1() {
        num = 10;
        size = 20;
    }

    // Static variable can be changed by static methods.
    // Use `ClassDemo.changeNum2()` when accessed by outside
    // You can't assign a value to non-static variable in static methods.
    static void changeNum2() {
        num = 11;
    }
}
```

Static context 包含:

* Static block
* Static method

在 static context 中,你不能:

* 访问非静态成员变量
* 调用非静态方法
* 使用 `this`, `super` 关键字。`this`, `super` 指向的是 instance。假如 `Child` 类继承 `Parent` 类,如果你要:
** 调用子类或者父类的静态函数,使用 `Child.staticFunc()`, `Parent.staticFunc()`
** 访问子类或者父类的静态成员函数,类似上一条

!! Static Class

参考 [[Java: OOP: Nested Class]]。

参考:

* [[Java – Static Class, Block, Methods and Variables|https://beginnersbook.com/2013/04/java-static-class-block-methods-variables/]]
在这个节点下,ECMAScript 跟 JavaScript 是可以互换的,并不去纠结叫法本身。

对于应该选择什么技术来学习及使用,可以参考:

* [[The State of JavaScript|https://stateofjs.com]]
* [[StackShare|https://stackshare.io/]]

!! See Also

* [[Web API]]


Class 是在 ES6 (ECMAScript 2015) 推出的新特性。

在 React 中用 class component 时经常会出现一个问题,即 class 中的 method 默认是非 bound 的。React 的 [[文档|https://reactjs.org/docs/handling-events.html]] 详细描述了这个问题。

表现在于,如果你想在 method 体中用 `this` 指代对象的实例时会报错:

```javascript
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};
  }

  handleClick() {
    // ERROR: this.setState will throw exception
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}
```

有几个解决方法:

* 在构建函数中 `bind` 上(推荐):<div>

```javascript
constructor(props) {
  super(props);
  this.state = {isToggleOn: true};
	
  // This binding is necessary to make `this` work in the callback
  this.handleClick = this.handleClick.bind(this);
}
```
</div>

* 用仍在实验状态的 [[public class fields syntax|https://babeljs.io/docs/plugins/transform-class-properties/]]。这个语法有点迷惑性:<div>

```javascript
class Toggle extends React.Component {
  // This syntax ensures `this` is bound within handleClick.
  // Warning: this is *experimental* syntax.
  handleClick = () => {
    console.log('this is:', this);
  }
	
  // ...
}
```
</div>

* 不直接将 method 赋值给 `onClick` 属性,而是包裹一个匿名函数:<div>

```javascript
class LoggingButton extends React.Component {
  handleClick() {
    console.log('this is:', this);
  }

  render() {
    // This syntax ensures `this` is bound within handleClick
    return (
      <button onClick={(e) => this.handleClick(e)}>
        Click me
      </button>
    );
  }
}
```

</div>
[[paularmstrong/normalizr|https://github.com/paularmstrong/normalizr]] 提供了将嵌套的 JSON 数据 normalize 的方法,例如:

```javascript
// 转换前的数据
{
  "id": "123",
  "author": {
    "id": "1",
    "name": "Paul"
  },
  "title": "My awesome blog post",
  "comments": [
    {
      "id": "324",
      "commenter": {
        "id": "2",
        "name": "Nicole"
      }
    }
  ]
}

// 转换后的数据
{
  result: "123",
  entities: {
    "articles": {
      "123": {
        id: "123",
        author: "1",
        title: "My awesome blog post",
        comments: [ "324" ]
      }
    },
    "users": {
      "1": { "id": "1", "name": "Paul" },
      "2": { "id": "2", "name": "Nicole" }
    },
    "comments": {
      "324": { id: "324", "commenter": "2" }
    }
  }
}
```

这也可以用在列表数据中,比如一个帖子列表,可能有一个评论者在多个帖子中留言,可以将 normalized 的数据从后端传到前端,再通过前端 React 来渲染,也可以在前端 denormalized。

这种库与 React / Redux 配合起来很方便。
涉及到日期操作时,看看 [[You-Dont-Need-Momentjs|https://github.com/you-dont-need/You-Dont-Need-Momentjs]] 这个项目。它把最常用的日期库做各种对比,非常详细专业,也可以当作一个 cheatsheet 来看。目前我觉得用 [[date-fns|https://date-fns.org/]] 比较好。
[[Destructuring Assignment|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment]] 非常灵活,跟 Spread 操作符可以结合起来,跟 Arrow Function 也可以结合起来:

```js
var fun = ({a, b}) => a+b;
fun({a: 1, b: 2})    // 3
fun({a: 1})          // NaN (1+undefined)

// 甚至可以带默认参数
var fun2 = ({a, b} = {a: 1, b: 3}) => a+b;
fun2();     // 4
```

!! Array Destructuring

```js
let input = [1, 2];
let [first, second] = input;
console.log(first); // outputs 1
console.log(second); // outputs 2
```

```js
// swap variables
[first, second] = [second, first];
```

```js
let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // outputs 1
console.log(rest); // outputs [ 2, 3, 4 ]
```

```js
// ignore trailing elements
let [first] = [1, 2, 3, 4];
console.log(first); // outputs 1

// ignore some elements
let [, second, , fourth] = [1, 2, 3, 4];
console.log(second); // outputs 2
console.log(fourth); // outputs 4
```

!! Object destructuring

```js
let o = {
    a: "foo",
    b: 12,
    c: "bar"
};
let { a, b } = o;

// surround with parentheses or JavaScript parses a `{` as the start of block
({ a, b } = { a: "baz", b: 101 });

// passthrough
let { a, ...passthrough } = o;
let total = passthrough.b + passthrough.c.length;
```

```js
function f({ a, b = 4 } = { a: "hello" }) {
    console.log(a, b)
}

f()                     // hello 4
f({a: 'world'})         // world 4
f({a: 'world', b: 2})   // world 2
```

!! TypeScript destructuring

看 TypeScript 官方的 [[handbook|https://www.typescriptlang.org/docs/handbook/variable-declarations.html]]。与 JavaScript 基本一致。
不可变对象,即一个对象在创建之后它的内容不再被修改。在函数式编程的场景中(比如 [[Redux]])经常被使用。如果需要修改数据,不应该修改原本的对象,而应该拷贝一个新的对象做修改,再替换原来的变量指向的对象。比如下面演示一段修改字段值的代码:

```javascript
let obj = { a: 1, b: 2 };
let modifiedObj = { ...obj, a: 3};
```

JS 实现不可变对象有语言内置的方式,也有第三方库。

!! 语言内置的方式

[[Spread operator|JavaScript: Spread Operator]] 或 `Object.assign` 可以实现。一般用 spread operator,因为更简单好理解。`Object.assign` 的方式不在这里描述。

对于数组:

```javascript
const numbers = [1, 2, 3];

// Adding
const index = numbers.indexOf(2);
const added = [...numbers.slice(0, index), 4, ...numbers.slice(index)];

// Removing
const removed = numbers.filter(n => n !== 2);

// Updating
const updated = numbers.map(n => (n === 2 ? 20 : n));
console.log(updated);
```

对于 `Object`:

```javascript
const address = {
  country: "USA",
  city: "San Francisco"
};

// Add new field
const added = {
  ...address,
  zipCode: 94102
};

// Removing (country field is removed)
const { country, ...removed } = address;
console.log(removed);

// Updating
const updated = {
  ...address,
  city: "New York"
};
console.log(person);
```

<<.warning "注意:spread operator 使用的是 ''浅复制''。这意味着你在复制多层 object 的结构时需要额外注意。使用第三方库会自动帮你解决这些问题。">>

!! 第三方库

!!! Immer

[[Immer|https://immerjs.github.io/immer/docs/introduction]] 是 [[Mosh|https://codewithmosh.com/]] 最推荐的库。

[img width=600 [immer-flow]]

它的原理是,提供一个代理了原始数据 `baseState` 的草稿对象 `draftState`,你在这个草稿上做的改动会被 Immer 纪录,用来生成一个新的对象:

```javascript
import produce from "immer"

const baseState = [
    {
        todo: "Learn typescript",
        done: true
    },
    {
        todo: "Try immer",
        done: false
    }
]

const nextState = produce(baseState, draftState => {
    draftState.push({todo: "Tweet about it"})
    draftState[1].done = true
})
```

[[Redux Toolkit]] 底层使用了 Immer。

!!! Immutable.js

[[Immutable.js|https://immutable-js.github.io/immutable-js/]] 是 Facebook 维护的。它自定义了一个 Map 对象,在这个 Map 上做 `set()` 操作修改字段:

```javascript
import { Map } from "immutable";

let book = Map({ title: "Harry Potter" });

function publish(book) {
  return book.set("isPublished", true);
}

book = publish(book);

console.log(book.toJS());
```

!!! Immer v.s. Immutable.js

Immer 在实现上更优雅,你操作的是就是一个 JavaScript object,而 Immutable.js 需要使用它自定义的 Map 结构。这使得后者在与第三方库整合上势必会更麻烦。

''应该使用 Immer。''
这是一个 ES6 的特性(<<es6-compatibility-table>>)。

在此之前有 AMD (Require.js 为代表)和 CommonJS (Node.js 为代表)两套规范,我认为不需要再去学他们,ES6 Module 应该是后续会发展得更好的模块系统。

! 基础

# ES6 每个模块以一个 JS 文件形式存在
# 这个文件是用来被导入的,在里面定义任何符号都不会污染全局空间
# 这个文件自动启用了 Strict Mode

! 语法

!! Basic Usage

导出单个符号:

```js
export function detectCats() {
  // ...
}

export class Kittydar {
  // ...
}
```

导入单个符号:

```js
// 注意:这里不管导入一个还是多个,都必须加上花括号
import {detectCats} from "./module.js"
```

批量导出:

```js
function detectCats() {
  // ...
}

class Kittydar {
  // ...
}

// 注意:这里不管导出一个还是多个,都必须加上花括号
export {detectCats, Kittydar};
```

批量导入:

```js
import {detectCats, Kittydar} from "./module.js"
```

导出符号重命名:

```js
export {detectCats as dc, Kittydar as k};
```

导入符号重命名:

```js
import {detectCats as dc, Kittydar as k} from "./module.js"
```

!! Default exports

导出:

```js
// 第一种
let myObject = {
  field1: value1,
  field2: value2
};
export {myObject as default};

// 第二种
export default {
  field1: value1,
  field2: value2
};
```

导入:

```js
// 下面的 moduleDefault 是个 object,有 field1, field2(对应上面的导出代码)
// 注意:这里 import 后面没有花括号
import moduleDefault from "module.js";
```

!! Module objects

```js
import * as cows from "cows";
// 此时 cows 变量是个 object,包含 cows.js 中所有被 export 的内容
```

!! Aggregating modules

注意这里面 `*` 的用法,与 module objects 做对比。

```
// world-foods.js - good stuff from all over

// import "sri-lanka" and re-export some of its exports
export {Tea, Cinnamon} from "sri-lanka";

// import "equatorial-guinea" and re-export some of its exports
export {Coffee, Cocoa} from "equatorial-guinea";

// import "singapore" and export ALL of its exports
export * from "singapore";
```

! 如何使用?

浏览器和 Node.js 目前(2017 年 2 月)都无法直接支持 ES6 模块系统,需要转译(transpiler)和打包(bundle)工具来将其转成可被支持的代码。

最常用的 transpiler 是 Babel;最常用的打包工具是 webpack。

对于 Babel,照它的 [[Setup 文档|https://babeljs.io/docs/setup/]] 作配置即可。同时 `babel-cli` 库提供了 `babel-node` 程序,可以先转译后再调用 `node` 命令行程序执行 JS 代码。

webpack 相关的配置,参考它的 [[Getting Start 教程|https://webpack.js.org/guides/get-started/]]。

Babel 默认不支持相对于固定路径的 import,参考 [[JavaScript: Module System: Absolute Import]]。

! 设计原则

ES6 规范不关心解释器如何装载一个模块,但是它用一些要求限定了解释器的行为,使得这套模块系统非常静态化(可以与 Python 的做对比):

* `import` 和 `export` 必须在一个模块的顶层作用域被使用,无法在函数块中使用,也无法实现 conditional import or export
* 所有导出的标识符必须是显式的,即不能用编程的方式导出标识符(比如如果你想导出 `a1`, `a2`, ..., `a100`,那你必须在代码里输出这么多标识符的名字,而无法用一段循环来导出)
* Module objects are frozen. 你没法 hack 进这个对象去修改它的内容,或者增加功能
* 任何模块以及它的依赖,都必须在 JS 代码被执行之前加载完毕。没有懒加载的能力。
* 导入出错时没有恢复的能力(webpack 之类的工具可以在编译期检测出这种错误)
* 整个装载过程,没有提供 hook 的能力;你没法在一个模块将被装载前执行什么代码

这里面的限制都是为了保证这个系统在运行时的稳定性。但是其中有一些能力,可以借助 webpack 这类工具实现,比如 hook 能力。而且这套规范的设计也很大程度上方便了这些 compile-time 工具。

浏览器上暂时没有实现这套加载能力,需要依赖 webpack 把不同模块打包到一个大文件中。这让我觉得很奇怪,毕竟浏览器还是作为 JS 的最大运行环境,如果不能实现这套能力真是很尴尬。但是 ES6 Module 系统是否是为了解决 AMD 和 CommonJS 割裂出来的生态系统而做的整合呢?

! 参考文档

# [[ES6 In Depth: Modules - Mozilla Hacks|https://hacks.mozilla.org/2015/08/es6-in-depth-modules/]]
# [[Import - MDN|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import]]

! TOC

JS 的 `import` 默认不支持绝对路径。对于嵌套层次比较多的 JS 文件,去 `import` 时可能非常麻烦,需要往上走很多级:

```js
import MyUtilFn from '../../../../utils/MyUtilFn';
```

期望的方式是,可以按项目根目录做绝对路径的引用:

```js
import MyUtilFn from 'utils/MyUtilFn';
```

有几个方式可以实现绝对路径引用。create-react-app 支持 `jsconfig.json` 文件来实现。构建工具中,Babel 和 Webpack 也都支持实现。

!! Create React App

CRA 内置了对绝对路径引用的支持,按 [[文档|https://create-react-app.dev/docs/importing-a-component/#absolute-imports]] 进行配置即可。

!! Webpack

Webpack 可以通过在配置文件中 [[配置|https://webpack.js.org/configuration/resolve/#resolvealias]] alias 来实现。

!! Babel

Babel 有插件可以实现此效果。常用的 Babel 插件有两个:

* [[entwicklerstube/babel-plugin-root-import|https://github.com/entwicklerstube/babel-plugin-root-import]]
* [[tleunen/babel-plugin-module-resolver|https://github.com/tleunen/babel-plugin-module-resolver]]

后者(tleunen/babel-plugin-module-resolver)在 GitHub 上的流行程度、维护程度都更佳。

具体使用方法看 [[GitHub|https://github.com/tleunen/babel-plugin-module-resolver]]。

一个要注意的点是,在 `.babelrc` 中不仅要配置 `root`,还需要配置 `alias`。这个插件不会默认在 `root` 下找目录来 import。这让我觉得非常奇怪:

```json
{
  "presets": [
    "next/babel"
  ],
  "plugins": [
    [
      "module-resolver",
      {
        "root": ".",
        "alias": {
          "pages": "./pages",
          "components": "./components",
          "interfaces": "./interfaces"
        }
      }
    ]
  ]
}
```

比如这个例子,如果你不配置 components 的路径映射,那么 `import from components` 并不会起作用。

!! Why Promise?

Promise 的出现是为了解决异步编程中,主要使用的回调机制的几个问题:

* Callback hell:Promise 可以把一层层嵌套的 callback 变成 `.then().then()...`,从而使代码编写和阅读更直观
* 错误处理难:Promise 比 callback 在错误处理上更清晰直观
* 同时进行多个异步操作的代码编写困难:Promise 可以简单处理此情况

Google 的这篇 [[文档|https://developers.google.com/web/fundamentals/primers/promises]] 写得非常好。但是它引入 Promise 用的 `img.ready()` 让我觉得没有道理,毕竟 Promise 函数更像是你告诉它开始干活(所以应该是 `img.display()`)而不应该像事件一样的 `img.ready()`。

目前看浏览器环境中,使用 Promise 的场景主要就是发异步请求。

Promise 的重点在于:

* 它是如何解决 callback hell,并提供直观的 API 和机制去让异步代码编写变得简单
** 在此基础上,它怎样让控制流变得清晰(比如多个 promise 链在一起时,发生错误时应该怎样流转)
* 有哪些常见的问题场景以及相应的解决方式(即是 pattern)

!! What's a Promise

一个 Promise 对象中定义的主要是一段执行具体操作的代码,并且在这段代码中,会执行两个回调函数,一个表示操作成功(`resolve`),一个表示操作失败(`reject`),比如下面这段发起 AJAX 请求的代码(关注 `new Promise()` 开始那部分):

```js
function get(url) {
  // Return a new promise.
  return new Promise(function(resolve, reject) {
    // Do the usual XHR stuff
    var req = new XMLHttpRequest();
    req.open('GET', url);

    req.onload = function() {
      // This is called even on 404 etc
      // so check the status
      if (req.status == 200) {
        // Resolve the promise with the response text
        resolve(req.response);
      }
      else {
        // Otherwise reject with the status text
        // which will hopefully be a meaningful error
        reject(Error(req.statusText));
      }
    };

    // Handle network errors
    req.onerror = function() {
      reject(Error("Network Error"));
    };

    // Make the request
    req.send();
  });
}
```

Promise 构造函数中的参数被称为 executor。我们在后面还会提到它。

调用 `get(url)` 函数会生成一个 Promise 实例。当调用这个实例的 `.then()` 方法时,Promise 中定义的代码会被开始被执行。一个 Promise 实例有这几个状态:

* pending:未确定状态。刚 `new` 出来的 Promise 处于这个状态;然后会马上执行 executor 中定义的语句
* resolved:代码执行到 `resolve()` 语句后
* rejected:代码执行到 `reject()` 语句后
* settled:resolved 或者 rejected 状态都属于 settled

实例调用的代码如下:

```js
get('story.json').then(function(response) {
  console.log("Success!", response);
}, function(error) {
  console.error("Failed!", error);
})
```

`.then()` 可以接受两个参数,第一个是执行成功后的回调函数,第二个是失败后的回调函数。executor 中调用 `resolve()` 或者 `rejected()` 时传的参数,会被这两个回调函数获得。

!! 如何解决 callback hell?

`.then()` 看起来并没有绕开 callback 的模式。那 Promise 是如何解决 callback hell 的?答案就在 Promise 的 chaining。

`.then()` 的参数——即这两个回调函数,可以是多种类型的:

* 没有返回值的函数,会使得 Promise 链不再延续,此时你再往后面调用 `.then()` 是没有作用的。比如:<div>

```js
Promise.resolve('foo').then(function(s) {
  console.log(s);
}).then(function(s) {
  // Never executed
  console.log(s);
});

// Output:
// foo
```
</div>
* 有返回值的函数,会使 Promise 链可以继续,如:<div>

```js
Promise.resolve('foo').then(function(s) {
  console.log(s);
  return s + 'bar';
}).then(function(s) {
  console.log(s);
});

// Output:
// foo
// foobar
```
</div>
* 有返回值且返回值为另一个 Promise 对象的函数,也会使 Promise 继续。与前者的区别在于,再次调用 `.then()` 时可能会触发的是异步操作,因此不是马上触发下一轮 `resolve()`:<div>

```js
Promise.resolve('foo').then(function(s) {
  return new Promise((resolve, reject) => {
	  console.log(s);
	  setTimeout(() => {
		  resolve(s + 'bar')
		}, 1000);
	});
}).then(function(s) {
  console.log(s);
});

// Output:
// foo
// foobar (1s after displaying "foo")
```
</div>

!! A Realworld Example

```js
// Including the `get()` function above...
function getJSON(url) {
  return get(url).then(JSON.parse);
}

// Get chapter list, then get content of chapter 1
getJSON('story.json').then(function(story) {
  return getJSON(story.chapterUrls[0]);
}).then(function(chapter1) {
  console.log("Got chapter 1!", chapter1);
})
```

!! Control Flow (and error handling)

当调用 `.then()` 时同时提供了两个参数,那么只会有其中一个被调用:

```js
get('story.json').then(function(response) {
  console.log("Success!", response);
}, function(error) {
  console.log("Failed!", error);
})
```

如果是 `.then(resolve_func).catch(reject_func)` 的形式:

```js
get('story.json').then(function(response) {
  a + 1   // throws ReferenceError
}).catch(function(error) {
  console.log("Failed!", error);
})
```

那么在 `get('story.json')` 以及 `catch` 之前的 resolve 函数中的 `a + 1` 报错都会被捕捉。

Promise 定义的规则是,错误只会往后抛,直到遇到下一个 `.catch` 或者带 reject 函数的 `.then`。Google 的文档中提供了一个很好的例子:

```js
asyncThing1().then(function() {
  return asyncThing2();
}).then(function() {
  return asyncThing3();
}).catch(function(err) {
  return asyncRecovery1();
}).then(function() {
  return asyncThing4();
}, function(err) {
  return asyncRecovery2();
}).catch(function(err) {
  console.log("Don't worry about it");
}).then(function() {
  console.log("All done!");
})
```

执行流为:

[img width=400 [promise-flow-chart]]

!! Promise in Practice

Promise 代码编写起来,相对同步代码有两个挑战。

!!! 数据传递

由于 Promise 代码的异步特性,以及大量使用函数,因此变量数据的传递和共享变得复杂。

设想有这样的同步代码:

```js
let story = getJsonSync('story.json');
addHtmlToPage(story.heading);

for (let chapterUrl of story.chapterUrls) {
  let chapter = getJsonSync(chapterUrl);
	addHtmlToPage(chapter.html);
}
```

如果要写成异步,就会比较麻烦。因为你需要把各个 Promise 串起来,这其中数据的作用域只在各自的 resolve 函数中。你可以通过几种方式共享数据:

* 嵌套 Promise,即是在一个 resolve 函数中再去新建 Promise 并调用 `.then()`:<div>

```js
getJson('story.json').then(story => {
  addHtmlToPage(story.heading);
  return story.chapterUrls.reduce((sequence, chapterUrl) => {
		// 注意这里应该是 sequence.then() 打头。不然整条 Promise 链不起来。实际模拟一把 reduce 过程可以理解
    return sequence.then(() => {
      return getJson(chapterUrl);
    }).then(chapter => {
      addHtmlToPage(chapter.html);
    })
  }, Promise.resolve());
})
```
</div>
* 将数据通过 `resolve(data)` 或者在 executor 中返回数据来传递给下一环:<div>

```js
getJson('story.json').then(story => {
  addHtmlToPage(story.heading);
  return story.chapterUrls;
}).then(chapterUrls => {
  chapterUrls.reduce((sequence, chapterUrl) => {
    return sequence.then(() => {
      return getJson(chapterUrl);
    }).then(chapter => {
      addHtmlToPage(chapter.html);
    })
  }, Promise.resolve());
});
```
</div>
* 在 Promise 代码外设置变量用于传递数据:<div>

```js
// 这个例子比较啰嗦,仅供说明做法
let chapterContents = [];
    getJson('story.json').then(story => {
      addHtmlToPage(story.heading);
      return story.chapterUrls.reduce((sequence, chapterUrl) => {
        return sequence.then(() => {
          return getJson(chapterUrl);
        }).then(chapter => {
          chapterContents.push(chapter.html)
        })
      }, Promise.resolve());
    }).then(() => {
      for (let chapterContent of chapterContents) {
        addHtmlToPage(chapterContent);
      }
    })
```
</div>

<<.info "`Promise.resolve()` 的作用,类似于累加中的初始值 0,或者累乘的初始值 1。">>

!!! 同步执行多事件的完成时间的不一致性

Promise 代码中,特别值得注意的一点是,''Promise 的 executor 在 Promise 对象被创建时就被执行了''。因此如果想实现同时做多任务,但是对任务结果的处理是按顺序来的,需要一定的技巧。

下面演示如何同时下载多个章节内容,但是按顺序将最快获取到的章节显示出来。效果是:

|!拉取到章节的顺序 |2 |1 |3 |5 |4 |
|!显示内容 |不显示 |显示 1, 2 |添加 3 |不添加 |添加 4, 5 |

代码如下:

```js
function parallel_download_and_display_immediately() {
  getJson('story.json').then(story => {
    addHtmlToPage(story.heading);
    // 1. 创建拉取各章节的 Promise 对象,使得实际拉取动作开始
    // 2. 使用 Array.reduce pattern 把各 Promise 对象的 `.then()` 串起来,
    //    实现章节拉取完成的结果是被顺序处理的
    return story.chapterUrls.map(getJson).reduce((sequence, chapterPromise) => {
      return sequence.then(() => chapterPromise).then(chapter => {
        console.log(`Add chapter ${chapter.chapter}`)
        addHtmlToPage(chapter.html);
      });
    }, Promise.resolve())
  }).catch(() => {
    addTextToPage(`Error occurred. ${err.message}`);
  }).then(() => {
    document.querySelector('.spinner').style.display = 'none';
  });
}
```

!! Resources

* [[JavaScript Promise: an Introduction - Web Fundamentals|https://developers.google.com/web/fundamentals/primers/promises]]:Google 写的这篇入门教材是我见过最佳的
* [[Working with Promise - Google Developers|https://developers.google.com/web/ilt/pwa/working-with-promises]]
* [[Promise - MDN|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise]]:API 参考
* [[Promise Cheatsheet|https://frontarm.com/james-k-nelson/promises-async-await-cheatsheet/]]

Spread operator (`...`) 跟 Python 的 unpack (`*`) 非常类似。参考 MDN 上的这些文档,讲得简单明了而且有很多实用例子:

* [[Spread Operator - MDN|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator]]
* [[Rest Parameters|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters]]
* [[Destructuring Assignment|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment]]

```js
// 用于 array literals
[...iterableObj, 4, 5, 6]

// 用于函数调用
myFunction(...iterableObj);

// 用于函数声明
function(a, b, ...theArgs) {
  // ...
}

// rest parameters 可以被 destructure
function f(...[a, b, c]) {
  return a + b + c;
}

f(1)          // NaN (b and c are undefined)
f(1, 2, 3)    // 6
f(1, 2, 3, 4) // 6 (the fourth parameter is not destructured)

// 用于变量赋值(array / object 展开)
var a, b, rest;
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]

({a, b} = {a:10, b:20});
console.log(a); // 10
console.log(b); // 20

// ES2016 - not implemented in Firefox 47a01
({a, b, ...rest} = {a:10, b:20, c:30, d:40}); 
```
用 [[JavaScript Standard Style|https://standardjs.com/]] 就好。它虽然不是 JavaScript 官方出品,但是有着不错的社区认可程度。而且 WebStorm 内置了这种 style。
[[Template literals|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals]] (aka. template strings) 是 ES2015 提出的语法特性,方便了字符串拼接。

基础:

```javascript
`string text`
```

多行字符串:

```javascript
`string text line 1
 string text line 2`
```

模板:

```javascript
`string text ${expression} string text`
```

Tagged templates:

```javascript
tag`string text ${expression} string text`
```

其中 tagged templates 是比较复杂的。它设计之初是希望 tag 函数可以拿到 template string 中的信息,比如它有几段字符串、有哪些表达式,从而可以做一些加工或者逻辑,再返回加工后的信息。这是 MDN 的一个例子:

```javascript
let person = 'Mike';
let age = 28;

function myTag(strings, personExp, ageExp) {
  let str0 = strings[0]; // "That "
  let str1 = strings[1]; // " is a "

  // There is technically a string after
  // the final expression (in our example),
  // but it is empty (""), so disregard.
  // let str2 = strings[2];

  let ageStr;
  if (ageExp > 99){
    ageStr = 'centenarian';
  } else {
    ageStr = 'youngster';
  }

  // We can even return a string built using a template literal
  return `${str0}${personExp}${str1}${ageStr}`;
}

let output = myTag`That ${ person } is a ${ age }`;

console.log(output);
// That Mike is a youngster
```

另外一个例子,配合使用 [[Spread Operator|JavaScript: Spread Operator]]:

```javascript
function tag(strings, ...values) {
  console.log(strings);
  console.log(values);
  
  return 'whatever';
}

let a = 1;
let b = 2;
tag`a = ${a}, b = ${b}`

// Output:
// ["a = ", ", b = ", ""]
// [1, 2]
```

注意 `strings` 中会带有最后的空字符串。一般没什么用处。`strings` 中还会有一个 `raw` 属性,返回未 escaped 的原字符串(比如 `\n` 这些)。

对于业界在 tagged template 上的实际使用,有 styled-components 中 [[大量使用|https://styled-components.com/docs/api]] 它来 [[扩展 API 能力|https://github.com/styled-components/styled-components/issues/715#issuecomment-295560988]]:

```javascript
const mixin = css`...`

styled.div`
  /* this function would just be toString()'d */
  background: ${p => p.color || 'white'};

  /* this mixin wouldn't be flattened into the rest of the rules */
  ${mixin}
`
```

如果没有 tagged template,上面例子中的 arrow function 会简单地被转成 string,styled-component 的 API 将无法拿到函数对象;同时它也无法拿到 mixin 做更复杂的处理。
!! 编辑器光标跳转到指定位置

使用 [[KJump|https://plugins.jetbrains.com/plugin/10149-kjump]] 插件。

在 `~/.ideavimrc` 中定义了 <kbd>Ctrl-,</kbd> 作为快捷键:

```
# KJump Plugin
nmap <C-,> :action KJumpAction.Word0<cr>
```

!! DPI 问题

参考 [[JB 的文档|https://intellij-support.jetbrains.com/hc/en-us/articles/360007994999-HiDPI-configuration]]。

!! Material UI Theme 问题

不要安装 [[Material UI Theme|https://plugins.jetbrains.com/plugin/8006-material-theme-ui]]。会把 UI 元素撑高,搞得不好看。
!! Definition

> [[JSON|http://www.json.org/]] (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999.

!! Libraries

* JavaScript: built-in library `JSON`
* Python: standard library `json`
* C++
** rapidjson
** jsoncpp

!! Tools

!!! GUI Viewer

|! |!Folding |!Platform |!Handle Large File (>10mb) |!Format / Compact |
|![[JSON Editor|https://chrome.google.com/webstore/detail/json-editor/lhkmoheomjbkfloacpgllgjcamhihfaj]] |Y |<<plat-chrome>> |N |Y |
|![[JSON Viewer|https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh]] |Y |<<plat-chrome>> |N |Y |

Many editor or IDE can handle JSON files too. But some of them may not be able to handle large files (>10mb):

* Java-based IDE (IntelliJ-based IDE)
* Chromium-based Editor / IDE (VSCode, Atom, etc.)

!!! CLI Viewer

|! |!Platform |!Handle Large File (>10mb) |!Format / Compact |
|![[jq|https://stedolan.github.io/jq/]] |<<plat-win>> <<plat-linux>>|Y |Y |
|!Vim |<<plat-win>> <<plat-linux>> |Y |Y |

!!! Filtering and Generating

* [[JMESPath|http://jmespath.org/]]: a query language for JSON with a complete grammar specification (should be precise and consist). Should consider learn this first. 
* [[jq|https://stedolan.github.io/jq/]]: like `sed` for JSON data
* [[jid|https://github.com/simeji/jid]]: json incremental digger using filtering queries like jq. It's very helpful for dealing with large JSON data
* [[JSON-Splora|https://github.com/wellsjo/JSON-Splora]]: a GUI frontend for fq, built with Electron
* [[jpmens/jo|https://github.com/jpmens/jo]]: generating JSON from command line
* [[dflemstr/rq|https://github.com/dflemstr/rq]]: perform queries on streams of records in various formats

jid and JSON-Splora should not be able to handle large files. They are not efficiency enough.

!!! Comparison

* [[JSON Diff|http://jsondiff.com/]]: The semantic JSON compare tool

!! More Resources

* [[burningtree/awesome-json|https://github.com/burningtree/awesome-json]]: many tools but not very practical
* [[These|https://news.ycombinator.com/item?id=13090604]] [[HackerNews|https://news.ycombinator.com/item?id=9446980]] [[comments|https://news.ycombinator.com/item?id=7895076]]

JSP 是一种 HTML + Java 揉在一起的东西,类似带 Java 解释器的模板语言。在 Web 开发中,主要有两种用法:

* 纯 JSP 实现一切逻辑,输出 HTML 给用户
* 搭配 Servlets,由 Servlets 做逻辑,再把数据传给 JSP 做模板输出

第一种的例子:

```java
<html>
   <head>
      <title>Reading Cookies</title>
   </head>
   
   <body>
      <center>
         <h1>Reading Cookies</h1>
      </center>
      <%
         Cookie cookie = null;
         Cookie[] cookies = null;
         
         // Get an array of Cookies associated with the this domain
         cookies = request.getCookies();
         
         if( cookies != null ) {
            out.println("<h2> Found Cookies Name and Value</h2>");
            
            for (int i = 0; i < cookies.length; i++) {
               cookie = cookies[i];
               out.print("Name : " + cookie.getName( ) + ",  ");
               out.print("Value: " + cookie.getValue( )+" <br/>");
            }
         } else {
            out.println("<h2>No cookies founds</h2>");
         }
      %>
   </body>
</html>
```

第二种的例子:

```java
// Servlet
package jsp.GuestJsp;

import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 * GuestJsp is a servlet controlling user
 * interaction with the guest book.
 */
public class GuestJsp extends HttpServlet {
  /**
   * doGet handles GET requests
   */
  public void doGet(HttpServletRequest req,
                    HttpServletResponse res)
    throws ServletException, IOException
  {
    // Save the message in the request for login.jsp
    req.setAttribute("message", "Hello, world");

    // get the application object
    ServletContext app = getServletContext();

    // select login.jsp as the template
    RequestDispatcher disp;
    disp = app.getRequestDispatcher("login.jsp");

    // forward the request to the template
    disp.forward(req, res);
  }
}
```

```java
// JSP
<%@ page language=javascript %>

<head>
<title><%= request.attribute.message %></title>
</head>

<body bgcolor='white'>
<h1><%= request.attribute.message %></h1>
</body>
```

看 `request.attribute` 携带了从 Servlet 传过来的数据。

现在 JSP 应该没什么人用了。大概懂它当年做什么就好。
# 核心概念:[[JSX: Core Concepts]]
# 基本用法:[[JSX: JavaScript Expression]]
# 模式:[[JSX: Patterns]]
! JSX 是什么?

> JSX is a JavaScript syntax extension that looks similar to XML. You can use a simple JSX syntactic transform with React.  - [[JSX In Depth|https://facebook.github.io/react/docs/jsx-in-depth.html]]

即是说,它是一个 JS 的扩展语法,它本质是还是 JS 只是长得像 XML:

```js
var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        Hello, world! I am a CommentBox.
      </div>
    );
  }
});
```

你可以用 [[Babel|https://babeljs.io/repl/]] 把它编译成纯粹的 JS:

```js
var CommentBox = React.createClass({
  displayName: "CommentBox",

  render: function render() {
    return React.createElement(
      "div",
      { className: "commentBox" },
      "Hello, world! I am a CommentBox."
    );
  }
});
```

可以观察到,JSX 部分被替换成 `React.createElement`。Facebook 在 JSX 的 [[规范|https://facebook.github.io/jsx/]] 中表示,JSX 只是一种语言扩展,并无意变成 JS 的合法语法加入 ECMAScript 规范中,只适用于各种 transpiler 做转换;而且它也不是 XML/HTML,不会遵循 XML/HTML 的规范,只是让大家感觉熟悉而已。

! 核心细节

!! 不同类型的组件

JSX 中分两种类型:

# 一种类似 HTML 结点的结构,tag 用小写:`<div>` 
# 自定义组件类型,tag 首字母大写:`<MyComponent>`

注意,第一种结构跟浏览器 DOM 并不一样,是 React 自己维护的一种 DOM。

在类 HTML 组件中:

# 如果是 HTML 规范中定义的 tag 名(比如 `div`),那它的属性只能是 HTML 规范中存在的属性,否则会被忽略
#* 如果你想要带自定义数据,需要使用 `data-*` 形式
#* 因为 `class`, `for` 是 JS 定义的关键字,因此不能被当作属性名,需要相应替换成 `className`, `htmlFor`
# 如果是 [[custom element|http://www.html5rocks.com/en/tutorials/webcomponents/customelements/]],则任意的属性名都可以使用
#* 可以直接使用 `class`, `for`

在自定义组件中,属性名需要用 camelCase,这是为了跟 JS 的代码风格一致。

!! 参考文档:

# [[JSX in Depth - React|https://reactjs.org/docs/jsx-in-depth.html]]
# [[DOM Elements - React|https://reactjs.org/docs/dom-elements.html]]
# [[JSX Specification|https://facebook.github.io/jsx/]]
在 JSX 的 tag 属性值中,用 `{}` 包裹起来的代码就是 JavaScript Expression:

```js
var person = <Person name={window.isLoggedIn ? window.name : ''} />;
```

除了可以写正常的 JS 代码,还可以嵌入其他的 component class:

```js
var content = <Container>{window.isLoggedIn ? <Nav /> : <Login />}</Container>;
```

甚至可以调用函数(看下文的 `renderAdminMenu`):

```js
// ...
const renderAdminMenu = function() {
  return (<MenuLink to="/users">User accounts</MenuLink>)
}
// ...
const userLevel = this.props.userLevel;
return (
  <ul>
    <li>Menu</li>
    {userLevel === 'admin' && renderAdminMenu()}
  </ul>
)
```

!!! 用 Spread 语义 (`...`) 传递参数

React 借鉴了 ES6 新加的 [[Spread Syntax|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator]] 表示属性值的传递(准确地说 ES6 只支持了 Array 部分,Object 部分还在提议中):

```js
function FancyCheckbox(props) {
  var { checked, ...other } = props;
  var fancyClass = checked ? 'FancyChecked' : 'FancyUnchecked';
  // `other` contains { onClick: console.log } but not the checked property
  return (
    <div {...other} className={fancyClass} />
  );
}
ReactDOM.render(
  <FancyCheckbox checked={true} onClick={console.log.bind(console)}>
    Hello world!
  </FancyCheckbox>,
  document.getElementById('example')
);
```

它的功能类似 Python 的 unpacking,但是语法和功能上不一样。官方文档 [[JSX Spread Attributes|https://facebook.github.io/react/docs/jsx-spread.html]] 有一些简单的描述。
DevHints 总结了一批好用的 [[pattern|https://devhints.io/react#jsx-patterns]]。
> JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed.
> -- [[JWT Introduction|https://jwt.io/introduction/]]

JWT 是一种数据格式,它最终形态是几段 base64 编码过的字符串拼接而成,并且带了数字签名,可以被生成的一端验证数据完整性。

JWT 有两种形式,JWS(JSON Web Signature)和 JWE(JSON Web Encryption)。一般的应用场景是 JWS,也称 signed JWT,''只保证数据完整性,不保证安全性''。而 JWE 可以同时保证完整性和安全性。但是 JWE 相对复杂且应用场景少,在这里不做描述。下面的内容都是基于 JWS。

JWT 一般用于 ''授权''(authorization)及 ''信息交换''(information exchange)。

!! 快速上手

对 JWT 的官方理解,看 [[RFC7519|https://tools.ietf.org/html/rfc7519]] 及 [[JWT Introduction|https://jwt.io/introduction/]]。由于这里通过一个授权的例子快速理解:

[img width=600 [jwt-authorization-flow]]

对于这样一个场景,第三步返回的 JWT 可以是这样子的(使用未 base64 编码过的内容及额外空行使其更好理解):

```
{ "alg": "HS256", "typ": "JWT" }
.
{ "sub": "4938475", "exp": 1577836800, "session_id": "394d1e840f" }
.
eyJ0eXAiOiJKV1QiLA0K
```

这三部分分别是 ''JOSE Header''、''JWS Payload'' 及 ''JWS Signature''。服务端保存密钥(secret),用它生成 signature。这也是客户端将 JWT 回传时服务端可以验证的基础:

```
signature = HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
```

Header 很好理解。Payload 中关键点是其中的字段。规范中定义了三类字段:

* [[Registered Claim Names|https://tools.ietf.org/html/rfc7519#section-4.1]]:已被注册的字段;''这部分是最关键的,可以实现一些会话管理相关的逻辑''
* [[Public Claim Names|https://tools.ietf.org/html/rfc7519#section-4.2]]:看不太懂,似乎没引入什么新字段?
* [[Private Claim Names|https://tools.ietf.org/html/rfc7519#section-4.3]]:用户自己定义的字段。除了不要跟 registered 和 public 的名字冲突外,对命名规则没有要求。Auth0 则 [[要求|https://auth0.com/docs/tokens/guides/create-namespaced-custom-claims]] 用户加上 URL 格式的 namespace,如 `https://www.mysite.com/`;加完后的 claim name 类似 `https://www.mysite.com/favorite_color`

上面的例子中,`sub` 和 `exp` 是 registered 的,有限定格式和用途;`session_id` 是 privated,用户自己定义的。

参考:

* [[JWT Introduction|https://jwt.io/introduction/]]
* [[RFC7519 - JSON Web Token (JWT)|https://tools.ietf.org/html/rfc7519]]
* [[JWT, JWS and JWE for Not So Dummies! (Part I)|https://medium.facilelogin.com/jwt-jws-and-jwe-for-not-so-dummies-b63310d201a3]]

!! Registered Claim Names

Auth0 的 [[文档|https://auth0.com/docs/tokens/concepts/jwt-claims#reserved-claims]] 描述了这些字段的含义,我在此基础上加了示例:

|!字段名 |!含义 |!示例 |
|iss (issuer) |Issuer of the JWT |如 API 的域名,如 `"https://api.github.com/"` |
|sub (subject) |Subject of the JWT (the user) |如标识一个用户,如用户 ID `"3984719"` |
|aud (audience) |Recipient for which the JWT is intended |如使用这个 JWT 的客户端,比如配合 OAuth 使用时的 client ID |
|exp (expiration time) |Time after which the JWT expires |`1490922820`,注意是数字 |
|nbf (not before time) |Time before which the JWT must not be accepted for processing |`1490886820` |
|iat (issued at time) |Time at which the JWT was issued; can be used to determine age of the JWT |`1490886820` |
|jti (JWT ID) |Unique identifier; can be used to prevent the JWT from being replayed (allows a token to be used only once) |`"39d8fa3e"`,在「安全」一节描述 |

Auth0 的 [[文档|https://auth0.com/docs/scopes/current/sample-use-cases#authenticate-a-user-and-request-standard-claims]] 描述了它如何使用 JWT 的(不重要的字段被省略,并加了注释):

```json
{
  "iss": "https://YOUR_DOMAIN/",
  "sub": "auth0|USER-ID",
  "aud": "YOUR_CLIENT_ID",
  "exp": 1490922820,
  "iat": 1490886820
}
```

个人觉得 `sub` `exp` 比较重要,其他似乎意义不大。可以结合具体框架再做分析。

!! 安全

* ''签名用的 key 一定要保证安全''。不然黑客可以随意生成可以通过验证的 token
* ''不要在 token 中放敏感信息''。JWT 只保证数据的完整、不被篡改,但是并不加密数据
* ''给 token 一个过期时间''。如果没有过期时间,这个 token 就永久有效,可能会受到 ''重放攻击''。JWT 亦提供了一个 [[jti 声明|https://tools.ietf.org/html/rfc7519#section-4.1.7]],用来给每个 token 标记一个单独的 ID,这样可以单独或者配合 `aud` 做黑名单,来收回对某些被黑客利用的 token 的权限
* ''使用 HTTPS'';不要明文传输 token

参考 [[Token Best Practices|https://auth0.com/docs/best-practices/token-best-practices]]。

[[k3s|https://k3s.io]] 是一个可以单机运行、最低内存要求仅有 512M 的轻量级 k8s 发行版。

下面的使用经验基于 [[v1.18.2+k3s1|https://github.com/rancher/k3s/releases/tag/v1.18.2+k3s1]]。

!! 安装

由于使用 Traefik 时需要修改默认的配置,因此不要让 K3s 自动安装 Traefik,不然每次重启 k3s 时会覆盖掉你在 `/var/lib/rancher/k3s/server/manifests/traefik.yaml` 中的修改:

```bash
curl -sfL https://get.k3s.io | sh -s - server --no-deploy traefik
```

稍等片刻后,检查结点是否 ready:

```bash
kubectl get nodes
```

!! k8s yaml 位置

将各种 YAML 文件放进这个目录,效果等同于 `kubectl apply -f`:

```
/var/lib/rancher/k3s/server/manifests
```

!! Traefik

将 GitHub 上的 [[traefik.yaml|https://github.com/onlyice/services/blob/master/traefik.yaml]] 文件放入 `/var/lib/rancher/k3s/server/manifests/` 中,稍等片刻,容器起来后就可正常运行。

同时参考 [[Traefik]]。


!! 会议

观察流行的技术、话题。

* [[GOTO Conference|https://gotocph.com]]:感觉是非常好的技术会议。议题很新。
* [[JAMstack_conf|https://jamstackconf.com]]:有很多前端的内容

!! 论坛

* 时常读读 [[dev.to|https://dev.to/]]

!! 趋势

对于一些已经熟悉的领域,保持每隔一段时间就看看它的新发展。

!!! 前端

* 每年可以看看这个 [[Frontend Handbook|https://frontendmasters.com/books/front-end-handbook/2019/]] 对去年的总结
* 每年看看流行技术的变化:[[The State of CSS|https://stateofcss.com/]]、[[The State of JavaScript|https://stateofjs.com]]
* 搜索「2019 javascript recap」之类的关键词

!!! 框架

对于熟悉或者日用的框架,保持对它新功能、新方向的跟进:

* Django、Scrapy、React.js 等



!! TOC

* Early math
* Arithmetic
* Pre-algebra
* Algebra I
* Geometry
* Algebra II
* Trigonometry
* Precalculus
* Statistics & probability
* Calculus
* AP Calculus AB
* AP Calculus BC
* Differential equations
* Linear algebra

!! Concepts

!!! Early math + Arithmetic

[img width=350 [calculation-result]]

//Picture from [[Wikipedia|https://en.wikipedia.org/wiki/Template:Calculation_results]]//

* counting
* number, 2-digit number, 3-digit number
* [[Elementary arithmetic|https://en.wikipedia.org/wiki/Elementary_arithmetic]]: addition, subtraction, multiplication, division, regrouping (carring, borrowing), times tables, basic facts, quotient, remainder
* [[Deci-|https://en.wikipedia.org/wiki/Deci-]] (or places): tens, hundreds; tenth, hundredth
* Geometry: size, size length, conner; shapes, fractions of shapes, composing shapes
* Basic Facts: In Basic Facts, the arithmetic operations such as addition, subtraction, multiplication, and division are performed mainly by using the one-digit numbers (1 to 9).
* negative number, positive number, opposite number, absolute value
* fraction (To be continued from https://www.khanacademy.org/math/arithmetic-home - Fraction)


!! Long Long After

* cartesian coordinate system, polar coordinate system

使用 Tiddlywiki 作为个人知识库。

参考这些:

* [[Write krunner 5 Plugins in Python the Quick Way|https://www.reddit.com/r/kde/comments/7owue9/write_krunner_5_plugins_in_python_the_quick_way/]]
* [[Cross-process Runners|http://blog.davidedmundson.co.uk/blog/cross-process-runners/]]
* [[Shihira/krunner-bridge|https://github.com/Shihira/krunner-bridge]]
* [[davidedmundson/pythonrunner|https://cgit.kde.org/scratch/davidedmundson/pythonrunner.git/]]
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djiHcBCAQBgJYMSEES5JQ+BtI/A///M/sm7dWmnYoIGZEpuU1FaOHz8m3333LR2sTO5gYWph6qEBNIAG0AAaQANoAA2gATSABtAAGkADbg28evWr3Lh+XcaPGyd58+SRCuXLy7hxY+Wbr79+24aoqC8EIo4ARkzEvRIKBIGcSeDFixcyauRIMwMmf758ZlmyW7duym+/vcKEwYRBA2gADaABNIAG0AAaQANoAA2gATSABtBAFmngyZPPZOOGDWa5+AL580vHDh3k3LlzOXPAiVJDIEoIYMREyYukGhDILgL/+c9/5PTp09IuKUnyxcebjeG2bN4sz549pYOVRR0s91+/cM1fQ6EBNIAG0AAaQANoAA2gATSABtAAGkADL1/+IKdOnZQuXTpLTK5cUrdOHbOPzO+//55dQ0jkC4G3mgBGzFv9+qk8BN6MwF//+ldZvHix1K5Vy/yn3iM5Wd5//4z8+ONLTBhMGDSABtAAGkADaAANoAE0gAbQABpAA2gADWSjBnSVkrt378jMmTOkYIECUqpUSRkyZIg8ffLkzQaEiA0BCIRMACMmZGREgAAElMCjR49k4MCBUrJECSlcqJDMnTtH7t37UP7859/oZGVjJ4u/euKvntAAGkADaAANoAE0gAbQABpAA2gADaABtwa++OJz2blzh/lDWt07pnWrVnLkyBH597//zSAXBCCQRQQwYrIINNlAIFoI/PHHH3Jg/35p2aKF5MmdW+rXqyd79uyWL798gQGDAYMG0AAaQANoAA2gATSABtAAGkADaAANoIEI1MDPP/8k589/IP369pXYmBipXr26zJ07V3579SpahqyoBwQimgBGTES/HgoHgcgi8Msvv8jMGTPMPjD6n/bgQYPk0qWL8ssvP9PJisBOlvuvX7jmr6HQABpAA2gADaABNIAG0AAaQANoAA2ggQcPPpIlixdL8WLFpFjRotKnd2+5f+9eZA1AURoIRCEBjJgofKlUCQLhIHDu3Dnp2qWLFClcWN7505/M2qLtkpJk1KiRHDBAA2gADaABNIAG0AAaQANoAA2gATSABtBADtGAmi/ly5Uz4zu54+KkWdOmsmjhwnAMJ5EmBCDwmgBGDFKAAASCItCxQweJyZXL/CetRoz+R50/Xz4OGKABNIAG0AAaQANoAA2gATSABtAAGkADaCCHaSA+b15njEfHeUoU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ATSABtAAGkADaAANoAE0gAasBjBiMjBQRhQIhEgAIyZEYASHwNtKACOGDprtoHFGC2gADaABNIAG0AAaQANoAA2gATSABqJHAxgxb+toH/XOSgIYMVlJm7wgkIMJYMRETweLzjLvEg2gATSABtAAGkADaAANoAE0gAbQABqwGsCIycEDdgvc1OsAACAASURBVBQ9xxDAiMkxr4qCQiB7CWDE0EGzHTTOaAENoAE0gAbQABpAA2gADaABNIAG0ED0aAAjJnvH3Mj97SCAEfN2vGdqCYE3JoAREz0dLDrLvEs0gAbQABpAA2gADaABNIAG0AAaQANowGoAI+aNh81IAALpEsCISRcRASAAASWAEUMHzXbQOKMFNIAG0AAaQANoAA2gATSABtAAGkAD0aMBjBjG/iAQfgIYMeFnTA4QiAoCGDHR08Gis8y7RANoAA2gATSABtAAGkADaAANoAE0gAasBjBiomLojkpEOAGMmAh/QRQPApFCACOGDprtoHFGC2gADaABNIAG0AAaQANoAA2gATSABqJHAxgxkTL6RjmimQBGTDS/XeoGgUwkgBETPR0sOsu8SzSABtAAGkADaAANoAE0gAbQABpAA2jAagAjJhMH0EgKAn4IYMT4AcNtCEDAmwBGDB0020HjjBbQABpAA2gADaABNIAG0AAaQANoAA1EjwYwYrzHwPgEgXAQwIgJB1XShEAUEsCIiZ4OFp1l3iUaQANoAA2gATSABtAAGkADaAANoAE0YDWAEROFA3lUKeIIYMRE3CuhQBCITAIYMXTQbAeNM1pAA2gADaABNIAG0AAaQANoAA2gATQQPRrAiInMsThKFV0EMGKi631SGwiEjQBGTPR0sOgs8y7RABpAA2gADaABNIAG0AAaQANoAA2gAasBjJiwDaeRMAQcAhgxDgouIACBQAQwYuig2Q4aZ7SABtAAGkADaAANoAE0gAbQABpAA2ggejSAERNoRIxnEMgcAhgxmcORVCAQ9QQwYqKng0VnmXeJBtAAGkADaAANoAE0gAbQABpAA2gADVgNYMRE/bAeFYwAAhgxEfASKAIEcgIBjBg6aLaDxhktoAE0gAbQABpAA2gADaABNIAG0AAaiB4NYMTkhJE5ypjTCWDE5PQ3SPkhkEUEMGKip4NFZ5l3iQbQABpAA2gADaABNIAG0AAaQANoAA1YDWDE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EuhibiwAEIPJojsmiwAx0JkenQHEQC969AIQA73o0QtADPSiRy8AMdCLHr0gLfQCDUADRtQAQExuPGbICwtoswBAjDY7mTbVf//9R5GRkXYhDEfE8N4xx44dM20f0XD3WAAgBpNFd0wWAWKgMz06A4iBXvToBSAGetGjF4AY6EWPXgBioBc9ekFa6AUagAaMqAGAGPf41lCLb1sAIMbLn//nz58pMTGRli5dKo4JEyYIKFMlJES5xvcuX77s5ZZA93JrAYAYTBbdMVkEiIHO9OgMIAZ60aMXgBjoRY9eAGKgFz16AYiBXvToBWmhF2gAGjCiBgBicus1Q35YIHsLAMRkbyNTp/j333/pl19+UY6MjAwBYiKaN1eu8f0//vjD1P1E411vAYAYTBbdMVkEiIHO9OgMIAZ60aMXgBjoRY9eAGKgFz16AYiBXvToBWmhF2gAGjCiBgBiXO9XQw2wAECMj2ng6tWrAsS0atnSx3qO7ubWAgAxmCy6Y7IIEAOd6dEZQAz0okcvADHQix69AMRAL3r0AhADvejRC9JCL9AANGBEDQDE5NZrhvywQPYWAIjJ3kZelQIgxqsep1s7AxCDyaI7JosAMdCZHp0BxEAvevQCEAO96NELQAz0okcvADHQix69IC30Ag1AA0bUAECMW11sqMxHLQAQ42MPHiDGxx64E7sLEIPJojsmiwAx0JkenQHEQC969AIQA73o0QtADPSiRy8AMdCLHr0gLfQCDUADRtQAQIwTHWgoChawYwGAGDuG8dbLADHe+mRd3y+AGEwW3TFZBIiBzvToDCAGetGjF4AY6EWPXgBioBc9egGIgV706AVpoRdoABowogYAYlzvV0MNsABAjI9pACDGxx64E7sLEIPJojsmiwAx0JkenQHEQC969AIQA73o0QtADPSiRy8AMdCLHr0gLfQCDUADRtQAQIwTHWgoChawYwGAGDuG8dbLADHe+mRd3y+AGEwW3TFZBIiBzvToDCAGetGjF4AY6EWPXgBioBc9egGIgV706AVpoRdoABowogYAYlzvV0MNsABAjI9pACDGxx64E7sLEIPJojsmiwAx0JkenQHEQC969AIQA73o0QtADPSiRy8AMdCLHr0gLfQCDUADRtQAQIwTHWgoChawYwGAGDuG8dbLADHe+mRd3y+AGEwW3TFZBIiBzvToDCAGetGj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
!! Resources

* Marko Luksa 的 [[Kubernetes in Action]] 一书质量不错,描述全面插图丰富,是系统学习的首选
* [[kelseyhightower/kubernetes-the-hard-way|https://github.com/kelseyhightower/kubernetes-the-hard-way]]: Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts. The target audience for this tutorial is someone planning to support a production Kubernetes cluster and wants to understand how everything fits together.

Learn X in Y Minutes:

* [[Learn the Kubernetes Key Concepts in 10 Minutes|http://omerio.com/2015/12/18/learn-the-kubernetes-key-concepts-in-10-minutes/]],中文译文 [[十分钟带你理解Kubernetes核心概念|http://dockone.io/article/932]]
* [[五分鐘 Kubernetes 有感|https://medium.com/@evenchange4/%E4%BA%94%E5%88%86%E9%90%98-kubernetes-%E6%9C%89%E6%84%9F-e51f093cb10b]]

|!Name |Kubernetes in Action |
|!Author |Marko Lukša |
|!Edition |1th |
|!Release Date |December 2017 |
|!ISBN-13 |978-1617293726 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

这本书是最好的 K8S 入门书。本书不做笔记,详细的内容落入 [[Kubernetes]] 中。

目前(2021 年 3 月),本书的 [[第二版|https://www.manning.com/books/kubernetes-in-action-second-edition]] 在撰写中,预计 2021 年夏天面市。
iVBORw0KGgoAAAANSUhEUgAABMoAAAMiCAYAAACfQy9YAAAgAElEQVR4Aeydh7sURb7+779hwCwKmAMKCAIiqEjOmAWMgCCYQFTEAIiiYgIDZlAQDIgoCKZF1F1zDqubXNPde/e5uzfsfX5bv+ftc2tOdZ0J3TXdZ87MfHieeXrm0NVd/dan+lv1dnXVvxj+oQAKoAAKoAAKoAAKoAAKoAAKoAAKoAAKoAAKmH9BAxRAARRAARRAARRAARRAARRAARRAARRAARRAAYNRBgQogAIogAIogAIogAIogAIogAIogAIogAIoIAUYUQYHKIACKIACKIACKIACKIACKIACKIACKIACKIBRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABVAABVAABVAABRhRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABVAABVAABVAABRhRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABVAABVAABVAABRhRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABVAABVAABVAABRhRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABVAABVAABVAABRhRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABVAABVAABVAABRhRBgMogAIogAIogAIogAIogAIogAIogAIogAIo0KIAI8ogAQVQAAVQAAVQAAVQAAVQAAVQAAVQAAVQAAUYUQYDKIACKIACKIACKIACKIACKIACKIACKIACKNCiACPKIAEFUAAFUAAFUAAFUAAFUAAFUAAFUAAFUAAFGFEGAyiAAiiAAiiAAiiAAiiAAiiAAiiAAiiAAijQogAjyiABBVAABVAABVAABVAABVAABUoosH37drN69Wo+aAADMAADGTDwyrZt5p///GeJO27H+DNGWccoB3KBAiiAAiiAAiiAAiiAAijQwRT48ccfzfDhw80xvXrxQQMYgAEYyICBkwcPNl9//XUHu9vHs4NRFteDXyiAAiiAAiiAAiiAAiiAAigQKfDBBx+YnXfaiQ8awAAMwECGDGzZsqVDRxmMsg5dPGQOBVAABVAABVAABVAABVCgVgq88847hc7xxAkTzO233cYHDWAABmAggIHJkycV7qcvbNxYq9t6ovNilCWSiZ1QAAVQAAVQAAVQAAVQAAWaTQHXKFu8aJH5+eef+KABDMAADAQwcN9992KUNVsQ5XpRAAVQAAVQ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+OGHOd1HtBNoJ8EADMSZgffff1++++67OFUVodqWSIqyUCXIypAACZAACZAACZAACZAACZAACZAACZAACcQiAURZLHYjG0ECJEACJEACJEACJEACJEACJEACJEACJBA0AURZ0AQpTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIsEEGWx2I1sBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNAEEGVBE6Q8CZAACZAACZAACZAACZAACZAACZAACZBALBJAlMViN7IRJEACJEACJEACJEACJEACJEACJEACJEACQRNAlAVNkPIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKxSABRFovdyEaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkETQBRFjRBypMACZAACZAACZAACZAACZAACZAACZAACcQiAURZLHYjG0ECJEACJEACJEACJEACJEACJEACJEACJBA0AURZ0AQpTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIsEEGWx2I1sBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNAEEGVBE6Q8CZAACZAACZAACZAACZAACZAACZAACZBALBJAlMViN7IRJEACJEACJEACJEACJEACJEACJEACJEACQRNAlAVNkPIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKxSABRFovdyEaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkETQBRFjRBypMACZAACZAACZAACZAACZAACZAACZAACcQiAURZLHYjG0ECJEACJEACJEACJEACJEACJEACJEACJBA0AURZ0AQpTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIsEEGWx2I1sBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNAEEGVBE6Q8CZAACZAACZAACZAACZAACZAACZAACZBALBJAlMViN7IRJEACJEACJEACJEACJEACJEACJEACJEACQRNAlAVNkPIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKxSABRFovdyEaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkETQBRFjRBypMACZAACZAACZAACZAACZAACZAACZAACcQiAURZLHYjG0ECJEACJEACJEACJEACJEACJEACJEACJBA0AURZ0AQpTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIsEEGWx2I1sBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNAEEGVBE6Q8CZAACZAACZAACZAACZAACZAACZAACZBALBJAlMViN7IRJEACJEACJEACJEACJEACJEACJEACJEACQRNAlAVNkPIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAKxSABRFovdyEaQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAkETQBRFjRBypMACZAACZAACZAACZAACZAACZAACZAACcQiAURZLHYjG0ECJEACJEACJEACJEACJEACJEACJEACJBA0AURZ0AQpTwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEIsEEGWx2I1sBAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQNAEEGVBE6Q8CZAACZAACZAACZAACZAACZAACZAACZBALBJAlMViN7IRJEACJEACJEACJEACJEACJEACJEACJEACQRP4/8BHbq5rMVO9AAAAAElFTkSuQmCC
iVBORw0KGgoAAAANSUhEUgAABnoAAAHCCAYAAADIAhcLAAAgAElEQVR4Aeydh3sUxf/Hf//GVwUUKRZEBSyAgoL0JgIiTUABBSnSUaQJIkhvUqSDtARCS4AUOoQeIAk11NCL9A5+fs97cDZ7e/1yl9zeve959tm729mZ2dfM7MzOez+f+T/hhwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwJYE/s+WuWamSYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEhEIPKwEJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJ2JQAhR6bFhyzTQIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIUelgHSIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESMCmBCj02LTgmG0SIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESoNDDOkACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACNiVAocemBcdskwAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkACFHtYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABErApAQo9Ni04ZpsESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEKPSwDpAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZCATQlQ6LFpwTHbJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEACJEChh3WABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABGxKgEKPTQuO2SYBEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABCj2sAyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRgUwIUemxacMw2CZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACZAACVDoYR0gARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAZsSoNBj04JjtkmABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiABEiAQg/rAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnYlACFHpsWHLNNAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAhR6WAdIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIwKYEKPTYtOCYbRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARKg0MM6QAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAI2JUChx6YFx2yTAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAIUe1gESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESIAESsCkBCj02LThmmwRIgARIgARIgARIgARIgARIgARIgARIgARIgARIgARIgAQo9LAOkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkIBNCVDosWnBMdskQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQKGHdYAESIAESIAESIAESIAESIAESIAESIAESIAESIAESMADgX9FhBsZsA4EVgc8NK0gHaLQEySQjIYESIAESIAESIAESIAESIAESIAESIAESIAESIAEIpNAECf4/30mwo0Mwr0OBFXYDP1dgUJP6BkzBRIgARIgARIgARIgARIgARIgARIgARIgARIgARKwMYEAhJ5wn8hn/ig2BVIHAhKAQt/0KfSEnjFTIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEbE/BR6HExcf7vv0/l32em7elT+fe/7dnTJ8KNDMKlDuh6qfbmOvvsqWtRTJ756NIw9E2fQk/oGTMFEiABEiABEiABEiABEiABEiABEiABEiABEiABErAxAR+EHpPIo4Sdp09zRJwnT+TZkyfy9Mljefr4sTx59Mhhe/zwoXAjg3yrA5b6iDqqtiePVb1F3YUYpQUgJ9eDXq18Qt/0KfSEnjFTIAESIAESIAESIAESIAESIAESIAESIAESIAESIAEbE/Ag9Pz7r2HtYAg8EHVMgg4m8B9he/BAHj64Lw/vP98e3L8vD+7fkwf37nIjg3ysA/dUPdT1EnUUdfXRwwfy+NFDefyfEIQ6DdHHEHyemdab8ij2hL7pU+gJPWOmQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIk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gw4qaJugMAhAAALlQsAVPd16f8h9nr5vZOrA8NG1ft+3oaGh5Jvk/yuFI3RFz7U33C733v84CwwiUQduuvVev8GHJXratmkbCRa0W65btg5ccNFlpl0gekrhDssxQAACpUjAjei59vrbuM/T741MHbjl9r/5fd9Ci55BAweastvs3yYyPGzfh3W8+8EXtrvc1F1ETynecTkmCECgFAi4ouea6+j70m+ITr/B7fsievK8muzevVvatGnjPzTYCAnWXqQIHEqfw3777isbNmzIs8bnt1lFRQVtIhEtRRso/TaQ6W902l/+kl9lZysIQAACMSPw5ZdfSlv6vvRzItzP2XeffeTTTz8taMutHD+eOhHhOpGpLxi3904++eSCtgkKgwAEIFAuBPbu3SsHtG3LfZ77fGTrgPZ9165dW/JNsiQien777Tfp1KmTPPLIIywwiGQdeKN9e/npp58K2uD1Fw/PPfdcJHnQlrmWPfboozLs/fcL2iYoDAIQgEC5EPj999+lc+fO3OPp90a2DrR//XX58ccfC9okt23bJs/T941snYh7///RRx+VIUOGFLRNUBgEIACBciGgfd+3336bexx938jWgddfe01++OGHkm+SJSF6lNL3339vIiI0KoIFBlGrA998800ojf3zzz+nPXBNiGQd0Pknfv3111DaBYVCAAIQKAcC9H3p70atv+seb1h9X8304H4Pr2knUakDGzdupO9bDjdnzgECEAiNgA6SR+WaznHS/0ivA19//XVobaOQBZeM6CnkSVEWBCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIgDAURPHP7KnCMEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAJlSQDRU5Z/Vk4KAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIACBOBBA9MThr8w5QgACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgUJYEED1l+WflpCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIgDAURPHP7KnCMEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAJlSQDRU5Z/Vk4KAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIACBOBBA9MThr8w5QgACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgUJYE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rJEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkElA0JNpN6yFAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAgIOgpwDKUAAECBAgQIECAAAECBAgQIECAAAECBAgQIJBJQNCTaTeshQABAgQIECBAgAABAgQIECBAgAABAgQIECBQICDoKcAylAABAgQIECBAgAABAgQIECBAgAABAgQIECCQSUDQk2k3rIUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCAg6CnAMpQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkElA0JNpN6yFAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAgIOgpwDKUAAECBAgQIECAAAECBAgQIECAAAECBAgQIJBJQNCTaTeshQABAgQIECBAgAABAgQIECBAgAABAgQIECBQICDoKcAylAABAgQIECBAgAABAgQIECBAgAABAgQIECCQSUDQk2k3rIUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCAg6CnAMpQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkElA0JNpN6yFAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAgIOgpwDKUAAECBAgQIECAAAECBAgQIECAAAECBAgQIJBJQNCTaTeshQABAgQIECBAgAABAgQIECBAgAABAgQIECBQICDoKcAylAABAgQIECBAgAABAgQIECBAgAABAgQIECCQSUDQk2k3rIUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCAg6CnAMpQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkElA0JNpN6yFAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAgIOgpwDKUAAECBAgQIECAAAECBAgQIECAAAECBAgQIJBJQNCTaTeshQABAgQIECBAgAABAgQIECBAgAABAgQIECBQICDoKcAylAABAgQIECBAgAABAgQIECBAgAABAgQIECCQSUDQk2k3rIUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCAg6CnAMpQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkElA0JNpN6yFAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAgIOgpwDKUAAECBAgQIECAAAECBAgQIECAAAECBAgQIJBJQNCTaTeshQABAgQIECBAgAABAgQIECBAgAABAgQIECBQICDoKcAylAABAgQIECBAgAABAgQIECBAgAABAgQIECCQSUDQk2k3rIUAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCAg6CnAMpQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkElA0JNpN6yFAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAgIOgpwDKUAAECBAgQIECAAAECBAgQIECAAAECBAgQIJBJQNCTaTeshQABAgQIECBAgAABAgQIECBAgAABAgQIECBQICDoKcAylAABAgQIECBAgAABAgQIECBAgAABAgQIECCQSeBf8we79u3m+YsAAAAASUVORK5CYII=







Kubernetes 发行版。

轻量型:

* [[k3s]]
* [[MicroK8s|https://microk8s.io/]]
`minikube service list` 命令可以输出一些有用的信息,包含内部服务的外网访问地址。比如你部署完 `istio` 后,可以用 `istio-ingress` 的 URL 去访问 istio 的负载均衡服务:

```bash
> $ minikube service list
|--------------|----------------------|--------------------------------|
|  NAMESPACE   |         NAME         |              URL               |
|--------------|----------------------|--------------------------------|
| default      | details              | No node port                   |
| default      | kubernetes           | No node port                   |
| default      | productpage          | No node port                   |
| default      | ratings              | No node port                   |
| default      | reviews              | No node port                   |
| istio-system | istio-ingress        | http://192.168.99.100:30058    |
|              |                      | http://192.168.99.100:32319    |
| istio-system | istio-mixer          | No node port                   |
| istio-system | istio-pilot          | No node port                   |
| kube-system  | kube-dns             | No node port                   |
| kube-system  | kubernetes-dashboard | http://192.168.99.100:30000    |
|--------------|----------------------|--------------------------------|
```

k8s 的组件主要分为两部分:''控制面''(control plane)组件和 worker node 组件:

[img width=500 [kubernetes-components]]

|!The Control Plane |!On the worker node |!Add-on Component |
|• etcd<br>• API Server<br>• Scheduler<br>• Controller Manager |• kubelet<br>• kube-proxy<br>• Container Runtime |• kube-dns<br>• Dashboard<br>• Ingress Controller<br>• Heapster<br>• CNI network plugin |

除了 kubelet 必须是一个普通的进程外,其他组件可以是普通进程,也可以是 ''以 pod 形式运行'' 的(事实上大多是以 pod 形式)。Master node 也往往有 kubelet 用来运行控制面的组件。

Worker node 上的组件是必须全部跑在 worker node,但是 master 的组件可以分布在不同的 node,也可以跑多个实例做高可用。其中 etcd 和 kube-api-server 是可以并行(parallel)运行的,但 scheduler 和 controller manager 同一时间只能各自有一个实例运行。

''k8s 的组件只与 kube-api-server 通信。etcd 只被 kube-api-server 读写。''

kube-apiserver 是 k8s 运转的核心。

!! 请求处理过程

[img width=700 [kube-api-server-operation]]

过程:

* Authentication / Authorization 做鉴权
* Admission 是一类可以配置开启的 [[插件|https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/]],它们可能会修改请求附带的资源,甚至拒绝掉请求。比如:
** AlwaysPullImage 会将 pod 中的 image pull policy 覆盖为 AlwaysPullImage
** DenyServiceExternalIPs 会拒绝掉指定了 external IP 的 service
* Resource validation 校验资源的定义是否合法等等

!! 与其他控制面组件的交互

API server 中并不会有很多逻辑。比如通过 API server 创建了一个 ReplicaSet 后,API server 并不会将相应的 pod 资源对象创建起来;这类事情是各种 controller 在做,比如 ReplicaSetController。

Scheduler 和各类 controller,通过 API server 提供的 watch 能力,向 API server 建立长连接并持续监听它们关心的资源的变化情况。资源的新建、修改和删除都会通知。
Key fact:

* ''etcd 保存了 k8s 集群的所有状态和元信息''
* ''etcd 仅被 kube-api-server 使用''
** kube-api-server 可以实现 ''[[乐观锁|DC: C: Optimistic / Pessimistic Concurrency Control]]'' 来提升性能
** 未来可以容易地替换掉 etcd(如有必要)

kube-api-server 实现乐观锁的机制是:

* 给集群中每一个 resource 都带上一个版本号(在 `metadata.resourceVersion` 中体现)
* 每次修改资源都会增加版本号
* client 请求修改资源时,需要先拉现在的资源以获得版本号,再请求做修改
** 如果请求修改时该资源的版本号已经变化,kube-api-server 会报错,client 需要再拉、再请求修改

etcd 使用 RAFT 共识算法,一个变更需要取得大多数节点同意才有会效。
Scheduler 决定了 pod 分配往哪台 node。

!! 从资源变化的角度

Scheduler 向 API server 监听 pod 的变化。当它发现有 pod 没有指派 node 时,它将该 pod 调度到某个 node,以修改该 pod 资源定义的方式。

Node 上的 kubelet 也监听 pod 资源的变化。当某一 node 发现有 pod 被指派给它时,它调用 container runtime 将该 pod 运行起来。

!! 默认调度算法

[img width=800 [kubernetes-default-scheduling-algorithm]]

''怎样决定 node 是否 acceptable''?

* ''Node 资源情况'':是否满足 pod 运行;node 自身是否资源紧缺,比如上报了 memory pressure
* ''Pod 指派情况'':Pod 是否指定了它要运行的 node 或者 node label?
* Pod 指定了 host port 时,看 node 上的该端口是否被占用?
* Volumn,taints,pod affinity rule 等影响

''怎样决定哪个 node 更合适''?

这一过程没有深究了。[[Kubernetes in Action]] 一书没有很详细讲这点。你可以实现自定义的 scheduler,也可以指定具体的 pod 使用哪一 scheduler。

Kubernetes 集群有一个容器网络的概念,即会为集群中每一个 pod 分配一个 IP。在部署集群时,需要指定一个容器网络的 CIDR(参考 [[这里|https://kubernetes.io/docs/setup/scratch/#network]])。

!! 集群网络与容器网络

按 TKE 的 [[要求|https://cloud.tencent.com/document/product/457/9083#.E9.9B.86.E7.BE.A4.E7.BD.91.E7.BB.9C.E4.B8.8E.E5.AE.B9.E5.99.A8.E7.BD.91.E7.BB.9C.E7.9A.84.E5.85.B3.E7.B3.BB]]:

* 集群网络和容器网络网段不能冲突
* 同一 VPC 内,不同集群的容器网络网段不能冲突
* 容器网络和 VPC 路由冲突时,优先在容器网络内转发

集群网络是指 Kubernetes 集群所在的宿主机(一般是物理机)的网络。集群网络与容器网络的 CIDR 不能冲突,是各容器平台的共识,包括时速云及 gaia。时速云及 gaia 表示如果用户不指定 CIDR,那么他们会自动指定 CIDR,并与集群网络避开冲突。对于「同一 VPC 内,不同集群的容器网络网段不能冲突」,时速云及 gaia 均 ''无此限制'',不知道 TKE 出于什么原因做的限制,毕竟不同集群的 pod 并不能互相通信。

创建 TKE 集群时需要先选择 VPC 及指定容器网络 CIDR,这使得在创建前就可以知道 CIDR 是否可行。其他容器平台没有选择 VPC 的过程,无法提前知晓,可能需要用户自行避开。

!! 选择什么网段?

选网段时主要考虑集群运行的 pod 数量会有多少。 `/24` 的网段支持每个 node 节点上运行 254 个 pods。`192.168.0.0/17` 的 CIDR 支持 3 万多 pod 每节点。大部分时候这个 CIDR 的选择不会成为瓶颈。

k8s 的 label 用来给资源打标签,selector 用来筛选资源,比如 ReplicaSet:

```yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:                 # ReplicaSet 管理有这种标签的 pod
      tier: frontend
  template:
    metadata:
      labels:                    # 生成的 pod 带有这些标签
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3
```

Label 是一些 (string, string) 键值对。Selector 有两类:

* Equality-based:
** 操作符:`=`,`==`,`!=`
** 例子:`environment=production,tier!=frontend`
* Set-based:
** 操作符:`in`, `notin`, `exists`,以及可以表示某一 label key 存在(无视其值)或不存在
** 例子:`environment in (production, qa),tier in (frontend)`;`env` 表示筛选 label 中有 `env` 的,不管值是个进程能;`!env` 表示筛选 label 中没有 `env`

上面例子的格式主要是用在 kubectl 中:

```
kubectl get pods -l 'environment in (production),tier in (frontend)'
```

逗号分隔表示逻辑与(`&&`)。Selector 不支持逻辑或(`||`)。

在 YAML 中的写法:

```yaml
# Equality-based
selector:
    component: redis
    tier: midware

# Set-based
selector:
  matchLabels:             # key-value 形式
    component: redis
  matchExpressions:        # 带操作符
    - {key: tier, operator: In, values: [cache]}   # YAML map 的紧缩写法
    - key: environment                             # YAML map 的另一种写法
      operator: NotIn
      values:
      - dev
```

Service 和 ReplicationController 用的是 equality-based;比较后面出现的资源类型,如 Job、Deployment、ReplicaSet、DaemonSet 等,均用的 set-based。

!! 参考

* [[Labels and Selectors|https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/]]
k8s namespace 可以将 k8s 资源分组,比如 pod、service、rc 等。不同 namespace 中的资源可以有同个名字,比如可以有同样的名为 "helloworld" 的 pod。默认的命名空间为 "default"。

''namespace 用于'':

* 在大集群中分隔开不同团队的使用
* 给不同用户分配不同的资源(resource quota)

''namespace 不会'':

* 隔离 pod 间的网络请求

创建 service 时会建立一个相应的 ''DNS 条目'' `<service-name>.<namespace-name>.svc.cluster.local`。其中 `<namespace-name>` 部分如果省略则表示同个命名空间。

''并不是所有资源都有命名空间'',如 node、persistentVolumes。
K8S 带来了什么?有什么益处?

''细化分工'':

* ''开发'' 不再需要去关心线上环境的基础设施(什么系统、什么基础库等等)
* ''运维'' 不再需要去关心开发所提供的程序需要怎样的基础设施,比如系统、基础库等等

这使得这两者的工作可以解耦。开发只需要关心实现好业务逻辑,描述好所需要的资源数量(比如某个服务需要运行多少个实例,一共要求多少 CPU 及内存);运维只需要维护好稳定的 k8s 集群,使得资源调试能正常工作。

''适应微服务架构'':微服务架构所产生的服务数量多,不同服务对 scaling 的需求不一致,k8s 可以比较好的处理。

''继承自容器技术的益处'':

* 各服务方便的、隔离的运行环境
* 开发环境与线上环境一致

但值得注意的是,k8s 从设计理念上,''并不一定需要搭配容器技术来使用''。它的核心是资源调度,而容器是当前环境下适合用来包裹程序及其资源需要的技术。如果有另外一种技术也可以达成相应目标,它也可以被调度。
Kubernetes 中的各类资源对象。
Kubernetes 定义了一种 ConfigMaps 对象,''用来分离 Pod / 容器和它的运行配置'',比如你可以在测试环境和生产环境用同个 pod 模板来运行 pod,但是使它们所使用的配置不同。

创建一个 ConfigMaps 对象,在里面定义一组 k-v 对,然后就可以通过环境变量或者 Volumn 中的文件形式供 pod 使用。

''一个常见的混淆点是'':如果你在某个 k-v 对中,value 使用的是某个文件的内容,即使这个文件是 JSON / YAML 这类结构化数据,Kubernetes 也不会去解析它。它只会把文件内容变成环境变量的值 / Volumn 中的文件,给到 pod 中的应用程序去解析。

Kubernetes 至今(2021 年 6 月)并未提供一种机制,在 ConfigMaps 内容变化时通知容器进程。除非你的容器进程直接访问 kube-api-server(不合理的做法)。

ConfigMaps 的用法很简单,查查文档即可。

你需要慎重考虑修改 ConfigMaps 的影响:

* 如果 Pod 以 mount 一个目录的形式来使用,里面的文件内容会发生改变
** 假如此时你的 Pod 并没有自动用上新内容,有可能使得开发者进入容器内部时有所疑惑,发现容器行为跟配置文件不一致。k8s 在 1.19 版本引入了 immutable ConfigMap 来避免这个问题
* 配置的生效需要一段时间,可能有一段时间内不同 pod 的配置不一样
CronJob 类似 [[Job|Kubernetes: Resource: Job]],但是它是周期性地跑或者在未来某个时间运行。

YAML:

```yaml
apiVersion: batch/v1beta1               
kind: CronJob
metadata:
  name: batch-job-every-fifteen-minutes
spec:
  schedule: "0,15,30,45 * * * *"           
  jobTemplate:
    spec:
      template:                            
        metadata:                          
          labels:                          
            app: periodic-batch-job        
        spec:                              
          restartPolicy: OnFailure         
          containers:                      
          - name: main                     
            image: luksa/batch-job
```

`schedule` 字段的格式跟 Linux 的 cronjob 类似,分别是 Minute、Hour、Day of month、Month、Day of week。

创建一个 CronJob 后,k8s 会在指定的时间创建 Job 来运行指定的任务。

''CronJob 并不能保证在确定的时间运行,因此 job 的代码逻辑需要保证两个 job 同时运行时也可以正常运作。''
''DaemonSet 的作用是在每台 node 都运行一个指定的 pod''。跟 [[ReplicaSet|Kubernetes: Resource: ReplicaSet]] 一样,它也用 pod template 来定义 pod。

可以通过 `nodeSelector` 来 ''使 DaemonSet 只运行在部分 node 上''。当 node 的 label 变化时,比如被打上 DaemonSet 需要的 label,或者该 label 被去除时,k8s 会自动检测,并在相应的 node 上创建 pod 或者删除 pod。

DaemonSet 不需要定义 replicas count,因为它只在每台 node 上运行一个 pod。它不通过 scheduler 来调度,因此即使一台 node 被标记为 unschedulable 来避免 pod 被调度到上面部署时,DaemonSet 定义的 pod 仍然会被部署上去。
Deployment 最大的特点是:它可以让升级过程变成 ''声明式'' 的(而不是指令式的)。声明式是 k8s 一直强调的哲学。

假如没有 Deployment,你需要使用 [[ReplicaSet|Kubernetes: Resource: ReplicaSet]] 或 [[ReplicationController|Kubernetes: Resource: ReplicationController]]。一旦升级时,如果你想实现滚动升级,需要非常麻烦地去建立新的 RS / RC,不停地修改 replicas 值,直到升级完成。Deployment 帮你搞定这个过程。

`kubectl` 提供了一个命令 `rolling-update`,但这个命令不是使用 Deployment,而是把上述人工操作的过程,用代码来调用 kube-apiserver 完成。如果 `kubectl` 中途挂掉,会非常地啰嗦麻烦。

而且 Deployment 还提供了类似发布历史的能力:

```shell
$ kubectl rollout history deployment kubia deployments "kubia":

REVISION    CHANGE-CAUSE
2           kubectl set image deployment kubia nodejs=luksa/kubia:v2
3           kubectl set image deployment kubia nodejs=luksa/kubia:v3
```

发布有异常时,你可以回滚到前一个版本(revision)。你也可以回滚到任何特定版本。保留几个版本,由 `revisionHistoryLimit` 控制。版本信息存在 RS 中,因此你不要手动删掉 Deployment 建立的 RS。

Job 表示一次性任务。Job 的 pod template 中生成的 pod,跑的进程不再是一直运行的服务,而是能跑完的任务。

Job 的 pod 所运行的 node 一旦挂了,k8s 会重新在别的 node 上起该 pod。

Job 的 YAML:

```yaml
apiVersion: batch/v1        
kind: Job                   
metadata:
  name: batch-job
spec:                                
  template: 
    metadata:
      labels:                        
        app: batch-job               
    spec:
      completions: 5
      parallelism: 2
      restartPolicy: OnFailure         
      containers:
      - name: main
        image: luksa/batch-job
```

注意点:

* restartPolicy 无法是默认的 Always,而需要设置为 OnFailure 或 Never;可以设置重试次数的上限
* Job 可以跑多次,即串行地起 pod 来运行。使用 `completions` 指定,不指定时只跑一次
* Job 可以并行运行,用 `parallelism` 来指定;不指定时不并行运行
* 可以设置运行的超时时间
k8s 的 pod 是最小的程序运行单位。一个 pod 可能包含多个容器,但多个容器只能运行在同一个 node,不会运行在多个 node。

!! 为什么最小运行单位是用 pod 而不是容器?

因为容器的最佳实践是,一个容器只运行一个程序(除了这个程序本身会创建子进程)。比如一个容器往往不会同时跑多个不同的 web 服务。

但有时候你需要额外的容器来配合主容器运作,比如一个同步外部文件的程序、日志收集的程序、某种本地 agent 等等。因此 k8s 设计了 pod 这种结构,来包裹多个容器并实现容器间的网络、文件共享(通过 [[Volumn|Kubernetes: Core Concept: Volumn]])等。

!! Pod 间的网络访问

k8s 会为集群中的 pod 生成一个软件定义的网络。每个 pod 在这个网络中会被分配一个唯一的 IP,通过这个 IP pod 间可以互相访问,即使它们在不同的 node。k8s 的 namespace 不会隔离这种访问。`kubectl get pods -o wide` 可以看到 pod IP。

!! 最简单的 YAML 定义

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports: 
    - containerPort: 8080
      protocol: TCP
```

''其中 ports 部分只有文档作用'',k8s 不会根据它做逻辑。

''kubectl explain'' 命令可以描述 YAML 中的字段,如:

```shell
kubectl explain pods
kubectl explain pods.spec
```

!! 使用 YAML 文件创建 pod

```shell
kubectl create -f kubia-manual.yaml
```

!! 以 YAML / JSON 形式查看 pod

```shell
kubectl get po kubia-manual -o yaml
kubectl get po kubia-manual -o json
```

!! 查看 pod 日志(stdout、stderr)

```shell
# 单容器
kubectl logs kubia-manual
# 多容器用 -c 指定容器
kubectl logs kubia-manual -c kubia
# 如果前面的 pod 挂了,想看它的日志
kubectl logs kubia-manual --previous
```

Log 可能会滚动(rotated),[[这里|Docker: Logging Drivers]] 有详细信息。

!! 发请求到 pod 中

一种方法是创建 service 将 pod 的服务公开出来。可以使用 [[Kubernetes: Resource: ReplicationController]] 中提及的 `kubectl expose` 命令将 rc / deployment expose 出来。

另外一种方法是使用 `kubectl port-forward`,比如:

```shell
kubectl port-forward kubia-manual 8888:8080
```

kubectl 会在本地起一个进程侦听 8888 端口,并将访问这个端口的请求转发到 kubia-manual pod 中的 8080 端口。这种方法非常适合用于调试。

!! Label

Label 可以用来筛选 pod:

```yaml
apiVersion: v1                                         
kind: Pod                                              
metadata:                                              
  name: kubia-manual-v2
  labels:    
    creation_method: manual          
    env: prod                        
spec: 
  containers: 
  - image: luksa/kubia
    name: kubia
    ports: 
    - containerPort: 8080
      protocol: TCP
```

查看 pod 的 label:

```
$ kubectl get po --show-labels
NAME            READY  STATUS   RESTARTS  AGE LABELS
kubia-manual    1/1    Running  0         16m <none>
kubia-manual-v2 1/1    Running  0         2m  creat_method=manual,env=prod
kubia-zxzij     1/1    Running  0         1d  run=kubia

$ kubectl get po -L creation_method,env
NAME            READY   STATUS    RESTARTS   AGE   CREATION_METHOD   ENV
kubia-manual    1/1     Running   0          16m   <none>            <none>
kubia-manual-v2 1/1     Running   0          2m    manual            prod
kubia-zxzij     1/1     Running   0          1d    <none>            <none>
```

还可以:

* 修改已有 pod 的 label
* 按 label 筛选出 pod。筛选逻辑支持:
** Label 存在与否
** Label 值匹配
* 批量删除某些 label 下的 pod

Label 与 selector 是配合使用的。可以给 node 设置 label,再要求 pod 被调度到符合条件的 pod:

```shell
$ kubectl label node gke-kubia-85f6-node-0rrx gpu=true
node "gke-kubia-85f6-node-0rrx" labeled

$ kubectl get nodes -l gpu=true
NAME                      STATUS AGE
gke-kubia-85f6-node-0rrx  Ready  1d
```

注意下面的 `nodeSelector`:

```yaml
apiVersion: v1                                         
kind: Pod                                              
metadata:                                              
  name: kubia-gpu
spec: 
  nodeSelector:               
    gpu: "true"               
  containers: 
  - image: luksa/kubia
    name: kubia
```

如果你想把 pod 调度到指定的某一个 node,可以使用 k8s 分配给每个 node 的 label `kubernetes.io/hostname`。但这种做法不被推荐,如果该 node 挂掉了,这个 pod 也就无法运行了。

!! Annotation

Annotation 类似 label 也是键值对,但是不参与筛选,而是放入较长文本被程序所使用。Label 的值能放入的文本较少。

```shell
$ kubectl get po kubia-zxzij -o yaml
apiVersion: v1
kind: pod
metadata:
  annotations:
    kubernetes.io/created-by: |
      {"kind":"SerializedReference", "apiVersion":"v1", 
      "reference":{"kind":"ReplicationController", "namespace":"default", ...
```

!! k8s 如何终止一个 pod

先向 pod 中的各容器发 SIGTERM,并把该 pod 从 service 对应的 pod 列表中删除。各容器主进程应该开始 graceful stop。等待一段 grace period 后(默认 15s),如果容器还没停止,k8s 会向容器发 SIGKILL 杀掉容器进程。

!! 健康检查

k8s 通过 liveness probe 机制,让 pod 中的程序可以告知 k8s 自己是否正常。在 pod 的 spec 中可以定义:

```yaml
  livenessProbe:
     httpGet:
       path: /
       port: 8080
     initialDelaySeconds: 15
```

Web 服务常用的惯例是在 `/health` 接口中返回成功失败。好的实践是,`/health` 接口不止是简单返回 HTTP 200,而且应该 ''检查外部依赖是否正常'',比如依赖的数据库等等。

Liveness probe 的检查过程应该足够 ''轻量''。避免过多、频繁的资源浪费;''不要在其中实现重试逻辑'',比如检查数据库连接失败后,再检查一次。

!! Pod 是否可提供服务

Pod 中有 readinessProbe 机制,用于判断一个 pod 是否可以正常提供服务。Pod 只有 ready 了,service 才会把请求转到该 pod。

readinessProbe 提供的探测方式与 livenessProbe 一致。

你可能看到这种情况:

```
$ kubectl get po kubia-2r1qb
NAME          READY     STATUS    RESTARTS   AGE
kubia-2r1qb   0/1       Running   0          2m
```

Running 表示 liveness probe 通过,READY 0/1 表示 readinessProbe 没有通过。

!! 三种 probe 的区别

见 k8s [[官方文档|https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-command]]。

!! Managed vs Unmanaged

通过 ReplicationController 或者 Deployment 创建的 pod 为 managed。直接创建的 pod 为 unmanaged。

''Unmanaged pod 在 node fail 时,k8s 不会自动帮其重新创建;managed 则会。''
PV 指 PersistentVolumns,代表可持久化的存储资源,其底下会有对应的实际存储资源(比如 GCE Persistent Disk);PVC 指 PersistentVolumnClaims,代表开发声明所需要使用的存储资源量。

''机制'':

{{ kubernetes-pv-pvc-illustrated }}

''主要作用'':将基础架构的管理交还给运维,由运维维护 PV;开发者仅需要向集群申请需要使用的持久化存储(通过 PVC),无需再关心基础架构。

PV 的 YAML 样例及功能解读:

{{ kubernetes-pv-yaml }}

Acesss mode 有三种:RWO (ReadWriteOnce)、ROX (ReadOnlyMany) 及 RWX (ReadWriteMany)。不同类型的 volumn 支持不同的 access mode,见 [[官方文档|https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes]]。

PV 不属于任何命名空间,它是集群级的资源,跟 node 类似。

PVC 由开发创建,表示需要怎样的(大小、访问模式等)持久化存储供 pod 使用。PVC 这种资源不再是附属在 pod 中,而是属于命名空间的,并且只有同个命名空间的 pod 可以使用该 PVC。

PVC 的 YAML 样例及功能解读:

{{ kubernetes-pvc-yaml }}

Pod 中使用 PVC:

{{ kubernetes-pvc-pod-yaml }}

!! 生命周期

一个 PV 有几个 phase:

* Available:可以被 bound 到 claim 上
* Bound:已经被 bound 到 claim 上
* Released:不再被 bound 到 claim 上,但是还没被 reclaim
* Failed:自动 reclaim 失败

一个 PVC,假如没有合适的 PV 可以 bind 上,则状态会是 pending;此时如果有 pod 使用了该 PVC,pod 无法成功启动,会处于 pending 状态,event 中会有 FailedScheduling 事件:1 pod has unbound immediate PersistentVolumeClaims。

假如你删掉了正在被使用的 PV 和 PVC 资源,k8s 并不会马上销毁它,而是等到没有被使用时再销毁。见 [[官方文档|https://kubernetes.io/docs/concepts/storage/persistent-volumes/#storage-object-in-use-protection]]。

使用了 PVC 的 pod 被销毁时,PVC 并不会被同时销毁,仍然可以被使用;同样的,PVC 如果被销毁,PV 并不会被销毁。

!! PV 及 PVC 对应关系

一个 PV 只能被一个 PVC 绑定。即使 PV 的空间有 100G,而 PVC 仅要求 10G,剩余没有使用的 90G 仍然不能被其他 PVC 使用。下文描述的 dynamic provisioning 可以避免这种资源浪费。

!! Reclaim Policy

一旦 PVC 被销毁,其所绑定的 PV 的状态从 bound 变为 released。这种情况下它无法马上被其他 PVC 绑定,因为上面还有旧的数据。你可以在 PV 的 spec 中定义 reclaim policy,指导 k8s 在 PV 变为 released 后的行为。Reclaim policy 有三种:

* Retain:保留 PV,不做动作,留给运维手工处理。手工处理的过程是:
*# 删除 PV。其下的存储资源仍然存在
*# 如果需要,对存储资源中的文件做清理
*# 再次创建 PV,使其使用同个存储资源。此时 PV 可以再被 PVC 绑定,使底下的存储资源再次被 pod 使用
* Recycle:已废弃,基本上是做次删除(`rm -rf /thevolume/*`)
* Delete:自动将 PV 及其下的存储资源(比如 Azure Disk)同时删除

不同的存储资源支持的 reclaim policy 不一样。比如 GCE Persistent Disk 不支持 recycle,只支持其他两种。

!! Dynamic provisioning of PersistentVolumes

上述的流程均是运维预先准备好(provision)资源及 PV,使用者再 claim 它们要多少资源。Dynamic provisioning 可以使运维无需预先准备 PV,使集群在用户创建 PVC 时动态生成 PV。

k8s 通过定义了一种新资源 StorageClass 完成这个过程。StorageClass 是集群下的资源,不属于具体命名空间,它的定义如下:

```yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast                          # StorageClass 名字,会被 PVC 使用
provisioner: kubernetes.io/gce-pd     # provisioner,即分配资源的插件,比如这个是 GCE 的 persistent disk
parameters:                           # 参数是传给 provisioner 插件的,各插件的参数定义不同
  type: pd-ssd                        # 表示 provisioner 生成的 PV 应该是基于 SSD 的
  zone: europe-west1-b
```

各云厂商 [[定义|https://kubernetes.io/docs/concepts/storage/storage-classes/#parameters]] 了它们自己的 provisioner。

如果你用 GKE,GKE 会在你的 k8s 集群 [[预先配置|https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes]] 好一个默认的 StorageClass,其使用的是标准磁盘(pd-standard,而非 SSD)。

你可以配置多个 StorageClass 来满足不同要求,比如定义一个名为 standard,表示标准磁盘的;再定义一个名为 fast,表示 SSD 的。

配置好 StorageClass 后,你就可以在 PVC 中定义要使用的 StorageClass,如:

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc 
spec:
  storageClassName: fast     # 要使用的 StorageClass
  resources:
    requests:
      storage: 100Mi
    accessModes:
    - ReadWriteOnce
```

k8s 就会让相应的 provisioner 分配磁盘,产生 PV。整个过程如下:

{{ kubernetes-dynamic-provisioning }}

假如你在 PVC 中不定义 `storageClassName`,k8s 会用 [[默认的 StorageClass|https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class/]]。假如你不想用动态生成的 PV,想用手工分配的 PV,你需要将 `storageClassName` 设置为空字符串 `""`。

`kubectl get sc` 可以用来检查已有的 StorageClass,比如 `kubectl get sc standard -o yaml`。

StorageClass 中可以设置 reclaim policy,来控制生成的 PV 的 reclaim policy。默认一般是 `delete`,即一旦 PVC 被删除,绑定的 PV 不再被使用,则会自动删除 PV 及其底下的磁盘资源。
ReplicaSet 跟 [[ReplicationController|Kubernetes: Resource: ReplicationController]] 非常像,语法上差异很小。但 ReplicaSet 用来取代 [[ReplicationController|Kubernetes: Resource: ReplicationController]]。

ReplicaSet 的优势在于:

* 它的 selector 是 set-based,表达能力更佳;而 rc 是 equality-based。这两者的区别参考 [[这里|Kubernetes: Object: Label and Selector]]
* 它生成的 pod、或者接管的手工生成的 pod,会带 `ownerReferences` 属性指向自己;这使得它对 pod 的管理比 rc 更合理(rc 是完全基于 label 的)。Pod 的 yaml 会像这样子:<div>

```yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2020-02-12T07:06:16Z"
  generateName: frontend-
  labels:
    tier: frontend
  name: frontend-b2zdv
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: frontend
    uid: f391f6db-bb9b-4c09-ae74-6a1f77f3d5cf
...
```

</div>

对于 unmanaged pod,如果 ReplicaSet 发现其 label 符合 rs 的 selector,会马上 ''将其接管'',打上 `ownerReferences`。

对于 selector 规则有重叠的情况,k8s 目前(2021 年 3 月)似乎没有处理冲突,只是在 Deployment 的 [[文档|https://kubernetes.io/docs/concepts/workloads/controllers/deployment/]] 中提及不要这样做:

<<<
Do not overlap labels or selectors with other controllers (including other Deployments and StatefulSets). Kubernetes doesn't stop you from overlapping, and if multiple controllers have overlapping selectors those controllers might conflict and behave unexpectedly.
<<<

ReplicationController 用来表示要在集群中运行一定数量的某个 pod。下面将 ReplicationController 简称 rc。

rc 的关键点在于:

* ''定义 label selector'',表示带这些标签的 pod 属于这个 rc 的管控之下
* ''定义副本个数''
* ''定义 pod template'',表示生成怎样的 pod

''rc 不足够灵活,使用时应该用 deployment''。比如 rc 在做滚动更新时,建议的做法是:

* 新建一个新的 rc,用上新版本的 pod template,使其 replicas 为 1
* 不停地将老 rc replicas 减 1,新 rc 加 1,直至发布完

这个过程就非常繁琐。Deployment 可以自行解决这些问题。

!! 创建 rc

早前的 k8s 版本可以用 `kubectl run` 搭配 `--generator=run/v1` 参数来创建 rc。但是这个做法由于容易引起混乱,被移除了。应该使用 `kubectl create` 搭配一个 YAML 来创建 rc。而 `kubectl run` 只能用来创建 pod,跟 `docker run` 的功能类似。

YAML 样例:

```yaml
apiVersion: v1
kind: ReplicationController     
metadata:
  name: kubia                      
spec:
  replicas: 3                 # Replicas count
  selector:                   # Label selector
    app: kubia 
  template:                   # Pod template
    metadata:                      
      labels:                 # 应该跟 rc 的 label selector 一致,否则 rc 会无限生成新 pod
        app: kubia                 
    spec:                          
      containers:                  
      - name: kubia                
        image: luksa/kubia         
        ports:                     
        - containerPort: 8080
```

其中 ''不建议定义 rc 的 selector'',不定义时 k8s 从 pod template 中取 labels 作为 selector,减少出错可能。

!! 为 rc 创建 service

```shell
kubectl expose rc kubia --type=LoadBalancer --name kubia-http
```

上面创建了一个名为 `kubia-http`、类型为 `LoadBalancer` 的 service。

!! 查询 rc

```shell
kubectl get rc
```

```
NAME        DESIRED    CURRENT   READY   AGE
kubia       3          3         2       17m
```

!! 扩缩容 rc

```shell
kubectl scale rc kubia --replicas=3
```

!! 手工修改 pod 的 label 的效果

* 如果 managed pod 被修改后,label 不再满足 rc 的 selector,pod 变成 unmanaged;rc 因为 pod 数量不足,产生新 pod
* 如果 unmanaged pod 被修改后,label 满足了 rc 的 selector,pod 变成 managed;rc 因为 pod 数量过多,杀掉部分 pod

!! 修改 rc 的 selector 后的效果

不太重要。可以忽略。

如果 rc 当前管理的 pod,在 rc 修改 selector 其 label 不再能匹配 selector,这些 pod 会变成 unmanaged pod,不受管理。rc 会生成新的 pod,但假如你不同时修改 pod template 中的 label 使其匹配新的 selector,那 rc 可能无限制地生成新的 pod。

!! 修改 rc 中的 pod template 后的效果

虽然现时的 pod 跟 rc 定义的 template 已经不同,但是 rc 不会杀掉当前的 pod,而是在 pod 被销毁(容器进程退出或手工删除 pod)时,再以新的 template 生成 pod:

[img width=700 [k8s-rc-change-pod-template]]

!! 删除 rc

删除 rc 时会同时删除其管理的 pod。如果想要不删除 pod,使用 `--cascade=false`:

```shell
kubectl delete rc kubia --cascade=false
```
Secrets 非常类似 ConfigMaps。但是相比 ConfigMaps 多了加密能力。

!! 安全

假如不 [[配置加密算法和密钥|https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/]],Secrets 中的 K-V 对会以明文形式存在 etcd 中。如果配置了,则 etcd 中的数据会被加密,密码和密钥会以文件形式(未验证)保存在 master 的机器上。

kube-apiserver 可以获取和设置加密算法,因此它的权限控制也要做。

有能力创建 pod 的人也可以隐式地看到 Secrets 的值。

Pod 中的 secret volumn 会是个 tmpfs,避免落盘带来的安全问题。

!! 拉私有 Docker Registry 镜像

也用到了 Secrets 的能力。建一个 `docker-registry` 类型的 secret:

```shell
$ kubectl create secret docker-registry mydockerhubsecret \
--docker-username=myusername --docker-password=mypassword \
--docker-email=my.email@provider.com
```

在 Pod 中配置 `imagePullSecrets`:

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: private-pod
spec:
  imagePullSecrets:
  - name: mydockerhubsecret
  containers:
  - image: username/private:tag
    name: main
```

用 Service Account 可以避免每个 pod 都加 `imagePullSecrets`。
Pod 在提供服务时有一些问题:

* Pod 不是永久的,可能会被销毁或者调度走
* Client 可能不知道 pod 的 IP 端口
* 提供同个服务的 pod 可以有很多个

''因此需要有个固定的方式来访问 pod 中的服务''。k8s 的 service 资源提供了这样的能力。

!! 基础

Service 类似 pod,rc 等,是 k8s 中的一种资源。指定一个 YAML 或者使用 kubectl expose 来创建它。

Service 在其整个生命周期,有固定的 IP 和 端口。Client 连接到 service 的 IP 端口即可访问其后的 pod。Service 会做负载均衡。

''Service 的 YAML,通过 selector 来指定其转发到哪些 pod 上'':

```yaml
apiVersion: v1
kind: Service             
metadata:
  name: kubia              
spec:
  ports:
  - port: 80               # 访问该 service 的 80 端口时,
    targetPort: 8080       # 请求会被转发到 pod 的 8080 端口
  selector:                 
    app: kubia   
```

''可以设置同一个 client 的多次请求都走向同一个 pod'':

```yaml
apiVersion: v1
kind: Service             
spec:
  sessionAffinity: ClientIP
  # ...
```

''可以转发到 pod 中的多个端口'':

```yaml
apiVersion: v1
kind: Service             
metadata:
  name: kubia    
spec:
  ports:                  # 多个 port 结构
  - name: http              
    port: 80                
    targetPort: 8080        
  - name: https             
    port: 443               
    targetPort: 8443        
  selector:                 
    app: kubia
```

''`targetPort` 可以使用 pod 定义中的端口名字,方便 pod 更换端口号'':

```yaml
kind: Pod
spec:
  containers:
  - name: kubia
    ports:
    - name: http           # 8080 端口的名字为 http
      containerPort: 8080      
    - name: https              
      containerPort: 8443
```

```yaml
apiVersion: v1
kind: Service             
spec:
  ports:
  - name: http              
    port: 80                
    targetPort: http       # 使用端口名来指向 pod 定义中的 8080 端口
  - name: https             
    port: 443               
    targetPort: https       
```

!! 集群中的其他 pod 如何得知某 service 的 IP 端口?

k8s 提供了两种方式:''环境变量'' 和 ''DNS 服务'':

环境变量比较鸡肋,pod 只能看到在它启动之前已经存在的 service;后面创建的 service 不行。

DNS 服务是合适的。比如你要查 default 命名空间下的 backend-database service 的 IP,你可以通过 DNS 查询这个 FQDN 的 A / AAAA 纪录来获得 IP:

```
backend-database.default.svc.cluster.local
```

你也可以省略掉 `svc.cluster.local`,只使用 `backend-database.default`。如果发起请求的 pod 也在同个命名空间(default),那只使用 `backend-database` 来查询也是可以的。

kube-dns 也提供了 SRV 类型的 DNS 查询,可以查到端口。但不是很常用。请求方可能要提前知道 service 的端口(比如通过约定使用常用的 80 / 443)。

内部实现上,k8s 会修改容器中的 `/etc/resolv.conf` 使其指向 `kube-dns` pod 所提供的 DNS 服务。`kube-dns` 本身也是一个 service,可以通过 `kubectl get service -n kube-system` 观察。

!! Service Endpoints

Endpoints 是 k8s 的另一种资源。当创建 service 时,k8s 会解析并监视被 service 选中的 pod,将其 IP 和端口存入其新建的同名 endpoints 中,比如:

```
$ kubectl describe svc kubia
Name:                kubia
Namespace:           default
Labels:              <none>
Selector:            app=kubia         
Type:                ClusterIP
IP:                  10.111.249.153
Port:                <unset> 80/TCP
Endpoints:           10.108.1.4:8080,10.108.2.5:8080,10.108.2.6:8080   # kubia service 对应的 endpoints
Session Affinity:    None
```

创建 kubia service 时会同时建立的 kubia endpoints:

```
$ kubectl get endpoints kubia
NAME    ENDPOINTS                                         AGE
kubia   10.108.1.4:8080,10.108.2.5:8080,10.108.2.6:8080   1h
```

每当有新的 pod 满足 service 的 selector,或者有已有 pod 不再满足时,k8s 会监视到这部分变化并更新对应的 endpoints 结构。每当访问 service IP 端口时,k8s 会从 endpoints 中选择一个 pod 的 IP 端口进行转发。

!! 如何使 service 指向外部服务(而不是集群内 pod)?

''第一种方法叫 headless service,即没有 selector 的 service。''

如果你创建 service 时不指定 selector,k8s 不会帮你自动创建 endpoints。此时你再手工创建同名 endpoints,使其 IP 端口列表指向你想访问的外部服务即可。过程如下:

# 创建一个没有 selector 的 service:<div>

```yaml
apiVersion: v1
kind: Service
metadata:
  name: external-service     
spec:                       
  ports:
  - port: 80 
```

</div>
# 再创建一个同名 endpoints:<div>

```yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: external-service      
subsets:
  - addresses:         # 外部服务的 IP 端口列表
    - ip: 11.11.11.11
    - ip: 22.22.22.22
    ports:
    - port: 80  
```

</div>

''第二种方法是使用 ExternalName 的 service 类型'':

```yaml
apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName                       
  externalName: someapi.somecompany.com     
  ports:
  - port: 80
```

!! 如何使集群外可以访问 service?

默认的 service 类型是 ClusterIP,生成的 IP 只能在集群内被访问。Service 还有其他类型:

* NodePort:可以用集群内所有的 node 上的某个端口来访问此 service。这样外部服务可以访问任一 node 的 node port 来访问 service。缺点明显,某一 node 可能不可用,此时外部访问就失败了。同时要留意 node 机器上的防火墙策略
* LoadBalancer:这种需要你的容器服务厂商支持,比如 GKE。应用此类型后,会在 NodePort 基础上又新建一个外网可访问的负载均衡 IP(比如在 Google Cloud 中会新建一个 load balancer,公网 IP 会收费)。这样外部服务可以通过此 IP 来访问

但 ''最合理的方式是使用 ingress controller'',也需要你的容器服务支持。Ingress controller 类似 nginx,提供了 7 层的负载均衡,可以在 HTTP 层做路由等:

[img width=800 [k8s-ingress-controller]]

创建一个 ingress controller 类似这样:

```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubia
spec:
  rules:
  - host: kubia.example.com             
    http:
      paths:
      - path: /                           
        backend:
          serviceName: kubia-nodeport     
          servicePort: 80     
```

对比 LoadBalaner 的好处是:

* LoadBalancer 模式中每个 service 都需要一个单独的公网 IP;但是 ''ingress controller 可以用一个公网 IP,将请求路由到多个 service''
* 可以在 ingress controller 上 ''配置 TLS'',使外部请求通过 HTTPS 进来;而 ingress controller 转发给 pod 的请求可以只走 HTTP

另外,ingress 不会转发请求给 service;它只是通过 service 来找到对应的 pod。

!! 如何判断某 pod 是否可以接受请求?

见 [[Kubernetes: Resource: Pod]] 中的 readinessProbe 一节。

!! 如何同时请求某个 service 下的多个 pod?

将 ClusterIP 设为 None,使得查询 service 的 DNS 请求返回的不再是 service 的 IP,而是底下所有 pod 的 IP:

```yaml
apiVersion: v1
kind: Service
metadata:
  name: kubia-headless
spec:
  clusterIP: None          # 配置这里
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia
```

这样你可以对所有 pod 同时发请求。

!! 出错时的定位方法

如果你请求某个 service 失败了,这样定位:

# 确定请求发起方是在集群内,而不是集群外
# 不要 ping service IP,没有用
# 如果定义了 readiness probe,看看它成功了吗
# 用 `kubectl get endpoints` 看看该 service 的 pod 列表
# 如果你是用 service 的域名来访问的话,试试直接访问 service 的 ClusterIP 能否成功
# 确认下你访问的端口号是不是 service 的端口号(而不是 pod 的端口号)
# 直接访问 pod 的 IP 端口试试;如果不能访问,看看 pod 中的服务是不是监听在 localhost 上了(localhost 不能被 pod 外访问)
StatefulSet 跟 ReplicaSet 很类似,都在管理一组 pod。但是 StatefulSet 是有状态的,体现在:

* 每个 pod 有单独的、固定的存储(通过 PVC template 实现)
* 每个 pod 有稳定的 identity,比如 hostname 在 pod 失败重启后不变
* Scale down 更严格,一次只能 scale down 一个 pod;当前有一个 pod unhealthy 时,无法 scale down
* 每个 pod 可以与其他 pod 通过 kube-dns 互相发现

设计 StatefulSet 可能是为了满足 ''分布式存储组件'' 的要求,比如 ZooKeeper、[[Consul|https://www.consul.io/docs/k8s/installation/install#server-agents]] 等。

具体的配置方法和逻辑细节再翻文档即可。
Volumn 可以理解成一块磁盘,可以被 mount 到 pod 的容器中。

Volumn 存在的目的是:

* Pod 中多容器共享文件
** 即使是单容器,volumn 中的内容也可以在容器重启后保留
* 对容器产生的文件进行持久化
* 预先填充某些文件到容器运行时的某一目录中

''Volumn 不是全局资源,而是属于某一 pod 的资源''。

''Volumn 跟随 pod 的生命周期'',在 pod 中容器运行前准备好,在 pod 被销毁时也销毁;这也意味着,pod 中容器重启时,volumn 中的内容仍然存在。

!! 示例

{{ kubernetes-volumn-illustrated }}

如上所示该 pod 有两个 volumn,三个容器。publicHtml volumn 被 WebServer 和 ContentAgent 分别 mount 到了不同的目录上,即 WebServer 的 `/var/htdocs` 目录的内容会与 ContentAgent 的 `/var/html` 一致。

!! Volumn 的类型

常见的几种,''但是它们不是持久化的'':

* `emptyDir`:空目录,该 volumn 初始内容为空
* `hostPath`:volumn 映射到宿主机的某个目录
* `gitRepo`:用 git 仓库提前填充好 volumn 的内容

特殊的:

* `configMap`, `secret`, `downwardAPI` 将 k8s 集群的资源和信息暴露到 pod 中。
* `persistentVolumeClaim`,后面详谈

此外还有大量基于网络存储的(如 `cephfs`),基于云厂商的(如 `gcePersistentDisk`)。

!! 持久化存储

使用厂商提供的 volumn type,比如 `gcePersistentDisk`;或者在自建机房使用基于网络的 volumn(比如 `nfs`),可以实现持久化存储。

但这样存在一个问题,比如你需要在 pod 中描述 NFS volumn 的 server 地址:

```yaml
volumes: 
- name: mongodb-data 
  nfs: 
    server: 1.2.3.4 
    path: /some/path
```

这会导致:

* Kubernetes 存在的一大目的是使开发者不用关心基础设施,但在 pod 中描述 NFS 地址破坏了这一点
* NFS server 地址在别的集群中可能不一样,使得这份 pod 描述不通用

k8s 定义了 PersistentVolumes 和 PersistentVolumeClaims 来解决这个问题。

!! PV 及 PVC

See [[Kubernetes: Resource: PV and PVC]]。


''在容器外'',可以运行 `kubectl proxy` 命令,会在本地起一个 proxy。Proxy 帮你搞定鉴权、证书检验等。`kubectl` 需要的本地配置文件(一般是 `~/.kube/config`)中已经包含了鉴权信息,因此 proxy 才能实现这种能力,你可以直接访问 kube-apiserver 的接口。

''在容器内'',一般你不需要访问 kube-apiserver。如果你真的需要,server 地址在环境变量中,鉴权信息在默认的 service account volumn 中(`/var/run/secrets/kubernetes.io/serviceaccount/`)。
应用日志,是指 pod 中业务程序打出来的日志。

这是实现采集容器 stdout 日志功能时的调研,重点在于:

* pod 日志打到了哪里
* 如何配置 filebeat 来做采集

!! 查看日志

如果日志打到 stdout,那么 `kubectl logs` 可以看到。如果 pod 经历过重启,`kubectl logs --previous` 可以看之前的日志。如果 pod 被销毁,这些日志会丢失。

如果日志打到容器内的文件中,可以运行 `kubectl exec <pod> cat <logfile>`,或者 `tail -n` 等命令查看。

`kubectl cp` 提供了在容器内外复制文件的能力:

* `kubectl cp foo-pod:/var/log/foo.log foo.log`
* `kubectl cp localfile foo-pod:/etc/remotefile`

!! Kubernetes 的 pod 日志收集机制

K8S 利用了 Docker 提供的 [[logging driver|https://docs.docker.com/config/containers/logging/configure/]] 机制来采集容器日志([[来源|https://kubernetes.io/docs/concepts/cluster-administration/logging/#logging-at-the-node-level]])。Docker 默认将各容器的 stdout 和 stderr 重定向到磁盘文件中,最终变成一个 JSON 文件。在 node 节点上的一个例子(裁剪了 ID 长度以提升可读性):

```
[root@cluster1node1 pods]# tree /var/log/pods
/var/log/pods
|-- 510cb18b-3b2c-11e9-85ab-525400b56f21
|   `-- ake-add-node
|       `-- 0.log -> /var/lib/docker/containers/36ce55/36ce55-json.log
|-- c68f45d9-3b09-11e9-85ab-525400b56f21
|   `-- coredns
|       `-- 0.log -> /var/lib/docker/containers/3336f5/3336f5-json.log
`-- fcbc3dd0-3b2a-11e9-85ab-525400b56f21
    `-- ake-add-node
        `-- 0.log -> /var/lib/docker/containers/2b77c9/2b77c9-json.log
```

JSON 日志内容节选,带 `log`, `stream` 及 `time` 三个参数:

```json
{"log":"      \"capabilities\":{\n","stream":"stderr","time":"2019-02-28T03:34:58.383595946Z"}
{"log":"        \"por{"log":"      }\n","stream":"stderr","time":"2019-02-28T03:34:58.383600746Z"}
```

Pod 重启时,K8S 默认保留一份已停止的容器的日志。

K8S 通过 Docker Engine 接口去创建容器,在 HostConfig 中指定了 `json-file` 的文件格式(猜测如此,代码中没找到),因此 `/var/log/pods` 目录可以保证存在。`/var/log/pods` 下的具体日志内容是由 Docker 写入。

注意 1.10 及以下版本可能没有这个目录:

> 如果您有特殊需求,那么可以在集群中设置您自己的日志记录解决方案。在运行 Kubernetes V1.11 或更高版本的集群中,可以从 /var/log/pods/ 路径中收集容器日志。在运行 Kubernetes V1.10 或更低版本的集群中,可以从 /var/lib/docker/containers/ 路径中收集容器日志。
> - 来自 [[IBM Cloud Kubernetes 文档|https://console.bluemix.net/docs/containers/cs_health.html]]

从这个 [[issue|https://github.com/kubernetes/kubernetes/issues/55905]] 中的信息能看到,1.10 起 `/var/log/pods` 下的路径发生变化:

```
# 1.9:            /var/log/pods/<UID>/<container>_<0-based-restart-count>.log
# 1.10 and newer: /var/log/pods/<UID>/<container>/<0-based-restart-count>.log
```

这个 [[issue|https://github.com/kubernetes/kubernetes/issues/45911]] 体现出 1.6 版本的 K8S 已经有 `/var/log/pods` 日志了。

1.9.6 版本的 K8S 的一例 log 文件路径:

```
# Symlink: /var/log/pods/<pod-uid>/<container-name>_<0-based-restart-count>.log => /var/log/containers/<pod-name>_<namespace>_<container-name-container-id>.log
/var/log/pods/37f5169f-3e63-11e9-be9d-525400dec72d/onlyice-consumer_5.log
              └ pod uid                            |                |
                                                   └ container name |
                                                                    └ restart count (6th run)
```

其中 pod uid 可以通过这几种方式取得:

* 通过 `kubectl get pods/<pod-name> -n <namespace> -o yaml`,观察 `metadata.uid` 字段
* 通过 [[Downward API|https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-of-the-downward-api]] 通过 `fieldRef` 从 `metadata.uid` 中获得

<<.warning "`metadata.uid` 需要 Kubernetes 1.8.0 及以上版本,参考这个 [[commit|https://github.com/kubernetes/kubernetes/commit/0f65b218a07e3a5edda16484604dcf1f76bae793]] 所在的 tag。">>

如果想通过 Kubernetes 来获得 pod 中容器的 stdout / stderr,可以使用 `/var/log/pods` 中的日志,但是官方并没有文档描述这个路径的 pattern,也没有承诺这个路径不变。而且直接采集 `/var/log/pods` 中的日志有可能丢数据(因为日志滚动)。

可能的更好方式是使用 `kubectl logs` 或者 kubeapi-server 的 [[read log|https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/#read-log-pod-v1-core]] 接口。这两者不依赖 `/var/log/pods` 下的日志。`kubectl logs` 最终调用的是 kubeapi-server,而 kubeapi-server 又会调用 [[Docker Engine API|https://docs.docker.com/engine/api/v1.24/]] 中的 `/containers/(id or name)/logs` 接口。这个接口使你不用关心 `/var/log/pods` 的路径变化。但是有 issue ([[1|https://github.com/kubernetes/kubernetes/issues/28369]], [[2|https://github.com/moby/moby/issues/37646]]) 反馈,`docker logs -f` 在 JSON 日志发生 rotation 时会有异常。我实测是 `docker logs -f` 及 `kubectl logs -f` 都会在那一刻退出,不再显示日志。这就使得这个方法也变得鸡肋。

!! filebeat 采集 `/var/log/pods` 下日志

观察到 `log-opts` 仅配置单文件的情况,一旦日志达到限制的大小,会 `close_write` 再 `open`,没有删除及新建过程发生,因此 inode 也没有发生变化:

```
$ inotifywatch ./53f5db77572eca11f6af33f89e3d0972298e1ab1743ebc7f1ce5d1e807d90a04-json.log 
Establishing watches...
Finished establishing watches, now collecting statistics.
^C
 total  modify  close_write  open  filename
108588  108580  4            4     ./53f5db77572eca11f6af33f89e3d0972298e1ab1743ebc7f1ce5d1e807d90a04-json.log
```

根据这个 [[帖子|https://discuss.elastic.co/t/filebeat-and-truncated-files/63054]],对于快速被 truncate 的文件,filebeat 可能会漏读日志。可以设置 `backoff` 参数来让 filebeat 更激进地去检测文件内容变化,来减少漏读的概率。但是本质上无法避免。

参考:

* [[How Does Filebeat Ensure At-Least-Once Delivery?|https://www.elastic.co/guide/en/beats/filebeat/5.0/how-filebeat-works.html#at-least-once-delivery]]
* [[Inode reuse causes Filebeat to skip lines?|https://www.elastic.co/guide/en/beats/filebeat/5.0/faq.html#inode-reuse-issue]]

!! 不同容器平台的 Docker 日志配置(不影响 k8s 拉起的 pod)

视 K8S 集群部署工具的不同,可能会带上不同的 `--log-opt` 参数来控制日志文件的大小和数量,如 Google 的 Container-VM Image [[配置|https://github.com/kubernetes/kubernetes/blob/efa96f7eb848715d77abe136aaa01f45ef8751fe/cluster/gce/gci/configure-helper.sh#L1178]] 了 10MiB 及最多 5 个文件,并最终作为环境变量写入 `/etc/default/docker` 文件中。

部分容器平台实现调研:

* 灵雀 2.x 版本,在节点上配置了(`/etc/docker/daemon.json`)单文件最多 20MiB 的配置
* TKE 公有云版本,在节点上配置了(`/etc/docker/dockerd`)单文件上限 100MiB,最多 10 个文件

`docker inspect -f '{{.HostConfig.LogConfig.Type}}' <container-id>` 可以看到相应的容器运行在哪种 logging driver 上。

!! 参考资源

* [[Logging Architecture - Kubernetes official docs|https://kubernetes.io/docs/concepts/cluster-administration/logging/]]
* [[Configure logging drivers - Docker official docs|https://docs.docker.com/config/containers/logging/configure/]]
* [[JSON File logging driver - Docker official docs|https://docs.docker.com/config/containers/logging/json-file/]]
* [[Collecting Application Logs On Kubernetes - timber.io|https://timber.io/blog/collecting-application-logs-on-kubernetes/]]
* [[Kubernetes in Action (2018)|https://www.manning.com/books/kubernetes-in-action]], 17.4.6 Handling application logs
Google 提供了 [[Kubernetes Dashboard|https://github.com/kubernetes/dashboard]] 用来方便地查看和操作 Kubernetes 集群。

!! 安装

在一个部署好的 Kubernetes 集群中,参考这些材料安装 dashboard:

* [[kubernetes/dashboard|https://github.com/kubernetes/dashboard]]
* [[教程:部署 Kubernetes Web UI (控制面板)|https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/dashboard-tutorial.html]]

如果不能从 GCR 拉镜像(如被墙),参考 [[Docker: Task: How to Pull GCR Images]]。

!! 访问

运行 `kubectl proxy` 后,默认会在 `127.0.0.1:8001` 上监听请求,dashboard 在 http://127.0.0.1:8001/ui 上。如果你是在一台远程机器上(比如 VPS)开 `kubectl proxy`,而想在本地使用浏览器访问 dashboard,那么:

* 不要使用 `kubectl proxy --address=0.0.0.0 --accept-hosts='^.*$'` 把 proxy 监听到外网 IP 上。这样虽然可以被外网访问到,但是在登录 dashboard 时会没有反应。相关 issue 在 [[这里|https://github.com/kubernetes/dashboard/issues/2735]]
* 应该使用 [[SSH: Tunneling]] 把 8001 端口 tunnel 到本地来
在 k8s 中,向 Pod 暴露信息有几种常用的方式:

* DNS,比如 [[Service|Kubernetes: Resource: Service]]
* 环境变量,比如 [[Service|Kubernetes: Resource: Service]],[[ConfigMaps|Kubernetes: Resource: ConfigMaps]],[[Secrets|Kubernetes: Resource: Secrets]]
* 文件(Volumn),比如 [[ConfigMaps|Kubernetes: Resource: ConfigMaps]],[[Secrets|Kubernetes: Resource: Secrets]]

除了上面这些资源外,有时候你可以想 ''把 Pod 的元信息(metadata)暴露给 pod''。k8s 提供了 Downward API 机制,可以做这件事情,并且一样 ''支持环境变量及 Volumn''。下面这个例子中,这些元信息通过环境变量给到 pod 中:

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: downward
spec:
  containers:
  - name: main
    image: busybox
    command: ["sleep", "9999999"]
    resources:
      requests:
        cpu: 15m
        memory: 100Ki
      limits:
        cpu: 100m
        memory: 4Mi
    env:
    # 注意这些环境变量
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    # ...
```

Pod 的 label 和 annotation 也是可以 expose 给 Pod 的,但是只能通过 Volumn 而不能通过环境变量,因为它们可能会被修改,而环境变量无法实时变化。

Kubernetes 设计了 Compute Resource(计算资源)的概念。与 API Resource(比如 Pod, Service)不同,compute resource 表示一个容器在运行时的资源使用,分为 CPU 和内存两种。每种资源又分为 request 和 limit 两种,比如下面的 deployment:

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
```

其中:

* CPU
** Limit 的值表示该容器能使用的最多 CPU 时间(应该是通过 cgroup 去限制的)。如果容器的 CPU 使用率很高,容器实现(如 docker)可能会允许容器使用比它的 limit 更多的 CPU,但是 K8S 不会将容器杀掉
** Request 的值通过转换,会变成 `--cpu-share` 参数传给 docker
* 内存
** Limit 表示能使用的内存上限。容器业务程序使用的量大于 limit 值时,会因为 OOM 被容器内的操作系统杀掉
** Request 表示 K8S 保证分配给容器使用的内存量。如果业务程序使用的内存大于 request,且 node 节点上资源不足时,容器有可能被 K8S evict

虽然 limit / request 是配置在容器上的,但是 pod 也有这个概念,它的 limit / request 指其中所有容器的总和。

K8S 在选择 node 节点去部署 pod 时,会保证该 node 剩余的容量 大于 pod 所要求的 request,但不要求剩余容量大于 limit。Node capacity 一般由 kubelet 自动上报,但是也可以手动指定,比如你需要预留一部分资源给不被 K8S 管理的进程时。K8S 计算 node 剩余容量时,不会将非 kubelet 管理的资源计算进来,比如你手动 docker run 的容器,或者 node 节点上非容器的进程。

!! 参考

* [[Managing Compute Resources for Containers - Kubernetes|https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/]]
* [[Nodes - Kubernetes|https://kubernetes.io/docs/concepts/architecture/nodes/#node-capacity]]
* Kubernetes in Action 一书中,Chapter 14: Managing pods' computational resources 有非常详尽的描述
如果你使用的私有的 Docker Registry,你可能需要用用户名密码登录上它。一般用 `docker login --username=<username> <registry-address>` 来登录,登录完后会在 `~/.docker/config.json` 中存放认证信息。

Kubernetes master 在指挥 kubelet 去拉镜像时,也需要用这份认证信息。按 Kubernetes [[文档|https://kubernetes.io/docs/concepts/containers/images/#configuring-nodes-to-authenticate-to-a-private-registry]] 描述,kubelet 会按这个顺序去拿这个配置:

* `{--root-dir:-/var/lib/kubelet}/config.json`
* `{cwd of kubelet}/config.json`
* `${HOME}/.docker/config.json`
* `/.docker/config.json`
* `{--root-dir:-/var/lib/kubelet}/.dockercfg`
* `{cwd of kubelet}/.dockercfg`
* `${HOME}/.dockercfg`
* `/.dockercfg`

如果你没有配置一个 `HOME` 环境变量给 `kubelet` 进程(通过 `cat /proc/<pid>/environ`)判断,那么 `${HOME}/.docker/config.json` 没有作用。

容器平台在部署 node 节点时,应该需要考虑把镜像仓库的认证信息预先生成好,写到 node 节点机器上。(不确定是否最佳实践)

用 Kubernetes 的 Secret 机制应该也可以实现一样的功能。参考 [[这里|https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/]]。

!! 参考

* [[Images - Kubernetes|https://kubernetes.io/docs/concepts/containers/images/#configuring-nodes-to-authenticate-to-a-private-registry]]
* [[Docker Registry 文档|https://docs.docker.com/registry/deploying/#run-an-externally-accessible-registry]]
* [[Pull an Image from a Private Registry - Kubernetes|https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/]]
!! Playground

Docker 公司提供了免费的 [[Play with Kubernetes|https://labs.play-with-k8s.com/]] 服务,让你不用到各云服务上买机器,也能方便免费地搭起一个测试 K8S 集群。快速验证想法时可以用它,相对 [[Minikube]] 更方便。

地理位置相关的问题,例如:

* 需要批量计算路程时长时
* 需要把一批地点,从几块区域中筛选出来时(比如把 100 个企业,按行政区分类)

可以考虑下面的解决方法。

!! 地图无忧

[[地图无忧|https://www.dituwuyou.com/]] 是一个面向企业的地图工具,非常非常强大,有什么需求时优先考虑用这个,而不是自己造轮子。

!! react-amap

饿了么前端团队,基于高德地图封装了 [[react-amap|https://github.com/ElemeFE/react-amap]] 组件,看起来很好用。

!! 百度地图官方 SDK

百度地图提供了很多 SDK,可以直接用。
|!Name |Learning Web Design: A Beginner's Guide to HTML, CSS, JavaScript, and Web Graphics |
|!Author |Jennifer Niederst Robbins |
|!Edition |5th |
|!Release Date |May 2018 |
|!ISBN-13 |9781491960202 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

零基础入门网页制作最好的书。内容深入浅出,排版上佳,插图精致且富有说明性。

官方网站:https://www.learningwebdesign.com/

主要内容纪录在 [[Website Creation Roles]]、[[UI: Tool]] 以及 [[Graphic]]。
这一章比较基础,讲几个点:

* Web, internet
* Server, browser
* URL
* 网页的基础结构

不是很值得纪录。
前言中的这段话非常核心:

> The heart of the matter is that as web designers, we never know exactly how the pages we create will be viewed. We don’t know which of the dozens of browsers might be used, whether it is on a desktop computer or something more portable, how large the browser window will be, what fonts are installed, whether functionality such as JavaScript is enabled, how fast the internet connection is, whether the pages are being read by a screen reader, and so on.

这节主要阐述这些概念:

* [[The multitude of devices|Web Design: Challenge: The multitude of devices]]
* Web standards
* [[Progressive enhancement|Web Design: Progressive Enhancement]]
* [[Responsive Web Design]]
* [[Accessibility|Web Design: Accessibility]]
* Site performance

各个话题都提供了非常好的工具和扩展阅读。
讲基础的 HTML 文档结构。
! 116. Populating Next Right Pointers in Each Node

[[题目链接|https://leetcode.com/problems/populating-next-right-pointers-in-each-node/]] | [[我的解答|https://leetcode.com/problems/populating-next-right-pointers-in-each-node/submissions/]]

这个题意很简单,就是给你一棵完美二叉树(perfect binary tree):

```
         1
       /  \
      2    3
     / \  / \
    4  5  6  7
```

其中每个结点都有一个 `next` 指针,你需要让它指向它同级的右边的结点:

```
         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \  / \
    4->5->6->7 -> NULL
```

要求是只能用常量的额外空间。

做这个题的时候,我陷入了之前二叉树中序遍历的思维惯性,认为整个过程中树的根结点的需要一直保留。但是这道题的关键是拆分、细化问题。其实第一层(1号结点),在做完 2 -> 3 的连接后,就没有作用了。对于第二层也同理(2, 3 号结点),如果 4->5->6->7 做完了,第二层也没有作用了。

因此这道题可以很简单地用非递归或者递归的形式实现。但是留意非递归形式并非常量额外空间的,因为每层递归带来了额外的空间消耗,消耗的空间跟 n 线性相关。

另外有一点,这个树可以是完全空的(root 就是 NULL),需要留意这种边界条件。
! 165. Compare Version Numbers

[[题目链接|https://leetcode.com/problems/compare-version-numbers/]] | [[我的解答|https://leetcode.com/problems/compare-version-numbers/submissions/]]

这是道水题。给你两个版本号的字符串(只包含点号和数字),要你比较大小,比如:

```
0.1 < 1.1 < 1.2 < 13.37
```

需要注意的是,`1.7 < 1.15` 的,点号分隔出来的第二部分只是小版本号,也要按数字的方法比较大小,而不是用字符串字典序。

这道题一开始觉得很简单,看了题目中的示例数据后,以为版本号字符串都是两部分组成的,直接 Python `str.split` 开搞,结果发现有三部分的版本号 `1.0.2`,也有一部分的版本号 `1`。还有以 0 开头的版本号:`1.02`。还有奇怪的 `1.0`。

处理好这些 case 后很容易就过了。写了 Python 跟 C++ 两个版本。C++ 的版本用了 `stringstream` 用来解析数字和点号。

看题很重要,思考测试数据的可能性很重要。虽然是水题也错了这么多次。
! 227. Basic Calculator II

[[题目链接|https://leetcode.com/problems/basic-calculator-ii/]] | [[我的解答|https://leetcode.com/problems/basic-calculator-ii/submissions/]]

```
"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5
```

题目要求是,给一个字符串,里面包含加减乘除运算符、正整数和空格,要你算出它的结果。

这道题就是先把乘除的结果算出来,把加减操作和数字先存起来,最后再一起运算(当然边解析字符串边运算也是能实现的)。基本上是考字符串解析。我写了一个 Python 版本和一个 C 版本。

# Python 版本用了 `re.finditer` 把各符号分隔开来(pattern 用的是 `(\d+|[+\-*/])`),很容易就过了,字符串解析的工作都给 Python 做了,但是性能很差。
# C 的版本只用了 4ms,但是逻辑比较复杂,提交了几次才过

看到论坛里面,有 C++ 版本用了 `iostream`, `string.find_first_not_of` 等,解析起来相对简单。
! 319. Bulb Switcher

[[题目链接|https://leetcode.com/problems/bulb-switcher/]] | [[我的解答|https://leetcode.com/problems/bulb-switcher/submissions/]]

这道题是智力题。

一开始想到的是暴力算,先把全部 int 个数的灯的亮灯数算出来,再直接查。但是 LeetCode 好像不支持这种模式,对于每个 TestCase 它都会完整的执行整段代码,包括我生成亮灯表的过程。

后来在纸上把前 10 个灯泡的情况列了出来,发现灯是否亮,跟这个数有几个约数有关。偶数个约数的灯不亮,奇数个亮:

```
 1 => 1
 2 => 1, 2
 3 => 1, 3
 4 => 1, 2, 4
 5 => 1, 5
 6 => 1, 2, 3, 6
 7 => 1, 7
 8 => 1, 2, 4, 8
 9 => 1, 3, 9
10 => 1, 2, 5, 10
```

这样可能还不够直观,换一种形式:

```
 1 =>  1x1
 2 =>  1x2
 3 =>  1x3
 4 =>  1x4, 2x2
 5 =>  1x5
 6 =>  1x6, 2x3
 7 =>  1x7
 8 =>  1x8, 2x4
 9 =>  1x9, 3x3
10 => 1x10, 2x5
```

可以看出约数都是成对出现。但是对于平方数,它有一对约数的乘号两边是相同的数字。这导致它的约数只有奇数个。

所以这个题变成,看 `(0, n]` 的平方数有多少个。所以一行简单的 `(int)sqrt(n)` 可以解决。
LeetCode 上的算法题质量不错,分类跟难度标识都做得挺好。

这篇 Wiki 就不把题目列表搬过来了,可以直接去看 LeetCode 上的 [[题目列表|https://leetcode.com/problemset/algorithms/]]。

我用了 Google 登录的帐号来做题。


LeetCode 上的算法题质量不错,分类跟难度标识都做得挺好。

这篇 Wiki 就不把题目列表搬过来了,可以直接去看 LeetCode 上的 [[题目列表|https://leetcode.com/problemset/algorithms/]]。

我用了 Google 登录的帐号来做题。


包含 Linux 开发、系统运维的内容,更多是使用层的内容。对于操作系统的内容,看 [[Operating System]]。


Linux 的发行版实在是千千万万,如何选择合适的发行版很重要。

我的场景主要是日常开发,游戏、看电影、Office 等需求应该交给 Windows 去做。

对于我的场景,发行版应该满足几个原则:

# 社区大,因为 Linux 往往没有商业公司支持,主要靠社区力量去维护
# 在积极开发、维护中
# 有丰富的包仓库,能方便地安装使用各种软件和库
# 系统升级过程平滑,少出问题
# 加分项:解决以下问题:
#* 硬件驱动自动安装(特别是显卡)
#* 比较好的字体渲染(比如 Ubuntu Cairo)
#* 安装系统过程方便直观,有 GUI 安装程序更佳(比如 Manjaro 之于 Arch Linux)

各 Linux 发行版的比较,可以看 Wikipedia 上的 [[Comparison of Linux Distributions|https://en.wikipedia.org/wiki/Comparison_of_Linux_distributions]]。综合上面各个因素,Arch Linux 是最适合我使用的。

!! Case Study: Manjaro v.s. Arch Linux

Manjaro 是一个非常不错的 Arch-based 发行版。它主要解决了几个问题:

* 方便的 GUI 安装程序,直接安装好桌面环境和常用软件;易用且外观漂亮
* 独立但是跟 Arch Linux 容量相当的软件仓库,会等软件包在 Arch 上稳定下来后,再同步过来;系统稳定性会比 Arch 好<<footnote "[1]" "很可能就不会遇到「`systemd` 关机时等待 90s」「`NetworkManager` 无法显示无线网卡」这种问题了">>
* 可以在多个 Linux 内核间自由切换<<footnote "[2]" "我没有这个需求">>

但是它又有一些缺陷:

* 发行于 2011 年,过于年轻,缺少社区积累,官方文档也少,相关设施不完善(比如在中国只有 3 个软件包仓库镜像;没有 Web 页面可以查询软件包信息等)。这是 ''最大'' 的问题,无法预测它能不能好好存活下去,而且它跟 Arch 的一些差异(但是又基于 Arch)可能会导致一些不方便解决的问题(比如装 `open-vm-tools-dkms` 时报内核头文件找不到)
* 可以使用 AUR 中的包,但是由于官方软件包比 Arch 稍旧,可能会出现 AUR 包的依赖有问题(虽然非常罕见)

对于 Linux 系统维护中的一些费劲的点,两个发行版的表现是:

|! |!Arch Linux |!Manjaro |
|!桌面环境 |手动安装 / 5min 精力 |有 GUI 安装程序 |
|!显卡驱动 |手动安装 / 5min 精力 |有 GUI 安装程序 |
|!字体渲染 |手动配置 |手动配置 |

所以只要 Arch Linux 的安装配置有标准化的文档(比如 Arch Wiki,或者自己整理的文档),那么只需要付出额外的一小部分精力,就可以实现 Manjaro 带来的效果。



在 Linux 平台上分享软件时,你可能需要一些类似 Windows 上安装程序、WinRAR / WinZip 自解压安装包等机制。这个安装包需要实现:

* 用户可以运行
* 运行时可以解压出其他文件,并运行安装、初始化脚本

!! Makeself

[[megastep/makeself|https://github.com/megastep/makeself]] 是一个 bash 脚本,用来生成上述功能的脚本。功能强大,而且有 nvidai、Virtualbox 在使用。

!! AppImage

[[AppImage|https://appimage.org/]] 的思路不太一样,是直接把程序打包成一个单独的可执行文件。具体机制没有仔细了解过。

!! 自制脚本

大多数时候你不需要自制脚本,直接用 Makeself 搞定。如果你想自己写脚本,参考下 Miniconda 的安装包。主要要考虑几点:

* 做基础的内容校验,比如脚本运行时:
** 判断自身的文件长度是否正确,防用户只下载了一半,或者内容被窜改
** 判断脚本中所附带的可执行文件是否被窜改,可以通过 MD5
** 对运行环境做判断,比如你的脚本如果依赖 tar,那你要判断下 tar 在用户的环境里面有没有
Linux 使用 locale 系统用来反映不同语言、文化中的习惯(时间格式、货币格式、数字格式等)及所使用的字符集(如 UTF-8)。

用户设置的 locale 会被一系列 glibc 函数读取及使用。设置好后体现为 `LANG` 和 `LC_*` 这些环境变量;使用 `locale` 命令可以查看。不同的变量有不同的含义,比如:

* `LANG`:其他变量没有定义时,默认使用这个
* `LC_NUMERIC`:数值格式
* `LC_TIME`:日期格式
* `LC_COLLATE`:字符串排序方式,同时影响正则表达式匹配(比如某种 collate 定义了 A < a < B 时,`[A-Z]` 会包含 a, b 等,引起混乱)
* `LC_CTYPE`:定义了终端(terminal)的编码,以及这种语言下哪些字符是字母、标点、空格等等,并定义了大小写规则(比如土尔其语 `tr_TR` 中,`i` 的大写是 `İ`)
** 如果你的终端使用的编码与 `LC_CTYPE` 定义的不一致,可能会有乱码。比如可以在 UTF8 终端下,设置 GB1312 的 LC_CTYPE,此时用 Vim 打开一个 UTF8 文件会乱码
* `LANGUAGE`:一系列语言,用于翻译
* `LC_ALL`:会覆盖除了 `LANGUAGE` 以外所有变量,用于调试

你还会看到这种 locale 名:`C` `POSIX`。它表示 ASCII 编码,并适用于 `LC_COLLATE` `LC_CTYPE`。

!! 最佳实践

根据这个写得非常好的 [[帖子|https://unix.stackexchange.com/a/149129]],推荐的做法是:

# 设置 `LANG` 为你想要的 locale,比如 `zh_CN.UTF8` 或者 `en_US.UTF8`
# 显式设置 `LC_COLLATE`、`LC_NUMERIC` 为 `C`

!! 操作

所有可用的 locale 被定义在 `/etc/locale.gen` 文件中。把想使用的 locale 取消注释,再运行 `locale-gen` 生成 locale 文件。

<<.note "需要 `locale-gen` 的原因是,全部语言的 locale 定义文件大约有 50MB 大,但用户往往只用其中一两个语言,所以 Linux 分发了 locale 定义文件的模板,再使用 `locale-gen` 生成实际的 locale 文件。">>

!! WSL

<<.warning "在 WSL2 中,使用 `sudo update-locale LANG=en_US.UTF8 LC_NUMERIC=C LC_COLLATE=C` 时两个 `LC_*` 变量无法生效。可能是因为 [[这个原因|https://docs.microsoft.com/en-us/windows/wsl/faq#how-do-i-change-the-display-language-of-wsl]]。">>

!! 参考

* [[What should I set my locale to and what are the implications of doing so?|https://unix.stackexchange.com/a/149129]]
* [[Understanding the Locales on Debian GNU/Linux – Linux Hint|https://linuxhint.com/locales_debian/]]
* [[Locale - Arch Wiki|https://wiki.archlinux.org/index.php/locale]]
日志滚动是为了避免日志文件把磁盘写满,而定期备份、压缩、删除旧的日志文件的一种手段。有几个场景:

* 有应用程序写日志文件,需要在外部将其日志文件滚动。可以用 [[logrotate]],但是需要应用程序支持 log reopen(一般通过信号机制)
* 应用程序将日志文件输出到 stdout,可以用 [[tinylog]]
* 应用程序本身内建了 log rotation 机制,不需要外部工具做 rotation,比如 Python 的 `logging` 库有 `RotatingFileHandler`

Linux 内核提供了 namespaces 机制,用于在不同进程(组)间做资源的隔离。容器技术依赖于 namespaces 机制。

常用的可以隔离的类别,即 namespace 的类型有:

|!Namespace |Isolates |
|!Mount (mnt) |Mount points |
|!Process ID (pid) |Process IDs |
|!Network (net) |Network devices, stacks, ports, etc. |
|!Inter-process communication (ipc) |System V IPC, POSIX message queues |
|!UTS |Hostname and NIS domain name |
|!User ID (user) |User and group IDs |

比如你为某个进程设置了新的 User ID namespace,那么这个进程运行时不能看到系统默认的用户(user)和组(group),而只能看到在它这个进程其中配置的用户和组。如果有另外一个进程也设置了这个 namespace,这两个进程能看到同一套用户。

`/proc/<pid>/ns` 下能看到该进程所使用的 namespace。

注意每个命名空间都只有一种类型。''并没有一种命名空间包含了多种类型''。因此:

* 对于 Docker 容器,不同的容器间隔离了 mount、pid、ipc 等,是因为每个容器都有自己单独的若干个命名空间
* 对于 k8s pod 里面的多个容器,它们绑定了同样的一套命名空间,使得彼此间的侦听的端口可以互相访问、进程互相可见等
ArchWiki 上有一篇 [[wiki|https://wiki.archlinux.org/index.php/Pacman/Rosetta]],描述了不同发行版包管理器的命令对应表。包括 Red Hat/Fedora, Debian/Ubuntu, SLES/openSUSE, Gentoo 四个主流发行版。


Brendan Gregg 的个人网站上有非常好的材料:[[Linux Performance|http://www.brendangregg.com/linuxperf.html]],同时他的 [[Systems Performance: Enterprise and the Cloud|http://www.brendangregg.com/sysperfbook.html]] 一书,应该是系统了解系统性能的不错途径。你也可以通过这本书了解到各类性能监控软件 (比如 `top`),它的输出代表着什么。
!! 命令

* 用户操作相关:useradd, userdel, usermod
* 查看用户列表:[[Linuxize 文档|https://linuxize.com/post/how-to-list-users-in-linux/]]
* 组操作相关:groupadd, groupdel, groupmod
* 查看组列表:[[Linuxize 文档|https://linuxize.com/post/how-to-list-groups-in-linux/]]
* 修改密码:passwd

!! System user

Linux 有 system user 概念:

* 表示这个用户是用来跑后台程序的(比如 postgres 用户,仅用来跑 server 及执行 psql 命令);
* 不是日常使用的(但是你仍然可以这样做)

桌面环境的登陆框(比如 SDDM)不会显示 system user 供选择。

实现上,system user 的 uid 范围与普通用户不一样。在 `/etc/login.defs` 中定义了:

```
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000
UID_MAX                 60000
# System accounts
SYS_UID_MIN               500
SYS_UID_MAX               999

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000
GID_MAX                 60000
# System accounts
SYS_GID_MIN               500
SYS_GID_MAX               999
```

对于 system user,你应该用 `sudo -iu <username>` 来使用其命令行,比如 `sudo -iu postgres`。

负载均衡组件,目前流行的是基于 [[HTTP]] / gRPC 的。

! 根据短信/各类 App 推送信息,自动创建提示本地提醒

在使用 Android 时有一些场景,~~没有找到太好的解决办法。~~

Update: 已经找到解决办法。使用 [[Notification Reminder (Quick)|https://play.google.com/store/apps/details?id=com.bhanu.notificationreminders]]。可以创建 Sticky Notification,而且在第三方应用中通过 Android 系统的分享功能分享到 Notification Reminder 来创建这条本地通知,这使得在 SMS 应用(Messager)中用 12306 信息创建通知非常方便。缺点是没有自动根据发车时间点创建通知的能力,不过这些手动设置的时间消耗在可接受的范围内。

解决问题的路径是:

# Google Play 上搜索 "Sticky Notification"
# 搜到一个叫 [[Sticky Notification|https://play.google.com/store/apps/details?id=com.androidsole.stickynotification]] 的应用,试用了下,不够方便:
## 不支持系统分享
## 乱弹广告
# 删除 Sticky Notification,再去 Google Play 上看它的同类应用,~~发现 Notification Reminder,试用,发现好用~~又发现 [[Notey - Notification Reminder|https://play.google.com/store/apps/details?id=thomas.jonathan.notey]] 更佳
# 值得一提的是,Notification Reminder 这个应用在我遇到这些问题之前就有了,''说明我之前搜索的方式不对''

!! 票务信息

在 12306 订了票后,12306 会发短信过来告知车次和座位号,但是到出发那天时,12306 的短信已经被淹没了,从 SMS 里提取信息非常麻烦;手动用日程管理软件建一个提醒是可行的解决办法,但是相对低效。

如果有个软件能够读取 12306 的信息,提取里面的发车时间和座位号,在开车前几小时自动发一条本地提醒到通知栏,会方便很多。也可以在出发前一天晚上发一条提醒,方便做行程安排。

同样的场景还有:

# 各类电影购票时产生的兑换码
# 各类团购应用的团购券(但是这种没有消费时间要求)

在提取规则的生成方面,这个 App 应该支持通过一段文字,自动生成一些提取规则,以便用户将不在库里的提取规则添加进来。

!! 日常提醒

有一些日常的提醒场景,用各类 To-Do 软件比较麻烦。

场景:

# 下班了回家时去店里拿个快递
# 去腾大/万利达拿个快递
# 明天上班前去拍个照片拿回执
# 下午出去 shopping,要买什么东西

这些场景如果用传统 To-Do 软件,基本上需要设一个提醒时间,感觉很麻烦。对于这种短时间、能简单完成的任务,如果有个软件直接发一些内容到手机通知中心,然后你拿起手机就能看到,搞完就 Mark Done 就挺好。

现在看手机的频率那么高,如果用户的通知中心没有被太多垃圾塞满,这个在通知中心的提醒应该是容易被看到的。
<svg xmlns="http://www.w3.org/2000/svg" height="645" viewBox="0 0 871 645.304" width="871">
    <style type="text/css">
.st2 {fill:#1a6e6e;font-family:微软雅黑;font-size:12pt}
.st1 {fill:#ffffff;font-family:微软雅黑;font-size:12pt}
.st3 {font-weight:bold}
</style>
    <defs>
        <linearGradient y2="68" id="lg1" y1="-17" gradientUnits="userSpaceOnUse" x1="12" x2="134">
            <stop offset="0" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#289797" />
            <stop offset="0.76" stop-color="#289797" />
            <stop offset="0.76" stop-color="#228484" />
            <stop offset="0.8" stop-color="#228484" />
            <stop offset="0.8" stop-color="#289797" />
            <stop offset="1" stop-color="#289797" />
        </linearGradient>
        <linearGradient y2="140" id="lg2" y1="44" gradientUnits="userSpaceOnUse" x1="5" x2="141">
            <stop offset="0" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#289797" />
            <stop offset="0.76" stop-color="#289797" />
            <stop offset="0.76" stop-color="#228484" />
            <stop offset="0.8" stop-color="#228484" />
            <stop offset="0.8" stop-color="#289797" />
            <stop offset="1" stop-color="#289797" />
        </linearGradient>
        <linearGradient y2="236" id="lg3" y1="134" gradientUnits="userSpaceOnUse" x1="-0" x2="146">
            <stop offset="0" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#289797" />
            <stop offset="0.76" stop-color="#289797" />
            <stop offset="0.76" stop-color="#228484" />
            <stop offset="0.8" stop-color="#228484" />
            <stop offset="0.8" stop-color="#289797" />
            <stop offset="1" stop-color="#289797" />
        </linearGradient>
        <linearGradient y2="378" id="lg4" y1="256" gradientUnits="userSpaceOnUse" x1="-14" x2="160">
            <stop offset="0" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#289797" />
            <stop offset="0.76" stop-color="#289797" />
            <stop offset="0.76" stop-color="#228484" />
            <stop offset="0.8" stop-color="#228484" />
            <stop offset="0.8" stop-color="#289797" />
            <stop offset="1" stop-color="#289797" />
        </linearGradient>
        <linearGradient y2="513" id="lg5" y1="404" gradientUnits="userSpaceOnUse" x1="-5" x2="151">
            <stop offset="0" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#289797" />
            <stop offset="0.76" stop-color="#289797" />
            <stop offset="0.76" stop-color="#228484" />
            <stop offset="0.8" stop-color="#228484" />
            <stop offset="0.8" stop-color="#289797" />
            <stop offset="1" stop-color="#289797" />
        </linearGradient>
        <linearGradient y2="637" id="lg6" y1="527" gradientUnits="userSpaceOnUse" x1="-5" x2="151">
            <stop offset="0" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#2a9f9f" />
            <stop offset="0.6" stop-color="#289797" />
            <stop offset="0.76" stop-color="#289797" />
            <stop offset="0.76" stop-color="#228484" />
            <stop offset="0.8" stop-color="#228484" />
            <stop offset="0.8" stop-color="#289797" />
            <stop offset="1" stop-color="#289797" />
        </linearGradient>
    </defs>
    <g id="table1" transform="translate(0.5,0.5)">
        <g>
            <path stroke="#1e7a7a" fill="url(#lg1)" d="M0,0L146,0L146,51L0,51L0,0z" />
            <text class="st1">
                <tspan x="22" y="31.3">Log Structure</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M146,0L390,0L390,51L146,51L146,0z" />
            <text class="st2">
                <tspan x="227" y="21">Unordered</tspan>
                <tspan x="188" y="41.5">数据库文件中纪录无序</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M390,0L631.4,0L631.4,51L390,51L390,0z" />
            <text class="st2">
                <tspan x="479" y="21">Ordered</tspan>
                <tspan x="430.5" y="41.5">数据库文件中纪录有序</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M631.4,0L870.4,0L870.4,51L631.4,51L631.4,0z" />
            <text class="st2">
                <tspan x="719.4" y="21">Ordered</tspan>
                <tspan x="670.9" y="41.5">数据库文件中纪录有序</tspan>
            </text>
        </g>
        <g>
            <path stroke="#1e7a7a" fill="url(#lg2)" d="M0,51L146,51L146,133.4L0,133.4L0,51z" />
            <text class="st1">
                <tspan x="52.5" y="98">Index</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M146,51L390,51L390,133.4L146,133.4L146,51z" />
            <text class="st2">
                <tspan x="184" y="77.2">In-Memory Hash Map</tspan>
                <tspan x="159" y="98.2">纪录 </tspan>
                <tspan x="195.5" class="st3">每个 key</tspan>
                <tspan x="260.5"> 对应其在数据库</tspan>
                <tspan x="196" y="118.7">文件中的纪录的位置</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M390,51L631.4,51L631.4,133.4L390,133.4L390,51z" />
            <text class="st2">
                <tspan x="480.5" y="98">&lt;= 同左</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M631.4,51L870.4,51L870.4,133.4L631.4,133.4L631.4,51z" />
            <text class="st2">
                <tspan x="646.4" y="77.5">Log-Structured Merge-Tree
</tspan>
                <tspan x="638.9" y="98">使用平衡树或者红黑树实现的,</tspan>
                <tspan x="669.4" y="118.5">查询快,索引 key 有序</tspan>
            </text>
        </g>
        <g>
            <path stroke="#1e7a7a" fill="url(#lg3)" d="M0,133.4L146,133.4L146,236.3L0,236.3L0,133.4z" />
            <text class="st1">
                <tspan x="50" y="190.6">Query</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M146,133.4L390,133.4L390,236.3L146,236.3L146,133.4z" />
            <text class="st2">
                <tspan x="156" y="190.6">通过索引找到数据所在文件位置</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M390,133.4L631.4,133.4L631.4,236.3L390,236.3L390,133.4z" />
            <text class="st2">
                <tspan x="480.5" y="159.6">&lt;= 同左
</tspan>
                <tspan x="411" y="180.1">假如索引 miss,因为数据有</tspan>
                <tspan x="398.5" y="201.1">序,</tspan>
                <tspan x="430.5" class="st3">从数据文件中查找更快了</tspan>
                <tspan x="606.5">,</tspan>
                <tspan x="414.5" y="221.6">可以二分查找,不用遍历。</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M631.4,133.4L870.4,133.4L870.4,236.3L631.4,236.3L631.4,133.4z" />
            <text class="st2">
                <tspan x="720.9" y="159.4">&lt;= 同左
</tspan>
                <tspan x="645.4" y="179.9">由于索引中的 key 有序,且数</tspan>
                <tspan x="638.9" y="200.9">据库文件中纪录有序,因此</tspan>
                <tspan x="830.9" class="st3">不需</tspan>
                <tspan x="659.9" y="221.9" class="st3">要把全部 key 落索引中</tspan>
                <tspan x="825.9">。</tspan>
            </text>
        </g>
        <g>
            <path stroke="#1e7a7a" fill="url(#lg4)" d="M0,236.3L146,236.3L146,397.3L0,397.3L0,236.3z" />
            <text class="st1">
                <tspan x="52" y="322.6">Write</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M146,236.3L390,236.3L390,397.3L146,397.3L146,236.3z" />
            <text class="st2">
                <tspan x="228" y="312.3">更新索引、
</tspan>
                <tspan x="180" y="332.8">追加写最后一个文件分片</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M390,236.3L631.4,236.3L631.4,397.3L390,397.3L390,236.3z" />
            <text class="st2">
                <tspan x="480.5" y="260.3">&lt;= 同左
</tspan>
                <tspan x="398.5" y="280.8">虽然数据库文件中纪录有序,但</tspan>
                <tspan x="398.5" y="301.3">是不需要保证它一直是有序的。</tspan>
                <tspan x="398.5" y="321.8">在数据写入时去实时重新排序数</tspan>
                <tspan x="400" y="342.8">据文件中的纪录会很耗 I/O。</tspan>
                <tspan x="605" class="st3">顺</tspan>
                <tspan x="398.5" y="363.8" class="st3">序写一个新纪录的文件,再定期</tspan>
                <tspan x="406.5" y="384.8" class="st3">做压缩合并是更合理的做法。</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M631.4,236.3L870.4,236.3L870.4,397.3L631.4,397.3L631.4,236.3z" />
            <text class="st2">
                <tspan x="710.9" y="312.3">更新索引、
</tspan>
                <tspan x="689.9" y="332.8">写 WAL 防 crash</tspan>
            </text>
        </g>
        <g>
            <path stroke="#1e7a7a" fill="url(#lg5)" d="M0,397.3L146,397.3L146,519.9L0,519.9L0,397.3z" />
            <text class="st1">
                <tspan x="26.5" y="464.4">Compaction</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M146,397.3L390,397.3L390,519.9L146,519.9L146,397.3z" />
            <text class="st2">
                <tspan x="154.5" y="423.4">追加写导致一个 key 可能出现在</tspan>
                <tspan x="156" y="443.9">多个文件分片。需要做压缩。背</tspan>
                <tspan x="164" y="464.4">景线程对现有数据进行压缩合</tspan>
                <tspan x="156" y="484.9">并,合并完后使用新的分片文件</tspan>
                <tspan x="164" y="505.4">及索引,旧文件和索引丢弃。</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M390,397.3L631.4,397.3L631.4,519.9L390,519.9L390,397.3z" />
            <text class="st2">
                <tspan x="398.5" y="433.1">除了未压缩过的文件,其他文件</tspan>
                <tspan x="398.5" y="453.6">都是有序的,因此压缩合并时可</tspan>
                <tspan x="398.5" y="474.6">以使用类似合并排序的做法。</tspan>
                <tspan x="606.5" class="st3">性</tspan>
                <tspan x="422.5" y="495.6" class="st3">能更高、内存消耗更少。</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M631.4,397.3L870.4,397.3L870.4,519.9L631.4,519.9L631.4,397.3z" />
            <text class="st2">
                <tspan x="638.9" y="433.4">压缩合并时,</tspan>
                <tspan x="734.9" class="st3">新增的数据不再存</tspan>
                <tspan x="646.9" y="454.4" class="st3">在文件中,而是直接在索引中</tspan>
                <tspan x="638.9" y="475.4" class="st3">取。</tspan>
                <tspan x="670.9">而且索引中已经排好序,这</tspan>
                <tspan x="678.9" y="495.9">会使合并性能更好。</tspan>
            </text>
        </g>
        <g>
            <path stroke="#1e7a7a" fill="url(#lg6)" d="M0,519.9L146,519.9L146,644.3L0,644.3L0,519.9z" />
            <text class="st1">
                <tspan x="18.5" y="587.9">Pros and Cons</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M146,519.9L390,519.9L390,644.3L146,644.3L146,519.9z" />
            <text class="st2">
                <tspan x="153" y="557.1">+ 实现简单</tspan>
                <tspan x="153" y="577.6">- Hash map 不适合存磁盘。如</tspan>
                <tspan x="153" y="598.1">果 key 太多,内存可能不够用</tspan>
                <tspan x="153" y="618.6">- 无法做范围查询</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M390,519.9L631.4,519.9L631.4,644.3L390,644.3L390,519.9z" />
            <text class="st2">
                <tspan x="397" y="546.9">对比左边方案:
</tspan>
                <tspan x="397" y="567.4">+ 压缩性能更好
</tspan>
                <tspan x="397" y="587.9">+ 可以做范围查询
</tspan>
                <tspan x="397" y="608.4">- Hash map key 过多时内存可</tspan>
                <tspan x="397" y="628.9">能不够用</tspan>
            </text>
        </g>
        <g>
            <path stroke="#2da7a7" fill="#e8f1f1" d="M631.4,519.9L870.4,519.9L870.4,644.3L631.4,644.3L631.4,519.9z" />
            <text class="st2">
                <tspan x="638.4" y="567.4">对比左边方案:
</tspan>
                <tspan x="638.4" y="587.9">+ 压缩性能更好
</tspan>
                <tspan x="638.4" y="608.4">+ 不需要全量数据进索引</tspan>
            </text>
        </g>
    </g>
</svg>
日志滚动是用来避免日志文件过大吃满硬盘的情况。对于已经内置了日志滚动能力的程序(如 Django 的 logging 可以做滚动),不在此文讨论范围内。对于没有内建日志滚动的程序,可能有这几个场景需要做日志滚动:

* 对于常驻的、不停打日志的程序
* 对于非常驻的程序
* 将标准输出重定向到文件并需要日志滚动

对于常驻的程序,如果想做日志滚动,需要程序支持重新打开日志文件,以便在老文件做完操作后,程序可以在新文件打日志。比如 Gunicorn 就支持接收 USR1 信号来 [[重新打开日志|http://docs.gunicorn.org/en/latest/signals.html]]。

除了标准输出的场景,其他两个可以 `logrotate` 工具来做。

! logrotate

Linux 上有个内置的工具,`logrotate`,可以用来做 log rotation。`man logrotate` 可以看文档。这个是 1990 年就存在的项目,至今还在更新。

`logrotate` 需要你提供一个配置文件,指导它怎么做 rotation。这个配置文件语法古老,多看看 manpage 再下手。

!! sharedscripts

`sharedscripts` 有用,比如你的 Gunicorn 会有两个文件 `access.log`, `error.log`。你这样写:

```
/path/to/access.log /path/to/error.log {
    rotate 5
    daily
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /path/to/gunicorn.pid`
    endscript
}
```

此时就算 `access.log`, `error.log` 同时被 rotate,也只会调用一次 `kill` 命令。不带 `sharedscripts` 则会被调用两次。

!! 运行方式

命令行:

```bash
logrotate -s <path-to-logrotate.status> <path-to-logrotate.conf>
```

可以搭配 crontab 或者 Systemd Timer。

!! 内部原理

`logrotate` 在每一次运行时,会将它将要做 rotate 的文件时间,写入 `/var/lib/logrotate.status` (默认位置)文件中,如:

```
logrotate state -- version 2
"/usr/local/services/radio_api_server-1.0/log/access.log" 2018-1-3
"/usr/local/services/radio_api_server-1.0/log/error.log" 2018-1-3
```

如果你的文件第一次被 `logrotate` 遇到,那么除非 `size` 达到要求被 rotate,否则用 `daily`, `weekly`, `monthly` 这些是不会做 rotate 的,只会将这个文件的信息纪录进 `logrotate.status` 中。`logrotate` 在判断时,只看这个 status 文件,并不在乎文件本身的 Access Time / Modified Time 等等。

这导致你写 crontab 时要注意时间。比如你想做一个 daily 的 rotation,写的要求每天 23:59 分执行。但是 crond 可能到了次日 0 点才执行。这时候 rotation 出来的文件列表,可能会少一天:

```
access.log-20180101.gz
access.log-20180102.gz
access.log-20180104.gz   # 0103 那天 23:59,没来得及执行 logrotate,导致备份这里的日期是 4 号的
```

这时候,4 号 23:59 分执行的 `logratote`,就不会对 `access.log` 做 ratation 了。

! 对标准输出做日志滚动

需要在程序启动时将标准输出重定向到其他工具上,再打到文件上。

SuperUser 上这篇 [[帖子|https://superuser.com/a/291397]] 给出了非常多的工具参考。

! 参考

* [[How does logrotate exactly handle “daily”? - Server Fault|https://serverfault.com/questions/198203/how-does-logrotate-exactly-handle-daily]]
* [[Log rotation of stdout?|https://superuser.com/questions/291368/log-rotation-of-stdout]]
<svg xmlns="http://www.w3.org/2000/svg" width="455" height="223" viewBox="0 0 455 223">
    <style type="text/css">
.st3 {fill:#1a6e6e;font-family:微软雅黑;font-size:8pt}
.st2 {fill:#425c8a;font-family:微软雅黑;font-size:8pt}
.st1 {fill:#678ed0;font-family:微软雅黑;font-size:13pt}
</style>
    <defs />
    <g transform="translate(-762,-335)">
        <g id="shape1" transform="translate(1063,378)">
            <path d="M0,0L116.2,0" stroke-dasharray="11,5" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M122.4,0L115.1,-4.2C115.8,-3,116.2,-1.5,116.2,0C116.2,1.5,115.8,3,115.1,4.2L122.4,0" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
        </g>
        <path d="M0,0L194,0" stroke-width="2" id="shape2" fill="none" stroke="#1a6e6e" transform="translate(869,378)" />
        <g id="shape3" transform="translate(763,358.53)">
            <text class="st1">
                <tspan x="7.6" y="24">Alice</tspan>
            </text>
        </g>
        <path d="M0,0L0,18" stroke-width="2" id="shape4" fill="none" stroke="#1a6e6e" transform="translate(1064,369)" />
        <g id="shape5" transform="translate(831,440)">
            <path d="M0,0L348.2,0" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M354.4,0L347.1,-4.2C347.8,-3,348.2,-1.5,348.2,0C348.2,1.5,347.8,3,347.1,4.2L354.4,0" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
        </g>
        <path d="M0,0L0,18" stroke-width="2" id="shape6" fill="none" stroke="#1a6e6e" transform="translate(1064,431)" />
        <path d="M0,0L0,18" stroke-width="2" id="shape7" fill="none" stroke="#1a6e6e" transform="translate(831,431)" />
        <g id="shape8" transform="translate(811,444.96)">
            <text class="st2">
                <tspan x="11" y="16.5">100</tspan>
            </text>
        </g>
        <path d="M0,0L0,18" stroke-width="2" id="shape9" fill="none" stroke="#1a6e6e" transform="translate(869,369)" />
        <g id="shape10" transform="translate(847,380.81)">
            <text class="st2">
                <tspan x="6" y="16.5">START</tspan>
            </text>
        </g>
        <path d="M0,0L38,0" stroke-dasharray="11,5" stroke-width="2" id="shape11" fill="none" stroke="#1a6e6e" transform="translate(831,378)" />
        <g id="shape12" transform="translate(763,418)">
            <text class="st1">
                <tspan x="23.1" y="24">x</tspan>
            </text>
        </g>
        <g id="shape13" transform="translate(763,501)">
            <text class="st1">
                <tspan x="11.1" y="24.2">Bob</tspan>
            </text>
        </g>
        <g id="shape14" transform="translate(1033,380.81)">
            <text class="st2">
                <tspan x="8" y="16.5">COMMIT</tspan>
            </text>
        </g>
        <g id="shape15" transform="translate(1154.5,345.92)">
            <text class="st2">
                <tspan x="18" y="16.5">Time</tspan>
            </text>
        </g>
        <g id="shape16" transform="matrix(0,1,-1,0,943.3,335)">
            <path d="M24,41.3L37,37.9M24,0L24,82.7L24,0z" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M43,36.3L34.8,34.1C35.8,35.1,36.6,36.4,37,37.9C37.4,39.4,37.4,40.9,37,42.3L43,36.3" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
            <rect width="70.5" height="14" x="-22.4" y="31.3" fill="#ffffff" transform="matrix(0,-1,1,0,-29.3,53.3)" />
            <text class="st3" transform="matrix(0,-1,1,0,-29.3,53.3)">
                <tspan x="-22.5" y="41.8">get(x) =&gt; 100</tspan>
            </text>
        </g>
        <g id="shape17" transform="matrix(0,1,-1,0,1052.8,335)">
            <path d="M24,41.3L37,38M24,0L24,82.7L24,0z" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M43,36.4L34.8,34.1C35.8,35.2,36.6,36.5,37,38C37.4,39.5,37.3,41,37,42.4L43,36.4" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
            <rect width="52.1" height="14" x="-13.2" y="31.3" fill="#ffffff" transform="matrix(0,-1,1,0,-29.3,53.3)" />
            <text class="st3" transform="matrix(0,-1,1,0,-29.3,53.3)">
                <tspan x="-13.5" y="41.8">set(x, 150)</tspan>
            </text>
        </g>
        <g id="shape18" transform="translate(1043.5,444)">
            <text class="st2">
                <tspan x="11" y="17">150</tspan>
            </text>
        </g>
        <path d="M0,0L0,18" stroke-width="2" id="shape19" fill="none" stroke="#1a6e6e" transform="translate(1126.5,431)" />
        <g id="shape20" transform="translate(1106,444)">
            <text class="st2">
                <tspan x="11" y="17">250</tspan>
            </text>
        </g>
        <g id="shape21" transform="translate(1127,519.77)">
            <path d="M0,0L52.2,0" stroke-dasharray="11,5" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M58.5,0L51.1,-4.2C51.8,-3,52.2,-1.5,52.2,0C52.2,1.5,51.8,3,51.1,4.2L58.5,0" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
        </g>
        <path d="M0,0L296,0" stroke-width="2" id="shape22" fill="none" stroke="#1a6e6e" transform="translate(831,519.77)" />
        <path d="M0,0L0,18" stroke-width="2" id="shape23" fill="none" stroke="#1a6e6e" transform="translate(1127,511)" />
        <path d="M0,0L0,18" stroke-width="2" id="shape24" fill="none" stroke="#1a6e6e" transform="translate(831,511)" />
        <g id="shape25" transform="matrix(0,1,-1,0,943.3,477.8)">
            <path d="M24,41.3L37,50.7M24,0L24,82.7L24,0z" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M42,54.3L38.5,46.6C38.4,48,37.9,49.4,37,50.7C36.1,51.9,34.9,52.9,33.6,53.5L42,54.3" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
            <rect width="70.5" height="14" x="-22.4" y="31.3" fill="#ffffff" transform="matrix(0,-1,1,0,-29.3,53.3)" />
            <text class="st3" transform="matrix(0,-1,1,0,-29.3,53.3)">
                <tspan x="-22.5" y="41.8">get(x) =&gt; 100</tspan>
            </text>
        </g>
        <g id="shape26" transform="matrix(0,1,-1,0,1098.4,477.8)">
            <path d="M24,41.3L39.3,9.9M24,0L24,82.7L24,0z" stroke-width="2" fill="none" stroke="#1a6e6e" />
            <path d="M42,4.3L35,9.1C36.4,9,37.9,9.2,39.3,9.9C40.7,10.6,41.8,11.6,42.6,12.8L42,4.3" stroke-width="1" fill="#1a6e6e" stroke-linecap="round" stroke="#1a6e6e" />
            <rect width="52.1" height="14" x="-13.2" y="31.3" fill="#ffffff" transform="matrix(0,-1,1,0,-29.3,53.3)" />
            <text class="st3" transform="matrix(0,-1,1,0,-29.3,53.3)">
                <tspan x="-13.5" y="41.8">set(x, 250)</tspan>
            </text>
        </g>
        <g id="shape27" transform="translate(811,524.92)">
            <text class="st2">
                <tspan x="6" y="16.5">START</tspan>
            </text>
        </g>
        <g id="shape28" transform="translate(1095.5,524.92)">
            <text class="st2">
                <tspan x="8" y="16.5">COMMIT</tspan>
            </text>
        </g>
    </g>
</svg>

<iframe width="560" height="315" src="https://www.youtube.com/embed/OemtBmvQSKE" frameborder="0" allowfullscreen></iframe>

其中有一些观点有些意思。

* 穷人的认知水平导致他被锁死在他的阶层
* 美国有教育分层,穷人的教育在于让穷人成为一个对社会有用的工具,中产阶级的教育在于让人成为工艺品被上流社会挑选,而有钱人的教育在于培养决策能力
* 美国的素质教育往往是针对中产阶级的,而且它是另一种视角下的应试教育,是中产为了进名校而必须付出的代价
* 美国的名校大多数是私立学校,重在维护 WASP (White Anglo-Saxon Protestant) 族裔在美国社会的主流地位,同时又吸纳少部分其他族裔的精英;跟中国的大学很不一样
* KIPP 的理念对于穷人有不错的帮助,重视培养纪律、割断穷人与其社区的紧密联系(穷人的社区往往氛围不好,吸毒、无所事事等),以及重视考大学,很大程序上对于穷人打断自身阶级束缚有帮助;这类学校的做法就是应试教育
* 美国的社会分层和教育分层比较稳固,所以美国文化对于英雄(打破自身阶层的人)有一种强烈的认同感;中国的社会分层正在形成,但是教育分层还没有形成,但是未来也很可能会形成
* 人工智能会极大改变人类社会的形态(这部分内容也是为吴军的「智能时代」一书打广告)


MacOS 特定系统的经验。这个节点只放 MacOS 专有的功能,比如 Finder 的使用经验;如果非 MacOS 专有、是相对通用的领域,不放在这里,比如 [[PDF 阅读器|PDF]]。


在压测场景中发现一些问题,需要对 MacOS 系统参数做调优。软硬件配置为:

* MacBook Pro (16-inch, 2019)
* 2.3 GHz 八核Intel Core i9,16G 内存
* macOS Catalina (10.15.7)

影响 server 端并发能力的参数:

|!参数名 |!默认值 |!建议值 |!说明 |
|`kern.ipc.somaxconn` |128 |2048 |网络队列中,未 accept 的请求的数量上限 |

影响 client 端并发能力的参数:

|`net.inet.tcp.msl` |15000 |1000(?) |MSL 长度,主要影响 TIME_WAIT 状态的时长(2*MSL)<br>我不确定这种修改是否合理;感觉 `SO_REUSEADDR` 会更合理。 |
|`net.inet.ip.portrange` 段| | |指定了临时端口的范围 |

临时端口的范围对压测会有影响。压测时请求方需要占用临时端口来发请求,发完请求后会进行 TIME_WAIT 状态,此时这个端口是不能被重用的(我还没完全理解 `SO_REUSEADDR` 的逻辑)。MacOS 上默认可用的临时端口有 16000+ 个,TIME_WAIT 默认要 30s,这会导致压测一段时间后,临时端口所在的连接全部在 TIME_WAIT 状态,无法被重新使用,此时 golang 的 `net.Dial()` 会 block 直到有连接 TIME_WAIT 结束释放了端口,使得压测性能上不去。这篇 [[帖子|https://superuser.com/questions/145989/does-mac-os-x-throttle-the-rate-of-socket-creation]] 也有一些描述。

修改参数的方式:

* 临时、对本次启动生效:`sudo sysctl -w kern.ipc.somaxconn=2048`
* 在未来永久生效:添加进 `/etc/sysctl.conf`

查看参数的方式:`sysctl -a | grep kern.ipc.somaxconn`


使用 Homebrew。

!! Python

使用 Homebrew 安装 Python 时,注意带上 `--framework` 参数,这样才可以用上 wxPython(参考 [[1|https://wiki.wxpython.org/wxPythonVirtualenvOnMac]] [[2|https://github.com/Homebrew/homebrew-core/blob/master/Formula/python.rb]])(?):

```shell
> brew install python --framework
```
!! 快捷键

MacOS 特定辅助键:

* <kbd>⌘</kbd> Command (or Cmd)
* <kbd>⇧</kbd> Shift
* <kbd>⌥</kbd> Option (or Alt)
* <kbd>⌃</kbd> Control (or Ctrl)

MacOS 的快捷键比较复杂,新入门难记忆。[[CheatSheet|https://www.mediaatelier.com/CheatSheet/]] 软件提供了长按 <kbd>⌘</kbd> 显示当前软件快捷键的功能。

!! 分屏

用 [[Windows Tidy|https://apps.apple.com/cn/app/window-tidy/id456609775?mt=12]]。我在国区 App Store 已经购买它。设置快捷键 <kbd>⌘⌥←</kbd> 为左屏,<kbd>⌘⌥→</kbd> 为右屏。

!! 剪贴板

目前用了 [[PasteNow|https://apps.apple.com/us/app/pastenow-instant-clipboard/id1552536109?mt=12]]。有一些小问题,比如弹出列表后上下选择 item 时经常没反应。不过暂时没有去找更好的选择。在 Mac AppStore 有购入。

!! 连接 Android 手机

操作安卓手机上的文件,用 [[OpenMTP|https://openmtp.ganeshrvel.com/]]。
制作可启动的 USB 盘工具。

!! Rufus <<plat-win>>

[[Rufus|https://rufus.akeo.ie/]] 非常优秀,易用且性能好。遇到 U 盘无法写入时,可以先尝试格式化 U 盘。
如何制件图表。

!! 用什么工具

''普通图表'' 推荐 [[亿图图示|https://www.edrawmax.cn/]]。国产软件,功能齐全,而且它有社区,分享了大量日常能用到的模板,比较接地气。''我买了它的终身授权。''

''软件图表'' 使用 [[PlantUML|https://plantuml.com/]],可以用文本语言表达出图表。JetBrains 系有 [[插件|https://plugins.jetbrains.com/plugin/7017-plantuml-integration/]]。

另外 [[Lucidchart|https://www.lucidchart.com/]]、[[Creately|https://creately.com/]] 及 [[SmartDraw|https://www.smartdraw.com/]]。都是非常专业且带有各行业解决方案的工具。

但各家的免费版本都有好些限制:

* Lucidchart 限制了图形的个数。做一个复杂的图就能把免费额度耗尽
* Creately 免费版不支持导出 SVG

这是我用 Lucid Chart 做出来的图:

|{{ css-core-concepts-diagram }} |{{ zeesotech-order }} |

!! 图表怎样嵌入 TiddlyWiki

首选是将其导出成 SVG 再 [[嵌入|TiddlyWiki: SVG and Interactive Diagrams]]。备选是 PNG。

!! 如何使图表美观

事实上无论 Lucidchart 还是 Creately,它默认的基础图形都是没有样式的,黑框白背景,没有圆角也没有阴影。因此如果想图形比较有设计感,需要做一些简单的调整:

* 符合内容风格的颜色,一般生动活泼点比较好
* 一致的、好看的字体
* 矩形上圆角
* 根据设计风格考虑加阴影。阴影能构建一种类似卡片放在画布上的质感,是非常好的方式。但是阴影的距离、半径等一定要小
* 适当的地方可以加渐变

!! 不推荐的工具

!!! vecta.io

工具在 [[vecta.io|https://vecta.io/]]。CSS Tricks 网站用它做了一个 [[CSS Styling Order|https://vecta.io/app/publish/-LIi0BlIyDerWypSq5cD/Definitive-guide-to-CSS-styling-order]]。

实际用起来有几个问题:

* 图标难找,比如我想找个大括号图形,硬是找不到
* 操作文本左上对齐,有点 buggy

!!! Vectr

[[Vectr|https://vectr.com/]] 偏图标创作。不适合做带信息的图表。

TSF 有这样的目录结构:

```bash
spring-cloud-tsf
  |- spring-cloud-tsf-auth
  |- spring-cloud-tsf-core
```

其中 `auth` 依赖于 `core`。但是在根目录 `spring-cloud-tsf` 上 `mvn install` 会失败。Maven install `spring-cloud-tsf-auth` 时会报找不到 `org.springframework.cloud:spring-cloud-tsf:pom:1.0.1.BUILD-SNAPSHOT`

```bash
Failure to find org.springframework.cloud:spring-cloud-tsf:pom:1.0.1.BUILD-SNAPSHOT in http://maven.oa.com/nexus/content/repositories/releases 
```

解决办法是 SO 这个 [[帖子|https://stackoverflow.com/questions/6642146/maven-failed-to-read-artifact-descriptor]] 中 bzuillsmith 的回答,在 `spring-cloud-tsf` 目录上先 `mvn install -N` 一把。这样就算它的子项目 build 失败了,根目录自身还是会构建了来。
医药信息对来源的选择需要更慎重,权威的、可信任的来源才值得添加进来。

# [[PubMed|http://www.ncbi.nlm.nih.gov/pubmed]]: PubMed 是美国国立卫生研究院(National Institutes of Health)维护的一个生物医学数据库。
消息队列是比较流行、常见的中间件。值得一学。


<div class="tc-table-of-contents">
  <<toc-selective-expandable 'Meta'>>
</div>
对 Microservice 领略一无所知。挖坑学习。

网络资源:

* [[Microservices Architecture|http://microservices.io]]
* [[Blog of Phil Calçado|http://philcalcado.com/]]

书籍考虑看这下面的:

* Building Microservices: Designing Fine-Grained Systems
* Designing Data-Intensive Applications

!! Problems to Solve

From [[Istio overview|https://istio.io/docs/concepts/what-is-istio/overview.html]]:

* Service discovery
* Load balancing
* Failure recovery
* Metrics
* Monitoring
* A/B testing
* Canary releases
* Rate limiting
* Access control
* End-to-end authentication

这里面的内容大多数来自 [[Microservice Architecture|https://microservices.io/patterns/index.html]] 网站。这个网站的内容丰富详实,是不错的参考材料。


微软在 GitHub 上维护了一份自家 [[REST API Guidelines|https://github.com/Microsoft/api-guidelines]],我看的是 2.3 版本。

我觉得这份材料并不一定值得一看:

* Delta 部分设计得比较鸡肋,感觉为了通用而太过简单,难以实际应用
* 写 Push notifications via webhooks 写了很长篇福,但是很可能你并不想了解这块内容
* RESTful 之父 [[Roy Fielding 说|https://www.infoq.com/news/2016/07/microsoft-rest-api]] 这并不是一个 RESTful API guidelines,而仅仅是一个 HTTP API guidelines
** 有评论说,写成 Hypermedia API 更佳
** 我搞不懂 RESTful 是啥

根据我个人的知识储备,我觉得值得一看的章节:

* 7.10.2 Error condition responses
* 9 Collections
* 16 Naming guidelines

! 笔记

!! 总体可用性考量

5 Taxonomy 描述了哪些错误应该被纳入总体可用性(overall availability)考量。比如:

* Error 类,是由客户端引起(比如 BadRequest 等),不纳入总体可用性考量
* Fault 类,Server 引起的错误,纳入考量
* Long Running API,用户发起时 Server 会回 2XX 表示操作开始执行,但是一旦后续操作失败了,也应该纳入考量

!! 幂等(idempotent)

From http://www.restapitutorial.com/lessons/idempotency.html:

> From a RESTful service standpoint, for an operation (or service call) to be idempotent, clients can make that same call repeatedly while producing the same result. In other words, making multiple identical requests has the same effect as making a single request. Note that while idempotent operations produce the same result on the server (no side effects), the response itself may not be the same (e.g. a resource's state may change between requests).

一个操作如果是幂等的,那么客户端做多次调用时都会得到一样的结果,比如 GET 请求。

|!Method |!Description |!Is Idempotent |
|GET |Return the current value of an object |True |
|PUT |Replace an object, or create a named object, when applicable |True |
|DELETE |Delete an object |True |
|POST |Create a new object based on the data provided, or submit a command |False |
|HEAD |Return metadata of an object for a GET response. Resources that support the GET method MAY support the HEAD method as well |True |
|PATCH |Apply a partial update to an object |False |
|OPTIONS |Get information about a request; see below for details. |True |

!! PUT vs PATCH

PUT 代表的是 replacement semantics,而 PATCH 是 UPSERT semantics。

对于一个已经存在的 item,PUT 做的是全量替换,而 PATCH 做的是部分替换。即 PUT 请求中提供的 item 属性都会替换进资源本身,如果有一个原有的属性在 PUT 中消失了,那么这个属性在服务端也会被删除;而 PATCH 不会做删除属性这种事情,它只会更新原有的属性。

对于 item 还未存在时,PUT / PATCH 做的都是 insert 语义。

!! 表达错误

7.10.2 Error condition responses 一节描述了服务端如何将错误信息告诉客户端,值得借鉴。给一个例子:

```json
{
  "error": {
    "code": "BadArgument",
    "message": "Previous passwords may not be reused",
    "target": "password",
    "innererror": {
      "code": "PasswordError",
      "innererror": {
        "code": "PasswordDoesNotMeetPolicy",
        "minLength": "6",
        "maxLength": "64",
        "characterTypes": ["lowerCase","upperCase","number","symbol"],
        "minDistinctCharacterTypes": "2",
        "innererror": {
          "code": "PasswordReuseNotAllowed"
        }
      }
    }
  }
}
```

!! Collection URL Patterns

9 Collections 给出了针对集合(collection)的一些 URL pattern,值得借鉴。一些例子:

* Nested collections and properties: `GET https://api.contoso.com/v1.0/people/123/addresses`
* Order by: `GET https://api.contoso.com/v1.0/people?$orderBy=name`

里面的 filter, order by,分页 等 URL pattern,使用了 [[OData|http://odata.org/]] 提倡的 URL 样式。

filter, sort 时,需要考虑与后端存储的配合。

!! 分页

分页有两种模式,他们可以单独用也可以混合用:

* server-driven: server 指定了一页的 item 数,并提供 nextLink 告诉客户端下一页的 URL
* client-driven: client 通过请求参数指定一页的 item 数;这个参数超过 server 端配置时,使用 server 端配置

9.8.3 Additional considerations 提到一些分页需要考虑的点:

* 排序稳定性:server 必须提供额外的排序条件来满足这一点
* missing/repeated result:分页协议的设计要考虑这一点

!! Opaque URL

对于一些需要给出后续链接的情况,比如对一个大的集合做了分页后提供的 nextLink,往往使用 opaque URL 会合适:

```json
{
  "value":[
    { "id": "Item 1","price": 99.95,"sizes": null},
    { … },
    { … },
    { "id": "Item 99","price": 59.99,"sizes": null}
  ],
  "@nextLink": "{opaqueUrl}"
}
```

[[这篇文章|http://blog.ploeh.dk/2013/05/01/rest-lesson-learned-avoid-hackable-urls/]] 描述了什么是 opaque URL。大致上是一种防止用户使用未文档的 URL pattern 的方法,使得开发者可以更容易地去更新 URL。

如果不用 opaque URL,可能会把细节透露给 client。对于一个没有公开文档的 URL,它可能有两种设计:

* Hackable URL: `/items?page=3`
* Opaque URL: `/DC884298C`

比如一开始,我的 nextLink 长得像这样:`/items?page=2`;后来我决定换成 cursor 式:`/items?nextCursor=xxx`。如果不用 opaque URL,有些用户可能会在代码中硬编码规则,导致你无法更换 URL pattern。

!! Delta queries

10 Delta queries 描述一套模式,使客户端可以监控某些 item 的变化。这一节我觉得写得不好。它在尝试用简单的协议(可能为了通用),来描述一件复杂的事情。最后可能并不是太实用。

!! Long running operations

13 Long running operations 描述了一套模式,用于处理 long running operation。这里的核心在于把 operation 也抽象成一种资源。

!! Unsupported requests

前文提到的 collection URL pattern 是一些通用的模式,但是有一些 item 可能不支持里面的部分操作(比如 sort, filter 等)。15 Unsupported requests 描述了一套协议,用于告诉客户端 server 不支持什么。

!! Naming guidelines

16 Naming guidelines 有一些有价值的规则供参考,如:

* Services SHOULD avoid using articles such as 'a', 'the', 'of' unless needed to convey meaning.
** e.g. names such as aUser, theAccount, countOfBooks SHOULD NOT be used, rather user, account, bookCount SHOULD be preferred.
* When adding a type to a property name, services MUST add the type at the end, e.g. createdDateTime.
** For properties requiring both date and time, services MUST use the suffix 'DateTime'.
** For properties requiring only date, use suffix 'Date'

同时我见过一个说法,在描述数量时,把 num 提前,比如 `numPerson`, `numBooks`。
`minikube service list` 命令可以输出一些有用的信息,包含内部服务的外网访问地址。比如你部署完 `istio` 后,可以用 `istio-ingress` 的 URL 去访问 istio 的负载均衡服务:

```bash
> $ minikube service list
|--------------|----------------------|--------------------------------|
|  NAMESPACE   |         NAME         |              URL               |
|--------------|----------------------|--------------------------------|
| default      | details              | No node port                   |
| default      | kubernetes           | No node port                   |
| default      | productpage          | No node port                   |
| default      | ratings              | No node port                   |
| default      | reviews              | No node port                   |
| istio-system | istio-ingress        | http://192.168.99.100:30058    |
|              |                      | http://192.168.99.100:32319    |
| istio-system | istio-mixer          | No node port                   |
| istio-system | istio-pilot          | No node port                   |
| kube-system  | kube-dns             | No node port                   |
| kube-system  | kubernetes-dashboard | http://192.168.99.100:30000    |
|--------------|----------------------|--------------------------------|
```


`mms://` 协议以一种 [[Protocol Rollover|https://msdn.microsoft.com/en-gb/library/dd757582.aspx]] 的形式存在,它可以表示下面几种方式的直播流协议:

# Real Time Streaming Protocol (RTSP)
# Windows Media HTTP Streaming Protocol (HTTP)
# Microsoft Media Server (MMS)

Windows Media Player 及现代播放器,在播放 `mms://` 协议的 URL 时,会按上述的顺序去尝试播放。比如先按 RTSP 协议去尝试访问该 URL,如果失败,就用 HTTP 形式访问;如果再失败,就用 MMS 方式。

对于 RTSP 和 MMS,它们的协议分为 ''指令'' 和 ''传送数据'' 两部分,其中 ''指令'' 部分必须以 TCP,而 ''传送数据'' 部分可以用 UDP 也可用 TCP,而且 UDP 一般是被认为优先的。

!! 协议默认端口

|!RTSP |554 |
|!MMS |1755 |

!! 参考文档:

# [[Microsoft Media Server - Wikipedia|https://en.wikipedia.org/wiki/Microsoft_Media_Server]]
# [[Protocol Rollover - MSDN|https://msdn.microsoft.com/en-gb/library/dd757582.aspx]]
# [[Microsoft Media Server Protocol - MSDN|https://msdn.microsoft.com/en-us/library/cc239490.aspx]]
跨平台的移动端 App 开发。

看「TL老友记」的讨论:

* Flutter 是首选,美团、京东金融等使用了
* React Native 是不错的选择
* Cordova / Phonegap 性能有硬伤,开发体验应该也一般,现在已经不流行

2015/05 与么么嗖的开发有过交流。

么么嗖是个一键海淘型的产品。技术团队比较 Geek,他们做了一些事情让整个流程非常自动化。

# 抓取 20+ 家海外知名的电商网站产品,在自己的 App 中展示出来。抓的内容包括尺寸、款式等具体的型号
# 用户在他家 App / 网站下单后,他们用自己维护的一堆海外电商网站的机器人去发请求下单,填转运地址等。对于这一步,其他一键海淘产品,往往需要人工来下单,无法实现技术下单
# 再打通转运和清关流程

他们的爬虫用 Node.js 来写,下单机器人也是。下单这块是用的 Selenium / PhantomJS 这种 Headless Webkit 技术实现的,类似真人一样在国外电商网站上完成下单。据说下单过程中的每一步操作都有截图纪录,很方便查问题。

对比竞争对手的产品,他们在整个流程自动化上做得很好,比其他家节省了人力成本。利润的另外一个来源似乎是在国外电商网站上使用信用卡 / 其他优惠手段,使得买入的价格低,转卖给中国用户时赚取差价。

聊天过程中有几个点让我觉得挺赞的。

# Headless Webkit 形式的全自动下单流程。
# 对于判断爬虫是否正常运作,他们使用了类似 GitHub 的 contributions graph(在个人资料页中)的 Hea# 技术的 leader 非常 Geek,说一些核心内部系统非常简洁高效,甚至每一行 CSS 都是他自己写的。应该是个 JS 高手。
Monolithic Architecture,直译过来叫「单体应用体系」,指用单一的一个技术栈(比如 J2EE、Python Web 等),写一个庞大的应用,把所有业务逻辑、功能包含进来。这个应用可能即为 Web 前端提供 HTML 页面,又为手机 App 提供数据等。

好处:

* 开发简单,只需要一套工具链和编程背景知识
* 部署简单,只需要一套 CICD
* 扩容简单,就是部多几台机器

缺点:

* 应用代码可能越来越庞大,新人难以理解
* IDE、CICD 工具,越跑越慢,甚至难跑
* 你的程序容器(比如 Tomcat、nginx)需要加载的东西越多,它启动速度会越慢,降低开发效率
* 扩容变难,应用里有部分功能是 CPU 密集型、有部分是内存占用大,不拆出来难扩容
* 难以分工,模块的边界模糊,数据可能在不同地方被操作
* 被绑在一个技术栈上,如果这个技术栈不再能解决问题,或者需要频繁迁移到新版本,可能会很痛苦

!! 参考

* [[Monolithic Architecture|https://microservices.io/patterns/monolithic.html]]
在多台机器间共享键盘鼠标,用 [[Synergy|https://symless.com/synergy]]。Synergy 跨 Windows、Mac 和 Linux 三大平台,除了共享键盘鼠标,还可以共享剪贴板。

Synergy 1.x 版本免费,2.x 版本收费:

* Arch Linux 上的 [[synergy|https://www.archlinux.org/packages/community/x86_64/synergy/]] 包仍然是 1.8.8 版本,直接安装即可
* SourceForge 上有预编译好的 Windows 版本,最新的也是 1.8.8 版本,直接下载安装即可

Windows 作服务端会简单一点,因为有 GUI 界面可以配置。启动后先点 Configure Server,把右上角的电脑图标拉一个下来,然后命名为你的 Linux 机器的 hostname。再用 Linux 机器去连接即可。

! 多维度的文件管理系统

这个文件管理系统的目的是:更方便地组织文件、检索文件。

!! 背景

我遇到几个使用场景,给了我一些启发。

!!! 照片管理

旅游拍了很多照片,需要归类整理。但是文件系统是树状结构,只能把文件夹当作分类来组织照片。这会导致照片没法被更好地组织起来。比如大多数人会以 “日期-事件” 来命名文件夹(比如 `201607-西北旅游`),但是如果你想整理出不同的旅行中的所有 “亲密合照”,那你需要去多个文件夹里面搜索并且拷贝一份副本。这样非常不灵活。

另外有一个需求是,希望能灵活检索一些文件的元信息。比如照片文件中的 [[EXIF 信息|https://en.wikipedia.org/wiki/Exchangeable_image_file_format]],或者用户为某些文件自己添加的元信息(比如作者、描述等)。对于照片的例子,如果能读取 EXIF 中的位置信息并进行位置相关的检索就更好了,再如果能结合 Google 的图片 App 进行人脸识别 + 自动分类就更赞了。

!!! 全文检索多 PDF, ePub 文件

在看李笑来的《新生》时,他提到了全文检索 ePub / PDF 的需求。我也觉得随着我看的书越来越多,知识体系越来越健全时,我会有更多的电子资料(比如 PDF 书、网页保存的 PDF 等)需要有全文检索的能力。目前几大平台应该有不错的实现了:

* Windows 上没有去找相应的软件(但是应该有)
* Arch Linux 上,Plasma 的搜索(<kbd>Alt-F1</kbd> / <kbd>Alt-F2</kbd>)有全文搜索功能,但是无预览,只能知道特定的词组出现在哪些 PDF 中
* OSX 上,Spotlight 可以实现,但是没有具体使用过

但是这个功能是如此重要,如果它整合进这个文件管理系统中,会是个非常不错的特性。

!!! 为 Tiddlywiki 提供富媒体文件服务器

Tiddlywiki 的单页应用设计,导致嵌入富媒体文件时:

# 如果想不依赖外部链接,需要使用 Data URI 直接嵌入到 HTML 中,导致 HTML 庞大且浏览器性能可能降低
# 如果想使用外部链接:
## 需要维护外部链接的可用性,比如你可能需要把网络上的播客文件传到你自己的 CDN 上(比如七牛),避免那个外部链接挂掉了
## 不方便数据的统一管理,比如不能把全部数据都放在 Dropbox 上

!! 市面上已有的软件体验

Google 搜关键字 "tag based file system", "semantic filesystem",可以找到几个已有的实现:

* [[Tagsistant|https://www.tagsistant.net]]: 一个特殊的文件系统,在某个空白文件夹初始化后,对这个文件夹的操作,就跟创建 tag、给文件打 tag 等行为关联起来了。感觉不够直观,操作麻烦,功能有限。
* [[TMSU|http://tmsu.org/]]: 跟 Tagsistant 一样只能处理文件 tag,但是它的命令行直观得多,而且可以为文件指定 tag 值(像是 attribute)并进行查询。缺点是功能局限于 tagging。
* [[TagSpaces|https://www.tagspaces.org/]]: 看起来最不错的一个实现。高级版也支持 PDF / Word 等文件全文检索,也可以给文件打 Tag,用 Tag 查询。缺点是 UI 糟糕难用,性能非常差容易卡(应该是用了 nw.js / Electron 这类技术),同时没法给单个文件写描述。

另外对于照片的场景,我觉得 Google Photos 做得非常好,按人脸聚合以及搜索照片的功能深得我心。但是它有两个缺陷:

# 无法按地点搜索
# 可以给照片加上描述信息,但是这个描述无法被搜索到,很是鸡肋

所以,如果可能,自己做一个文件管理的软件应该是有作用的。

!! 预期的软件体验

# 这个软件可以让用户无需关心文件系统层面的分类(文件夹)。用户只需要把文件丢进我的软件,再进行打 Tag 等操作来管理。
# 这个软件应该提供足够灵活的打 Tag + 分类功能,和组合查询功能。比如在 “照片” 分类中,查找拍摄于 2016 年的照片。
# 这个软件应试针对某些具体使用场景做优化,比如知识管理、照片管理。

!! 可能的功能细节

* Tag / Attribute + Category
** 用户可以为每个文件设置 Tag / Attribute / Category,区别是 Category 只能有一个,并且在整个系统中呈树状结构
** 提供给用户复合查询的能力,复合查询中需要有操作符提供(e.g. `year == 2016`)
** 每个文件都可以写上单独的描述(可以作为一个 description 属性),用于检索
** 为常用的文件名后缀 / 文件类型,提供预设的 Tag Set,方便用户选择并进行标注。比如对于视频文件,可以给出 Movie Name, Movie Director 之类的 Attributes
** Tag 是一个没有值的 Attribute,它们在底层数据结构上可以是一致的
** 可以利用文件本身的 Meta 信息时(比如图片的 EXIF,MP3 的 ID3),尽量使用它用来存储和读取;不可以利用时,单独存储在另外的地方(这里的设计需要考虑,有些时候用户考虑隐私和文件分享,不愿意把 Meta 信息放在文件中)
* 知识管理
** 提供常用的富文本格式 / Plain Text 全文检索
** 最好提供上下文语句,或者渲染出来的预览
** 如果可以做成 Desktop App,注册一个 Schema URL,供 Tiddlywiki 呼起用来展示 PDF(不是很重要,流程难打通)
* 照片管理
** 提供缩略图预览的能力
** 可能的话,提供按位置信息搜索的能力。可以读取 EXIF 中的位置信息或者自定义的 Tag。比如搜索 “时间:2016 年 + 地点:敦煌 的照片”
* GTD / 分析文件大小占用,这些功能不重要,不要去实现
* Tag / Attribute for search and filter. Category for navigation
* 如果可以,尽量不要用数据库(或者只用 file based sqlite3),不在文件名上存储信息,用单独的文件夹存储。这样可以方便用各类网盘服务同步数据
* GUI 重要,CLI 可能不重要;最好用 Web-based GUI 技术,但是需要同时考虑性能
!! Aho–Corasick

| !掌握程度 |使用,不理解算法 |
| !时间复杂度 |O(m+n),m 为被搜索串长度,n 为要匹配的模式个数 |
| !空间复杂度 |未知 |
| !各语言实现 |[[C|https://sourceforge.net/projects/multifast/]], [[C|https://github.com/mischasan/aho-corasick]], [[Java|https://github.com/robert-bor/aho-corasick]], [[JavaScript|https://www.npmjs.com/package/aho-corasick]], [[Python|https://pypi.python.org/pypi/pyahocorasick/]] |

[[Aho-Corasick|https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm]] 算法主要用于这样的场景:给定多个字符串模式和一串待搜索的字符串,要求把各个字符串模式在被搜索的字符串中出现的位置计算出来。比如有以下输入参数:

* 被搜索的字符串:`Across the Great Wall, we can reach every corner in the world`
* 欲匹配的字符串模式:`he`, `all`, `an`

则这个算法会在线性时间内,把 `he` 的位置(9),`all` 的位置(19)以及 `an` 的位置(28)搜索出来。

!! FlashText

[[FlashText|https://github.com/vi3k6i5/flashtext]] 是一个快速查找和替换字符串的算法及 Python 实现。
这里描述我在制订 TSF 容器 API 规范时总结的经验。

TODO:部分内容待补充

!! Request ID

在 HTTP 请求的头部带上 `X-Request-ID`,用来唯一标识一个请求。回包必须将该 `X-Request-ID` 以 HTTP 头形式原样带回。示例:

```
X-Request-ID: 921e2b45-83db-4ecd-b17a-2f7a7cf0bd0f
```

一些调研:

* `GET` 请求无法带请求体,所以在请求体中(比如 JSON 结构中)放 request ID 并不合适
* `X-Request-ID` 不在 HTTP 规范中,但是相对广泛使用(参考 [[Wikipedia|https://en.wikipedia.org/wiki/List_of_HTTP_header_fields]])
* 有些代理服务器可能会 strip 掉这个头
* [[Correlation IDs for microservices architectures|https://hilton.org.uk/blog/microservices-correlation-id]] 这篇描述了挺长篇幅,应该有有价值的内容,有时间看看

!! 关于 API 请求成功时,是否返回 201 / 204 的问题

关于 201 (Created) / 204 (No Content) 回包可能没有回包,与 API 回包设计中 {"code", 0, "message": ""} 在设计上的冲突,需要考虑下。

!! 按 ID 批量查询资源

API Handyman 的这篇 [[文章|https://apihandyman.io/api-design-tips-and-tricks-getting-creating-updating-or-deleting-multiple-resources-in-one-api-call/#a-response-containing-responses]] 给出了一个常见的 URL pattern 设计:

```
GET /resources?ids=ID1,ID2
```

其中有几点需要考量:

# 用逗号(`,`)作分隔符是否合适?
# 返回体的结构设计
# 分页及不存在的 ID 处理

!!! 用逗号作分隔符

根据这个 SO [[回答|https://stackoverflow.com/a/38816380/1189076]],用逗号作分隔符是 OK 的。query component 指 URL 中 `?` 到 `#`(如果没有,则到 URL 末尾)的中间部分,这部分可以包含的字符有

* `a`-`z`, `A`-`Z`
* `0`-`9`
* `/` `?` `:` `@` `!` `$` `&` `'` `(` `)` `*` `+` `,` `;` `=` `-` `.` `_` `~`
* percent-encoded characters

其中 `,` `/` 这些虽然叫作 [[reserved character|https://tools.ietf.org/html/rfc3986#section-2.2]],但是这里的 reserved 并不是不能用,而是说如果这些字符如果没有使用它的特殊含义(如作为分隔符),而是当作普通的字符串使用,那么你应该 percent-encode 它。

一些使用了 reserved character 的场景:

* Google Drive 的文件查看功能:`https://drive.google.com/viewerng/viewer?url=http://journals.plos.org/plosone/s/file?id=body.pdf`
* 电商网站中经常会看到 `,`
* 一些 OAuth 的 callback URL 

!!! 返回体的结构设计

API Handyman 用的方案是:

```json
{
  "ID1": {
    "status": "201",
    "headers": [
      {"header's name": "header's value"}
    ],
    "body": { "the": "response's body"}
  },
  "ID2": {
    "status": "400",
    "headers": [
      {"header's name": "header's value"}
    ],
    "body": { "the": "response's body"}
  }
}
```

这个结构更适合于创建多个对象时使用,而不适合在查询多个对象时。我觉得应该沿用列表页的回包结构:

```json
{
  "data": {
    "totalCount": 5,
    "content": [
      {
        "id": "498e8220-5342-4277-b1cd-40caecbf9840",
        "name": "main-cluster"
      },
      {
        "id": "498e8220-5342-4277-b1cd-40caecbf9840",
        "name": "second-cluster",
      }
    ]
  },
  "code": 0,
  "message": ""
}
```

!!! 分页及不存在的 ID 处理

TODO: 不存在的 ID 会影响返回结构中的 `totalCount`,以及需要一种机制表达该元素不存在。后续考虑。
[[架构|MySQL: Architecture]]:

{{ mysql-architecture }}

[img width=350 [mysql-in-practise-cover]]

极客时间上的「[[MySQL 实战 45 讲|https://time.geekbang.org/column/intro/139]]」专栏(已购买,使用 189 手机号登陆)。

讲的比较 ''简单易懂'',但 ''质量一般''。比如基础篇第二节讲 redo log 及 binlog 时:

* 把二阶段提交揉在 binlog 一段讲了,比较混乱,后面才提到这是二阶段提交
* 把 point-in-time recovery 与二阶段提交揉在一起了。二阶段提交是为了保证 crash-safe 和服务 crash recovery,跟 point-in-time recovery(恢复到过去某一时间点,使用全量备份和 binlog 进行)没有什么关系

所以这里面的内容,看的过程也要多翻阅其他文档进行多方验证。
<svg xmlns="http://www.w3.org/2000/svg" width="586" height="613" viewBox="0 0 586 613">
    <style type="text/css">
.st2 {fill:#425c8a;font-family:微软雅黑;font-size:12pt}
.st3 {fill:#aa7f00;font-family:微软雅黑;font-size:12pt}
.st1 {fill:#ffffff;font-family:微软雅黑;font-size:12pt}
</style>
    <defs>
        <linearGradient gradientUnits="userSpaceOnUse" id="lg1" y1="-12" x1="9" x2="118" y2="64">
            <stop stop-color="#2a9f9f" offset="0" />
            <stop stop-color="#2a9f9f" offset="0.6" />
            <stop stop-color="#289797" offset="0.6" />
            <stop stop-color="#289797" offset="0.76" />
            <stop stop-color="#228484" offset="0.76" />
            <stop stop-color="#228484" offset="0.8" />
            <stop stop-color="#289797" offset="0.8" />
            <stop stop-color="#289797" offset="1" />
        </linearGradient>
        <linearGradient gradientUnits="userSpaceOnUse" id="lg2" y1="50" x1="-35" x2="360" y2="326">
            <stop stop-color="#dbe8ee" offset="0" />
            <stop stop-color="#cde0e8" offset="0.6" />
            <stop stop-color="#adcedc" offset="0.6" />
            <stop stop-color="#adcedc" offset="0.76" />
            <stop stop-color="#81bace" offset="0.76" />
            <stop stop-color="#81bace" offset="0.8" />
            <stop stop-color="#adcedc" offset="0.8" />
            <stop stop-color="#adcedc" offset="1" />
        </linearGradient>
        <linearGradient gradientUnits="userSpaceOnUse" id="lg3" y1="-12" x1="9" x2="118" y2="64">
            <stop stop-color="#2a9ab6" offset="0" />
            <stop stop-color="#2a9ab6" offset="0.6" />
            <stop stop-color="#2892ad" offset="0.6" />
            <stop stop-color="#2892ad" offset="0.76" />
            <stop stop-color="#228098" offset="0.76" />
            <stop stop-color="#228098" offset="0.8" />
            <stop stop-color="#2892ad" offset="0.8" />
            <stop stop-color="#2892ad" offset="1" />
        </linearGradient>
        <linearGradient gradientUnits="userSpaceOnUse" id="lg4" y1="-34" x1="24" x2="301" y2="160">
            <stop stop-color="#dfe5f2" offset="0" />
            <stop stop-color="#d3dbee" offset="0.6" />
            <stop stop-color="#b8c6e4" offset="0.6" />
            <stop stop-color="#b8c6e4" offset="0.76" />
            <stop stop-color="#97adda" offset="0.76" />
            <stop stop-color="#97adda" offset="0.8" />
            <stop stop-color="#b8c6e4" offset="0.8" />
            <stop stop-color="#b8c6e4" offset="1" />
        </linearGradient>
        <linearGradient gradientUnits="userSpaceOnUse" id="lg5" y1="-1" x1="1" x2="86" y2="59">
            <stop stop-color="#6287c6" offset="0" />
            <stop stop-color="#6287c6" offset="0.6" />
            <stop stop-color="#5d80bc" offset="0.6" />
            <stop stop-color="#5d80bc" offset="0.76" />
            <stop stop-color="#5170a5" offset="0.76" />
            <stop stop-color="#5170a5" offset="0.8" />
            <stop stop-color="#5d80bc" offset="0.8" />
            <stop stop-color="#5d80bc" offset="1" />
        </linearGradient>
        <linearGradient id="lg6" y1="0%" x1="0%" x2="0%" y2="100%">
            <stop stop-color="#fff4e7" offset="0" />
            <stop stop-color="#ffe8cb" offset="0.82" />
            <stop stop-color="#ffe5c4" offset="0.86" />
            <stop stop-color="#ffcf7c" offset="0.86" />
            <stop stop-color="#ffc000" offset="0.9" />
            <stop stop-color="#ffdcaa" offset="0.9" />
            <stop stop-color="#ffdcaa" offset="1" />
        </linearGradient>
    </defs>
    <g transform="translate(-43.55,-109)">
        <g id="shape1" transform="translate(144,110)">
            <path fill-rule="evenodd" stroke="#1e7a7a" fill="url(#lg1)" d="M117.1,52C122.3,52,126.6,47.8,126.6,42.6L126.6,9.4C126.6,4.2,122.3,0,117.1,0L9.4,0C4.2,0,0,4.2,0,9.4L0,42.6C0,47.8,4.2,52,9.4,52L117.1,52z" />
            <text class="st1">
                <tspan x="39.3" y="29.5">客户端</tspan>
            </text>
        </g>
        <path id="shape2" fill-rule="evenodd" stroke="#268ea8" fill="url(#lg2)" transform="translate(44.55,189)" d="M325.4,365L325.4,11C325.4,4.9,320.5,0,314.4,0L11,0C4.9,0,0,4.9,0,11L0,365C0,371.1,4.9,376,11,376L314.4,376C320.5,376,325.4,371.1,325.4,365z" />
        <g id="shape3" transform="translate(144,208)">
            <path fill-rule="evenodd" stroke="#1e768c" fill="url(#lg3)" d="M117.1,52C122.3,52,126.6,47.8,126.6,42.6L126.6,9.4C126.6,4.2,122.3,0,117.1,0L9.4,0C4.2,0,0,4.2,0,9.4L0,42.6C0,47.8,4.2,52,9.4,52L117.1,52z" />
            <text class="st1">
                <tspan x="39.3" y="29.5">连接器</tspan>
            </text>
        </g>
        <g id="shape4" transform="translate(68,302)">
            <path fill-rule="evenodd" stroke="#1e768c" fill="url(#lg3)" d="M117.1,52C122.3,52,126.6,47.8,126.6,42.6L126.6,9.4C126.6,4.2,122.3,0,117.1,0L9.4,0C4.2,0,0,4.2,0,9.4L0,42.6C0,47.8,4.2,52,9.4,52L117.1,52z" />
            <text class="st1">
                <tspan x="39.3" y="29.5">缓存层</tspan>
            </text>
        </g>
        <g id="shape5" transform="translate(223.72,302)">
            <path fill-rule="evenodd" stroke="#1e768c" fill="url(#lg3)" d="M117.1,52C122.3,52,126.6,47.8,126.6,42.6L126.6,9.4C126.6,4.2,122.3,0,117.1,0L9.4,0C4.2,0,0,4.2,0,9.4L0,42.6C0,47.8,4.2,52,9.4,52L117.1,52z" />
            <text class="st1">
                <tspan x="39.3" y="29.5">分析器</tspan>
            </text>
        </g>
        <g id="shape6" transform="translate(175.64,260)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,19C0,22.9,-3.1,26,-7,26L-37.4,26C-41.2,26,-44.4,29.1,-44.4,33L-44.4,35.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M-44.4,42L-40.1,34.7C-41.4,35.4,-42.8,35.8,-44.4,35.8C-45.9,35.8,-47.4,35.4,-48.6,34.7L-44.4,42" stroke-linecap="round" />
        </g>
        <g id="shape7" transform="translate(237.2,260)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,19C0,22.9,3.1,26,7,26L42.8,26C46.7,26,49.8,29.1,49.8,33L49.8,35.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M49.8,42L54,34.7C52.8,35.4,51.3,35.8,49.8,35.8C48.3,35.8,46.8,35.4,45.6,34.7L49.8,42" stroke-linecap="round" />
        </g>
        <g id="shape8" transform="translate(223.72,396)">
            <path fill-rule="evenodd" stroke="#1e768c" fill="url(#lg3)" d="M117.1,52C122.3,52,126.6,47.8,126.6,42.6L126.6,9.4C126.6,4.2,122.3,0,117.1,0L9.4,0C4.2,0,0,4.2,0,9.4L0,42.6C0,47.8,4.2,52,9.4,52L117.1,52z" />
            <text class="st1">
                <tspan x="39.3" y="29.5">优化器</tspan>
            </text>
        </g>
        <g id="shape9" transform="translate(223.72,490)">
            <path fill-rule="evenodd" stroke="#1e768c" fill="url(#lg3)" d="M117.1,52C122.3,52,126.6,47.8,126.6,42.6L126.6,9.4C126.6,4.2,122.3,0,117.1,0L9.4,0C4.2,0,0,4.2,0,9.4L0,42.6C0,47.8,4.2,52,9.4,52L117.1,52z" />
            <text class="st1">
                <tspan x="39.3" y="29.5">执行器</tspan>
            </text>
        </g>
        <g id="shape10" transform="translate(287,354)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,35.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M0,42L4.2,34.7C3,35.4,1.5,35.8,0,35.8C-1.5,35.8,-3,35.4,-4.2,34.7L0,42" stroke-linecap="round" />
        </g>
        <g id="shape11" transform="translate(287,448)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,35.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M0,42L4.2,34.7C3,35.4,1.5,35.8,0,35.8C-1.5,35.8,-3,35.4,-4.2,34.7L0,42" stroke-linecap="round" />
        </g>
        <g id="shape12" transform="translate(60,522)">
            <text class="st2">
                <tspan x="2" y="22">Server 层</tspan>
            </text>
        </g>
        <path id="shape13" fill-rule="evenodd" stroke="#5a7cb7" fill="url(#lg4)" transform="translate(44.55,592.69)" d="M325.4,114.3L325.4,11C325.4,4.9,320.5,0,314.4,0L11,0C4.9,0,0,4.9,0,11L0,114.3C0,120.4,4.9,125.3,11,125.3L314.4,125.3C320.5,125.3,325.4,120.4,325.4,114.3z" />
        <g id="shape14" transform="translate(60,609)">
            <path fill-rule="evenodd" stroke="#4a6798" fill="url(#lg5)" d="M77.6,58C82.8,58,87,53.8,87,48.6L87,9.4C87,4.2,82.8,0,77.6,0L9.4,0C4.2,0,0,4.2,0,9.4L0,48.6C0,53.8,4.2,58,9.4,58L77.6,58z" />
            <text class="st1">
                <tspan x="27.5" y="22">存储
</tspan>
                <tspan x="27.5" y="42.5">引擎</tspan>
            </text>
        </g>
        <g id="shape15" transform="translate(163.78,609)">
            <path fill-rule="evenodd" stroke="#4a6798" fill="url(#lg5)" d="M77.6,58C82.8,58,87,53.8,87,48.6L87,9.4C87,4.2,82.8,0,77.6,0L9.4,0C4.2,0,0,4.2,0,9.4L0,48.6C0,53.8,4.2,58,9.4,58L77.6,58z" />
            <text class="st1">
                <tspan x="27.5" y="22">存储
</tspan>
                <tspan x="27.5" y="42.5">引擎</tspan>
            </text>
        </g>
        <g id="shape16" transform="translate(267.55,609)">
            <path fill-rule="evenodd" stroke="#4a6798" fill="url(#lg5)" d="M77.6,58C82.8,58,87,53.8,87,48.6L87,9.4C87,4.2,82.8,0,77.6,0L9.4,0C4.2,0,0,4.2,0,9.4L0,48.6C0,53.8,4.2,58,9.4,58L77.6,58z" />
            <text class="st1">
                <tspan x="27.5" y="22">存储
</tspan>
                <tspan x="27.5" y="42.5">引擎</tspan>
            </text>
        </g>
        <g id="shape17" transform="translate(60,663)">
            <text class="st2">
                <tspan x="2" y="32.5">存储引擎层</tspan>
            </text>
        </g>
        <g id="shape18" transform="translate(393,208)">
            <path fill-rule="evenodd" fill="url(#lg6)" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0z" />
            <path stroke="#e1a900" fill="none" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0zM236,10.3L209.5,10.3L209.5,0" />
            <text class="st3">
                <tspan x="46" y="29.5">管理连接,权限验证</tspan>
            </text>
        </g>
        <g id="shape19" transform="translate(270.55,234)">
            <path stroke-width="2" stroke-dasharray="11,5" stroke="#1a6e6e" fill="none" d="M0,0L116.2,0" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M122.4,0L115.1,-4.2C115.8,-3,116.2,-1.5,116.2,0C116.2,1.5,115.8,3,115.1,4.2L122.4,0" stroke-linecap="round" />
        </g>
        <g id="shape20" transform="translate(393,302)">
            <path fill-rule="evenodd" fill="url(#lg6)" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0z" />
            <path stroke="#e1a900" fill="none" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0zM236,10.3L209.5,10.3L209.5,0" />
            <text class="st3">
                <tspan x="46" y="29.5">词法分析,语法分析</tspan>
            </text>
        </g>
        <g id="shape21" transform="translate(350.28,328)">
            <path stroke-width="2" stroke-dasharray="11,5" stroke="#1a6e6e" fill="none" d="M0,0L36.5,0" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M42.7,0L35.4,-4.2C36.1,-3,36.5,-1.5,36.5,0C36.5,1.5,36.1,3,35.4,4.2L42.7,0" stroke-linecap="round" />
        </g>
        <g id="shape22" transform="translate(393,396)">
            <path fill-rule="evenodd" fill="url(#lg6)" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0z" />
            <path stroke="#e1a900" fill="none" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0zM236,10.3L209.5,10.3L209.5,0" />
            <text class="st3">
                <tspan x="30" y="29.5">执行计划生成,索引选择</tspan>
            </text>
        </g>
        <g id="shape23" transform="translate(350.28,422)">
            <path stroke-width="2" stroke-dasharray="11,5" stroke="#1a6e6e" fill="none" d="M0,0L36.5,0" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M42.7,0L35.4,-4.2C36.1,-3,36.5,-1.5,36.5,0C36.5,1.5,36.1,3,35.4,4.2L42.7,0" stroke-linecap="round" />
        </g>
        <g id="shape24" transform="translate(393,490)">
            <path fill-rule="evenodd" fill="url(#lg6)" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0z" />
            <path stroke="#e1a900" fill="none" d="M0,0L0,52L236,52L236,10.3L209.5,0L0,0zM236,10.3L209.5,10.3L209.5,0" />
            <text class="st3">
                <tspan x="46" y="29.5">操作引擎,返回结果</tspan>
            </text>
        </g>
        <g id="shape25" transform="translate(350.28,516)">
            <path stroke-width="2" stroke-dasharray="11,5" stroke="#1a6e6e" fill="none" d="M0,0L36.5,0" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M42.7,0L35.4,-4.2C36.1,-3,36.5,-1.5,36.5,0C36.5,1.5,36.1,3,35.4,4.2L42.7,0" stroke-linecap="round" />
        </g>
        <g id="shape26" transform="translate(207.28,565)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L-0,21.5" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M-0,27.7L4.2,20.3C3,21.1,1.5,21.5,-0,21.5C-1.5,21.5,-3,21.1,-4.2,20.3L-0,27.7" stroke-linecap="round" />
        </g>
        <g id="shape27" transform="translate(207.28,162)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,39.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M0,46L4.2,38.7C3,39.4,1.5,39.8,0,39.8C-1.5,39.8,-3,39.4,-4.2,38.7L0,46" stroke-linecap="round" />
        </g>
        <g id="shape28" transform="translate(238.91,162)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,39.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M0,46L4.2,38.7C3,39.4,1.5,39.8,0,39.8C-1.5,39.8,-3,39.4,-4.2,38.7L0,46" stroke-linecap="round" />
        </g>
        <g id="shape29" transform="translate(175.64,162)">
            <path stroke-width="2" stroke="#1a6e6e" fill="none" d="M0,0L0,39.8" />
            <path stroke-width="1" stroke="#1a6e6e" fill="#1a6e6e" d="M0,46L4.2,38.7C3,39.4,1.5,39.8,0,39.8C-1.5,39.8,-3,39.4,-4.2,38.7L0,46" stroke-linecap="round" />
        </g>
    </g>
</svg>


MySQL 运维、管理。

MySQL 的数据恢复分几种:

* Point-in-time recovery,即恢复 DB 到过去某一刻。一般是在一些误操作,比如误删数据后进行
* Recovery from data corruption or disk failure,因为数据文件或者磁盘损坏需要修复,过程与 point-in-time 类似,不再描述
* Crash recovery,崩溃修复,指在 MySQL 异常退出(如操作系统 bug、掉电等)时的恢复

!! Point-in-Time Recovery

在要恢复的时间点前需要有全量备份,配合 binlog 即可恢复。具体操作看 [[官方文档|https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery.html]]。

!! Crash recovery

崩溃修复有不同的维度:

* 磁盘有 partial-write 的情况下:InnoDB 的 [[Doublewrite|InnoDB: Concept: Doublewrite]] 机制可以解决
* 有未完成的事务、未提交的自增 ID、被破坏的 index tree 等:通过 [[redo log|InnoDB: Concept: Redo Log]] 恢复。写 log 过程中使用的 [[2PC 算法|InnoDB: Topic: 2PC for Redo Log and Binlog]] 也保证了数据的可靠性

!! References

* [[15.18.2 InnoDB Recovery - MySQL 8.0 Documentation|https://dev.mysql.com/doc/refman/8.0/en/innodb-recovery.html]]
! MySQL 慢查询日志分析

MySQL 有一项纪录耗时长的查询的功能,叫 [[慢查询日志|http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html]]。可以在 MySQL Server 上设置 `slow_query_log` 参数为 1 打开,最终慢查询日志会被写到 `slow_query_log_file` 参数所指定的文件上。

慢查询的存在往往表示业务逻辑中有不合理的 SQL 查询存在,它们很可能会对数据库的性能、吞吐量产生很大影响。因此分析并消除慢查询是很有必要的。

Pernaco Toolkit 中提供了 [[pt-query-digest|https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html]] 工具,可以用来做 MySQL 慢查询的分析。它的基础能力是:

# 解析慢查询日志中的 SQL 语句、耗时等信息
# 对每条 SQL 语句,使用生成一个 fingerprint,用于对同类 SQL 语句做聚类,比如:`SELECT * FROM my_table WHERE a = 3 AND b in (3, 1, 4)` 会被转为 `select * from my_table where a = ? and b in(?+)`
# 按聚类后的结果,输出一份报告,指明哪几类 SQL 语句耗时大,它们的耗时分布如何,并给出一些实际例子
# 报告中还可以顺带帮你对语句做 explain,更方便地分析性能瓶颈
# 还提供了 review 跟 history 能力,可以把出现在慢查询中不同的 fingerprint 存在其他的一个数据库表中,供开发 / DBA 做 review。可以形成一个定时审核 SQL 语句合理性的工作流。同时也有开源的 Web 项目 [[Anemometer|https://github.com/box/Anemometer]],可以对 review 跟 history 所产生的数据做操作([[参考|https://www.percona.com/blog/2012/08/31/visualization-tools-for-pt-query-digest-tables/]])。

总的来说, pt-query-digest 很大程度上把分析慢查询日志中的脏活累活给做了,减轻了开发或者 DBA 的负担。

同时 pt-query-digest 的 review 功能还可以用来辅助 [[发现 SQL 注入攻击|https://www.percona.com/live/mysql-conference-2013/sessions/using-percona-toolkit-detect-and-even-prevent-sql-injection-attacks]]。
从一条查询 SQL 的执行过程描述 MySQL 的架构。

!! 架构总览

{{ mysql-architecture }}

''不同的架构引擎共用一个 Server 层''。

缓存层在 MySQL 8.0 之后因缺乏实用性被彻底删除,这里不再做讨论。

!! 一个查询 SQL 的例子

''连接器'' 负责跟客户端建立连接、获取权限、维持和管理连接:

* 用户名密码的校验(authentication)
* 权限判定(authorization),比如该用户所能查询的库表,会在这层获取
* 维护长连接

无论使用的是 `mysql` 命令还是 MySQL client library 去连接 MySQL server,都是连接器做处理。

连接上 server 后,客户端可以发起一个查询请求:

```sql
select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
```

''分析器'' 做词法分析,理解这是一条查询语句,查询的是什么表、用什么条件。分析器会获得相应的库表结构,如果用户查询的表或列不存在(比如 `t1` 库不存在),会给出报错。但这层不考虑权限(比如用户是否有查询这个表的权限,我也不知道为啥)。

''优化器'' 是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。比如上面的 SQL,即可以先按 `t2.d` 筛选也可以先按 `t1.c` 筛选。优化器会选效率更高的方式。

''执行器'' 实际调用存储引擎接口,获取数据并返回给客户端。它也做权限控制。

主流的 ''存储引擎'' 是 InnoDB,一些场景下也用 Memory。

MySQL 的 binary log 也称 binlog,''包含了一切使 DB 数据变化的「事件」''(或者可能变化的事件,比如没有删掉任意一行的 `DELETE` 操作)。Binlog ''不会纪录'' `SELECT` `SHOW` 这类不修改数据的语句。对这类语句的分析,使用 query log。

''主要用途'':

* ''主从复制(replication)'':源服务器会将 binary log 发送至备机,以实现完全一致的数据同步
* ''数据恢复(recovery)'':
** 原因显而易见,见 [[MySQL: Admin: Recovery]]
** ''但只能恢复完成的事件或已提交的事务''

!! Formats

三种格式:

* statement-based:纪录 SQL 语句
* row-based:默认的方式,纪录行的变化
* mixed:默认用 statement-based 方式,但出现特定情形时自动切换为 row-based

在主从同步时,有一些 SQL 语句是''未确定性的''(nondeterministic,比如包含 `UUID()` 函数),可能会导致主从间的不一致。MySQL 在遇到这种情况时会抛异常。用 row-based 可以避免这种问题。mixed 也可解决这种问题,会在未确定性出现的情况下使用 row-based。''MariaDB 已将 mixed 作为其默认格式。''但在 MySQL 运维实践层面,我不确定哪种是最好的。

像 `CREATE TABLE` `ALTER` `DROP` `GRANT` 等修改表结构或者 MySQL 内部表的命令,MySQL 会无视配置的 binlog 格式,都使用 statement-based。

客户端可以设置自己当前会话的 binlog 格式:

```sql
mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';
```

一些情况:

* 如果要执行的 SQL 非常耗性能,但只改动很少的行,那使用 ROW 可以显著减少备机的性能消耗
* 如果要执行非常多条 SQL,但只改动很少部分的数据,使用 ROW 比较合适
* 如果执行的 SQL 很少,但会改动大量的行(比如一个匹配大量行的 WHERE 从句),那使用 STATEMENT 合适

!! References

* [[The Binary Log - MySQL|https://dev.mysql.com/doc/refman/8.0/en/binary-log.html]]

Core insights of [["Query-Related Issues" official documents|http://dev.mysql.com/doc/refman/5.7/en/query-issues.html]].

! Case Sensitivity in String Searches

用 SQL 字符串搜索时,比较函数看的是表的 collation。比如表的 collation 为 `utf8_general_ci` 时,字符串比较是不区分大小写的。你的 `WHERE field="abcdefg"` 会同时识别 abcdefg 和 AbCdEfG。


* [[dbcli/mycli|https://github.com/dbcli/mycli]] 是个交互式的 MySQL CLI
N 个分支的树。

!! 遍历

跟 [[二叉树|Binary Tree]] 类似,区别点在于:

* 二叉树是左右子节点,N-ary 树是若干 children 节点
* N-ary 没有中序遍历,因为有无数种所谓「中序」,比如 (child1, root, chid2, child3, ...)

下面的代码以这颗树作为测试用例:

[img width=300 [n-ary-tree-test-case]]

中序遍历、后序遍历、按层遍历的实现:

```go
package main

import "fmt"

type Node struct {
	Val      int
	Children []*Node
}

func preorder(root *Node) []int {
	answer := []int{}
	if root == nil {
		return answer
	}

	stack := []*Node{root}
	for len(stack) != 0 {
		curr := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		answer = append(answer, curr.Val)
		for i := len(curr.Children) - 1; i >= 0; i-- {
			stack = append(stack, curr.Children[i])
		}
	}

	return answer
}

func postorder(root *Node) []int {
	answer := []int{}
	if root == nil {
		return answer
	}

	firstStack := []*Node{root}
	secondStack := []*Node{}

	for len(firstStack) != 0 {
		curr := firstStack[len(firstStack)-1]
		firstStack = firstStack[:len(firstStack)-1]

		secondStack = append(secondStack, curr)
		firstStack = append(firstStack, curr.Children...)
	}

	for len(secondStack) != 0 {
		answer = append(answer, secondStack[len(secondStack)-1].Val)
		secondStack = secondStack[:len(secondStack)-1]
	}
	return answer
}

func levelOrder(root *Node) [][]int {
	answer := make([][]int, 0)
	if root == nil {
		return answer
	}

	queue := []*Node{root}

	for len(queue) != 0 {
		levelAnswer := []int{}
		nextQueue := []*Node{}
		for _, node := range queue {
			levelAnswer = append(levelAnswer, node.Val)
			nextQueue = append(nextQueue, node.Children...)
		}
		queue = nextQueue
		answer = append(answer, levelAnswer)
	}

	return answer
}

func main() {
	root := &Node{
		1, []*Node{
			{2, nil},
			{3, []*Node{
				{6, nil},
				{7, []*Node{
					{11, []*Node{
						{14, nil},
					}},
				}},
			}},
			{4, []*Node{
				{8, []*Node{
					{12, nil},
				}},
			}},
			{5, []*Node{
				{9, []*Node{
					{13, nil},
				}},
				{10, nil},
			}},
		},
	}
	fmt.Println(preorder(root))
	fmt.Println(postorder(root))
	fmt.Println(levelOrder(root))
}
```

对于变量命名的建议,Dart 这个 [[文档|https://dart.dev/guides/language/effective-dart/design#names]] ''写得非常好''。下面大部分内容摘录自此。

!! 保持一致

好的命名:

```js
pageCount         // A field.
updatePageCount() // Consistent with pageCount.
toSomething()     // Consistent with Iterable's toList().
asSomething()     // Consistent with List's asMap().
Point             // A familiar concept.
```

差的命名:

```js
renumberPages()      // Confusingly different from pageCount.
convertToSomething() // Inconsistent with toX() precedent.
wrappedAsSomething() // Inconsistent with asX() precedent.
Cartesian            // Unfamiliar to most users.
```

!! 最重要的描述性名词放最后面

好的命名:

```js
pageCount             // A count (of pages).
ConversionSink        // A sink for doing conversions.
ChunkedConversionSink // A ConversionSink that's chunked.
CssFontFaceRule       // A rule for font faces in CSS.
```

差的命名:

```js
numPages                  // Not a collection of pages.
CanvasRenderingContext2D  // Not a "2D".
RuleFontFaceCss           // Not a CSS.
```

!! 最重要的描述性名词放最后面

好的命名:

```js
pageCount             // A count (of pages).
ConversionSink        // A sink for doing conversions.
ChunkedConversionSink // A ConversionSink that's chunked.
CssFontFaceRule       // A rule for font faces in CSS.
```

差的命名:

```js
numPages                  // Not a collection of pages.
CanvasRenderingContext2D  // Not a "2D".
RuleFontFaceCss           // Not a CSS.
```

!! 非布尔型的属性或变量,用名词短语来命名

好的命名:

```js
list.length
context.lineWidth
quest.rampagingSwampBeast
```

差的命名:

```js
list.deleteItems
```

!! boolean 属性或变量,用非命令式动词短语

boolean 变量经常被用在控制流的条件中,所以用动词短语可读性好于形容词。比较下这两者:

```js
if (window.closeable) ...  // Adjective.
if (window.canClose) ...   // Verb.
```

非命令式动词短语(non-imperative verb phrase)有几种:

* "to be" 形式:`isEnabled`, `wasShown`, `willFire` 等
* [[助动词|https://zh.wikipedia.org/wiki/%E5%8A%A9%E5%8B%95%E8%A9%9E]]:`hasElements`, `canClose`, `shouldConsume`, `mustSave` 等

非命令式动词短语,它从语义上不改变任何东西,因此适合作为属性的命名,因为访问一个 boolean 变量也不改变任何东西。

好的命名:

```js
isEmpty
hasElements
canClose
closesWindow
canShowPopup
hasShownPopup
```

差的命名:

```js
empty         // Adjective or verb?
withElements  // Sounds like it might hold elements.
closeable     // Sounds like an interface.
              // "canClose" reads better as a sentence.
closingWindow // Returns a bool or a window?
showPopup     // Sounds like it shows the popup.
```

!! 当函数参数为 boolean 时,省略掉动词

这个修订了上一条建议。boolean 作为参数时,往往是比较直观的,省略掉动词会简练一些:

```js
Isolate.spawn(entryPoint, message, paused: false);
var copy = List.from(elements, growable: true);
var regExp = RegExp(pattern, caseSensitive: false);
```

!! 用「正向」形式来表达 boolean 属性或变量

好的例子:

```js
if (socket.isConnected && database.hasData) {
  socket.write(database.read());
}
```

差的例子:

```js
if (!socket.isDisconnected && !database.isEmpty) {
  socket.write(database.read());
}
```

''例外'':有些场景下,反向形式是最常被使用的(比如有时候关注反向多于正向),此时用反向更佳。

!! 用于返回数值的函数命名

使用名词短语:

```js
var element = list.elementAt(3);
var first = list.firstWhere(test);
var char = string.codeUnitAt(4);
```

!! 避免函数命名为 `getXXX`

如果函数不带参数,它的作用类似于访问一个属性,可以设置一个 getter。比如 `getBreakfastOrder()` 变为 `breakfastOrder` 属性。

如果函数需要带参数、或者有副作用等导致它不能被定义成一个 getter,可以选择:

* 去掉 `get`,使用名词短语,比如 `breakfastOrder()`
* 使用更精确的动词,如 `create`, `download`, `fetch`, `calculate`, `request`, `aggregate` 等

!! 生成格式字符串

比如你想动态生成一个 Redis key:

```python
def get_session_key(session_id):
    return f"session_{session_id}"
```

这个函数命名中的 `get` 会使其含意混淆不清,直觉会认为是从远程接口获取的。好的命名应该叫 `make_session_key`。这个命名参考了 django-redis 项目的某段 [[代码|https://github.com/jazzband/django-redis/blob/683ebcf16a5c342d9794552c9897c8baa2d6b0be/tests/test_backend.py#L26]]。
[[Neo4j|https://neo4j.com/]] 是图数据库中比较流行的。我在做一个需求时短暂使用过它;那个需求是要构建一棵公司及其股东的树。

!! 安装

下载 [[Neo4j Desktop|https://neo4j.com/download/]]。启动后即会有一个可用的 Neo4j 数据库。

!! 查询语言

Neo4j 所使用的查询语言被称为 Cypher。Cypher 之于 Neo4j,类似于 SQL 之于 MySQL。Cypher 的文档中,每个关键字(`CREATE` / `MERGE` / `DELETE`)等都有丰富的示例给出。参考它来判断如何写。

我在需求中写过一些语句:

<div class="box">

''查询'':

```cypher
MATCH (c:Company) 
WHERE c.credit_code IS NOT NULL OR c.name IS NOT NULL AND c.not_found = false 
RETURN c
```

`c:Company` 中 `c` 是别名(alias),跟 SQL 中的 `AS c` 差不多。

</div>

<div class="box">

''创建结点''(`$created_props` 是配合 Python SDK 使用的,不是 Cypher 语法本身支持的):

```cypher
MERGE (c:Company { name: $name }) 
ON CREATE SET c = $created_props 
ON MATCH SET c = $modified_props 
RETURN c
```

关键的一点是,Cypher 中做创建时往往用 `MERGE` 而不用 `CREATE`。`MERGE` 在对象还不存在时创建(`ON CREATE`),在对象存在时做更新(`ON MATCH`),比较灵活。

</div>

<div class="box">

''创建关系'':

```cypher
MATCH (c:Company { name: $company_name }), 
      (p:Person { id: $person_id }) 
CREATE (c)-[r:IS_CONTROLLED_BY {
      type: $type, att: $att, proportion: $proportion, 
      contribution: $contribution, order: $order 
}]->(p) 
RETURN r
```

`CREATE (c)-[r:IS_CONTROLLED_BY]->(p)` 这种语句表示创建一条有向的关系。

创建的这个关系,也可以带一些属性,比如代码中的 `type` `att` 等。

</div>

!! Python SDK

安装:

```shell
pip install neo4j
```

代码示例:

```python
from datetime import datetime
import dataclasses

import neo4j
from neo4j import Transaction, GraphDatabase

@dataclasses.dataclass
class Person:
    id: str
    name: str
    created_at: datetime = None
    modified_at: datetime = None


def create_or_update_person_node(tx: Transaction, person: Person):
    now = datetime.now()
    props = dataclasses.asdict(person)
    result = tx.run(
        (
            "MERGE (p:Person { id: $id }) "
            "ON CREATE SET p = $created_props "
            "ON MATCH SET p = $modified_props "
            "RETURN p"
        ),
        id=person.id,
        created_props={**props, 'created_at': now, 'modified_at': now},
        modified_props={**props, 'modified_at': now})
    return result.single()

if __name__ == '__main__':
    driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "passsword"))
    with driver.session() as neo4j_session:
        person = Person(id=1, name="Zhiheng")
        neo4j_session.write_transaction(create_or_update_person_node, person)
```

NetworkManager 有几个组件:

* daemon,`NetworkManager.service`
* `nmcli`,命令行工具
* `plasma-nm`,Plasma 的桌面 GUI 工具
* dispatcher,`NetworkManager-dispatcher.service`,提供 hook 到 interface 状态变化时的能力

!! Dispatcher

示例:

```bash
# Run as root
cd /etc/NetworkManager/dispatcher.d/

vim 00-remove-default-route.sh

#!/bin/bash

IF=$1
STATUS=$2

if [[ "$IF" == "enp2s0" && "$STATUS" == "up" ]]; then
    echo "Hey I am up"
fi

chown root:root 00-remove-default-route.sh
chmod 755 00-remove-default-route.sh

systemctl enable NetworkManager-dispatcher.service
systemctl start NetworkManager-dispatcher.service
```

Dispatch 的细节参考:

* [[Arch Wiki|https://wiki.archlinux.org/index.php/NetworkManager#Network_services_with_NetworkManager_dispatcher]]
* `man NetworkManager`
* [[NetworkManager hook to update the routing tables for dual-homed systems|https://gist.github.com/dcode/bbf990ea781bed1e42d39e2351b6c432]]

!! DNS 配置获取

NetworkManager 用 `resolveconf` 这个工具来发 DHCP(?) 请求并把获得的 DNS 服务器配置加到 `/etc/resolv.conf` 中。默认会把所有网卡的 DNS 配置都加进来。

可以在 `/etc/resolveconf.conf` 中写配置,比如如果你不想要 `10.11.56.*` 的 DNS 服务器被加进来,可以:

```bash
name_server_blacklist="10.11.56.* 10.14.0.*"
```

!! 调试

```bash
systemctl restart NetworkManager
systemctl restart NetworkManager-dispatcher
```
!! Resources

* [[awesome-nextjs|https://github.com/unicodeveloper/awesome-nextjs]]
* [[pankod/next-boilerplate|https://github.com/pankod/next-boilerplate]] 看起来不错的 boilerplate

!! Warning

<<.warning "Next.js 的官方文档有时候会滞后。比如 3 月 10 号发布的 [[Next.js 9.3|https://nextjs.org/blog/next-9-3]] 中内嵌了 SASS 支持,但是文档在 3 月 12 号时仍然没有更新,导致我做了 [[无用功|Next.js: Integration: SASS together with PostCSS]]。">>
对于一个单页应用,往往会做好前后端分离,后端只负责提供 API 以获取数据,而不参与 HTML 生成。Next.js 作为前后端的中间层,它提倡预生成(pre-render)页面,以获得更好的性能和 SEO 效果。这就意味着,一个使用后端 API 提供数据、可以展示不同数据的网站,可能有这几种方式实现:

* 客户端拉取数据:即浏览器加载好页面框架,再发起异步请求拉取数据填充进来
* 服务端预生成好整个页面。考虑到 SPA 的本质是 ''不刷新页面'' 以获得更好的性能和交互性,一般是在第一次打开网站时加载服务端预生成好的页面,后续的请求则由客户端来获得数据

客户端方式一般通过组件的 lifecycle event 来做,比如在 `componentDidMount` 中拉取数据。但是注意 `componentDidMount` 只会在组件初始化时被执行,如果初始化后还有操作引起数据变化,则需要再次拉取。

对于服务端方式,Next.js 提供了两种方式([[官网文档|https://nextjs.org/docs/basic-features/data-fetching]]):

* Static Generation,即静态的内容生成,适用于类似产品官网或者个人博客这类内容网站。特点是不管页面模板还是内容都是预先生成好的,不会在用户访问时再度生成,优点是可以被 CDN 缓存以获得非常快的性能,缺点是无法生成动态内容(比如跟具体用户相关的内容)
* Server-side Rendering,即页面是在每次用户访问时生成的。这种方式性能稍差,但是动态性好

Next.js 的 [[官网文档|https://nextjs.org/docs/basic-features/data-fetching]] 详细描述了具体机制。注意 Next.js 也不限制你使用服务端方式的同时也使用客户端方式。

!! 具体场景下选择怎样的方式?

如果你想做个静态生成内容的站点,那无疑使用 Next.js 的 static generation 即可。

对于动态内容的站点,从内容量的维度:

* 如果页面中全部或者绝大多数内容都是动态的,建议使用 Next.js 的 server-side rendering
* 如果页面中仅有部分内容是动态的,且这部分内容并不是重点,那建议使用客户端方式

从技术角度:

* 如果你不愿意被限定在 Next.js 的 `getServerSideProps` 机制内,那可以考虑用客户端方式;但使用 Next.js 往往是为了用它提供的这些便利性

另外,考虑这样一个场景:你有一个显示图书简介的页面,它对应一个 Next.js 的 page。如果你想从显示第一本书变为显示第二本书,无论使用的是 `<Link>` 还是 `Router.push()` 时,只要 page 不变,''page component 就不会被销毁重建''。这意味着如果你用客户端方式来获取图书数据,你需要:

* 维护加载数据的状态(state),比如在 `componentDidMount` 中加载第一次的数据,在跳转到第二本书的事件处理函数中加载第二次的数据
* 自行处理 history,无法利用 Next.js 的 router 机制

如果你用 `getServerSideProps`,则加载数据逻辑都写在这个函数中就好。从第一本书跳转第二本书时,前端会访问 Next.js 的 server,以 JSON 方式获得服务端调用 `getServerSideProps` 的结果,作为 props 传入给 page component。整个逻辑写在一处就好,相较于客户端方式需要自行处理各种状态,心智负担明显变小。
Next.js 提供了两种机制让你加入全局的 CSS (或 SASS) 或者 JS 文件。

第一种是使用 `pages/_app.js`,描述在 [[这里|https://nextjs.org/docs/basic-features/built-in-css-support#adding-a-global-stylesheet]]。它仅能导入 CSS / SASS,无法导入 JS 文件。我不太喜欢这种方案。但是 Next.js 强制要求全局 CSS / SASS 只能通过这种方式加入。

第二种是使用 [[next/head|https://nextjs.org/docs/api-reference/next/head]]。不可用于导入 CSS,可导入 JS。可以写一个被每个页面所使用的公共 Meta 组件,然后在各页面使用它:

# 在 `pages/base/Meta.tsx` 中写入:<div>

```javascript
import React from "react";

import Head from 'next/head'

const Meta = () => (
  <Head>
    <script src="/js/font-awesome/all.min.js"></script>
  </Head>
)

export default Meta
```

这样会导入 Font-Awesome 的 JS 文件。

</div>

# 在各页面使用它,比如:<div>

```javascript
import React from "react";
import Meta from "pages/base/Meta";

class IndexPage extends React.Component<any, any> {
  render() {
    return <div>
      <Meta/>
      {# ... #}
    </div>
  }
}

export default IndexPage
```
</div>

!! See Also

导入 SASS 的初始设置在 [[Next.js: Import SASS File]]。
在 Next.js 中 [[导入 SASS 文件|https://github.com/zeit/next-plugins/tree/master/packages/next-sass]]。

下面以 [[Bulma|https://bulma.io/documentation/customize/with-node-sass/]] 为例,说明下具体怎么做。

# `npm install --save bulma`
# 安装 [[@zeit/next-sass|https://github.com/zeit/next-plugins/tree/master/packages/next-sass]]
# 新建 `styles/style.sass` 文件,写入:<div>

```css
@charset "utf-8"
@import "../node_modules/bulma/bulma.sass"
```

如果想对 Bulma 做修改和扩展,参考 [[CSS: Preprocessor: SASS: Customize Existing Library]]。

</div>

然后按 [[Next.js: Import Global Stylesheets / Script Files]] 使其成为公共样式表即可。
# 按官方文档 [[Getting Start|https://nextjs.org/docs/getting-started]] 初始化一个工程
# 做 TypeScript integration: `npm install --save-dev typescript @types/react @types/node`
# 导入 Bulma: [[Next.js: Import SASS File]]
# 加入 Babel 插件,实现绝对路径引用:[[TypeScript: Module System: Absolute Import]]

Next.js 中默认就用了 Babel。如果你想配置 Babel,就在项目根目录下建一个 `.babelrc`。一个典型的启用了绝对路径 import 的 `.babelrc` 长这个样子:

```json
{
  "presets": [
    "next/babel"
  ],
  "plugins": [
    [
      "module-resolver",
      {
        "root": ".",
        "alias": {
          "pages": "./pages",
          "components": "./components",
          "interfaces": "./interfaces"
        }
      }
    ]
  ]
}
```

!! Resources

* [[Next.js 官方文档|https://nextjs.org/docs#customizing-babel-config]]

!! See Also

* [[TypeScript: Module System: Absolute Import]]
* [[JavaScript: Module System: Absolute Import]]
我有一个场景,想把基于 SASS 的 Bulma 作为组件库,再引入基于 PostCSS 的 Tailwind CSS 作为 utilities。

<div class="box">

''注意:在折腾完这个方案的第二天后,我看到官方两天前发布了 Next.js 9.3,内嵌了 import SASS 文件的功能。因此我这下面的折腾部分白费了。''

变化在于:

* PostCSS 和 Tailwind CSS 仍然需要配置
* 不再需要安装 `@zeit/next-css` 和 `@zeit/next-sass`,不再需要编写 `next.config.js`
* `pages/_app.js` 照旧

</div>


整个过程折腾了很久,各种报错,最后才尝试成功。

首先按 [[Tailwind CSS: Integrated with Next.js]] 写好 `postcss.config.js` 以及 `styles/tailwind.css`。然后需要安装这两个插件:

```bash
npm install --save-dev @zeit/next-css @zeit/next-sass
```

这里是奇怪点。如果你不用 SASS(不安装 `@zeit/next-sass`),那么你也不需要 `@zeit/next-css` 就可以正常用 Tailwind CSS。但是一旦你要用 SASS,你就必须这两个插件都安装。然后配置 `next.config.js`,将这两个插件的参数注入进来:

```javascript
const withSass = require('@zeit/next-sass')
const withCSS = require('@zeit/next-css')

module.exports = withCSS(withSass({}))
```

<<.tip "这里亦可以使用 [[next-compose-plugins|https://github.com/cyrilwanner/next-compose-plugins]] 来避免较迷惑的嵌套写法。">>

最终的效果是:

# `pages/_app.js`:<div>

```javascript
// Note: 这里启用了 babel-plugin-module-resolver,因此不需要用相对路径
import 'styles/style.sass'
import 'styles/tailwind.css'

// This default export is required in a new `pages/_app.js` file.
export default function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />
}
```
</div>
# `styles/style.sass`:<div>

```css
@charset "utf-8"
@import "~bulma"
```
</div>
# `styles/tailwind.css`:<div>

```css
/* purgecss start ignore */
@tailwind base;
@tailwind components;
/* purgecss end ignore */

@tailwind utilities;
```
</div>

然后你可以在 JSX 正常使用 Bulma 及 Tailwind CSS 的 class。

<<.note "这个过程是在 Next.js 9.2.2 上完成的。不知道后续会不会产生变化。">>
根据 [[wiki|https://github.com/zeit/next.js/wiki/Global-styles-and-layouts]]:

> In Next.js there's no concept of "global layout". Every page in your Next.js project is complete and self-sufficient.

Next.js 里面没有 global layout 的概念。它的每个页面都是“自给自足”的。因此你要在每个页面 import header 和 footer,类似这样:

```js
import Meta from '../components/meta'
import Footer from '../components/footer'
export default () => (
  <div>
    <Meta />
    <p>hi there</p>
    <Footer />
  </div>
)
```

<<.warning "Next.js 9.3 开始将 `getInitialProps` 置为 deprecated,因此这个文档内容已过时。参考 [[Next.js: Data Fetching]]。">>

作为一个前后端分离的应用,页面展示的数据应该是单独通过 API 接口获取的。对于一个需要加载远程数据的页面,因为 Next.js 是带 SSR 的框架,它需要实现这几种场景:

* 如果用户是通过其他页面跳转到本页面,则在客户端发起 AJAX 请求获取数据
* 如果用户是直接在浏览器访问此页面,那么数据应该由服务端获取好并直接组装成 HTML 给到浏览器

因此,有别于 React 可以使用的 `componentDidMount()` 这种客户端的 lifecycle event 来做这件事情,Next.js 需要提供自己的机制,来确保上述两个场景都会去拉远程数据。它给出的是一个静态方法 `getInitialProps`([[官方文档|https://nextjs.org/docs/api-reference/data-fetching/getInitialProps]])。注意点在于,由于你的拉数据代码需要同时在客户端及服务端(Node.js)跑,因此你用的拉取的 API 需要是同构的(isomorphic)。官方提供的例子使用了 `isomorphic-unfetch`:

```javascript
import React from 'react'
import fetch from 'isomorphic-unfetch'

class Page extends React.Component {
  static async getInitialProps(ctx) {
    const res = await fetch('https://api.github.com/repos/zeit/next.js')
    const json = await res.json()
    return { stars: json.stargazers_count }
  }

  render() {
    return <div>Next stars: {this.props.stars}</div>
  }
}

export default Page
```

这是一个用 axios 的例子:

```javascript
class IndexPage extends React.Component<any, any> {
  static async getInitialProps() {
    const client = applyConverters(axios.create());
    try {
      const response = await client.get('http://127.0.0.1:8000/posts');
      return {
        things: response.data
      }
    } catch (error) {
      // Error handling
      console.log(error);
      return {
        things: []
      }
    }
  }

  constructor(props) {
    super(props);

    // Patterns from https://github.com/zeit/next.js/issues/1072#issuecomment-279014158
    this.state = props;

    // class methods are not bound by default. Bind this to methods.
    this.handleNewThing = this.handleNewThing.bind(this);
  }
}
```

同时看上面代码,如果你想把拉下来的数据当成 state 来用,那么你可以在 `constructor` 中给 `this.state` 赋值。

Next.js 默认使用 file-system routing。比如定义了页面 `pages/product/list.js`,那么你可以通过 `http://your-site.com/product/list` 来访问它。但是如果你想用自定义的 `http://your-site.com/product` 来访问,应该怎么做呢?

这里需要改两个地方,一个是客户端,一个是服务端。

客户端需要修改任何指向这个页面的 `<Link>` 元素,用 `href` 表示文件系统路径,用 `as` 表示浏览器中的路径,比如:

```html
<Link href="/product/list" as="/product">
  <a>List Page</a>
</Link>
```

这样你在页面上点击这个链接时,浏览器路径会变成 `/product`,页面也会正常渲染。但是当你此时刷新页面时,会报 404,加载不出来 `/product` 页面,因为 Next.js 它按逻辑去找 `pages/product.js` 找不到。此时你应该在服务端也写上映射规则。具体做法如下:

# 参考 Next.js [[文档|https://nextjs.org/docs/#custom-server-and-routing]],修改 `package.json` 及拷贝 `server.js`
# 在 `server.js` 中写上:<div>

```js
if (pathname === "/product") {
  app.render(req, res, "/product/list", query)
} else {
  handle(req, res, parsedUrl)
}
```
</div>
Next.js 9 开始有 [[内建的 TypeScript 支持|https://nextjs.org/blog/next-9#built-in-zero-config-typescript-support]]。

开始使用:

# 将任意 pages / components 中的 `.js` 文件改名为 `.tsx`(TypeScript 的 JSX 文件)
# `npm run dev`,会自动检测到并在根目录生成 `tsconfig.json`,包含一些合理的配置

Next.js 会在开发(`npm run dev`)和生产(`npm build`)时都做 TS 的编译期检查。
使用 nginx 的一些经验纪录。

!! `include` directive

nginx 的 `include` directive 可以用通配符,通配符甚至可以在中间(这是 Bash 能力吧?):

```nginx
include /usr/local/services/*/nginx.conf;
```

!! 反向代理配置示例

```nginx
server {
    listen          80;
    server_name     fm-api.oa.com;

    location /static/ {
        root    /usr/local/services/radio_api_server-1.0;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:13001;
        proxy_redirect off;
    }
}
```

设的几个 header 重要,但是还不清楚具体含义和作用。
|!Name |你凭什么做好互联网:从技术思维到商业逻辑 |
|!Author |曹政 |
|!Edition |N/A |
|!Release Date |December, 2016 |
|!ISBN-13 |978-7505738751 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

豆瓣链接:[[https://book.douban.com/subject/26915104/]]。

内容比较大白话,简单易懂,值得看看。

> 谈谈信息不对称
> 一直以来,大部分商业行为获利的一个重要基础是信息不对称。互联网时代一个巨大的谎言是,信息是公开透明的,但是很遗憾,这不是真的。
> 第一,一些非常具有价值的信息资源,并不在互联网流传,每个行业都有自己的小圈子,有些信息和资讯,只在小圈子里流通,对广大公众而言,这些信息是无从获知的。
> 第二,即便互联网存在一些非常有价值的信息,也是混杂在大量垃圾无效信息里的,甄别的技术难度极高。而且更严峻的是,即便是这种有价值的信息,往往也是以碎片化方式存在,你必须在大量的垃圾信息中寻找这样的有价值碎片,再一片片拼起来,这的确不是一件容易的事情。

需要多留意好的信息源。提升辨识信息的能力。

---

> 比如去看一个国家的移动应用免费榜单,看什么呢?看Top榜单应用类型分布,看这个的意义在哪里呢?你看他们国家的热门应用类型分布就可以知道他们当前处于什么阶段,下一步会走向什么阶段,从大的方向说,PC互联网和移动互联网都是经历三个阶段,但PC互联网的历程长,移动互联网的历程短。第一个阶段是工具类,你有台电脑,有个手机,不知道干吗,装东西玩。2000年左右最火的是什么网站,是下载站、破解站。移动互联网一开始也是,各种工具类应用先火,然后就是娱乐类,如听歌、玩游戏、看小说,几乎同时社交类就起来了,再往下生活类,各种电商、折扣、团购、订票订房、健康、理财等等。从PC互联网到移动互联网,都是这个顺序,当然这里还存在更细的顺序和逻辑(比如随着带宽和流量资费的下降,热点领域从音频到视频),有兴趣的朋友可以自行深挖一下。

大意还是日常要多观察各种现象。多提问题并进行调研。

---

> 未来的20年,互联网与各种行业的跨界与渗透会更加深入,所产生的机会和市场空间会远远超过现在的互联网规模,也许你做不到先知先觉,但是如果能体会到市场的差异性和信息不对称的巨大鸿沟,紧跟着先进者的步伐,捎带做一些向落后领域“搬砖”的事情,开上帝视角,获得丰厚回报,并不是很难的事情。

比如东南亚现在的互联网发展,可能跟中国好几年前就类似。有些经验可以复制。

---

> 几年前,我去丁香园做分享的时候,我提前一天把医疗行业的关键词挖掘了一下,把相关的热门网站的搜索排名过了一遍,这样我讲的内容虽然还是几个月前一个峰会上的内容,但是案例我都换成了他们熟悉的网站和企业。这其实是大部分技术人员分享时候的盲区,自说自话,完全不考虑受众。

这个例子很有启发性。''曹政多次提到用百度指数、百度知道来理解行业和人群。''

---

> 那么如何做到发现人才,挖掘人才,识别人才?第一,你要见更多的人,并尽可能认识更多的牛人。第二,有心胜无心,要不断总结牛人的特点和规律,每次要分析,要琢磨,要带着对人的判断来和人沟通,并不断通过事实的反馈来纠正自己的判断,进而提高判断力。第三,人才需要一定的发挥空间,也需要一定的成长空间,要敢放权,允许犯错。第四,人才往往有一定局限性,要用其长避其短。

「要不断总结牛人的特点和规律」这个我很赞同,而且不容易做到。

---

> 创业者的两种类型
> 我把创业者分成两大类型,一种是现实主义,一种是理想主义。
> 现实主义的典型是草根创业者,如早期的站长,没有特别的远大目标,但善于经营流量,流量变现思路清楚,不做亏本的买卖。如一些非常“山寨”的游戏开发者(非贬义),对热点的跟进能力强,执行效率高,快速迭代能力强,当然,原创能力基本没有。
> 现实主义者善于从0到1,将一件事情快速起步,有在低成本甚至0成本的情况下做大用户量和收入的能力。几个典型的草根创业的朋友,几年前就常跟我说:“其实我什么都不会,就会赚点钱,你看每个月赚个五六万、十来万,很轻松,但是没意义啊。”听这话我就恨得牙痒痒的,但是人家说的是真的。现实主义者的武器通常是SEO(搜索引擎优化)、ASO(应用商店搜索优化)、社交网络营销等等各种低成本的传播技巧,当然也有一些精通SEM(搜索引擎营销)的玩花钱买钱的游戏,这是现实主义中的数据分析流派。
> 但现实主义创业者往往缺乏远大的目标和对未来的方向感,对技术依赖度不高,对规模化运营缺乏信心,也不容易获得投资商的认可。我认识一个流量运营能力非常强的个人站长,但是他就总跟我抱怨,没有人愿意投资他。说实话,他非常善于用各种技巧做到相当高的用户量,以及每年几百万乃至上千万的收入,而且利润率还不低,但再往上是什么?他给不出目标,给不出愿景,他给投资人的大体只能是,你出多少钱,我每年分你多少红。算下来保证能赚钱,但这真不是投资人想要的。
> 理想主义创业者的构成则比较复杂,少不更事、热血澎湃的大学生,BAT的经理人,海归创业者,以及不差钱的富二代,等等。理想主义者有远大的目标和愿景,他们想的是100甚至1000以上的东西,但是很遗憾,大部分人不知道怎么从0做到1。他们的创业方案多是未来如何形成大数据的平台,如何挖掘用户深层价值,规模化之后资本运作的目标和诉求是什么……那么我说,第一批用户哪里来?居然没想过。他们的理解是,我的产品是有价值的,做出来放在那里,用户难道看不到吗?不用客气,用户真的看不到。特别是一些从互联网巨头公司出来创业的朋友,他们习惯于在原有的平台上做产品,随便做出一个产品就有足够的曝光度和测试用户。当他们发现,原来辛辛苦苦做出来的产品还需要自己去找种子用户的时候,才突然意识到原来自己的计划里从来没有这一条。理想主义者喜欢高举高打,所以占据媒体版面的通常是他们,成得风光八面,败得也轰轰烈烈。人家的目标,就算不是乔布斯,至少也是BAT。所以我们有时候说创业成功概率低。当然,一旦成了,这事还真不小。那么说到这里,我想大家都知道我想说什么了,既要脚踏实地,又要仰望星空。理想主义固然好,但如果你想让自己的创业团队活下来,创业初期更多还是需要现实一点,除非你真的不差钱。现实主义者也需要多看看未来,不能只是停留在掌握一些运营的技巧上,要舍得为未来投资,气魄要更大一点。

这段很有意思。

---

> 题外话,我前些年访问最频繁的网站大概就是爱站了,有段时间几乎每天都上去,主要就两件事,一个关键词挖掘,一个百度排名分析,来回反复,能够短时间了解一个领域或一个产品的用户诉求,以及领域内网站的流量和价值排名。如果你善于使用爱站,其实你对用户需求、对竞争分析就会上一个台阶。当然,如果对其中的数据不放心,也可以同时用百度指数、360的爱搜指数做对比。

---

第五章中提到的,创业项目的单点启动、单边启动、双边启动、多边启动及借势启动很我启发。推荐有空翻看。

> 冷启动除了单点启动、单边启动、双边启动、多边启动,其实还漏了一个,即所谓的零点启动,也就是不需要任何用户,也不需要任何客户,只需要把握现有商业系统的买入和卖出策略,就可以获得收益,这就是所谓的套利玩家。

套利玩家可能适合于我当前的状态。

---

> 伊光旭(“冷笑话精选”创始人)最开始是借助豆瓣搞营销号、拉粉丝,豆瓣当然也是个不错的平台,但是毕竟规模有限,然后微博兴起,他立即研究微博的传播规律,去转战微博;当微信开始兴起的时候,他又第一批转战微信,在刚开始微信公众号还很稀缺的时候,以最低成本获得了惊人的粉丝订阅数,这就是跟对了势。现在人家身价几个亿,挂上新三板,巨大的商业价值已经体现无疑。

看「传播规律」。

---

> 用户获取成本是创业过程中最容易被忽视也是最关键的一个数据指标。这个没有想清楚,后面的营收测算全是扯淡。
> 执行能力其实比概念和想法更重要,证明自己的执行能力比描述辉煌的未来更重要。而商业计划书里,最能证明自己执行能力的,是对时间和成本的精确测算。

---

> 需求往往藏在搜索引擎里
> 以美图秀秀为例,最开始他们做的一个小工具叫作火星文输入法,当时流行过一段时间,用户量特别大,都是非主流的小孩子。但这个东西后来巨头也在做,可是商业路线不清晰,他们就准备转型。可是有这么多非主流用户,那么做什么好呢?吴总就做了特简单的一个事情,搜索了一下非主流的相关词,结果发现,非主流图片和非主流头像的搜索量,特别高。这是强需求,美图秀秀最开始的时候,刚引爆市场的时候其实是通过做一些摇头娃娃等头像生成工具,迅速在即时通讯上传播起来的。而当时市场领先的光影魔术手,还根本没意识到草根网民的需求在哪里。
> 分析搜索指数,查阅百度知道,是寻找用户需求的一个重要途径,这事我再强调一次。

很好的例子。

---

> 比如优秀的网站设计者从设计之初就已经考虑了SEO,而不是上线之后;优秀的App设计者从开始定义产品就已经思考ASO(应用商店搜索优化),而不是上线之后,这就是流量运营的概念要深入产品设计;社交分享功能和活动结构设计,在产品设计初期就应该考虑到框架内,而不是运营的时候再去提需求。

我觉得能在产品初期就考虑好传播就非常赞。

---

> 问题1:产品发展了很多用户,但活跃度不高,如何知道用户流失的原因并提高活跃度。
> 请注意背景,这是一个to B的业务,我的观点是,其实不要太关注流失的用户,很多用户就是来浅尝辄止的,看一下你的产品,试试而已,除非你有明确的证据证明这些用户流失后使用了竞争对手的产品,否则可能他们根本就不是用户。我反而建议,去看在这个平台上做得最好的用户,他们还需要什么,他们对这个平台更多的期望是什么,让最好的用户做你的死忠,把他们培养壮大,这可能会带动大量的其他典型用户。
> 第一,用户数多少其实有时候被过分强调了,其实没有忠诚度的用户根本不是用户。有死忠的核心用户,对一个创业公司来说是特别有意义的。当时4399做社区,看搜狐白社会靠玩游戏送房子带来每天几百万活跃用户的时候,我们都当它是典型的对手。李兴平说,这没用,这些用户没有忠诚度,活动一截止就流失了,后来果然。没有忠诚度的用户并没有什么价值。

---

> 第二步,足够强的曝光度
> 这句听上去像是废话,做曝光,买广告位也好,靠口碑传播也好,靠SEO推广也好,不就是这些招吗?
> 但其实,就是这么个简单的东西,很多人没有真正想明白,你做了曝光,是不是强调了品牌;在你的内容里,特别是容易分享的内容里,是不是强调了品牌。

如果我做个人品牌时,应该仔细考虑这一点。

> 柳焕斌是SEO高手,他强调的曝光途径是通过搜索优化来做的,除了搜索优化本身的技巧外,还有就是在搜索结果页中,你的品牌的曝光强度。
> 大部分SEO顾问会告诉你,如何强化热门词以及行业词,如何想办法在标题和描述中重复热门词,从而提高热门词的排名,但很少有人会提醒你,强调热门词固然不错,但要用热门词来修饰你的品牌词,品牌词的强度一定是优先于热门词的。2010年之前,麦包包可以说是“出淘”最成功的淘品牌,而且其品牌词百度指数在所有淘品牌里遥遥领先。也就是说仅仅靠品牌自然搜索流量可以节省每年相当于上千万乃至数千万的百度竞价排名的广告投入。
它个人网站上的 [[about page|https://sobolevn.me/about/]] 最好地描述了他做了什么。

俄罗斯人,创业者,编程高手。

他开公司做外包服务 [[wemake.services|https://wemake.services/]],并且将其研究的研发流程 Repeatable Software Development Process(RDSP)全部放在了 [[网站|https://wemake.services/meta/]] 上。内容非常简单扼要,将其运作方式、定价规则、招募规则、研发流程等一一详述,''非常值得一读''。

除了外包服务,他也提供 [[代码审查|https://drylabs.io/]] 的服务。

博客和演讲视频中有大量编程内容。


!! node-gyp

[[node-gyp|https://github.com/nodejs/node-gyp]] 是 Node.js 用来编译本地扩展的命令行工具。它自带了 gyp 作为生成构建系统文件(比如 Makefile,Visual Studio project,XCode project)的工具,并且可以针对不同的 Node.js 版本下载不同的头文件用于编译。

依赖 Python 2.7(3.x 不支持,应该是 gyp 使用的)和本地 C/C++ 编译器工具链(如 GCC,Visual C++)。

<<.tip "Node.js 源码中有个 [[扩展的 Hello World 示例|https://github.com/nodejs/node/tree/master/test/addons/hello-world]],可以用来尝试 node-gyp 的功能,同时看看 binding.gyp 怎样写。不过感觉这些本地扩展也不好写,需要懂一些 V8 的 C++ 库。">>

!! gyp

[[gyp|https://gyp.gsrc.io/index.md]] 是个 Meta-Build system: a build system that generates other build systems.

它本来是 Google 为 Chromium 生成不同平台的生成系统文件而编写的,后来开源了出来。

从它官网上看,它的很多功能点跟 CMake 相似,有时间可以看看它们的 [[比较|https://gyp.gsrc.io/docs/GypVsCMake.md]]。CMake 让我感觉不够优雅,可能 gyp 有它的优点。
我的 Arch Linux 默认使用最新版的 Node.js,这会导致有些库使用不了。原因多种多样,遇到过新版 Node.js 带的 v8 的头文件不一样,导致 node-gyp 编译失败的。

所以推荐使用 nvm 来安装并使用 LTS 的 Node.js。安装方法在 [[Arch Wiki|https://wiki.archlinux.org/index.php/Node.js#Alternate_installations]]。使用:

```
nvm install --lts
nvm use <your-lts-version>
nvm install -g yarn
```

这样安装的 yarn 才不会使用系统的 Node.js。不需要额外的 `PATH` 设置,nvm 会帮你搞定。

|!Name |非暴力沟通 |
|!Author |[作者] 歇尔·卢森堡 (Marshall B.Rosenberg)  [译] 阮胤华 |
|!Edition |N/A |
|!Release Date |January, 2016 |
|!ISBN-13 |978-7508086156 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

这本书的理论并不难懂,甚至每个人多多少少已经应用上了相应的方法。按照它的理论出发,日常沟通交流时多去思考,也能得出书中详细描述的行为指南。

这本书让我觉得很好的是,它的示例精致不罗嗦,行为指南清晰可实践,作者的表达也践行了它所说的不暴力。

但是问题在于,本来一两章就能讲完的道理,却讲了一本书。我觉得作者太过于强调具体的实践场景和方法论,但是本质上要做到非暴力,需要的是爱和同理心。方法论只能让你的行为像非暴力,或者一定程度上获得同理心,但并不是关键。

看完第五章后没有继续看。

笔记在微信读书中,结合上下文回顾更佳。
! Pushbullet

Pushbullet 是一个跨平台的消息同步工具,也能同步其他手机 App 的 Push 消息。它还提供了易用的 API。

!! API

Pushbullet API Access Token 纪录在 Enpass 中。

!! Python Libraries

有人将它的 API 封装成 Python 版本,非常适合日常做消息通知使用。Python 库在 [[randomchars/pushbullet.py|https://github.com/randomchars/pushbullet.py]]。

代码例子:

```python
from pushbullet import Pushbullet

api_key = 'See Enpass'
pb = Pushbullet(api_key)

title = 'Hello'
body = 'world'
push = pb.push_note(title, body)
```

同时还有人用 Python 写了 CLI 工具:[[GustavoKatel/pushbullet-cli|https://github.com/GustavoKatel/pushbullet-cli]]:

```bash
$ pip install pushbullet-cli
$ pb set-key
$ pb push "your content"
$ echo "something" | pb push
```

! Server 酱

一个 [[在线服务|http://sc.ftqq.com/3.version]]。往 `http://sc.ftqq.com/<token>.send` 发一个 GET / POST 请求,参数 `text`, `desp` 表示标题、正文,微信上就能收到通知。

```bash
curl http://sc.ftqq.com/$TOKEN.send?text=Notification&desp=things_done
```

Token 纪录在 Enpass 中。
! npm 基础

`npm help <command>` 命令会显示 `npm` 的 man page,内容非常详细。

!! 安装 / 卸载包

安装全局包:

```bash
$ [sudo] npm install -g <package_name>

$ # Example:
$ sudo npm install -g http-server
/usr/bin/http-server -> /usr/lib/node_modules/http-server/bin/http-server
/usr/bin/hs -> /usr/lib/node_modules/http-server/bin/http-server
/usr/lib
└── http-server@0.9.0 
```

但好的实践是,''不要'' 在 `/usr/lib/node_modules/` 下安装东西,防止跟 pacman 安装的某些包冲突。可以这样做:

# `npm config set prefix "${HOME}/.local"`
# 在 `~/.zshrc` 中增加 `${HOME}/.local` 到 `PATH`

安装本地包:

```bash
$ npm install <package_name>
```

卸载软件包:

```bash
$ npm remove [-g] <package_name>
```

!! 更新包

你可以用 `npm outdated` 命令查看哪些包不是最新的:

# 对于全局环境,它会检查全部全局包是不是最新的
# 对于本地项目环境,它会在 package.json 限定的范围内检查包是不是最新的
#* 比如 package.json 定义了库 A 的版本应该是 14.x.x,那么假如库 A 的最新版本是 15.x.x,`npm outdated` 也只会显示 14.x.x 中的最新版本

更新单个包:

```bash
$ npm install [-g] <pacakge_name>
```

更新全部包:

```bash
$ npm update [-g]
```

!! package.json

参考 [[官方文档|https://docs.npmjs.com/getting-started/using-a-package.json]]。

一个 package.json 至少包含 `name`, `version` 字段。可以用 `npm init --yes` 来创建一个最简的 `package.json`,用 `npm init` 交互式地创建一个详细 `package.json`。

`dependencies` 与 `devDependencies` 分别表示运行时 / 开发时的依赖,在开发阶段时,你可以用 `npm install <pacakge_name> --save/--save-dev` 来向这两个字段增加一个新的包。当你拿到一份其他的人源码,你进去它的目录中 `npm install` 时,默认会把 `dependencies` 跟 `devDependencies` 中的包都安装进去,除非你给 `npm install` 指定了 `--production` 选项,或者 `NODE_ENV` 环境变量为 `production`。

同理,删除包后如果想要它也在 package.json 中被删除:`npm uninstall --save/--save-dev <package_name>`。

`scripts` 中有一些脚本有 alias,比如 `npm start` 运行的是 `scripts` 中的 `start` 脚本;`npm test` 同理。

!! 查看已安装的包

```bash
$ npm ls [-g]
$ npm ls [-g] --depth=0
$ npm ll [-g]
```

!! 淘宝镜像

设置 `register` 配置以使用淘宝镜像:

```bash
$ sudo npm config -g set registry "https://registry.npm.taobao.org/"
```

设置全局配置,使得 `npm install` 时,无论装本地包还是全局包都使用这个镜像。

! [[SciPy Lecture Note - Numpy Part|http://www.scipy-lectures.org/intro/numpy/index.html]]

这个教程和简单明了。是 ''最推荐'' 的入门教程。

PDF:

* `scipy-lecture-note-numpy-1.3.1.pdf`
* `scipy-lecture-note-numpy-1.3.2.pdf`

同时 `Hypothesis activity.pdf` 中纪录了笔记。

! [[Numpy tutorial - Nicolas P. Rougier|http://www.labri.fr/perso/nrougier/teaching/numpy/numpy.html]]

这个教程分别用 ''非 NumPy'' 和 ''NumPy'' 实现了两套 Game of Life 的模拟过程。NumPy 版本实现更简单且运行效率高。

主要用到的是 Broadcast 机制,以及简要地说明了 ''Vectorization'' 的理念。还提供了大量的练习。同时提供了很多插图,很形象地说明了一些 NumPy 函数的作用。缺点是例子太单薄,不够展现 NumPy 更多的理念和用途。
内容:

# 核心概念:[[OAuth 2.0: Concepts]]
# 安全考量:[[OAuth 2.0: Security]]

案例:

* [[OAuth 2.0: GitHub Example]]

!! Reference

这种偏专业的领域,书本上的内容可能不够有说服力,可以考虑从有这方面实践的公司获得信息:

* 需要提供 OAuth 接入的大型互联网服务,如 [[Google|https://developers.google.com/identity/protocols/oauth2]]
* 需要提供认证和授权能力的 SASS 平台,如 [[Auth0|https://auth0.com/docs/architecture-scenarios/spa-api/part-1]]

在 O'Reilly 的 [[学习平台|https://learning.oreilly.com/]] 上搜索 OAuth,有一系列不错的书籍。我主要参考的是:

* [[Advanced API Security: OAuth 2.0 and Beyond|https://learning.oreilly.com/library/view/advanced-api-security/9781484220504/A323855_2_En_4_Chapter.html]]:专业
* [[Solving Identity Management in Modern Applications|https://learning.oreilly.com/library/view/solving-identity-management/9781484250952/A475485_1_En_5_Chapter.html]]:专业
* [[Mastering OAuth 2.0|https://learning.oreilly.com/library/view/mastering-oauth-20/9781784395407/]]:写得比较浅
!! 设计理念

根据 [[wikipedia|https://zh.wikipedia.org/wiki/%E5%BC%80%E6%94%BE%E6%8E%88%E6%9D%83]]:

> 开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

[[Mastering OAuth 2.0|https://learning.oreilly.com/library/view/mastering-oauth-20/9781784395407/]] 写道:

> OAuth 2.0 is a protocol that allows distinct parties to share information and resources in a secure and reliable manner.

!! 解决的问题

OAuth 2.0 解决两个问题:

* 联合身份(federated identity):允许用户使用另外一个服务的帐号登录此服务。比如用微信登录京东,用 Google 登录 Medium。这使得用户只需要维护一个帐号
* 授权(delegated authority):授权一个服务以用户的身份去访问它在另外一个服务中的信息。比如你可以授权 LinkedIn 帐户访问你的 Google 联系人这种非公开的信息

假如在有 OAuth 2 之前,应用 GoodApp 想访问你的 Facebook 联系人列表,那它不得不向你询问你的 Facebook 帐户的用户名密码。这样引起的问题是:

* 你给了 GoodApp 对你的 Facebook 帐户做任何事情的能力
* GoodApp 会储存你的密码,并且它可能由于被黑导致你的密码泄露
* 除非你修改你的 Facebook 密码,否则你没有办法收回这份授权

有了 OAuth 2 之后:

* 你不再需要给 GoodApp 你的 Facebook 密码,而是通过 Facebook 授权给一个 token 到 GoodApp
* 你可以限定 GoodApp 能访问你的哪些 Facebook 数据,比如只能读取好友列表
* 你可以随时在 Facebook 这边收回对 GoodApp 的授权

更通俗的理解是:''用户的密码是全权限的 token,token 是只有部分权限的密码''。

!! Components

理解 OAuth 的具体流程之前,先理解下它的几个组成部分:

* Resource Owner:资源的所有者,一般指用户;比如某个用户它拥有它的 Facebook 好友列表(资源)
* User Agent:用户的设备;比如浏览器、手机 native app
* Client:想要使用用户的资源的客户端或服务;比如上述例子中的 GoodApp,想获得用户的 Facebook 好友列表
* Authorization Server (AS):向 client 发放 access token,使得 client 可以访问具体资源服务器
* Resource Server (RS):即资源所在的服务。client 通过 AS 发放的 access token,在此处可以使用实际的资源

Authorization server 及 resource server 可能实现在同个域名也可能分开,但是它们背后的服务商一般是一样的,比如同样属于 Facebook。

!! Flow

OAuth 2 提供了 4 种授权类型(authorization grant type):

* ''Authorization code grant''
* ''Implicit grant''
* Resource owner password credentials grant
* Client credentials grant

第一种 authorization code grant 是最常见的,其次是 implicit grant。剩余的两种不做讨论。对于前两种方式,核心的点是:

* Client 预先在 AS 上注册了它的服务;AS 会给 client 一个 client ID 来标识它
* Client 最终要通过 AS 获得一个 access token,才能 RS;而 AS 需要用户允许才给 access token

!!! Authorization code grant

流程如下:

{{ authorization-code-grant-type }}

绝大多数互联网产品都采用这种流程,比如 Google、Twitter、GitHub。看这个 GitHub 的 [[例子|OAuth 2.0: GitHub Example]] 来深入理解这套流程。

{{ OAuth 2.0: GitHub Example }}

仅当存在 client 且它可以安全地保存信息时(包含 client secret 及 access token),才应该使用 authorization code grant 方式。假如它无法安全保存信息:

* client secret 被盗会导致黑客可以以此应用身份欺骗用户
* access token 被盗则黑客可以以用户身份做任何操作

怎样界定有无安全存放信息的条件?

* 如果你的 client 是纯 JS 应用,没有后台服务器,那它被认定为不满足。因为 JS 的 Storage API 和 cookie 都是不安全的,可以被外部读取的
* 如果你的 client 包含一个后台服务,一般被认为是满足的。后台可以通过保护数据库和使用各种加密方式来保证数据安全
* 如果你是在使用某个手机客户端(比如 GitHub 第三方客户端来访问 GitHub),这个客户端如果用了系统提供的安全能力(比如 [[Android|https://developer.android.com/training/articles/security-tips]]),则可以认定为是满足的

如果不满足的话,需要走 implicit grant type 流程。

!!! Implicit grant type

流程如下:

{{ implicit-grant-type }}

对比于 authorization code grant,这个流程的特点在于少了 client application,因此也没有哪一环可以安全地存放用户的 access token,所以 access token 直接给到了 user agent,并且一般会设置一个比较短的(如 1 小时)的有效时间。User agent 拿到 access token 后直接使用。

这种流程在互联网服务中比较少见,用户体验也会相对较差。
这里演示一个基于 GitHub 的 OAuth 应用,在获取用户授权后显示用户所有仓库信息的例子。GitHub 的 [[官方文档|https://developer.github.com/apps/building-oauth-apps/]] 对这个过程有详细地说明。我做了一个 YouTube 视频来描述这个过程:

<iframe width="560" height="315" src="https://www.youtube.com/embed/2-UtCzrRJpQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

代码及预编译好的多平台可执行文件在 <<coslink "这里" "/files/projects/github-oauth-client-application.zip">>。
RFC 6749 中有一节详细描述了 [[安全问题|https://tools.ietf.org/html/rfc6749#section-10]]。我没有仔细去看。这里讲述一下在 authorization grant type 流程中对 `state` 的运用。

> "A CSRF attack against the client's redirection URI allows an attacker to inject its own authorization code or access token, which can result in the client using an access token associated with the attacker's protected resources rather than the victim's (e.g., save the victim's bank account information to a protected resource controlled by the attacker)." Continue reading from the source [[RFC-6749|https://tools.ietf.org/html/rfc6749#section-10.12]].

`state` 的作用即是防止用户授权过程中,黑客想办法将用户的 authorization code 或者 access token 换成它自己的。结合前面的 ''联合身份''(federated identity)场景,这意味着用户在 client application 以它自己的身份,看到及操作黑客在第三方服务中的数据。这是一种 CSRF。

而 `state` 的作用即是在第三方服务 callback 时,黑客无法伪造出一样的 `state` 来防范对于 authorization code 的篡改。试想下不存在 `state` 时的这个流程:

# 正常用户 A 登录(login)了 client application
# A 去到了黑客 E 的恶意网站,不小心访问了 E 构建了 `/callback` 链接;而 `/callback` 链接中带的 authentication code 是 E 的
# 于是 A 访问了 `/callback`。由于没有 state 可以校验,client application 并不知道这个链接是它自己生成的还是恶意的。它拿这个 `/callback` 中的 code 换取了 access token,并以为这个 access token 是 A 的
# A 在 client application 上操作第三方服务时,用的是黑客 E 的 access token,这可能造成信息泄漏

参考:[[State parameter - Pipedrive Public API|https://pipedrive.readme.io/docs/marketplace-oauth-authorization-state-parameter]]。

|!Name |论中国 |
|!Author |[美]亨利·基辛格 [译]胡利平 等 |
|!Edition |N/A |
|!Release Date |July, 2015 |
|!ISBN-13 |9787508651903 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

豆瓣链接:[[https://book.douban.com/subject/26607419/]]。

如想回顾本书内容,上微信读书重读。

!! 评论

整书行文太流畅了,跟看小说一样简单,脉络分明,将作者对中华文化的理解贯穿全文。而且译者的水平也非常高,时不时让我觉得这根本就是中国人写的书。实在是很了不起。

历史盲的我,没想到是从一个外国人的书来了解自己的民族和历史。看这本书之前,我不理解中国古代是如何定位自己和周围邻国的关系,也好奇过为何蒙古人在元朝统治了中国,但为何汉族及其文化仍然是中华民族的主要组成。基辛格以他对中华文化的深厚底蕴给我了解答。

基辛格与中国高层接触非常多,书里面对于几代领导人的刻画非常形象立体。比如第一次台海危机时,书中描述道:

> 毛泽东后来解释说他的战略其实更为复杂,因为他清楚大陆的军队在美台协力抵抗面前无力攻占金门和马祖。他对赫鲁晓夫说,他根本无意占领那些岛屿,他是要通过威胁那些岛屿来防止台湾切断与大陆的联系: 我们只是想显示一下我们的潜力。我们不希望蒋离我们太远了。我们想让他待在我们够得着的地方。让他继续占领金门马祖意味着我们的岸炮和空军可以打他。如果我们占领了该两岛,我们就失去了随时让他不得安宁的能力。

很多类似的描述,都体现了当时的执政者面对复杂困难的国际形势时的深谋远虑。结合《邓小平时代》和网络上的一些视频片断,我对领导人的理解不再是电视里面的一副官腔,而有了一些崇敬之情。

前几天看到新闻,说本书作者基辛格博士被特朗普政府解职。于是查了一下,发现基辛格已有 97 岁高龄……希望老人家晚年身体健康,感谢他写了这么有趣的作品。
操作系统。[[Linux]]、[[Windows]] 下只放具体操作系统的使用、运维经验等,而 ''操作系统本身的知识''(比如 CPU 调度、虚拟内容空间等),即使大多数以 Linux 作为研究对象,也放在这个节点下。

!! 参考

关于 Linux 操作系统的知识、API 如何使用等,查看 [[The Linux Programming Interface]] 一书是最好的选择,比网上的博文、manpages 等更好理解。

[[Operating System Concepts]] 在讲解操作系统概念时非常好理解;但他没有很深入到 Linux / POSIX API 中,可以结合 [[The Linux Programming Interface]] 一起看。

[[OSTEP]] 据说很有趣易读,但是我感觉不如上面两本讲得通透。
|!Name |Operating System Concepts |
|!Author |Abraham Silberschatz, Greg Gagne and Peter B. Galvin |
|!Edition |10th |
|!Release Date |May 2018 |
|!ISBN-13 |978-1118063330 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |









操作系统的核心功能:

* ''虚拟化'':将物理硬件抽象成通用的、易用的虚拟形式。这里的虚拟化并不是指 KVM 等虚拟化技术
* 提供了 ''API'' 供开发者操作这台「虚拟机」的方方面面
* ''管理硬件资源'',提供给应用程序高效和公平使用的能力

设计目标:

* ''抽象'':抽象物理设备、抽象磁盘成为文件系统等等,为使用者提供便利
* ''高性能'':OS 带来了抽象,势必也会带来一些性能上的损失(overheads),比如更多的指令消耗更多的时间、占用更多的内存或者磁盘。OS 需要尽可能减少这部分损耗
* ''保护'':使不同应用程序之间不被相互影响,保护系统本身不被非法侵入
* ''高可靠性'':操作系统需要保护高可靠性,不停机工作

此外还有一些特定场景的设计目标,比如 ''节能(enery-efficiency)'' 对于一些 IoT 设备来讲就相对重要。''安全(security)'' 和 ''适合移动平台(mobility)'' 也有其各自的场景。

OS 简要发展史:

# 一开始计算机只是一些 ''库'',方便开发人员使用
# 后来开始产生 ''内核态和用户态'',使得一些核心的操作(比如 I/O、访问物理内存等)仅在内核态下可用,而用户需要使用系统调用(system call)来使 OS 帮你做这部分能力。这种隔离避免了不同用户态程序各自操作系统核心资源带来的混乱
# 微机出现后,开始有了 ''并发'' 的概念,使得操作系统和硬件可以同时服务于多个应用程序
# 当代 PC,集前人智慧,成熟完善,但对新的场景仍有发展,比如移动平台

内容来自 [[OSTEP: Ch2: Introduction]]。
操作系统在运行用户程序时需要做到几点:

* ''限制用户程序的操作'',比如用户程序无能直接访问底层硬件,用户程序读写文件时需要经过操作系统文件系统的权限管理
* ''保持对系统的控制'',比如操作系统一旦开始运行用户程序,需要有能力使 CPU 运行回操作系统的代码

!! 限制用户程序的操作

操作系统为了实现一些统一的调度、安全等,''不会直接开放用户直接做核心的操作''。最简单的例子是,用户程序无法直接访问硬盘设备,而需要通过操作系统提供的 API (`open()`, `read()` 等)操作文件系统,在经过权限检查后才可以访问。如果操作系统不做这层限制,它就无法抽象出文件系统。

因此操作系统发展出 ''user mode'' 及 ''kernel mode''。上文提到的核心操作都必须在 kernel mode 下由操作系统本身的代码完成。而用户程序想使用这些核心操作时,是通过调用 OS 提供的 ''system call'' 来实现的(后面简称为 syscall)。syscall 看起来跟普通函数很像,但调用它时,会触发系统进入 kernel mode 执行相应操作。

这一过程需要 ''硬件配合''。syscall 事实上也是一些长驻在内存中的代码,也有相应的入口地址;当用户调用它时,由于安全考虑,用户程序并不能知道它的内存地址,因此需要硬件来配合执行相应的程序。事实上操作系统启动时,会初始化一个 ''trap table''(也叫 trap handler table),把不同的 syscall 的号码和相应的 handler 地址交给 CPU 记忆。当用户程序调用 syscall 时,用户程序触发一个 trap CPU 指令,并附带相应的号码;CPU 便从 trap table 中找到相应的 handler 去执行。因为注意的是,syscall 也有自己的 stack(kernel stack)和寄存器值等,因此从用户程序切换到 syscall 的过程了也涉及 ''上下文切换''。整个过程如下:

[img width=600 [os-syscall-procedure]]

!! 保持对系统的控制

当 CPU 在执行应用程序时,它自然就没有执行操作系统的代码。那怎样 ''使操作系统重新获得控制权'',而不是让应用程序一直运行呢?有两种方式:

* 协作式的(cooperative):等待应用程序调用 syscall 时,将控制权回到操作系统。早期的操作系统有这样设计的,同时也有专门的指令使应用程序就算不调用 syscall 也可以把控制权给回
* 非协作式的(non-cooperative,也称抢占式):实现一套操作系统和硬件配合的 ''中断定时器''(timer interrupt),每隔一段时间(也称处理器时间片,processor time slice)将控制权交回操作系统

整个流程如下,其中 k-stack 指 kernel stack,proc_t 指 process table:

[img width=600 [os-timer-interupt-procedure]]

结合此图和上图可以发现,这个过程中有一个核心是上下文切换(context switch)。''有两个场景需要上下文切换'':

* ''从用户态变为内核态时'',保存用户态进程的 reg 和 stack,恢复 kernel 的 reg 和 stack
* ''切换进程时'',保存当前进程的上下文,恢复将被运行进程的上下文

值得注意的是,''操作系统和硬件都会做上下文切换''。硬件做的可能更底层,比如只包含寄存器;操作系统应该会保存更多进程的状态数据。
I/O 操作分为 [[blocking 和 nonblocking|OS: I/O: Blocking and Nonblocking]]。Nonblocking 针对于同时处理大量 fd 的情况,比如 server;同时需要搭配这些技术来实现高性能、大规模的 I/O 处理:

* [[I/O 多路复用|OS: I/O: Multiplexing]],比如 `select()` `epoll()` `kqueue()` 等
* Signal-driver I/O:实现起来比 I/O 多路复用复杂,不流行,不做研究
* [[POSIX Asynchronous I/O|https://docs.oracle.com/cd/E19683-01/816-5042/auto37/index.html]]:暂无研究
默认情况下,对一个 fd 做 `read()` `write()` 时,如果没有合适的数据读取、缓冲区空间不足以写入相应内容时,进程会阻塞住等待 I/O 完成,操作系统会把进程置为 sleep 状态并执行其他进程。

这在 server 场景下很不实用,因为一个 server 要处理大量的连接(即大量的 fd),如果读写一个 fd 就被 block 住,就无法处理大量的连接。

于是 Linux 提供了一个 flag `O_NONBLOCK`。对 fd 设置上该 flag 后,读写时如果数据未 ready,则操作系统不再阻塞,而是返回 `EAGAIN` 或是 `EWOULDBLOCK` 错误(这两者可以认为是一样的)。

如何对 fd 设置上 `O_NONBLOCK` 呢?

* 对于通过 `open()` 获得的 fd,在 `open()` 的参数中传入 `O_NONBLOCK`
* 对于不是通过 `open()` 的,比如 FIFO、socket 等,使用 `fcntl()` 来设置

非阻塞的 fd,如果不配合 [[I/O 多路复用|OS: I/O: Multiplexing]] 是没啥意义的。因为:

* 如果你用一个无限的循环不停去查询该 fd 的状态,会浪费大量的 CPU
* 如果你在循环中加入等待间隔,则对 fd 的处理不够及时

这都会使性能无法被利用好。
I/O 多路复用指的是监听多个 fd,并在其中任一 fd 可读写时通知进程进行操作。API 有:

* `select()` `poll()`:性能差,可移植性好
* `epoll()`:Linux 专有 API,性能好
* `kqueue()`:BSD 专用 API,性能好

这里主要讨论 `select()` `poll()` 及 `epoll()`。

在继续之前,要先讲讲两种不同类型的 readiness notification,分别是水平触发(level-triggered notification)以及边缘触发(edge-triggered notification)。

!! Level-triggered and edge-triggered

做了个视频讲解:

<$videojs controls="controls" fluid="fluid">
  <source src=<<cosurl '/files/videos/2021/03/io-readiness-notification.mp4'>> type="video/mp4">
</$videojs>

!! select 和 poll

这两个函数功能类似,`poll()` 功能多一些,签名分别是:

```c
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
```

`select()` 是把读、写、出错的 fd 分别以 3 个 set 传入;`poll()` 则是将它们都合并成一个数组,再通过数组元素的属性来区分。

!!! 什么情况下 fd 才算是 ready?

''仅在可以不 block 地进行 `read()` / `write()` 的情况下''。对于不同类型的 fd(如文件、FIFO、socket)等,ready 代表的含义也不同。参考 The Linux Programming Interface 一书第 63 章。

!! epoll

不同于 select 及 poll 需要不停地传入关心的 fd 列表,epoll 将该列表维护在内核中。epoll 的 API 如下:

```c
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);
int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);
```

`epoll_create()` 会返回这个 epoll 的 fd;再通过 `epoll_ctl()` 将关心的 fd 加入进来:

```c
int epfd;
struct epoll_event ev;
epfd = epoll_create(5);
if (epfd == -1)
    errExit("epoll_create");
ev.data.fd = fd;
ev.events = EPOLLIN;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, ev) == -1)
    errExit("epoll_ctl");
```

之后调用 `epoll_wait()` 时,系统会把 ready 的 fd 通过参数 `evlist` 返回。

!! 性能对比

[img width=800 [linux-io-multiplexing-performance-comparison]]

可以看出 select / poll 的 CPU 消耗,基本跟监听的 fd 数量成正比;而 epoll 则不太受数量影响。性能差距非常大。

''对于 select / poll'',kernel 在判断哪些 fd ready 时,

* 对于 select,kernel 需要扫描 [0, nfds-1] 一共 nfds 个 fd,即使三个 fd_set 中只有一个值为 nfds-1 的 fd
* 对于 poll,kernel 需要扫描 fds 中指定的一共 nfds 个 fd;这些 fd 都是被关心的

这就意味着,对于 select 的场景,''假如 fd_set 中的 fd 非常稀疏,比如 [1, 3, 5, 10000],kernel 仍然需要扫描 10001 个 fd;这是非常低效的''。poll 则没有此问题。

当监听的 fd 非常多时:

* 每次调用 select / poll 时,kernel 都必须 check 每个 fd 的 ready 情况,''非常耗 CPU''
* 对于 select,因为参数中的 fd_set 是 value-result,即调用结果也通过修改这些参数来返回,所以每次调用完都需要重新初始化 fd_set,这带来 CPU 消耗;对于 poll,在 user space 和 kernel 间传递 fds 数组的消耗也巨大
* 调用返回时,用户程序 ''需要检查每个 fd'' 来判断是否 ready

''对于 epoll'',下面的原因使得它性能高:

* 由于监听的 fd 放在 kernel 中维护,少了传递参数和遍历的消耗
* 由于 kernel 知道哪些 fd 是被关心的,因此当这些 fd 有状态变化时,kernel 将其放入 ready list 并等待下次 `epoll_wait()` 调用时返回即可

!! 参考

* Chapter 63, The Linux Programming Interface
Stream(流)是对输入输出设备的一种抽象,底层库(如 glibc、Java 标准库等)以流的形式提供高级 API,方便开发者使用。

!! Stream Buffering

Stream buffering 是指应用程序在处理流时,不一个一个字节处理,而是累积到一定量再做处理。特别地:

* 对于读,等输入设备积攒了一定量的数据时,API 再批量返回数据。比如从网卡读数据
* 对于写,等写入的内容积攒到一定量,再触发批量写入。用 `open` 打开一个常规文件,默认是 buffered 的

一个流有几种 buffering 形式:

|!unbuffered |传输的内容会尽可能快被读取或者被发出;Linux 中 stderr 默认为 unbuffered |
|!line buffered |一旦遇到换行符便即刻传输;Linux 中 stdin 默认为 line buffered |
|!fully buffered |也叫 blocked buffered,或者简单的 buffered;表示累积到一定量再传输;Linux 中 stdout 默认为 buffered |

参考:

* [[GLIBC 文档|https://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html]]
关于 OS :

* 如何抽象出被执行的任务(以进程进行抽象):[[OS: Process: Abstration]]
* 如何设计进程间的调度算法:[[OS: Process: Scheduler]]
* 常用的调度算法:多级反馈队列:[[OS: Process: Scheduling: The Multi-Level Feedback Queue]]

更具体的:

* 关于进程的 API 设计:[[OS: Process: API]]
* 关于孤儿进程、僵尸进程:[[OS: Process: Orphan Processes and Zombie Processes]]
* Linux 系统下进程运行时的信息:[[OS: Process: Runtime Information]]
* 跨进程通信:[[OS: Process: IPC]]
''进程'' 是 OS 对于运行程序的抽象。由于 CPU 需要进行 ''进程切换'',因此进程的一些状态信息需要被保存在内存中,比如:

* CPU 寄存器(包含了 program counter 和 stack pointer,分别用来确定进程运行到哪一条指令,以及栈在内存中的位置)
* 进程的内存空间中的内容
* I/O 相关的信息,比如打开了哪些文件、文件是只读还是可写等

由于进程需要被切换,因此进程至少有三种基础 ''状态'':running、ready to run 和 blocked。

操作系统需要调度不同的进程,因此需要维护一个进程列表。进程列表中每个进程的信息叫 ''process control block (PCB)''。
应如何设计操作系统的 API,使用户可以操作进程?核心的 API 应该有:

* 创建进程
* 销毁进程
* 等待进程退出
* 控制能力:比如暂停进程、继续进程
* 查询进程状态

对于 Linux 系统来说,创建一个新进程使用的是 `fork()`;如果想在新创建的进程中运行完全不一样的 binary,使用 `exec()`。

''分离 `fork()` `exec()` 的好处是'',可以在 fork 后 exec 前做一些操作,比如给新进程设置环境变量、重定向文件等。比如:

```shell
wc p3.c > newfile.txt
```

对于这样的 shell 命令,shell 可以在 fork 后、exec `wc` 命令之前,在 fork 出来的子进程中打开 `newfile.txt`,并将 stdout 定位到文件中。

!! fork 使用须知

对于带缓冲区的输出流(buffered stream),比如 stdout,在 fork 之前应该调用 `fflush(stdout)`。比如下面这段代码,如果不调用 `fflush`,同时 stdout 是 buffered stream(参考 [[OS: I/O: Stream]])时,会输出 ''两行 Hi''(unexpected):

```cpp
int main() {
    printf("Hi\n");
    fflush(stdout);
    fork();
    return 0;
}
```
!! Why?

''为什么需要 IPC?''信息共享、加速计算(利用多核 CPU)、模块化(不同进程各司其职)。

<div class="box">

''Chrome 的多进程例子'':

* ''浏览器(单一进程)'':负责磁盘和网络 I/O,管理渲染进程
* ''渲染进程(rendere processes,多进程)'':每个页面一个进程,处理 HTML、CSS、图片,运行 JS 等。一个页面有 bug 不影响其他页面
* ''插件进程(每个插件一个进程)''

浏览器进程与渲染进程、插件进程通过 IPC 沟通。渲染进程放在沙箱运行,减少安全风险(无法访问磁盘等)。

</div>

!! How?

主要有''两种形式'':

* ''靠内存共享'':比如 Linux 的共享内存。性能好,使用的系统调用少,但难以分布到多机
* ''靠通讯(message-passing)共享'':比如 Linux 的消息队列,或者通过网络进行的通讯。性能相对差,但是可以分布到多机

''基础模型'':生产者与消费者:

* 生产者产生数据,存放在 ''buffer'' 中供消费者消费;Buffer 可以指共享的内存区域,可以指消息队列等
* Buffer 分为不限大小的 unbounded buffer,以及限制大小的 bounded buffer

!! 消息传递(message-passing)系统的设计

''角色'':进程 P,进程 Q,及它们之间的通讯链路(communication link)。

逻辑上需要实现两个操作:`send()` / `receive()`。关心的元素有:

* 直接或间接地沟通
* 同步或异步的沟通
* 不同容量的 buffer

!!! ''直接 / 间接''

''直接通讯'':

* `send(P, message)`:发送一个消息到进程 P
* `receive(Q, message)`:接收一个进程 Q 发来的消息

这要求 ''对称的寻址''(symmetry in addressing),即 Q 发给 P 时需要指明 P,P 收 Q 消息时需要指明 Q。''不灵活''。改进方式是使其变成 ''非对称的''(asymmetry),即 P 收消息时不需要指定发送方,而是在消息中包含了发送方信息。

更好的方法是 ''间接通讯''。给定一个邮箱 A,让收方双方都对邮箱做操作:

* `send(A, message)`
* `receive(Q, message)`

还有一些细节,需要具体的实现方式去权衡。比如是否可以多个进程收取同个消息。

邮箱可以被一个进程所拥有。但是更好的方法是由操作系统所有。

!!! 同步 / 异步

''同步'' / ''异步'',也称 ''阻塞''(blocking) / ''非阻塞''(nonblocking)。分几种情况:

* 发送方发出消息后:
** Blocking send:阻塞直到消息被接收或者入邮箱
** Nonblocking send:不阻塞,继续执行其他操作
* 接受方接收消息时:
** Blocking receive:阻塞直到有消息可被接收
** Nonblocking receive:不阻塞,取到新消息或者空

!!! 不同容量的 buffering

如果通讯链路不支持 buffering,即它没有 buffer(一般是消息队列)来存放信息,这要求 blocking send。否则没有此限制。

!! 具体实现例子

!!! 共享内存

见 [[OS: Process: IPC: Shared Memory]]。

!!! 管道

见 [[OS: Process: IPC: Pipe]]。

!! Resources

* [[Operating System Concepts]] 第三章









管道:进程间双向通信的渠道。最早的 IPC 机制之一。

''设计考虑'':

* 支持双向通信还是单向?POSIX 普通管道一般是单向的
* 如果支持双向,是半双工(即同时只能有一方在写)还是全双工(双方能同时写)?POSIX 管道是半双工
* 进程间是否需要有一层关系(比如父子关系)?POSIX 普通管道一般是父子关系(否则没有意义);命名管道则不需要
* 管道能否通过网络来通讯,还是需要通讯双方进程在同一机器?POSIX 管道需要在同一机器

!! POSIX 普通管道

POSIX 普通管道(也叫匿名管道)是两种机制的结合:

* 管道本身,即是两个文件描述符 `fds[]`,使得 `write(fd[1], ...)` 时,内容可以通过 `read(fd[0], ...)` 得到
* 由于 `fork()` 出来的子进程会继承文件描述符,因此可以实现父进程 `write()` 而子进程 `read()`,或者反过来子进程写父进程读

虽然理论上普通管理可以是双向的,但双向会导致混乱(比如进程读到自己写的内容),所以实践上都是父子双方约定好谁写谁读,然后相应的在各自进程中将不需要使用的 fd 关掉。

<details>
  <summary>''代码实例''</summary>

<div>

```cpp
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#define BUFFER_SIZE 25
#define READ_END 0
#define WRITE_END 1

int main(void) {
  char write_msg[BUFFER_SIZE] = "Greetings";
  char read_msg[BUFFER_SIZE];
  int fd[2];
  pid_t pid;

  /* create the pipe */
  if (pipe(fd) == -1) {
    fprintf(stderr, "Pipe failed");
    return 1;
  }

  /* fork a child process */
  pid = fork();
  if (pid < 0) { /* error occurred */
    fprintf(stderr, "Fork Failed");
    return 1;
  }

  if (pid > 0) { /* parent process */
    /* close the unused end of the pipe */
    close(fd[READ_END]);
    /* write to the pipe */
    write(fd[WRITE_END], write_msg, strlen(write_msg) + 1);
    /* close the write end of the pipe */
    close(fd[WRITE_END]);
  } else { /* child process */
    /* close the unused end of the pipe */
    close(fd[WRITE_END]);
    /* read from the pipe */
    read(fd[READ_END], read_msg, BUFFER_SIZE);
    printf("read %s", read_msg);

    /* close the read end of the pipe */
    close(fd[READ_END]);
  }

  return 0;
}
```

</div>
</details>

''原子操作'':POSIX 规定 512 字节内的读写是原子的;Linux 把这个限制扩大到 4096。

!! POSIX 命名管道

POSIX 称它的命名管道为 FIFO(First In First Out)。''与普通管道不同之处在于'':

* FIFO 是个磁盘上的实际的文件(通过 `mkfifo()` 创建)
* 进程间不需要是父子关系也可以互相通信
* 即使使用它的进程退出了,FIFO 文件仍然存在并且可以被访问

FIFO 虽然可以是双向的(但仍是半双工),但实际用的时候还是建两个 FIFO 用于双向读写(不然就比较混乱,读到自己写的内容)。一个 FIFO 可以被多个进程写以及读。

!! 参考

* The Linux Programmer's Guide: [[6.2 Half-duplex UNIX Pipes|https://tldp.org/LDP/lpg/node9.html#SECTION00720000000000000000]], [[6.3 Named Pipes|https://tldp.org/LDP/lpg/node15.html#SECTION00730000000000000000]]
* [[Operating System Concepts]]
共享内存模型:

* memory-mapped file,一个特殊的文件,用于被不同进程获取同一块关联的内存区域
* shared-memory object,在代码中表示为一个指针,指向这块共享的内存区域

<details>
  <summary>''代码实例''</summary>

<div>

''Producer'':

```cpp
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/stat.h>

int main() {
  /* the size (in bytes) of shared memory object */
  const int SIZE = 4096;
  /* name of the shared memory object */
  const char *name = "OS";
  /* strings written to shared memory */
  const char *message 0 = "Hello";
  const char *message 1 = "World!";
  /* shared memory file descriptor */
  int fd;
  /* pointer to shared memory obect */
  char *ptr;

  /* create the shared memory object */
  fd = shm_open(name, O CREAT | O RDWR, 0666);

  /* configure the size of the shared memory object */
  ftruncate(fd, SIZE);

  /* memory map the shared memory object */
  ptr = (char *)mmap(0, SIZE, PROT READ | PROT WRITE, MAP SHARED, fd, 0);

  /* write to the shared memory object */
  sprintf(ptr, "%s", message 0);
  ptr += strlen(message 0);
  sprintf(ptr, "%s", message 1);
  ptr += strlen(message 1);
  
  return 0;
}
```

''Consumer'':

```cpp
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/stat.h>

int main() {
  /* the size (in bytes) of shared memory object */
  const int SIZE = 4096;
  /* name of the shared memory object */
  const char *name = "OS";
  /* shared memory file descriptor */
  int fd;
  /* pointer to shared memory obect */
  char *ptr;

  /* open the shared memory object */
  fd = shm_open(name, O RDONLY, 0666);

  /* memory map the shared memory object */
  ptr = (char *)mmap(0, SIZE, PROT READ | PROT WRITE, MAP SHARED, fd, 0);

  /* read from the shared memory object */
  printf("%s", (char *)ptr);

  /* remove the shared memory object */
  shm_unlink(name);
  
  return 0;
}

```

</div>

</details>
Linux 采用的是一个进程树结构,除了 init 进程(pid 1)之外,其他的进程都会有一个父进程,最上层的父进程则是 init。

假如一个进程(称之为父进程)创建了另一个进程(称为子进程),在父进程中调用 `wait()` 会等待子进程完成并获得子进程的返回码。如果父进程不调用 `wait()` 而且自身仍在运行,则子进程结束后会变成 ''僵尸进程''(zombie);大量僵尸进程会导致系统资源,特别是进程表耗尽,使得无法创建新的进程。假如父进程在子进程结束前就退出了,那子进程会变成 ''孤儿进程''(orphan),被 init 进程接管(即它的父进程变成 init 进程),''init 进程会自动调用 `wait()` 来回收''。假如子进程处于僵尸状态,但父进程还没调用 `wait()` 就退出了,子进程一样会被 init 进程接管。

假如一个进程有爷爷进程、也有父进程,如果父进程提前退出,爷爷进程还在,此时子进程仍然会被 init 接管。
`/proc/<pid>` 目录存放了进程运行时的信息。`/proc/<pid>/comm` 放的是当时运行进程的命令,比如 `python`, `httpd`, `gunicorn` 等。但是它有 16 个字节(定义在 `TASK_COMM_LEN`)的长度限制,超过了会被截断。

nginx, postgres 会修改 proc title,变成类似 `nginx: master` 这样。Python 的 `setproctitle` 包也提供了类似的能力。
多个进程同时运行时,需要考虑如何对他们进行调度。''调度器''(scheduler)即是实现这套逻辑的 OS 组件。

对于调度系统,

# 需要考虑的 ''维度'' 是 ''效率'' 和 ''公平''
# 如何体现上述的维度,则需要设计 ''度量方式''(metrics),用来衡量不同的算法在不同情况下的表现

常见的 ''度量方式'' 有几种:

* turnaround time,即任务开始排队到完成的平均时间。这个指标越低则越高效
* response time,即任务开始排队到被执行的平均时间。这个指标越低则(往往)越公平

这其中会涉及到一个问题,调度过程是 ''抢占式的(preemptive)'' 还是 ''非抢占式的(non-preemptive)''。抢占式的,表示调度器可以暂停一个任务(process)的运行,而切换到另外一个任务。现代操作系统是抢占式的。抢占式意味着 CPU 运行需要有固定的时间片(time slice),即每次运行一个进程至少一个时间片长度的时间。

有几种简单的调度算法。

!! 调度算法

!!! First In, First Out (FIFO)

[img width=500 [os-process-scheduler-fifo]]

这种算法实现是不考虑抢占的。显然很容易有 bad case 影响整体的性能。

!!! Shortest Job First (SJF)

[img width=500 [os-process-scheduler-sjf]]

这种算法能实现最优的效率。但是它是非抢占式的,如果新任务进入的时间点不合适,会影响其性能。

!!! Shortest Time-to-Completion First (STCF)

[img width=500 [os-process-scheduler-stcf]]

总是运行当前任务列表中,最快可以完成的任务。这种算法可以说是 SJF 的抢占式版本。效率是最优的,但是是非常不公平的。

!!! Round Robin

[img width=500 [os-process-scheduler-rr]]

轮转执行各任务。这种算法是平均响应时间(看上述 response time 定义)最短的,是最公平的,但相对地 turnaround time 不是最优。

而且需要考虑 ''频繁的上下文切换(context switch)带来的性能损失''。不仅包含存取寄存器的开销,还有 CPU 缓存、页表缓存、分支判断上的损耗。
OS 的调度算法有几大任务:

* 在不确定每个进程需要多少 CPU 的情况下做调度
* 兼顾完成时间(turnaround time)和响应时间(responsive time)(参考 [[OS: Process: Scheduler]])

多级反馈队列的核心在于:''通过观察进程的行为来确定给它多少 CPU''。它将进程(ABCD)分别放到不同优先级的队列(Q1 ~ Q8):

```
[High Priority] Q8: A => B
                Q7
                Q6
                Q5
                Q4: C
                Q3
                Q2
 [Low Priority] Q1: D
```

运行优先规则:

* 高优先级的进程先运行(A 和 B 先运行,后面才轮到 C 和 D)
* 同优先级的多个进程,轮流执行(A 和 B 轮流运行)
* 每个进程被执行时,至少给一个时间片

那进程如何改变优先级?规则是:

* 当进程刚开始运行,它处于最高优先级
* 当进程使用完整个时间片时,它的优先级降低
* 当进程没有使用完整个时间片就让出 CPU(比如触发了 I/O),则使它保持在同个队列中

''为了防止有些很耗 CPU 的进程一直无法被运行(starvation)'',加一条规则:

* 定时把全部进程放到最高优先级的队列中

''为了防止有些进程取巧'',在每次快用完它的时间片前就调用 I/O 让出 CPU,使其一直处于高优先级队列中:

* 一旦进程使用了一定量的 CPU 时间片,则将其优先级降低

另外则是,这个调度算法的参数(比如时间片长度、多久将全部进程置为高优先级等),一般都难以直观判断。因此 OS 一般提供 ''配置能力''。另外 OS 也提供了让使用者调整进程优先级的能力,比如 Linux 中的 `nice` 命令。

''总结'':

* Rule 1: If Priority(A) > Priority(B), A runs (B doesn’t).
* Rule 2: If Priority(A) = Priority(B), A & B run in round-robin fashion using the time slice (quantum length) of the given queue.
* Rule 3: When a job enters the system, it is placed at the highest priority (the topmost queue).
* Rule 4: Once a job uses up its time allotment at a given level (regardless of how many times it has given up the CPU), its priority is reduced (i.e., it moves down one queue).
* Rule 5: After some time period S, move all the jobs in the system to the topmost queue.










参考:

* [[TLPI: Ch29]]
* [[TLPI: Ch30]]
* [[TLPI: Ch31]]

TLPI 32 及 33 章暂未涉及,里面有这些内容:

* Thread Cancellation
* Thread Stack
* Thread and Signal
* Linux Implementation of POSIX Thread

!! 3.4 ~ 3.7: IPC

See [[OS: Process: IPC]].

!! 3.8: Communication in Client-Server Systems

!!! Socket

对于两台机器之间的通信,前人们抽象出了一套概念:''socket''。

一个 socket 可以认为是一个 `(ip, port)` 对。一对 socket 定义了一个通信:

[img width=400 [osc-socket]]

Socket 有几种主流类型:

* 面向连接的(connection-oriented),即 TCP
* 无连接的(connectionless),即 UDP

C 语言的 socket 函数是最底层的接口。Java 等高级语言在此基础上封装了更易用的 socket 接口。

!!! RPC

即在客户端远程调用服务端上的某函数。客户端发的包中,包含了要调用的服务端口、具体的服务名等(比如 HTTP API 中的路径)。
|!Name |Operating Systems: Three Easy Pieces |
|!Author |Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau |
|!Edition |N/A |
|!Release Date |N/A |
|!ISBN-13 |N/A |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

这本书我看的是 [[官方|http://pages.cs.wisc.edu/~remzi/OSTEP/]] 提供的分章节 PDF,我看的时候更新到 v1.01 07/06/20。这本书一般被缩写成 OSTEP。

看到第九章没看完,觉得这本书不够好:

* 逻辑的连贯性不够好,有些内容觉得生硬
* 缺乏实例,比如 CPU 调度算法相关的章节(第八、第九章),没有把流行的操作系统的做法展示出来

后面看了下 [[Operating System Concepts]],感觉非常好,简单明了。
{{ OS: Concept: Core Functions, Design Goals and Some History }}
对于现在操作系统,多个程序「同时」运行是很正常的事情。但是 CPU 只有这么多,如何使得多个程序同时运行?

|!核心问题 |How to provide the illusion of many CPUs? |
|!解法 |Time sharing(分时复用) |

Time sharing 即是 ''把 CPU 工作的时间分配到不同应用程序去''。类似的还有 space sharing,比如硬盘就是 space sharing 的,分到不同文件中。

{{OS: Process: Abstration}}

<div class="box">

''ASIDE: KEY PROCESS TERMS''

* The ''process'' is the major OS abstraction of a running program. At any point in time, the process can be described by its state: the contents of memory in its ''address space'', the contents of CPU registers (including the ''program counter'' and ''stack pointer'', among others), and information about I/O (such as open files which can be read or written).
* The ''process API'' consists of calls programs can make related to processes. Typically, this includes creation, destruction, and other useful calls.
* Processes exist in one of many different ''process states'', including running, ready to run, and blocked. Different events (e.g., getting scheduled or descheduled, or waiting for an I/O to complete) transition a process from one of these states to the other.
* A ''process list'' contains information about all processes in the system. Each entry is found in what is sometimes called a ''process control block (PCB)'', which is really just a structure that contains information about a specific process.

</div>
|!核心问题 |操作系统应该提供怎样的 API 来创建和控制进程? |
|!解法 |Linux `fork()`, `exec()`, `wait()` 等 |

{{OS: Process: API}}

!! Orphan Processes and Zombie Processes

{{OS: Process: Orphan Processes and Zombie Processes}}

<div class="box">

''ASIDE: KEY PROCESS TERMS''

* Each process has a name; in most systems, that name is a number known as a ''process ID (PID)''.
* The ''fork()'' system call is used in U NIX systems to create a new process. The creator is called the ''parent''; the newly created process is called the ''child''. As sometimes occurs in real life [J16], the child process is a nearly identical copy of the parent.
* The ''wait()'' system call allows a parent to wait for its child to complete execution.
* The ''exec()'' family of system calls allows a child to break free from its similarity to its parent and execute an entirely new program.
* A UNIX ''shell'' commonly uses fork(), wait(), and exec() to launch user commands; the separation of fork and exec enables features like ''input/output redirection'', ''pipes'', and other cool features, all without changing anything about the programs being run.
* Process control is available in the form of ''signals'', which can cause jobs to stop, continue, or even terminate.
* Which processes can be controlled by a particular person is encapsulated in the notion of a ''user''; the operating system allows multiple users onto the system, and ensures users can only control their own processes.
* A ''superuser'' can control all processes (and indeed do many other things); this role should be assumed infrequently and with caution for security reasons.

</div>
|!核心问题 |How to efficiently virtualize the CPU with control? |
|!解法 |Limited Direct Execution |

{{ OS: Concept: Limit Direct Execution }}

<div class="box">

''ASIDE: KEY PROCESS TERMS''

* The CPU should support at least two modes of execution: a restricted ''user mode'' and a privileged (non-restricted) ''kernel mode''.
* Typical user applications run in user mode, and use a ''system call'' to ''trap'' into the kernel to request operating system services.
* The trap instruction saves register state carefully, changes the hardware status to kernel mode, and jumps into the OS to a pre-specified destination: the ''trap table''.
* When the OS finishes servicing a system call, it returns to the user program via another special ''return-from-trap'' instruction, which reduces privilege and returns control to the instruction after the trap that jumped into the OS.
* The trap tables must be set up by the OS at boot time, and make sure that they cannot be readily modified by user programs. All of this is part of the ''limited direct execution'' protocol which runs programs efficiently but without loss of OS control.
* Once a program is running, the OS must use hardware mechanisms to ensure the user program does not run forever, namely the timer ''interrupt''. This approach is a ''non-cooperative'' approach to CPU scheduling.
* Sometimes the OS, during a timer interrupt or system call, might wish to switch from running the current process to a different one, a low-level technique known as a ''context switch''.

</div>
|!核心问题 |How to develop scheduling policy? |
|!解法 |见下文 |

{{ OS: Process: Scheduler }}

!! 研究方法

这一章在研究方法上是个非常好的范例。

# 对于调度系统,需要考虑的 ''维度'' 是 ''效率'' 和 ''公平''
# 如何体现上述的维度,则需要设计 ''度量方式''(metrics)。比如文中的 turnaround time 及 response time
# 为了让问题更容易解决,在一开始做一些 ''简化的假设'',再将假设移除。比如文中一开始做的假设是:
## Each job runs for the same amount of time.
## All jobs arrive at the same time.
## Once started, each job runs to completion.
## All jobs only use the CPU (i.e., they perform no I/O)
## The run-time of each job is known.

虽然书中并不是按我上面这样 top-bottom 行文的,而是 bottom-top,但是思考这类问题的思路是一致的。
|!核心问题 |How to schedule without perfect knowledge? |
|!解法 |见下文 |

{{ OS: Process: Scheduling: The Multi-Level Feedback Queue }}
|!核心问题 |How to share the CPU proportionally? |
|!解法 |见下文 |

按比例分享 CPU。采用发行彩票方式。基本理念:

* 每个时间片都举行一场彩票发行。比如发 100 张票,然后开出一张票
* 如果希望任务 A 运行 75% 的时间,任务 B 运行 25%,则给 A 75 张票,B 25 张票
* 每次开票得出一个票号。此时 A 都有 75% 的概率运行,B 则是 25%;多次开票后,它们的运行时间在统计上趋近于 3:1

为什么用随机?

# 比 LRU 等算法更均衡,没有 worst-case
# 实现上轻量简单,没有太多状态
# 生成随机数的性能好

没有继续看了。
这本书的核心组织方式:

* ''crux of the problem'':即问题中最核心、最重要的是什么
* ''timeline (behavior over time)'':系统在不同情况下如何演变
抓包,篡改数据和模拟发包,这几个任务在工作中非常常见。这里揉在一起讲述。

需要抓包的一些场景:

* 开发过程中,观察服务间 API 调用的包结构,便于开发、调试 bug
* 浏览器中研究网站 API

需要篡改数据的一些场景:

* 在浏览器上,想篡改 AJAX 请求返回的数据来影响界面的展示或者前端逻辑
* 篡改接口数据来影响 app 功能
* 开发过程中,用来修改特定的数据包以验证问题;Mock 数据以不等待别人配合等

需要模拟发包的一些场景:

* 在浏览器上,前端没有发送某个特定 API 请求的入口(如按钮、链接等),需要模拟发包来达到目的
* Ice 和娜娜有时需要去网上上一些课,看教学视频,而且被要求看满多少时间才可以。这些网站会在你看视频时定时发请求到服务器,纪录你看了多久。需要模拟发包来装作有看这些视频

! 思路

常规的数据流向,一般是:

```
                   发起请求
终端(手机 / PC) -----------> 代理 / 路由 ---------> 服务器
```

终端主要有网页浏览器和应用程序(PC 上的或者手机上的)。代理服务器可以架设在本地或者远端。

除了服务器、中间路由器这几环可能控制不了,其他部分是你可以控制的。你可以在终端或者代理服务器上做抓包、篡改数据。

! 在终端上

终端一般分成 PC 和手机。手机受限于操作便利性,一般只做抓包及展示,没有更高级的功能;Android 上常用 Package Capture, tPacketCapture。下面的内容仅针对 PC,按功能场景做分类。

!! 抓包

电脑上可以用老牌抓包工具 Wireshark 来抓包。如果是在服务器上没有图形界面,可以用 `tcpdump` 命令先抓包保存成文件,再放到 Wireshark 上分析。也可以用本地代理来抓包,流行的有 [[mitmproxy|https://mitmproxy.org/]]、[[Charles|https://www.charlesproxy.com/]] 和 [[Fiddler|https://www.telerik.com/fiddler]]。[[betwixt|https://github.com/kdzwinel/betwixt]] 提供了一个利用 Chrome DevTools 来分析数据包的工具,非常实用。

如果是在浏览器上,Chrome 的开发者工具是非常好用的。

!! 篡改数据

窜改数据的工具,可以用 Charles / Fiddler 提供的 rewrite 能力。也可以用 mitmproxy 实现可编程的修改数据。它们都可以修改出站数据中的 request 和 response。

Charles / Fiddler 需要你的应用程序将其设为正向代理。mitmproxy 即支持正向代理,也支持反向代理和透明代理。

!! 模拟发包

模拟发包的场景一般在浏览器上。对于非浏览器的请求,你可以 Postman 提供的代理先抓到包,再导出成 curl / Python 或者各语言代码。

对于浏览器上做模拟发包:

* 如果 JS 没有被混淆,可以直接看源码,找合适的切入点去用 JS 发请求。比如调用 JS 里面写好的函数。
* 有些网站不用 JS 发请求,而用 Flash 。这时候你不知道请求是如何被构造的,可以:
** 观察最终的 HTTP 请求包是怎样的,猜测字段含义并尝试构造类似请求
** 直接使用抓包工具,把 Flash 通过浏览器发出的包的内容修改了
* 有些网站直接用 `<form>` 来提交请求,可以修改 `<input>` 的值,用 JS 或者直接 Chrome 开发者工具中修改

如果网站使用了 React / Vue.js 等 MVVM 框架,你没办法简单地动 JS / HTML 元素来达成模拟发包,可以这样:

* 安装 [[Postman Interceptor|https://chrome.google.com/webstore/detail/postman-interceptor/aicmkgpgakddgnaphhhpliifpcfhicfo]] 及 Postman Chrome App。Postman 的单独 app 似乎不能连接 interceptor
* 打开 Interceptor 的拦截功能,Postman 上也点亮 interceptor
* 在 Chrome 开发者工具的 Network panel 中打勾 offline
* 此时在 Chrome 上发起的请求,并不会实际被发出,但是在 Postman 中可以看到(默认 History 中)。这时候你可以在 Postman 中修改请求体,再点发送

! 在代理 / 路由上

!! 抓包

如果你给程序设置了远程代理服务器,而你又可以访问这台服务器,那你可以在这台服务器上用 tcpdump, httpry, hsiafan/httpdump 等进行抓包。

!! 篡改数据

在路由 / 代理服务器上篡改数据,可以使终端无感知,比如手机上的 app。

mitmproxy, inaz2/proxy2, dahlia/wsgi-proxy 等工具可以实现可编程的 HTTP 代理。

!! 模拟发包

路由 / 代理机器上,一般不运行浏览器。除此之外的模拟发包的方法,跟在终端上差别不大。可以优先考虑用 Python / Go 写程序实现。

! 工具参考

!! Wireshark <<plat-win>> <<plat-linux>>

抓包界的元老级软件,应该属 tcpdump 和 Wireshark。有两个概念需要理解:

* Capture filter:表示抓包软件应该抓的内容。不在这个范围内的包被直接丢弃。目前主流用的 bpf-style capture filter
* Display filter:Wireshark 上的一个概念,类似于一个表格中的行列过滤器。它只是在展示上的做一些筛选,但是包有没有抓下来,还是看的 capture filter

!! httpry <<plat-linux>>

httpry ([[GitHub|https://github.com/jbittel/httpry]]|[[官网|http://dumpsterventures.com/jason/httpry/]]) 是一个 HTTP 实时抓包、展示和分析工具。它支持 bpf-style capture filter(跟 tcpdump 的包过滤表达式格式一致),可以把原始的 tcpdump 包保存下来,也能把解析好的 HTTP 包相关信息保存下来。同时它提供了一些 perl 脚本,可以用来分析保存下来的文件。

!! hsiafan/httpdump <<plat-linux>>

[[hsiafan/httpdump|https://github.com/hsiafan/httpdump]] 是个 HTTP 实时抓包展示工具,Go 语言写的,但是依赖 libpcap,没法编译成无依赖的二进制包。长时间运行发现有 CPU 占用高,不再输出内容的 bug。

```bash
$ go get github.com/hsiafan/httpdump
$ sudo httpdump -device any -level all -pretty
```

!! Chrome <<plat-win>> <<plat-linux>> <<plat-mac>>

在 Chrome 上装上 [[Postman Interceptor|https://chrome.google.com/webstore/detail/postman-interceptor/aicmkgpgakddgnaphhhpliifpcfhicfo]],搭配 Postman 独立应用或者 Chrome 应用,可以实现抓包及模拟发包。

!! Charles <<plat-win>> <<plat-linux>> <<plat-mac>>

[[Charles|https://www.charlesproxy.com/]] 是一个强力的抓包工具,跟 [[Fiddler|http://www.telerik.com/fiddler]] 类似,但是比 Fiddler 好。

* 跨平台,Java 实现
* 功能清晰直观,不像 Fiddler 放得那么乱
* UI 比 Fiddler 看起来可靠
* 有简单易理解的打断点功能,也有 ''按规则 rewrite 包'' 的功能,可以用来修改 HTTP 包

!! Firefox <<plat-win>> <<plat-linux>> <<plat-mac>>

Firefox 曾经有个不错的插件 [[Tamper Data|https://addons.mozilla.org/en-US/firefox/addon/tamper-data/]],但是随着 Firefox 的 Chrome 化,我已经搞不清楚如何去用这个插件了。

! 抓包类库参考

!! PyShark <<icon-code>> <<plat-win>> <<plat-linux>>

[[PyShark|https://github.com/KimiNewt/pyshark]] 通过调用 WireShark 命令行程序 tshark 实现抓包,同时能编程化的处理抓到的数据,非常实用。可以处理以前抓包保存下来的 pcap 文件,也可以处理实时抓的流量。它应该是这套处理方法中最好的类库了。

! 可编程 HTTP 代理

! 可编程代理参考

!! mitmproxy <<icon-code>>

[[mitmproxy|https://mitmproxy.org]] 是流行的可编程代理工具。

!! inaz2/proxy2 <<icon-code>> 

[[inaz2/proxy2|https://github.com/inaz2/proxy2]] 是个 Python 写的单文件 proxy,非常容易给 request / response 加 hook。

!! dahlia/wsgi-proxy <<icon-code>>

[[dahlia/wsgi-proxy|https://bitbucket.org/dahlia/wsgi-proxy]] 是 Python 写的 Proxy,没有开放定制的能力,需要自己改它代码。但是它是用 WSGI 运行的,可以容易上云服务。很多云服务要求被托管的 Python 程序必须用 WSGI。

<<.warning "实验时发现,云服务往往不支持这种方式的代理。因为你向代理发请求时是不会带 Host 的,而云服务它往往是一批机器服务成千上万个免费的二级域名(如 `<app_name>.leanapp.cn`),这导致它无法判断这个请求是针对哪个服务的,所以不能服务。">>

! HTTPS (or TLS) 抓包

在只使用了服务端证书(即非双向 TLS,一般情况下都是这样)的情况下,需要服务端密钥才能解开加密的数据。网上有大量教程讲如何操作。
DataQuest 上提供了一份 Pandas 的 [[cheatsheet|https://www.dataquest.io/blog/pandas-cheat-sheet/]](Dropbox 中有 PDF 版),可以用来快速理解 Pandas 的全貌和基本用法。

Gmail 中订阅了多份 Python 周刊,可以搜索 Pandas 看看有什么好的内容。

Pandas 的官方文档也是不错的选择。


! 阅读

各平台目前的最佳选择:

* Windows:金山 PDF 或者 PDF-XChange Viewer
* Linux:Master PDF Editor 或 Okular。因为下文描述的 Chrome 展示 PDF 的问题,优先使用 Master PDF Editor
* MacOS:PDF Expert

!! 金山 PDF <<plat-win>> <<plat-linux>>

[[金山 PDF|https://www.wps.cn/product/kingsoftpdf/]] 是目前尝试过的 ''最佳选择''。非常适合边阅读边注释的场景。但 Linux 版年久失休。

!! PDF-XChange Viewer <<plat-win>>

[[PDF-XChange Viewer|https://www.tracker-software.com/product/pdf-xchange-viewer]] 是非常好的 PDF 阅读软件。速度快,功能齐全,界面漂亮。做 annotation 也方便。

!! Xodo <<plat-win>>

Xodo 功能很简单(但是满足我做基本标记),特点是有比较好的 Dark Mode,对眼睛舒服。

!! Master PDF Editor <<plat-linux>>

[[Master PDF Editor|https://code-industry.net/masterpdfeditor/]] 体验还 OK,界面比较古板,但是做简单的 annotation 足够使用。

!! Okular <<plat-linux>>

KDE 下的 [[Okular|https://okular.kde.org/]],体验在同类产品中算不错的。掌握快捷键会方便做 annotation。

! 导出注释及高亮文本

有时需要把 PDF 中的注释及高亮内容导出,用于笔记或者博客文章等。调研了一些工具:

* PDF-XChange Viewer 可以导出你写的注释,但是无法导出高亮的内容
* [[SumNotes|https://www.sumnotes.net/]] 可以导出注释及高亮内容,但是收费,而且对高亮内容的排版有点混乱(比如有无序列表的情况下)

暂时没有找到好的解决方案。

! Chrome 中查看 PDF 文件

Chrome [[内建|https://www.lifewire.com/how-to-enable-disable-chrome-pdf-viewer-4769436]] 了一个 PDF viewer(需要在设置中打开),同时应用商店中有使用 Mozilla 使用 pdf.js 开发的 [[扩展|https://chrome.google.com/webstore/detail/pdf-viewer/oemmndcbldboiebfnladdacbdfmadadm]]。但它们各有问题:

* 内建:可以显示 text annotation,但是使用中文会乱码
* 扩展:有 annotation 不显示的问题(下文详述),但中文不会乱码

对于使用 [[Poppler|https://poppler.freedesktop.org/]] 的 [[PDF 阅读器|https://wiki.archlinux.org/index.php/PDF,_PS_and_DjVu#Comparison]] 添加的 annotation,Chrome PDF-viewer 扩展无法正常显示它们。比如你高亮了某段文本,这个高亮效果无法显示(参考此 [[issue|https://github.com/politza/pdf-tools/issues/161]])。Master PDF Editor 不使用 Poppler 则无此问题。''因此如果加了 annotation 的 PDF 要在 wiki 中展示,使用 Master PDF Editor。''

! 工具

!! PDFsam <<plat-win>> <<plat-linux>> 

[[PDFsam|http://www.pdfsam.org/]] 有 GUI 程序也有 CLI 版本。在 Arch Linux [[官方仓库|https://www.archlinux.org/packages/community/any/pdfsam/]] 有。功能:

* 将多个 PDF 合并起来
* 按书签切分 PDF 等

!! 在线工具

* http://www.ilovepdf.com/
* http://app.xunjiepdf.com/
! peewee

peewee 是一个设计和使用上非常像 Django 的轻巧 ORM。

!! 查询

参阅官方文档中的 [[Query|http://docs.peewee-orm.com/en/latest/peewee/querying.html]] 部分。

!! 与已有数据库一起工作

[[pwiz|http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#pwiz-a-model-generator]] 可以检视一个已有的数据库,并且生成一个 Model 文件。作用跟 Django 的 `django-admin.py inspectdb` 类似。

```cmd
$ python -m pwiz --help
$ python -m pwiz -H <host> -p <port> -u <user> -P -e mysql <schema> -o > models.py
```
To-do 应用 / 个人项目管理应用。

!! 需求

经过长时间的经验总结,我提炼出自己的需求:

# 对于大的项目,如系统学习新领域、准备旅游等,我需要纪录各类计划、学习路线,跟踪进度。比如我想学机器学习,那么我会找到一些适合自己的学习计划单 ([[例子|https://www.analyticsvidhya.com/blog/2017/01/the-most-comprehensive-data-science-learning-plan-for-2017/]]),然后跟踪自己学到了哪里
# 对 read it later / 灵光一现这类场景做收集,以及后续消化
# 对于生活上的琐事,我需要一种快速添加备忘、提醒的能力

对于这些需求,市面上满足需求的是一类 GTD 应用和 Outliner ([[wikipedia|https://en.wikipedia.org/wiki/Outliner]]) 应用。这两类应用联系紧密,而且往往还与个人知识管理的应用联系紧密。

!! 分解需求

# 大项目
#* 计划、学习路线往往是层级比较多的,因此需要带无限层级的 Outliner
#* 跟踪进度,需要工作提供「标记是否完成」的能力
#* (optional) 工具如果能纪录每项活动所花费的时间更佳
# read it later / 灵光一现
#* 快速灵入
# 生活琐事
#* 快速录入
#* 到时间提醒
#* (optional) 到地点时触发提醒,比如回家时到附近便利店拿快递

!! 工作流

大计划、学习路线这类,会随着你对目标的了解而经常变化,用软件去维护往往不如直接用文本。而且像我习惯边学习边记录入 wiki,wiki 上的内容就可以代表这件事情的框架。因此,我觉得在 wiki 上大致纪录即可,没必要上项目管理软件。至于每天要学习的细项,在每天开始工作/学习时先扔进 TickTick 日历视图中的收集箱,再做了即可。

对于快速录入及生活琐事,可以用 TickTick 快速录入。而且 TickTick 的手机及网页端提醒还是很可靠的。

参考:

# [[《搞定》最佳实践:如何利用滴答清单(TickTick)实践 GTD 理念? - 少数派|https://sspai.com/post/39960]]

!! History

!!! TickTick 主力

试过很多,最终 TickTick 胜出。其他值得一提的替代有:

* Workflowy: 无限层级的列表太赞,但是没法放富文本,只能用来列提纲
* Toodledo: 各功能都很赞,比如它的 Outlines, Task 功能;但是 UI 太丑,Web 端访问速度慢;移动端是 Web application,访问慢加上体验太差
* Trello: 非常赞,在团队协作上优于 TickTick,在个人管理上差于 TickTick
* Dynalist: 继承了 Workflowy 的优良设计,同时有不错的界面,还有一些新元素加入(选时间、MD 富文本、文件附件等)。是个不错的 Outliner,但是能力上不如 Moo.do(没有提醒能力等)
* Moo.do:
** 提供了类似 Workflowy 的 #tag @time 机制,以及无限层级的 outline (TickTick 没有写提纲能力)
** 可以跟 Gmail / Google Calendar / Google Contacts 整合
** UI 非常漂亮
** 需要翻墙,体验差,速度慢,而且 `@time` 的提醒在手机端的实现,而且我并不需要 Gmail、Google Drive 及 Google Contacts 的整合

我用过一段时间的 ClickUp。它的比较现代的项目管理工具,提供了与很多第三方应用的整合。一开始看中的是它的无限嵌套子任务,而且每个子任务都可以有完整的一整套属性,比如优先级、到期时间、Time Tracking 等等。而且也看中它与 Everhour 整合的 Time Tracking 功能。但是它的操作并没有 TickTick 那样流畅,额外的功能带来了额外的心智负担,而且我开始觉得 Time Tracking 难执行且对你分析自己没太多作用。因此最终还是用回 TickTick。

目前我觉得 TickTick 欠缺的一点是,它无法像 [[Plan|https://getplan.co/]] 有一个日历视图可以容易拖任务放进去,并设置起止时间。这个功能我觉得很赞,它做到了粗略的计时估计和纪录。
关于 pip 相关的工具链,参考 Dropbox 中的 `Jon_Banafato-What_s_in_your_pip_toolbox.pdf`。这是份在 PyCon 2017 演讲的 slide。

!! 设置 PyPI 镜像

`pip.conf` 位置:

* On Unix the default configuration file is: $HOME/.config/pip/pip.conf which respects the XDG_CONFIG_HOME environment variable.
* On macOS the configuration file is $HOME/Library/Application Support/pip/pip.conf.
* On Windows the configuration file is %APPDATA%\pip\pip.ini.

```ini
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
format = columns
```

!! pip workflow

看 [[Pipenv vs Poetry]]。我使用 [[Poetry]]。

!! Arch Linux 上使用 pip

Arch 上使用 pip 安装日常用的包时,要用 `pip install --user` 选项,避免安装在系统路径上。系统路径上的 Python 包,应该总是用 pacman 来安装;否则会遇到一堆烦人的 conflict 问题。

!! pip `--target` 的一些问题

* 包带来的 Data 文件没有地方放([[Issue|https://github.com/pypa/pip/issues/4092]])
* 安装时已有的依赖库,还是会被再装一次([[Issue|https://github.com/pypa/pip/issues/4116]])
* 包带来的脚本文件也没地方放([[Issue|https://github.com/pypa/pip/issues/3934]])

所以 `--target` 选项基本是不可用的。

!! pip `--prefix` 的一些问题

`--prefix` 后面接的路径需要是绝对路径,不然安装 numpy 时会报错。

参考这 [[两个|https://github.com/pypa/pip/issues/373]] [[Issue|https://github.com/pypa/pip/issues/3618]]。

Pipenv 和 poetry 在功能上是非常类似的。

!! 配置文件

Pipenv 使用自定义的 `Pipfile` 及 `Pipfile.lock` 来管理文件。

Poetry 使用 [[标准化的|https://www.python.org/dev/peps/pep-0518/]] 的 `pyproject.toml` 和自定义的 JSON 文件 `peotry.lock`。

!! Deterministic Builds

Deterministic Builds 即是确定性的构建,即是每个人安装项目依赖时,都会得到一样的 Python 库的依赖。这是靠 lock 文件实现的。

Peotry 在这方面的设计明显好过 Pipenv:

* `peotry install` 不带参数时默认使用 lock 文件中定义的依赖;pipenv 则是使用非 lock 文件中的依赖
** pipenv 在这方面表现较差。从 lock 文件进行安装,居然不是一开始就搭载上的功能,而是后面用户提 [[issue|https://github.com/pypa/pipenv/issues/293]] 后加的,而且居然用了一个 `--ignore-pipfile` 这么奇怪的名称,来给应该是一等公民的 deterministic builds 功能使用
* `peotry install` 一个库时,默认会在 `pyproject.toml` 中纪录这个库最新版本的 [[tilde requirement|https://poetry.eustace.io/docs/versions/#tilde-requirements]],这是避免后面破坏性升级的好实践;Pipenv 会使用 wildcard (`*`),意味着后面你可能一不小心把依赖库升级到新版本引发不兼容
* `pipenv install` 一个库时,还会把 `Pipfile` 中其他的库也升级到最新版本,并写进 `Pipfile.lock` 中。虽然提供了 `--keep-outdated` 参数,但是这个默认行为感觉过于激进。结合上一条描述的 `*` 作为库的默认版本范围,这个行为很容易 break things

!! 依赖解析

Pipenv 的依赖解析做得不够好,有些时候项目的依赖是有解的,但是 Pipenv 解不出来。[[sdispater/poetry|https://github.com/sdispater/poetry]] 上有一个例子。

!! 功能差异

* Peotry 即可以做 Python 应用的依赖管理(比如你的 Web 项目),也可以做 Python 库的;而 Pipenv 只能做 Python 应用的
* Peotry 支持上传 PyPI
* Peotry 可以替代 `setup.py`,是更统一的解决方案;而 Pipenv 不能

!! 个人体验

从 API 设计和一些行为看,pipenv 不像是质量优良的产品,用的过程中也遇到大大小小的 bug。比较难接受的是,在宣传上几乎是被认为 Python 项目依赖管理的最佳实践,但是却不是质量足够高的产品。

实际使用时 `pipenv install` 中的 `--deploy` 参数,在字面含义上难以理解,同时执行起来行为又不如所描述的。

Peotry 个人使用得不多,还没遇到什么坑。但是觉得 `poetry init` 这个生成脚手架的功能并不是很合适,只生成一个 `pyproject.toml` 会更好。

!! 参考

* [[sdispater/poetry|https://github.com/sdispater/poetry]]
* [[wemake-django-template: why we have moved from pipenv to poetry for all our projects|https://www.reddit.com/r/Python/comments/9yg5s7/wemakedjangotemplate_why_we_have_moved_from/]]
* [[Why is pipenv the recommended packaging tool by the community and PyPA?|https://www.reddit.com/r/Python/comments/8jd6aq/why_is_pipenv_the_recommended_packaging_tool_by/]]
* [[Python packaging war: Pipenv vs. Poetry|https://frostming.com/2018/05-15/pipenv-vs-poetry]]
播客、视频节目相关。

!! 播客推荐

* [[中文独立播客|https://typlog.com/podlist/]]


目前主力使用 Pocket Casts 及小宇宙。

曾经使用一段时间 [[Castbox|https://castbox.fm]],但是它除了 web 播放器免费之外(不如 Pocket Casts 的收费播放器好用),其他功能一般。

另外我曾考虑在 Inoreader 上管理播客订阅,但是 Inoreader 对音频内容的播放功能太差。
[[Podcast Insights|https://www.podcastinsights.com/]] 是非常专业的播客网站,从录音设备、剪辑软件到内容托管、市场营销,应有尽有。
[[Podcast Insights|https://www.podcastinsights.com/podcast-equipment/]] 提供了非常多专业的内容,包含:

* 设备推荐
* 音频处理软件介绍
* Podcast Hosting
* Marketing

!! 通过微信语音沟通时录制多人播客

多人播客时,有时候是通过微信或者其他软件远程沟通的,这个时候推荐的录制方法是:

# 在电脑上用微信来通话,使用麦克风和耳机进行对话
# 使用 OBS 来录制,在 OBS 中使用两个源,一个为电脑音频,一个为麦克风
# 将这两个源录制到不同的音轨,这样方便单独对自己或者微信上对方的声音做调整,比如将对方的音量调高等 
Poetry 常用功能速查。

!! 让 Poetry 在项目目录下创建 virtualenv

```bash
poetry config virtualenvs.in-project true
```

这样 `poetry install` 时会在项目下的 `.venv/` 建立 virtualenv。

!! 使用国内 PyPi 镜像源

在 `pyproject.toml` 中加入:

```toml
[[tool.poetry.source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
default = true
```

!! Poetry 构建包

使用 Poetry 构建 Python 包(而不是仅用来做依赖管理)时,你需要在项目根目录下有一个与 `pyproject.toml` 中定义的 project name 同名的 Python 包:

```
google-drive-explore
├── README.md
├── google_drive_explorer
│   ├── __init__.py
│   └── main.py
├── poetry.lock
├── pyproject.toml
├── result.html
├── result.md
└── token.json
```

`pyproject.toml` 文件如下:

```toml
[tool.poetry]
name = "google_drive_explorer"
version = "0.1.0"
description = ""
authors = ["kevin.lin <kevin.lin@shopee.com>"]

[tool.poetry.dependencies]
python = "^3.9"
google-api-python-client = "^2.4.0"
google-auth-httplib2 = "^0.1.0"
google-auth-oauthlib = "^0.4.4"
Markdown = "^3.3.4"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry.scripts]
google-drive-explorer = 'google_drive_explorer.main:run'
```

使用 `poetry build` 构建出源码包和 Wheel 包,会放在 `dist` 目录下。

如果你想要构建出来的包,被 pip install 时可以安装某个 binary 进 `PATH`(类似 `django-admin.py`),使用 `[tool.poetry.scripts]` 来指定 binary 的名字和运行哪个函数。看上面例子。同样的功能在 setup.py 体系中叫 [[scripts|https://docs.python.org/3/distutils/setupscript.html#installing-scripts]]。




!! Resource

* Beginner: [[Official Docs|https://www.postgresql.org/docs/]]
* Advanced: //Mastering PostgreSQL 11: Expert techniques to build scalable, reliable, and fault-tolerant database applications//

<<.todo "[[21.2|https://www.postgresql.org/docs/13/role-attributes.html]] 中跟 configuration settings 相关的内容未读。[[21.3|https://www.postgresql.org/docs/13/role-membership.html]] 开始的内容未读。">>

PG 有 user 和 group 的概念,但是它们都被包裹在 role 中。

!! Role Attributes

|!属性  |!作用                      |!语句 |
|!login |可登陆                     |`CREATE ROLE <name> LOGIN`<br>`CREATE USER <name>`<br>`CREATE USER` 隐含了 LOGIN。 |
|!superuser |不受权限控制 |`CREATE ROLE <name> SUPERUSER` |
|!database creation |可创建 DB;销毁 DB 需要由 DB owner |`CREATE ROLE <name> CREATEDB` |
|!role creation |可创建、修改、销毁除 superuser 外角色 |`CREATE ROLE <name> CREATEROLE` |
|!initiating replication |可初始化主从间同步;同时需要 LOGIN 属性|`CREATE ROLE <name> REPLICATION LOGIN` |
|!password |可通过密码登陆 |`CREATE ROLE <name> PASSWORD 'string'` |

[[psql]] 的 `\du` 元命令可以看所有 login role 的 attributes:

```
postgres=> \du
                                      List of roles
    Role name    |                         Attributes                         | Member of 
-----------------+------------------------------------------------------------+-----------
 course          | Superuser                                                  | {}
 goodreads_clone | Superuser                                                  | {}
 onlyice         | Create DB                                                  | {}
 postgres        | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
```

`SELECT * FROM pg_roles;` 可以看到所有 role 的属性。
!! The PostgreSQL User Account

应该由单独的系统用户(而不是 root 或者其他日常有使用的用户)来运行 PostgreSQL。一般会使用 `postgres` 用户来运行。

对于 Arch Linux,安装 PostgreSQL 后,会 [[自动生成|https://git.archlinux.org/svntogit/packages.git/tree/trunk/postgresql.sysusers?h=packages/postgresql]] `postgres` 用户,并且运行 server 时也是 [[使用此用户|https://git.archlinux.org/svntogit/packages.git/tree/trunk/postgresql.service?h=packages/postgresql]]。

你 ''仅能'' 使用该用户(`sudo -iu postgres`)来运行管理 PG 的任何命令,如 `psql`、`initdb`、`createdb`、`dropdb` 等。如果你在 `initdb` 时允许 group access (`-g`),则 `postgres` 组上的用户有读权限,需要重启 server 生效。实现上是给 data 目录设置上不同的文件和目录权限。
在 `createdb` 时,

```
createdb -l en_US.UTF-8 -O squirrel_admin squirrel
```

遇到了这样的报错:

```
createdb: error: database creation failed: ERROR:  new collation (en_US.UTF-8) is incompatible with the collation of the template database (C.UTF-8)
HINT:  Use the same collation as in the template database, or use template0 as template.
```

原因是 PG 内置了两个 [[template databases|https://www.postgresql.org/docs/current/manage-ag-templatedbs.html]],分别叫 template1 和 template0。template1 可能是在安装 PG server 时生成的,而当时的 `LC_COLLATE` 是 C,导致 template1 的 collation 也是 C。PG 在 createdb 时默认会复制 template1 形成新的库,因此指定的 collation 冲突时会报错。

解决方式有两种:

* 用 template0,有两种方式:
** SQL:`CREATE DATABASE dbname TEMPLATE template0;`
** CLI: `createdb -T template0 dbname`
* 重建 template1,方法参考 [[这里|https://stackoverflow.com/a/18873193]]

Connection string 是指在使用 C driver libpq 时,用来指定数据库的一串字符串。格式如下,遵循 RFC 3986:

```
postgresql://[user[:password]@][netloc][:port][,...][/dbname][?param1=value1&...]
```

例子:

```
postgresql://
postgresql://localhost
postgresql://localhost:5433
postgresql://localhost/mydb
postgresql://user@localhost
postgresql://user:secret@localhost
postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp
postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp
```

!! 参考

[[PostgreSQL: Documentation: 13: 33.1. Database Connection Control Functions|https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING]]



PowerShell 有 profile 的概念,跟 `.bashrc` `.zshrc` 的作用类似。

官方文档在 [[这里|https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-5.1]](5.1 版本)。Profile 文件的路径主要区分这几点:

* 运行环境是 console 还是 ISE
* 应用在当前用户还是全部用户

最佳实践是用 Current User, All Hosts 这种,文件路径是 `$Home\[My ]Documents\Profile.ps1`。但是我发现办公室的 Win 10 的文件路径跟文档的不一样,它是在 `$Home\Documents\WindowsPowerShell\profile.ps1`。在 PowerShell 中用 `$profile.CurrentUserAllHosts` 看一下。

PowerShell Core 6 是微软开源的跨平台版本,profile 文件的 [[位置|https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles]] 的不太一样。

!! 在多台机器上共享 profile

我在 Dropbox 上放了一份共享的 profile,路径是 `Dropbox\Sync\SharedPowerShell_profile.ps1`。在当前机器的 profile 文件中引入它:

```
& "~\Dropbox\Sync\SharedPowerShell_profile.ps1"
```
|!Name |Practical Django 2 and Channels 2: Building Projects and Applications with Real-Time Capabilities |
|!Author |Federico Marani |
|!Edition |N/A |
|!Release Date |December 2018 |
|!ISBN-13 |978-1484240984 |
|!Medium |[[网站|https://learning.oreilly.com/library/view/practical-django-2/9781484240991/]] |
|!Rating |{{!!rating}} |

!! 点评

这本书类似国内的项目实战书,有很多代码,可以照着实践。

优点:

* 对 Django 机制的讲解不错
* 按书中代码敲,可以实际地做成这个项目
* 有测试相关的内容,提倡了比较好的软件工程实践
* 对整个 Django 生态,比如测试、部署、开发工具、第三方库等,做了非常详细的介绍

缺点:

* 前端和客户端的章节我觉得意义不大。是本 Django 书就主力写 Django 内容就好了,其他领域的知识也很难在这么短的篇幅中写好
* 代码有些业务逻辑没有考虑清楚,似乎是为了写书而做的偏玩具性质的项目,比如:
** 处理用户登录后合并购物车的逻辑,没有考虑未登录前的购物车和登录态的购物车中有同样的商品
** 如果用户未登录时没有添加商品到购物车,但是登录态还存在购物车,那么代码逻辑中不会把登录态的购物车拿出来
* 一些代码实现上的下瑕疵:
** 存在一些打错的地方
** 一些需要配置的变量没有被提及
** 一些 JS 逻辑不佳

!! 笔记

第一章到第四章大多数是讲 Django 自身的机制,纪录在 [[Django]] 节点中。

第五章 Adding CSS/JavaScript to Our Django Project 大多数是前端的内容,没有细看。重点的内容大约是:

* 前端的端到端测试,可以用 selenium 配合 Django test
* 可以使用 django-webpack-loader 来让 Django 配合 webpack。配置成本看似挺高

我个人更倾向于前后端分离,后端出 API,前端负责 SPA 和 Server-side rendering 的方案(比如 Next.js 和 Gatsby)。用 Django 配合 MVVM JS 框架应该不是个好选择。

第六章写了一些好的第三方工具、库,比较有价值,纪录在 [[Django: Third Party Library]]。

第七章是讲深入定制 admin 界面,把 admin 界面做成内部 dashboard,兴趣不大跳过了。

第八章讲 Django Channles,我没细看,这比较局限在网页端实时通讯,应用场景可能不多,学习成本又看似挺高,跳过。

第九章讲如何用 React Native 写一个客户端应用。没有细看,大部分篇幅是代码,我觉得也可能没法写得深入。跳过。

第十章比较实际,写了部署所需要关心的点:

* JS/CSS Minify,使用 webpack
* [[Serving Static Assets|Django: Serving Static Assets]]
* [[Environment-Specific Variables|Django: Deployment]]
* Deploying on Dokku / Heroku,偏流程型,没细看
* SSL, WebSockets, and HTTP/2:描述了 Django 需要配合做什么相应的配置
* Setting Frontend Variables:有一些各页面都通用的模板 context variable,比如 copyright 上的年份,Google Analysis 的 tracker ID 等,可以利用 Django 的 context processor 使得每次模板渲染时都有这些变量可用
* Customizing Error Pages:404 / 500 页面编写
* Error Reporting:Django 内建了出错发邮件等机制;如果需要更高级能力,用 [[Sentry|https://sentry.io/]]
|!Name |怪诞行为学:可预测的非理性 |
|!Author |[以色列]尤瓦尔·赫拉利 [译]林俊宏  |
|!Edition |N/A |
|!Release Date |September 2010 |
|!ISBN-13 |978-7508622187 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

下面的内容是我在微信读书上做的点评跟笔记。

!! 点评

最早是从刘未鹏的文章里了解到这本书。这本书很容易读,基本上都是一些故事或实验围绕着一个观点。
里面有些观点挺有意思,点出了一些日常生活中难以关注到的点,引发思考;不足的是很多实验或者案例显得没说服力,比如很多实验都是在校园进行,而没有放在一个更大的环境、利用更多数据来推导。这导致这里面的观点不一定足够普适甚至是不正确的。

!! 推荐序

> “把心理学研究和经济学研究有效地结合,从而解释了人们在不确定条件下如何决策”,“发展了一整套实验研究方法,尤其是在实验室里研究市场机制的选择性方面”。

!! 富人嫉妒比自己更富有的人

可怕😨

> 面包机就说到这里。让我们再看看在另一种不同环境中的诱饵效应。比如你是单身,希望在即将参加的择偶晚会上吸引更多的未来约会对象,怎么办呢?我的建议是,你带上一个同伴,外观特点和你基本相似(相似的肤色、体型、面貌),但要比你稍稍差一点(-你)。
为什么?因为你想吸引的那些人很难在没有比较的情况下对你作出评估。但是如果把你和-你来比较,你那个作为诱饵的朋友就会把你提升许多,不单是与他(她)比较,而且从总体上与在场的其他人来比较,也是如此。这似乎显得不是很理性(我不敢保证这一点),但你很有可能为更多人所瞩目。当然,我们不能将评判标准仅停留在外观上。如果妙语连珠的谈吐能使你胜出,那就注意去择偶晚会时带上个不如你那么能言善辩、反应机敏的朋友。比较之下,你会显得更加出类拔萃。

!! 买书免运费与免费换机油

感觉这个案例不好,如果亚马逊的服务对我没有价值,那 $10 跟 $20 有什么区别?

> 好吧,我来出一道智力测验题。假如我给你们两个选择,每人只能选一个,一个是一张10美元的亚马逊网络书店的礼品券——免费,另一个是一张20美元的礼品券——你要付7美元。想一下马上回答。你选择哪一个?

!! 涨工资可以解决“血汗工厂”的痼疾吗?

我司过节从来不发钱,就是这个原因吗。

> 你要给雇员价值1000美元的礼物,还是1000美元的现金?哪个更好一些?如果你问雇员,大多数人很可能希望得到现金而不是礼物。但是礼物有其本身的价值,尽管有时礼物的真实价值被错估、低估,它却能在维护雇主与雇员之间的社会规范上起推动作用。

!! “火人节”:纯社会规范的回归

> 刚开始我感觉一切都很陌生,不久我就适应了“火人节”的规范。我很惊奇,事实上,我发现“火人节”是我所见过的最有包容精神、最具社会性、最有爱心的。我不敢说我很愿意在“火人节”这样的环境中住满一年52个星期。但是这一经历使我相信现实中多一些社会规范,少一些市场规范,我们的生活会变得更惬意、更有创造力、更充实,而且更有乐趣。

这一章引入了「社会规范」和「市场规范」两个概念,简单易懂,同时给出了一些社会规范能更好发挥作用的案例。这让我想起两个事情:

# 大学时心理系的学生经常会找人当被试做实验,回报有时会是精美礼品(其实就是一些零食糖果),有时会直接是小额的现金(五块钱),不知道他们有没有对比过效果
# 清明节在电视上有很多追悼烈士的节目,平时也有挺多歌颂公安干警的宣传,这似乎是我党利用社会规范来更好地管理这套武装力量?毕竟给再多的钱也很难让人愿意卖命。。同时知乎上一堆宣传警察功绩的帖子,也可能是上头指派的任务吧。。
>事实上,如果我们仔细回忆一下过去的几十年里市场规范怎样接管了我们的生活——它强调高工资、高收入、高消费——我们就会认识到让社会规范部分回归可能并不是什么坏事。实际上,它可能会把相当一部分

!! “你只需说不”Vs.“没问题”

> 第二,除非学生们已经懂得自己在激情状态中可能如何反应,否则他们就不应被看做有预测能力。因此性教育应该把关注焦点从心理学和人的生殖系统构成理论上,转移到怎样应对性兴奋的各种伴随状态上来。

!! 美食不如美器,预期改变品位

提高预期不是更容易降低评价吗,这里的观点跟生活经验不符

> 这种预期的影响力并不局限于饮食。如果请朋友看电影,你事先告诉他们评论家对该片评价如何高,他们就会更喜欢这部影片。

!! 价格越贵的药越有效吗?

啊我不太相信这个结果,又是一个没说服力的案例。

> 用这些题来测试喝过SoBe的学生,结果会怎样呢?花全价买饮料的学生平均做对了9道——与根本没喝过SoBe饮料的学生相同。更有意思的是花半价买饮料的这些人的成绩:平均答对6.5道题。我们从中可以得出什么?价格确实决定成绩,在这一案例中两组学生组词的表现有28%的差别。

!! 安慰疗法的去与留

尴尬。。

> 同时,如果因此而停止安慰疗法的实验,同样令人难以接受。这种疗法可能让成千上万的人们接受无作用(有风险)的手术。在美国,各个步骤都经过科学测试的外科手术很少。因此,我们实际上并不了解很多手术是否真能治好病,或者像从前的一些手术一样,因为安慰疗效才取得效果。

!! 政府法令能杜绝不诚实吗?

> 我的感觉是,我们的确看重诚实,想做诚实的人。但问题在于,我们内心的诚实尺度只有在考虑重大越轨行为时才被激活,例如,是否把会议室里一整盒钢笔据为己有的时候。在面临细微的越轨行为时,例如拿走一两支钢笔,我们甚至不会去想这点琐事与诚实有什么关联,因而我们的超我仍然在睡大觉。

!! 各行各业中的“灰色地带”

> 例如,加州律师公会1996年所作的一项研究发现,加利福尼亚州大多数律师对工作中的道德沦丧感到厌恶,对法律行业的现状“深感悲观”。2/3的人说今天的律师“因为经济压力不能坚守专业规范与准则”。将近80%的人说律师公会“未能适当处罚那些不遵守职业道德的律师”。1/2的人说如果能够重新选择职业,他们不会当律师。

> 例如,加州律师公会1996年所作的一项研究发现,加利福尼亚州大多数律师对工作中的道德沦丧感到厌恶,对法律行业的现状“深感悲观”。2/3的人说今天的律师“因为经济压力不能坚守专业规范与准则”。将近80%的人说律师公会“未能适当处罚那些不遵守职业道德的律师”。1/2的人说如果能够重新选择职业,他们不会当律师。

!! 谁是世界上最诚实的国家?

这让我想起 Coursera 的 Honor Code...

> 这次实验的新内容出现在第三组。测验开始以前,我们要求参与者们在试卷的上方这样的一则声明后面签名:“我知晓并允许本次实验结果进入麻省理工学院道德规范记录。”

「既然我们的母亲…」

> 在法律领域里,马里兰州霍华德县巡回法庭大法官丹尼斯·M·斯维尼发表了他的著作《律师法庭行为守则》,其中写道:“这里面的大多数规则,其实在我们很小的时候母亲就说过,她教导我们,懂礼貌有教养的人应该做到这些。既然我们的(还有你们的)母亲有别的重要事情要做,不能亲临我们州的每一个法庭,那我就把这些规则再对你们说一次。”

!! 非现金引发的作弊现象

> 你明白我们在干什么了吧?把一个扑克游戏筹码——本身没有任何价值的非现金货币——安插到交易中间,这会对学生们的诚实有影响吗?与那些直接拿到现金的学生相比,扑克游戏筹码会降低学生们诚实度,使他们多报自己的成绩吗?如果多报,会多出多少呢?

!! 诚实与不诚实的临界点

> 另一项研究里,我们发现家住纽约的商界人员,在旧金山机场(或者其他离家较远的地方)给孩子买礼物并纳入报销费用,比在纽约机场买或者从机场回家的路上买,更觉得心安理得。这一切在逻辑上都说不通,但是一旦交换介质是非货币的,我们为自己行为作出合理化解释的能力就会突飞猛进。

!! 现金时代的终结与舞弊行为的泛滥

> 我们要认识到一旦没有现金的直接提醒,我们就可能作弊,而且所达到的程度连我们自己都想象不到。我们必须唤醒自己,认识到这一切——不管是作为具体的个人、企业还是作为一个国家,而且是越快越好,越早越好。

!! 个人需求与群体属性的矛盾

> 本书从头到尾,我详细叙述了一些实验,希望你们觉得新奇,受到启发。如果你们感觉是这样,那是因为这些实验驳斥了“我们本质上是理性的”这一假定。

!! “免费午餐”是可以实现的

> 然而,本书(还有其他书)中的实验结果却显示,我们所有人的决策过程远不如传统经济学理论所假定的那么理性。我们的非理性行为既不是任意所致,也不是毫无目的,它有规律可循,而且可以预测。

!! 附录1 关于正文部分章节的补充 说明及趣闻逸事

不如发个红包。。

> 所以,如果送礼是一种理性行为,我去你家吃饭时就会说:“感谢你请我吃饭。我本来想花50美元给你买瓶波尔多葡萄酒,但又觉得这可能远不如直接给你50美元现金实用。”我点出5张10美元的钞票递给你说:“拿着,随便你怎么花都行。”或者我还可以只给你40美元,你我皆大欢喜,还省了我跑商店的麻烦。

可以跟很多行为类比,「可能性」是一切的乐趣所在。

比如玩王者荣耀,换个出装会不会更容易赢?这个打法是不是更合适?这种想法会驱动你去做尝试,去发现变化

> 食物丸、老虎机与电子邮件有什么关系?如果你仔细想一下,就会发现电子邮件与赌博其实非常相像。最相像之处是,垃圾邮件就等于拉下老虎机杠杆没中奖,但是说不定什么时候我们也能收到一封有用的邮件。我们意外地收到的邮件(食物丸)使我们兴奋不已,我们就上了瘾,不断地检查邮件,希望出现更多的意外惊喜。我们不断地拉杠杆,一次不行再拉一次,直到再次中奖。

> 我从干扰素治疗中得到的经验具有普遍意义:如果某一特定的预期行为导致即时的负面结果(惩罚),这一行为将很难促动,即使最终结果(在我这一案例中,增进健康)的预期价值很高也不例外。归根结底,延迟满足这一问题,难点就在这里。毫无疑问,我们都知道经常锻炼、多吃蔬菜对健康有好处,即便我们无法像德拉尼姐妹那么长寿;但是,因为很难在我们的意识里保持一幅我们未来健康状况的生动画面,我们还是忍不住要伸手去拿油炸甜面圈。

> 唉!为什么?他们为什么这样对待我?他们为什么抢走了我的安慰剂呢?

!! 附录2 用行为经济学解读 美国的次贷危机

> 这一观点看起来非常激进,事实上,它却是经济学中一个古老的观点。现代经济学鼻祖亚当·斯密,早在他的辉煌巨著《国富论》(1776年)出版之前,就写出了《道德情操论》(1759年),后者的重要性绝不亚于前者,但是更多是从心理学角度进行研究。在《道德情操论》中,亚当·斯密指出情绪、感情以及道德伦理也是人类行为的不同侧面,经济学家对此不但不应该忽视(更不用说无视了),还应该把它们当成值得研究的课题。

> 这就是一个最多应该贷款多少的问题如何转变成了银行最多可以贷给多少钱的问题,但是,这两个问题完全不是一回事。
做展示时的工具链。

!! PowerPoint 模板

Slide Carnival 提供了非常好看的 [[模板|https://www.slidescarnival.com/tag/tech]]。我在 2020 年 5 月将其 tech 标签下的模板全部下载了,放在了 Eagle 中。

!! HTML5 Slide

go 的 [[present 工具|https://pkg.go.dev/golang.org/x/tools/present]] 提供了不错的展示和运行 Go 代码的能力。

!! 代码

[[Slides|https://slides.com/features]] 提供了很棒的代码展示功能,可以仅高亮部分代码片断(其余部分变暗),而且这个高亮可以分为多步。这对于引导观众理解代码很有帮助。

!! 个性化地图

考虑使用安卓上的 [[Sphaera|https://play.google.com/store/apps/details?id=com.manco.sphaera_map_wallpapers&hl=en_US]] 来生成。我已购买。

!! 截屏及录屏

参考 [[Screen Capture and Recording]]。
压力测试。

! 工具

!! hey <<plat-win>> <<plat-linux>>

[[hey|https://github.com/rakyll/hey]] 是一个用 Go 写的 HTTP 压力测试工具。易用且性能高。

<<.warning "`-q` 参数指限定 QPS,但是它是指每个 concurrency worker (`-c`) 的 QPS。比如 `-c 4 -q 10`,则实际的 QPS 是 40(4x10)。[[GitHub issue|https://github.com/rakyll/hey/issues/72]] 中提到这个问题。">>

! 平台性能调优

一些 client / server 端的 kernel 参数会对压测有影响。见:

* [[MacOS: Performance Tuning]]

|!Name |Pro Git |
|!Author |Scott Chacon, Ben Straub |
|!Edition |2nd |
|!Release Date |November 2014 |
|!ISBN-13 |978-1484200773 |
|!Medium |[[网站|https://git-scm.com/book/en/v2]] |

在 Git 官方网站上,[[免费阅读|https://git-scm.com/book/en/v2]]。

一个 Git 仓库中,文件有个 tracked 状态。

* Untracked: 没有出现在上一个 commit 中,并且没有被 staged 的文件
* Tracked: 有出现在上一个 commit 中的文件,分两种状态:
** Modified: 被修改,跟上一个 commit 的内容不一样了
** Unmodified: 没有被修改

Working tree 表示本地 git 仓库下的文件们,不论他们是否被 track 了。Stage / Index 表示对文件的某一步修改,被 Git track 了。比如:

```bash
touch README
git add README
```

被 add 过的 README 文件,就被 staged 了,它会在 index 中。当下一次 commit 后,stage 中的修改被合进仓库历史中,然后  stage 又变成空的。



`git rm` 对 staged 的文件做操作,表示把一个文件中:

* `git rm` 作用于没有被修改、

产生创意。

无论是做内容还是做产品,有创意是第一步。

!! 改善已有产品

如果你对某类产品有兴趣,可以看看市面上已有产品是怎样的,它的优势在哪里?它的缺点是什么?

可以通过各类评测网站获得,比如扫地机器人的 [[评测网站|http://robot-vacuum-review.toptenreviews.com/]] 中,有很多机器人的缺点是“无法设置空气墙,无法设置某些区域让机器人不要进入”。也可以通过电商网站的评论获得(但是往往存在大量刷好评)。

另外曹政说过:

> 竞品分析不要只盯着对手的缺点看,也要知道人家厉害在哪里。靠功能和细节创新通常是干不掉市场领先者的,需要更完整的思路。

!! 找最近流行什么

一些网站服务提供了最近流行的内容分析:

* [[Buzzsumo|http://buzzsumo.com/]]:基于社交网络上的分享

TODO: 找到更多好的渠道

!! 解决自己日常生活中遇到的问题

[[Makebook|https://makebook.io]] 中提到,解决自己的问题也是一个可以考虑的点。因为你自己有这个问题,你知道解决方式是否足够好,而且对你也有帮助。但是要注意自己的这个问题是否足够广泛存在。

!! References

* [[Affiliate Marketing Made Simple: A Step-by-Step Guide - Neilpatel|https://neilpatel.com/what-is-affiliate-marketing/]]
* [[Makebook|https://makebook.io]]
[[Makebook|https://makebook.io]] 提供了一系列实用的指引,从产生 idea 到构建再到运营和盈利。
验证你的想法,你需要:

# 找到喜欢你的产品/内容的人群
# 观察/询问他们是否感兴趣,是否愿意付费

关于如何找到适合的人群,有这些例子:

* [[Remotive.io|Startup: Case: Remotive.io]] 的开发者向订阅其邮件列表的人发邮件直接询问
* [[Neilpatel|https://neilpatel.com/what-is-affiliate-marketing/]] 提到可以利用 Buzzsumo 及 Topsy 找到发过特定内容的 Twitter 用户
* 之前看到例子,有些人先做一个网站 Landing 页,再在社交网络上做宣传,看看访问网站的人有多少愿意点击注册按钮等

但要注意,有时候人们说喜欢你的产品,只是出于一种礼貌。最好的方式还是看看他们是否愿意付费。
探讨提升自我的话题,提供提高效率的工具、经验等。





编程范式。包含:

* 指令式的:
** Procedural(过程式)
** Object-oriented(面向对向)
* 声明式的:
** [[Functional|Programming Paradigms: Functional]](函数式)
** Logic
** Mathematical

一个编程语言可以支持多种范式。比如 JS 支持 ''过程式''、''面向对象'' 及 ''函数式''。
使用 JS 演示一些函数式编程的方法。

!! pipe

如何使用管道,使一个参数被多个函数依次处理后输出。例子来自 Code with Mosh 的 [[Redux 课程|https://codewithmosh.com/courses/ultimate-redux/lectures/14780293]]。

```javascript
import { pipe } from "lodash/fp";

const pickTag = obj => obj.tag;
const toLowerCase = str => str.toLowerCase();
const bracketify = str => `(${str})`;

const transform = pipe(pickTag, toLowerCase, bracketify);

// output: "(javascript)"
const output = transform({ tag: "JAVASCRIPT" });
```

!! Currying

Currying 是一种代码组织方式,用于将一个接受多参数的函数,变成只接受一个参数。通过一个返回函数的函数来实现。函数式编程中一般只接受一个参数。

```javascript
// Function which takes two argument
function add(a, b) {
  return a + b;
}

// Currying: transform into function which takes one argument
function add(a) {
  return function(b) {
    return a + b;
  };
}

const add2 = a => b => a + b; // (a, b) => a + b

add(1)(5); // add(1, 5)
// N => 1
```

Python 的 [[functools.partial|https://docs.python.org/3.8/library/functools.html#functools.partial]] 也可以用来实现类似的效果。

!! Tranform immutable data

对于不可变数据结构,如何新增、更新或者删除字段。例子来自 Code with Mosh 的 [[Redux 课程|https://codewithmosh.com/courses/ultimate-redux/lectures/14780289]]。[[JavaScript: Immutable Object]] 有更多讨论。

变化数组:

```javascript
const numbers = [1, 2, 3];

// Adding
const index = numbers.indexOf(2);
const added = [...numbers.slice(0, index), 4, ...numbers.slice(index)];

// Removing
const removed = numbers.filter(n => n !== 2);

// Updating
const updated = numbers.map(n => (n === 2 ? 20 : n));
console.log(updated);
```

变化对象:

```javascript
const person = {
  name: "John",
  address: {
    country: "USA",
    city: "San Francisco"
  }
};
const updated = {
  ...person,
  address: {
    ...person.address,
    city: "New York"
  },
  name: "Bob"
};
console.log(person);
```

注意,采用 spread operation 时,spread 的语句要写在前面。写在后面的字段有更高的优先级。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 459 422">
    <style>
        .fill{fill:none;stroke:#4ca3cc;stroke-width:17px;stroke-opacity:.32}.box-text{font-size:20px;line-height:1;fill:#000;font-family:Reenie Beanie;text-anchor:middle}.box-outline{fill:none;stroke:#000;stroke-width:6.3;stroke-linejoin:round}.joiner{fill:none;stroke:#000;stroke-width:3.8;stroke-linecap:round}.pos{stroke:#0068ff}.neg{stroke:#a00}
    </style>
    <g transform="translate(-58.5 -54.929)" class="box">
        <path d="M226 63.4l-158 5 164 15-157 2 152 13-160 2.6 164 11" class="fill"/>
        <path d="M223 67.3l-140-3.9-1.97 46.9 141 .971-.117-30.8" class="box-outline"/>
        <text y="95.567" x="153.244" class="box-text">
            <tspan y="95.567" x="153.244">asyncThing1</tspan>
        </text>
    </g>
    <g transform="translate(-57.529 24.683)" class="box">
        <path d="M226 63.4l-158 5 164 15-157 2 152 13-160 2.6 164 11" class="fill"/>
        <path d="M223 67.3l-140-3.9-1.97 46.9 141 .971-.117-30.8" class="box-outline"/>
        <text y="95.567" x="153.244" class="box-text">
            <tspan x="153.244" y="95.567">asyncThing2</tspan>
        </text>
    </g>
    <g transform="translate(-55.587 110.119)" class="box">
        <path d="M226 63.4l-158 5 164 15-157 2 152 13-160 2.6 164 11" class="fill"/>
        <path d="M223 67.3l-140-3.9-1.97 46.9 141 .971-.117-30.8" class="box-outline"/>
        <text y="95.567" x="153.244" class="box-text">
            <tspan y="95.567" x="153.244">asyncThing3</tspan>
        </text>
    </g>
    <g transform="translate(145.383 27.595)" class="box">
        <path d="M261 65.4l-193 3 199 17h-192l187 14.6-195 1 199 13" class="fill"/>
        <path d="M248 67.3l-165-3.9-1.97 46.9 179 .971-5.94-31.8" class="box-outline"/>
        <text y="93.625" x="168.778" class="box-text">
            <tspan x="168.778" y="93.625">asyncRecovery1</tspan>
        </text>
    </g>
    <g transform="translate(-56.558 191.673)" class="box">
        <path d="M226 63.4l-158 5 164 15-157 2 152 13-160 2.6 164 11" class="fill"/>
        <path d="M223 67.3l-140-3.9-1.97 46.9 141 .971-.117-30.8" class="box-outline"/>
        <text y="95.567" x="153.244" class="box-text">
            <tspan x="153.244" y="95.567">asyncThing4</tspan>
        </text>
    </g>
    <g transform="translate(183.702 117.575)" class="box">
        <path d="M261 65.4l-193 3 199 17h-192l187 14.6-195 1 199 13" class="fill"/>
        <path d="M248 67.3l-165-3.9-1.97 46.9 179 .971-5.94-31.8" class="box-outline"/>
        <text y="93.625" x="168.778" class="box-text">
            <tspan y="93.625" x="168.778">asyncRecovery2</tspan>
        </text>
    </g>
    <g transform="translate(159.617 189.869)" class="box">
        <path d="M228 64.4l-194 2.1 200 17.9-193-.9 198 16.5-208.9-.5 201.9 13.5-197.1 6 200.1 7-199.2 10 202.2 8" class="fill"/>
        <path d="M223 69.2l-184-.942 6.77 72.1 176 1.94 7.65-59.9" class="box-outline"/>
        <text y="97.508" x="133.826" class="box-text">
            <tspan x="133.826" y="97.508">log &quot;Don&apos;t worry</tspan><tspan x="133.826" y="129.508">about it&quot;</tspan>
        </text>
    </g>
    <g transform="translate(-6.073 269.343)" class="box">
        <path d="M162 64.4l-128 3 134 17h-127l132 15.6h-142.9l138.9 13-139.9 5 143.9 8-149.8 11 152.8 7" class="fill"/>
        <path d="M157 69.2l-111.9-.9-6.8 71.7 124.7-1-1-54.7" class="box-outline"/>
        <text y="94.596" x="100.817" class="box-text">
            <tspan y="94.596" x="100.817">log</tspan><tspan y="126.596" x="100.817">&quot;All done!&quot;</tspan>
        </text>
    </g>
    <path class="joiner pos" d="M93.8 60l.249 22.5"/>
    <path class="joiner pos" d="M88.5 74l5.4 10.9 5.8-10.9"/>
    <path class="joiner pos" d="M94.8 140l-1.22 27.4"/>
    <path class="joiner pos" d="M88.1 160l5.7 11 6.2-11"/>
    <path class="joiner pos" d="M94.6 225v25.7"/>
    <path class="joiner pos" d="M89.3 241l5.3 10.9 5.08-9.92"/>
    <path class="joiner pos" d="M94.8 306l-.727 25.3"/>
    <path class="joiner pos" d="M88.3 323l5.56 10.4 5.55-9.92"/>
    <path class="joiner neg" d="M168 35.9s67.5-12.4 72.1 48.5"/>
    <path class="joiner neg" d="M233 76.7l7.74 9.19 4.12-9.43"/>
    <path class="joiner neg" d="M169 116l52.9 1.7"/>
    <path class="joiner neg" d="M211 111l11.6 6.04-12.3 5.81"/>
    <path class="joiner neg" d="M170 202s69.3 14.1 68.4-54.9"/>
    <path class="joiner neg" d="M232 153l6.04-10.2 5.33 11.6"/>
    <path class="joiner pos" d="M257 142c-.971 120-108 55.4-111 110"/>
    <path class="joiner pos" d="M143 244l2.18 9.68 7.74-7.25"/>
    <path class="joiner neg" d="M169 282l22.9.244"/>
    <path class="joiner neg" d="M187 276l9.93 5.8-10.4 5.57"/>
    <path class="joiner neg" d="M310 141l-1.08 33.5"/>
    <path class="joiner neg" d="M304 167l5.57 10.2 5.08-10.2"/>
    <path class="joiner neg" d="M308 231v19"/>
    <path class="joiner neg" d="M303 244l5.8 10.2 5.56-10.4"/>
    <path class="joiner pos" d="M309 336c0 26.1-17 24.5-144 23"/>
    <path class="joiner pos" d="M173 352l-10.7 6.04 10.2 5.8"/>
    <path class="joiner pos" d="M419 233c1 161-20 160-256 159"/>
    <path class="joiner pos" d="M173 386l-11.5 5.95 11.9 5.16"/>
</svg>
Protobuf 是 Google 出品的结构化数据格式。特点是 ''语言中立''、''平台中立''。下面的内容基于 pb3 在 2020 年 10 月的版本。

!! 流程

# 写一个结构定义文件
# 用 protoc 将其生成为编程语言相应的代码
# 配合 protobuf 各语言的 runtime 就可以使用

!! 上手指南

# 根据 [[指引|https://github.com/protocolbuffers/protobuf]] 安装 protoc 以及你要使用的语言相应的 runtime
# 根据 [[language guide|https://developers.google.com/protocol-buffers/docs/proto3]] 理解一个 .proto 文件的基础写法,写好后用 protoc 生成代码文件
# 找到你对应语言的 generated code [[文档|https://developers.google.com/protocol-buffers/docs/reference/overview]],了解生成的代码文件 API 如何使用

!! Language Guide

这份 [[cheat sheet|https://gist.github.com/shankarshastri/c1b4d920188da78a0dbc9fc707e82996]] 简要地描述了 proto 文件的语言规则。

pb3 去掉了 `required` / `optional` 标识(在 pb2 中存在),一切都是 optional。

对于没打包的字段,解包时会默认用其类型的 [[默认值|https://developers.google.com/protocol-buffers/docs/proto3#scalar]],比如数值类型是 0,字符串类型是空字符串。由于这个默认值规则,因此 enum 类型的第一个值必须是 0。

enum 类型支持 alias,但需要显式打开选项:

```
enum EnumAllowingAlias {
  option allow_alias = true;
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;
}
```

可以为消息或者 enum 类型保留某些 tag number 或是字段名,使其不能被使用:

```
message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}

enum Foo {
  reserved 2, 15, 9 to 11, 40 to max;
  reserved "FOO", "BAR";
}
```

字段类型一般是不能修改的(有兼容性问题),但一些 [[情况|https://developers.google.com/protocol-buffers/docs/proto3#other]] 例外(主要是数值类型)。

使用 [[Any|https://developers.google.com/protocol-buffers/docs/proto3#any]] 类型时,可以将任意一个 message 类型的值打包进 Any 字段。

[[Oneof|https://developers.google.com/protocol-buffers/docs/proto3#using_oneof]] 表示 message 里面,某些字段只能有一个字段被设置上值。

Protobuf 的结构可以 [[跟 JSON 互相转换|https://developers.google.com/protocol-buffers/docs/proto3#json]]。

Message ''不支持继承''。

!! Well-Known Types

Google 提供了一些常用的类,称之为 [[well-known types|https://developers.google.com/protocol-buffers/docs/reference/google.protobuf]],也用 proto 文件表达。使用时需要在 proto 文件中 import 进来:

```
import "google/protobuf/timestamp.proto";

message Person {
  string name = 1;
  // ...
  google.protobuf.Timestamp last_updated = 5;
}
```

''但我觉得里面没多少好用的东西''。

!! Best Practices

团队应该维护一个公共的基础 message 库,比如定义业务相关的基础数据类型(比如用户),通用的结构(比如时间)等。

Uber 在 pb 上耕耘了很久,[[prototool|https://github.com/uber/prototool]] 和 [[buf|https://github.com/bufbuild/buf]] ''非常值得一看''(我还没看)。

这份 [[文档|https://github.com/protocolbuffers/protobuf/blob/master/docs/third_party.md]] 提供了 PB 相关的编程语言库、工具、RPC 实现等。
参考 [[PostgreSQL: Admin: General]],使用 postgres 用户运行 psql。

退出:

```
postgres=# \q
```

列出用户:

```
postgres=# \du
                                      List of roles
    Role name    |                         Attributes                         | Member of 
-----------------+------------------------------------------------------------+-----------
 course          | Superuser                                                  | {}
 goodreads_clone | Superuser                                                  | {}
 postgres        | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
```

导入数据,用 `\i`,如 `basics.sql`。

单步模式:`psql -s`。效果如下:

```
$ psql -s mydb
psql (12.3)
Type "help" for help.

mydb=# \i basics.source 
***(Single step mode: verify command)*******************************************
CREATE TABLE weather (
        city            varchar(80),
        temp_lo         int,
        temp_hi         int,
        prcp            real,
        date            date
);
***(press return to proceed or enter x and return to cancel)********************
```

心理治疗师或者心理咨询师的内容。

我觉得在迷茫或者没有动力的时候,适合看看这些人的内容。因为它们的内容往往会引发你对自己的思考,这是很好地调节情绪的方法。你对自己的认识越多,越能理解自己的情绪,调节自己。

!! 李松蔚

内容主要在 [[知乎|https://www.zhihu.com/people/lisongwei]] 上。我觉得李松蔚的文章写得比较好,但是视频内容一般。

!! 简里里

简里里和她老公峰哥有做播客,名字叫 [[Blow Your Mind|https://www.ximalaya.com/zhubo/43720750]]。我很喜欢简里里的思维,非常感性和温和,给人听起来感觉非常好。峰哥也是近似的。很羡慕家庭伴侣是可以深入聊各种话题且脾气好的。

!! Steve 说

[[Steve 说|https://www.ximalaya.com/jiaoyu/3385682/]] 的主播叫史秀雄。我觉得它的播客的内容会深入一些,虽然有些听起来比较枯燥,比如我并不太关心原生家庭的话题,因为我自己的原生家庭并不算差,我感受不到差的家庭是怎样的。但是它有些内容还是非常引发思考的。

|!Name |Python for Data Analysis |
|!Author |Wes McKinney |
|!Edition |1st |
|!Release Date |October 2012 |
|!ISBN-13 |978-1-4493-1979-3 |
|!Medium |电子书 |

!! 这本书是否值得一读

这本书在美国亚马逊的 [[评论|https://www.amazon.com/Python-Data-Analysis-Wrangling-IPython/product-reviews/1449319793/ref=cm_cr_dp_text?ie=UTF8&showViewpoints=0&sortBy=helpful]] 中,有一些看法:

# A tutorial in need of editorial work; not comprehensive; not a useful reference
#* 这本书有一些表达过于口语化,不够严谨;同时有一些信息不重要,不值得列出来
# Good for beginners. Faint printing problem. Somewhat outdated in 2016.
#* 2012 年刚出版时,关于 pandas 的教程还不多;到了 2016 年,网上的资源已经很不错了
#* R is winning the R vs Pandas argument due to ggplot2 and statistical learning professors publishing code first in R. 所以 pandas 可能在流行度上不如 R

作者正 2017 年发布了这本书的 [[第二版|http://shop.oreilly.com/product/0636920050896.do]]。有个非常熟练 Pandas 的人写了一篇 review:[[Python for Data Analysis — A Critical Line-by-Line Review|https://medium.com/dunder-data/python-for-data-analysis-a-critical-line-by-line-review-5d5678a4c203]],很不给情面地讲了这本书的种种缺点。我觉得这本书没有必要看了。

!! 个人体验

我并没有深入看这本书 (大约看了前 3~4 章)。看了目录,发现大部分是对 Scipy 栈的用法的描述,没有太多实际项目的经验提供,内容空洞。如果只是学习 Scipy 栈,网络上也有非常多好的材料,例如 [[Scipy Lectures|http://www.scipy-lectures.org]]。这使得这本书的作用并不大。



Python 的异步 I/O 是通过标准库 `asyncio` 及其生态构成的。

好的材料:

* [[FluentPythonCh18]] 是我入门 `asyncio` 的材料,但是里面的内容基于 Python 3.4,没有后来引入的 `async` / `await` 关键字,一些 API 也发生了变化;不过跟设计相关的内容仍值得看
* Python 的 [[官方文档|https://docs.python.org/3/library/asyncio.html]] 是不错的入门和使用材料
* Asyncio 的 [[单独文档|https://asyncio.readthedocs.io/en/latest/index.html]],里面有更详细的例子和相对平缓的学习曲线

下面的内容基于 Python 3.7。这里给一个理解整个体系的索引,看完这个索引你应该能更好地理解 asyncio 的 API 设计。相应的 API、代码示例等,需要再通过 Python 官方文档、框架文档或者其他渠道去学习。

<<.warning "有多年 Python 经验的彭哲夫在「[[这破 Python|https://zhuanlan.zhihu.com/p/45936509]]」提到 `asyncio` 生态差的问题,需要留意。">>

!! 核心模型

`asyncio` 通过异步 I/O 来达到 CPU 的最大利用,从而提升 Python 服务的响应时间和吞吐率。它使用的方式是 event loop。event loop 一般有两种运作机制,一种是异步回调 callback,一种是协程。Python 在语言层面上支持了协程,又提供了 `async` / `await` 关键字来方便使用。

业务程序跟 event loop 交互,关心几个事情:

* 任务以怎样的形式表达?([[awaitable|https://docs.python.org/3/library/asyncio-task.html#awaitables]])
* 如何将任务放进 event loop 并被调度?
* 如何获得任务的结果和异常?

调度的机制带来的问题:

* 如何同时运行多个任务?
* 如何终止一个运行中的任务?
* 如何给任务设置超时?

多任务协作带来的问题:

* 如何等待一个任务结束?
* 不同任务间的同步机制有什么?:[[Synchronization Primitives|https://docs.python.org/3/library/asyncio-sync.html]]
* 不同任务间的数据传递机制?:[[Queens|https://docs.python.org/3/library/asyncio-queue.html]]

!! 异步 I/O API

因为 `asyncio` 模型上是异步的,因此 Python 标准库中原有的 blocking I/O 函数不能被使用。`asyncio` 必需将这些功能实现在自己 的生态中。

* 异步网络 I/O:
** High-level API:[[Steams|https://docs.python.org/3/library/asyncio-stream.html]]
** Low-level API: [[Event loop|https://docs.python.org/3/library/asyncio-eventloop.html#opening-network-connections]], [[Transports and Protocols|https://docs.python.org/3/library/asyncio-protocol.html]]
* 异步文件操作:[[aiofile|https://github.com/Tinche/aiofiles]],由于操作系统没有成熟通用的异步 API,aiofile 通过线程来模拟
* 其他异步 I/O 库,参考 [[awesome-asyncio|https://github.com/timofurrer/awesome-asyncio]]

!! Event loop? (Really?)

我对 event loop 的设计存疑。Event loop 的功能,事实上不像它的字面意思上一样,它不仅做事件驱动,还 [[兼顾|https://docs.python.org/3/library/asyncio-eventloop.html]] 网络 I/O、TLS 升级、监听文件描述符、处理管道、信号、以及运行子进程。

!! 与其他异步框架的对比和交互?

Logged into ClickUp tasks.

* Asyncio 对比 Twisted 和 Tornado?
* Asyncio 对比 gevent 和 eventlet?
** https://glyph.twistedmatrix.com/2014/02/unyielding.html
** https://asyncio.readthedocs.io/en/latest/why_asyncio.html#but-gevent-and-eventlet-just-work
* Twisted 有一个 `asyncioreactor`,可以使用 asyncio 的 event loop 来驱动它的 Reactor;看看这两者是怎样整合的
* 看看 Twisted 作者的 [[The Report Of Our Death|https://glyph.twistedmatrix.com/2014/05/the-report-of-our-death.html]] 一文

!! 其他零碎的点

* 任务如何主动让出运行权?如何 sleep?:[[Waiting Primitives|https://docs.python.org/3/library/asyncio-task.html#waiting-primitives]]
* 如何在 asyncio 程序中运行同步(blocking)程序?:[[Running Blocking Code|https://docs.python.org/3/library/asyncio-dev.html#running-blocking-code]]
* 如何提升程序的并发量?多线程的可能性:[[Concurrency and Multithreading|https://docs.python.org/3/library/asyncio-dev.html#concurrency-and-multithreading]]
* [[调试的技巧|https://docs.python.org/3/library/asyncio-dev.html]]
参考 [[wemake-django-template|https://wemake-django-template.readthedocs.io/]]。

Python 的编码问题,[[Fluent Python 第四章|FluentPythonCh04]] 有非常不错的解答,解释了编码问题的深层原因,以及解决办法。

! History of default encoding

这篇博文解释了 Python 编码设计的一些历史原因: [[Why sys.setdefaultencoding() will break code|https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/]]。这篇文章的内容感觉比较水,我在这里总结一下。

2000 年时,Python 的开发者们决定给还未发布的 Python 2.0 增加 Unicode 相关的特性(Unicode Aware Python),于是有了 `unicode` 和 `str` 两种类型。但是当时互联网还未流行,很多国家甚至都没有多少计算机人才,所以编码问题在当时还是一个泥潭。同时当时 UTF-8 还没有成为编码格式中的标准。于是 Python 的开发者们选择了 `ascii` 作为 `unicode` 和 `str` 间隐式转换的编码,所以 `sys.getdefaultencoding()` 函数会返回 `ascii`。

但是他们犯了一个错误,提供了 `sys.setdefaultencoding()` 函数供开发者修改默认编码,这使得很多依赖于默认编码为 `ascii` 的程序出错。于是它们决定修复这个错误,用一种比较 hacky 的方式,在 `path.py` 初始化完后,删除了 `sys.setdefaultencoding()`。

但是随时时间推移,UTF-8 成了编码界的事实标准,大量的数据都使用了 UTF-8。于是默认的 `ascii` 编码很容易出现编解码问题。于是一种 reload hack 流行了起来:

```python
import sys
reload(sys)
sys.setdefaultencoding('utf8')
```

这种方式可以简单粗暴地解决一些问题,使得它很受欢迎。但是它仍然会引起一些其他库类出错,所以不受 Python 官方推荐。

后来 Python 3 将默认的编码改为了 UTF-8,并且去除了 byte string (`str` in py2) 和 text string (`unicode` in py2) 之间的隐式转换。于是 Python 2 中编解码出错的问题得到了比较好地解决。
!! GUI Packaging

* [[chriskiehl/Gooey|https://github.com/chriskiehl/Gooey]]: Turn (almost) any Python command line program into a full GUI application with one line

!! CLI Toolkit

General recommendation can be found on [[Command-line Applications - The Hitchhiker's Guide to Python|http://python-guide.readthedocs.io/en/latest/scenarios/cli/]].

* [[Clint|https://github.com/kennethreitz/clint]]: Python Command-line Application Tools. Provides many useful utilities such as coloring, indenting, etc.
* [[Click|http://click.pocoo.org/5/]]: argparse replacement, focusing building complicated application
* [[google/python-fire|https://github.com/google/python-fire]]: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.


Python 的多进程实现主要在 [[threading|https://docs.python.org/3/library/threading.html]] 模块中。

!! 模块设计

threading 模块的实现跟 Java 类似:

<<<
The design of this module is loosely based on Java’s threading model. However, where Java makes locks and condition variables basic behavior of every object, they are separate objects in Python. Python’s [[Thread|https://docs.python.org/3/library/threading.html#threading.Thread]] class supports a subset of the behavior of Java’s Thread class; currently, ''there are no priorities, no thread groups, and threads cannot be destroyed, stopped, suspended, resumed, or interrupted.'' The static methods of Java’s Thread class, when implemented, are mapped to module-level functions.
<<<

!! GIL 影响

因为 GIL 的存在,CPython 中同时只能有一个线程在执行 Python 字节码,而一般 Python 只会在执行 I/O  释放 GIL。''这使得 Python 的多线程不能有效利用多个 CPU 内核,适合做 I/O 密集的工作而不是 CPU 密集的。''

但 GIL 并不保证某个线程函数执行到一半不会被中断,因此对于共享变量,仍然要使用锁等机制来保护。

!! Linux 平台实现

threading 在不同平台有不同的底层实现。在 Linux 下使用的是 [[pthread 模型|OS: Thread]]。threading 模块中配合使用的各类 object,对应的底层实现如下:

* [[Lock Object|https://docs.python.org/3/library/threading.html#lock-objects]]:对应 NORMAL 类型 mutex
* [[RLock Object|https://docs.python.org/3/library/threading.html#rlock-objects]]:对应 RECURSIVE 类型 mutex
* [[Condition Objects|https://docs.python.org/3/library/threading.html#condition-objects]]:对应 condition variables
* [[Semaphore Objects|https://docs.python.org/3/library/threading.html#semaphore-objects]]:对应 POSIX semaphore
* Event Objects:未理解
* Timer Objects:未理解
* Barrier Objects:未理解

!! 线程本地变量

线程本地变量的概念是在 pthread 模型中提出的,可以在 [[TLPI: Ch31]] 理解。我认为对 Python 这种不需要手动内存管理、对象都在堆上生成的语言,''这种机制没有太大价值''。

考虑这样一个程序:

```python
from threading import Thread

count = 0

def incr(times):
    global count
    for i in range(times):
        count += 1

if __name__ == '__main__':
    t1 = Thread(target=incr, args=(1000000,))
    t2 = Thread(target=incr, args=(1000000,))

    t1.start()
    t2.start()
    t1.join()
    t2.join()

    print(count)     # 不会是 2000000,因为没有给临界区上锁
```

它的实现是有问题的,没有上锁。如果 `incr()` 不使用全局变量,那么两个线程各自加 100 万次,没有问题:

```python
from threading import Thread

def incr(times):
    count = 0
    for i in range(times):
        count += 1
    print(count)      # 1000000

if __name__ == '__main__':
    t1 = Thread(target=incr, args=(1000000,))
    t2 = Thread(target=incr, args=(1000000,))

    t1.start()
    t2.start()
    t1.join()
    t2.join()
```

因为 t1 和 t2 各自跑的 `incr()` 函数中分别拥有自己的一份 `count` 变量。但是多线程是共享同个内存地址空间的,因此假如因为某种机制(比如 weakref)t2 可以 refer 到 t1 的 count 变量的值,并对它做修改,那就会出现混乱。

而 `threading.local()` 就是用来避免这种情况的。使用 `threading.local()` 得到的 ''对象'',在不同的线程(包括主线程)中使用时,都只属于该线程本地使用:

```python
from threading import Thread, local

data = local()

def incr(times):
    # 注意要使用 data.count = 0,而不能 data = 0;
    # 因为 Python 的世界里,name 只是个指向 value 的 label,一旦 data = 0,
    # data 就与 thread.local() 失去了关系
    data.count = 0
    for i in range(times):
        data.count += 1
    print(data.count)           # 1000000

if __name__ == '__main__':
    t1 = Thread(target=incr, args=(1000000,))
    t2 = Thread(target=incr, args=(1000000,))

    t1.start()
    t2.start()
    t1.join()
    t2.join()
```
比较简单的日常任务经验。

!! 发送邮件

使用 [[drymail|https://github.com/SkullTech/drymail]],简单好用。

!! 通过 socks5 代理发送 HTTP 请求

`urllib3` 使用了 `PySocks` 来实现通过 socks5 代理发送 HTTP 请求。因此使用了 `urllib3` 的库,如 requests, python-telegram-bot 也获得了相应的能力。

值得注意的是,使用 `socks5://` scheme 时,DNS 解析是在客户端完成的,会影响 `api.telegram.org` 这类在中国大陆被 DNS 污染了的域名;使用 `socks5h://` scheme 来让 DNS 解析发生在服务端。

代码示例:[[Snippets: Python: Make HTTP Requests via Socks5 Proxy]]

对于以行为基础的数据(比如 list,CSV,SQL,Excel),有几个库可以处理。

!! Pandas

Pandas 应该是数据分析领域最专业、最强大的库之一。还没有深入了解,先不说太多。

!! Tablib

Tablib([[GitHub|https://github.com/kennethreitz/tablib]] | [[文档|http://docs.python-tablib.org/en/latest/]])是一个可以处理多种格式数据的方便的库。它可以将数据从 CSV, JSON, YAML, XLSX 等格式随意转换,接口简单易懂,使用方便。

缺点是不够专业。看过它的内部实现,每一行的数据是以类似 tuple 的形式存在,但是对于缺失值没有处理(Pandas 这方面做得好),这要求你的数据必需是规范的。
对于 XML/HTML 数据的处理,比较常用的库是 [[BeautifulSoup4|https://www.crummy.com/software/BeautifulSoup/bs4/doc/]],[[lxml|http://lxml.de/]] 等。

bs4 的 API 比较好用,而且它很流行,库的品质应该不错。但是我遇到过它的 `UnicodeDammit` 模块比较耗时的情况。当你创建一个 soup 对象时,bs4 会拿你的文本用 `UnicodeDammit` 判断编码,这个过程比较耗时。你可以考虑传入 [[from_encoding|https://www.crummy.com/software/BeautifulSoup/bs4/doc/#encodings]] 参数。

`lxml` 是构建在 `libxml2` 和 `libxslt` 之上的 Python Binding,据说性能非常好,代码质量也不错。

在 FM 工作时写过一套脚本用来运行 Python Web 程序。它包含:

* 安装 Conda,同时配置 PyPi 镜像,但是目前漏了 `.pydistutilrc` 的
* Python 工程的依赖维护(用 Conda 的 `environment.yaml`)
* 类 initscript 的 Gunicorn 启动停止脚本

代码在 [[Snippets: Python: Initscript-like scripts for Gunicorn with Conda]]。下文的内容是之前为项目写的 wiki,一些逻辑针对内部包发布系统而设计,外部用时需要改造下。

! 维护 Conda 环境

首先你应该按 Python 全攻略 页面,搞定「准备开发环境」部分。

!! 新的 Python 工程

先新建一个 conda env。如果你要用 Python 2,依赖项写 `python=2.7.*`;如果用 Python 3,依赖项直接写 `python` 即可:

```bash
/usr/local/services/conda-1.0/bin/conda create -n <project_name> "python=2.7.*"
```

这样会在 `/data/conda/envs/<project_name>` 处安装一个新的 conda env。

安装完后,每次你要操作这个环境,你就执行:

```bash
source /usr/local/services/conda-1.0/bin/activate <project_name>
```

之后你就可以在这个环境安装新的 Python 库,或者跑 Django 的 debug server 等等。

依赖装好后,注意生成 environment.yaml 文件并提交 SVN。

!! 旧 Python 工程想用 conda 管理

# 参考上文,像新工程一样先建个 conda env
# activate 后用 `conda install` 和 `pip install` 把依赖一个个装进来
# 验证下这些库是否能正常运行
# 生成 environment.yaml 文件(后文详述),提交 SVN

!! 安装 Python 库的方法和原则

将你的 conda env activate 之后:

# 带 C 扩展的 Python 库,**必须** 用 conda 装。比如 `mysqlclient`, `pillow`,用 conda 装时,conda 会帮你一并安装其依赖,如 `mysql-connector-c`, `libpng` 等: `conda install mysqlclient pillow`
# 不带 C 扩展的 Python 库,用 `pip` 直接装

对于 MySQL 的 Python 库,建议用 `mysqlclient` 而非 `MySQL-python`。

!! conda env 环境导入导出

Conda 用 `environment.yaml` 文件做环境的导入导出。导出的环境配置文件,可以扔到 IDC 机器上以部署出同样的 conda env。

# 导出环境到文件:activate 你的环境后, `conda env export > environment.yaml`
# 按文件生成环境:`conda create -n <project_name> -f environment.yaml`
# 按文件更新现有环境:activate 你的环境后,`conda env update -f environment.yaml`

! Python 项目部署

这块的逻辑都在 [[runner.py|Snippets: Python: Initscript-like scripts for Gunicorn with Conda: runner.py]] 中实现。

这套代码要求,你的业务织云包的根目录,必要有一个 `environment.yaml`。参考上文以生成 `environment.yaml`。

!! Web 服务

Web 服务采用 nginx 作反向代理,搭配 gunicorn 的做法。这样各管理端后台可以分开部署跟升级,不会绑在 Apache 一条大船上。

代码上,如果你是 Django 项目,要在 `settings.py` 中加上 `USE_X_FORWARDED_HOST = True` 这个配置。

首先,安装好 Conda(用 [[install.sh|Snippets: Python: Initscript-like scripts for Gunicorn with Conda: install.sh]])。

将你的项目打包好,在根目录需要有几个文件:

* environment.yaml
* gunicorn_conf.py
* nginx.conf

!!! gunicorn_conf.py

按 Gunicorn 官方提供的配置能力写,参考 [[这里|http://docs.gunicorn.org/en/19.7.1/settings.html]]。长得像这样:

```python
from setproctitle import setproctitle

bind = "127.0.0.1:13001"
workers = 4
worker_class = 'gevent'


def post_fork(server, worker):
    setproctitle("{} worker".format(server.proc_name))
```

注意:

* `bind` 只 `bind` 内网,用 10000+ 的高端口
* `worker_class` 只支持 `sync` 和 `gevent`,`sync` 是同步模式,`gevent` 是协程

`setproctitle` 的原因是,织云包发布会检查进程名,但是 gunicorn 默认的 `-n` 选项设置的 proctitle 像这样:

* `gunicorn: master [radio_api_server]`
* `gunicorn: worker [radio_api_server]`

织云会认为进程名是 `gunicorn:`,这样没法跟其他的 gunicorn 实例区分开(比如 `gunicorn: master [radio_contents]`)。不得已 hack 一把,在 `post_fork` 时把 worker 进程的 proctitle 改了。

master 进程的 proctitle 没法改,看 gunicorn 源码,没有好的 hack 入点。Monkey patch 也不好搞。

然后配置下启动、停止、reload 脚本:

```bash
./runner.py -p $install_path -t gunicorn --app-module radio_api_server.wsgi <start|stop|reload>
sleep 3
```

因为我们用信号来控制 Gunicorn,比如 SIGTERM 让 Gunicorn graceful shutdown,sleep 下避开包发布系统进程数检查报错。

弄好后在包发布系统上启动、停止、热重启分别试试,上机器观察进程起来没有、起来的时间等,再 `wget 127.0.0.1:13001` 简单测试下通不通。

!!! nginx.conf

长这样:

```
server {
    listen          #IP_INNER:80;
    server_name     fm-api.oa.com;

    location /static/ {
        root    #INSTALL_PATH/;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:13001;
        proxy_redirect off;
    }
}
```

最后,做 [[Log Rotation|Linux: Log Rotation]],事情做完整,不用半夜起来清磁盘。

!! nginx 容器本身的配置

```
http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    # 重点是这里
    include /usr/local/services/*/nginx.conf;
}
```

!! 避免升级操作带来的问题

* 升级时勾掉「升级前停止」,没必要停,升级完后重启即可
* 要重启时多用热重启

!! 脚本

先安装 Conda。再将你的脚本打织云包,在「安装完成时运行」「升级完成时运行」等 hook 处,填入: 

```bash
./runner -p <your_project_root> prepare
```

这个命令会帮你准备 Conda env 到 `/data/conda/envs/<project_name>`。

运行时的命令,类似 `/data/conda/envs/<project_name>/bin/python <your_script>`。
!! Gerneral Guides

* [[Interfacing with C/C++ Libraries - The Hitchhiker's Guide to Python|http://python-guide-pt-br.readthedocs.io/en/latest/scenarios/clibs/]]
* [[Extending and Embedding the Python Interpreter - Python Official|https://docs.python.org/3/extending/]]
* [[Binary Extensions - Python Packaging User Guide|https://packaging.python.org/extensions/]]

!! C/C++

Due to the lack of ABI standard of C++ language, there is no portable way to use C++ library among different operating systems and platforms ([[Refer|http://stackoverflow.com/questions/1615813/how-to-use-c-classes-with-ctypes]]).

* [[Cython|http://cython.readthedocs.io/en/latest/]] [C/C++]: popular and useful, consider this first
* [[ctypes|https://docs.python.org/2/library/ctypes.html]] [C]: lies in standard library and pretty easy to use
* [[CFFI|https://cffi.readthedocs.io/en/latest/]] [C]: popular and practical
* [[SWIG|http://www.swig.org]] [C/C++]: not just focusing Python but TCL and other script languages
* [[Boost.Python|http://www.boost.org/libs/python/]] [C/C++]: may require many knowledge on Python C library

GC (garbage collection) ,指 Python 自动将不再被使用的值回收。

理解 GC 前应该先理解 Python 的 [[name 和 value|Python: Variable Name and Value]]。

''Python 的 value 几乎全部存在于堆中''(type object 是例外)。一个 value 假如不再被使用,会被 Python 回收掉。但也有一些情况不会被回收,比如小的(512 字节以内)object,频繁分配及回收的成本会高于让它一直存在在内存中,因此它可能等到 Python 程序结束才被释放。

Python 使用的 GC 算法是引用计数。由于 name 是有作用域的,一个 name 离开它的作用域后,它所引用的值的引用计数减 1。目前的 CPython 实现中,一旦值的引用计数为 0,则会被马上回收。`del` 关键字也可以使一个名字在其作用域中失效。

''引用计数无法解决循环依赖(reference cycle)的问题''。循环依赖的例子:

```python
# 引用自身
lst = []
lst.append(lst)

# 互相引用
object_1 = {}
object_2 = {}
object_1['obj2'] = object_2
object_2['obj1'] = object_1
```

Python 使用了一套 generational gc 算法来检测循环依赖并做回收。这套算法不是常驻运行,而是间歇性地运行。这套算法的实现和优化,看这份官方文档的 PDF 及我做的注释:

<<display-pdf path:"/files/archives/2021/03/design-of-cpythons-garbage-collector.pdf" title:"design-of-cpythons-garbage-collector.pdf">>

!! 参考

<<display-pdf path:"/files/archives/2021/03/python-garbage-collection.pdf" title:"python-garbage-collection.pdf">>
!! Guides and Libraries

* [[The Hitchhiker’s Guide to Python|http://docs.python-guide.org/en/latest/]]
* Awesome Python ([[Website|http://awesome-python.com/]] | [[GitHub|https://github.com/vinta/awesome-python]])
* [[Awesome Python - LibHunt |https://python.libhunt.com/]]
* [[Full Stack Python|https://www.fullstackpython.com/table-of-contents.html]]

!! Tools

* [[Python tutor|http://pythontutor.com/]]: 用来可视化 Python 函数的运行过程。
* [[Pythex: a Python regular expression editor|http://pythex.org/]]
* [[Qix-/better-exceptions|https://github.com/Qix-/better-exceptions]]: automaticlly display pretty and useful information in exception

!! String Formatting Cheatsheet

由于官方文档中关于字符串格式化的部分太过学术化,[[PyFormat|https://pyformat.info/]] 这个网站提供了非常多的 `.format` / `%` 的用例,用来简化对这部分功能的使用。非常赞。

Python 中的 iterable, iterator 以及 generator,一直是非常亲密但是难以区分的概念。nvie 有一个很好的 [[帖子|https://nvie.com/posts/iterators-vs-generators/]] 阐述了它们之间的关系,但是内容偏向于概括和总结,对于新手来说仍然难以理解。[[Fluent Python|http://shop.oreilly.com/product/0636920032519.do]] 的第 14 章也有非常好的演绎,但是我认为它对「为什么要有这种语言特性」缺乏阐释。我试图从演变的角度,总结这些概念的来源和演化,以得到一个符合逻辑和容易理解的版本。

!! Simple Loop

几乎每一个 Python 入门教程,都会用类似下面的代码来讲述最简单的 `for` 循环:

```python
>>> l = [2, 1, 3]
>>> for i in l:
...     print(i)
2
1
3
```

在 Python 中,执行 `l[i]` 实际上是调用了 `l` 的 `__getitem__` [[函数|https://docs.python.org/3/reference/datamodel.html#object.__getitem__]]。`list` 类型中会实现了这个函数,用来返回某个 index 下的元素。而早期 Python 的实现上利用了这个操作。上面的 `for` 循环实际上是从 `l[0]` 开始取元素,等价于这段代码:

```python
i = 0
while True:
    try:
        print(l[i])  # 亦可是 print(l.__getitem__(i))
        i += 1
    except IndexError:
        break
```

Python 内置的大多数容器类型(`list`, `tuple`, `set`, `dict`)都支持 `__getitem__` <<footnote "[1]" "但是为了性能,实际上他们会用 C 来实现此函数,所以你在源码中找不到一个 `list.__getitem__` 函数。">>,因此它们都可以用在 `for .. in` 循环中。如果你有个自定义类型也想用在循环中,你需要在类里面实现一个 `__getitem__` 函数,Python 就会识别到并使用它。Fluent Python 一书提供了一个[[例子|https://github.com/fluentpython/example-code/blob/master/14-it-generator/sentence_iter.py]]。

!! Lazy Evaluation

在上面的代码例子中,`l` 的值是全部被加载到内存中,再在循环中被一个一个取出来的。设想这样一个场景,你要从数据库中查询出一千万条数据做处理,

* 如果全部加载到内存,可能会将内存撑满
* 在处理第一条数据前,需要等待大量时间从数据库中取出这些数据
* 一些特殊的场景下,你可能并不需要对全部的数据做处理,比如处理到第五百万条数据时即可以结束

前辈们提出了惰性求值(Lazy Evaluation)来解决这个问题。有些地方也叫它「延迟加载」「懒加载」等。它的基本理念是「按需加载」,在上面的例子中,可以将取数据过程变成一页页取,比如先取 100 条数据进行处理,处理完后再取下一个 100 条,直至全部取完。

!! The Iterator Protocol

Python 为了在语言层面支持 lazy evaluation,给出了 iterator 协议。如果一个类:

* 实现了 `__next__` 函数,并且:
  * 每次调用该函数,都可以返回一个新的数据
  * 没有新的数据时,调用它抛出 `StopIteration` 异常(当然如果序列是无限长,那么可以不抛)
* 实现了 `__iter__` 函数返回 `self`,下一节中描述

那么这个类即支持 iterator 协议。于是「按需加载」,即可以通过每次 `__next__` 被调用时去实现。Python 的内置函数 `next(iterator)` 实际上是调用 `iterator.__next__`。下面的例子给出一个 iterator 的实现,用来按需地计算出下一个斐波那契数:

```python
>>> class FibonacciIterator:
...     def __init__(self, maximum):
...         # 为了简单,将初始值设为 1, 2 而不是 0, 1
...         self.a, self.b = 1, 2
...         self.maximum = maximum
...     def __next__(self):
...         fib = self.a
...         if fib > self.maximum:
...             raise StopIteration
...         self.a, self.b = self.b, self.a + self.b
...         return fib
        
>>> f = FibonacciIterator(5)
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
5
>>> next(f)
# StopIteration occured
```

!! Enhanced iterable

上文中的 `FibonacciIterator` 已经实现了按需加载,那可以直接将它用在 `for` 循环中吗?试试:

```python
>>> for i in FibonacciIterator(5):
...     print(i)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'FibonacciIterator' object is not iterable
```

可以看到有 is not iterable 的报错。按上一节的描述,早期的 Python 仅在一个类有 `__getitem__` 函数时 Python 才将它当成 iterable,同时为了配合新的 iterator 的机制,Python 在 2.2 版本中将 `__iter__` 协议加入了进来:

# 一个类如果实现了 `__iter__` 并返回一个 iterator,那么它是 iterable 的
# 如果没有实现 `__iter__`,但是有 `__getitem__`,那么它仍然是 iterable 的

回想上文对于 iterator 的定义,它是实现了 `__iter__` 的,所以可以用在 `for` 循环中:

```python
>>> class FibonacciIterator:
...     # 其他函数实现省略,见上文
...     def __iter__(self):
...         return self
>>> for i in FibonacciIterator(5):
...     print(i)
1
2
3
5
```

!! Generator Function

上面虽然花了挺大篇幅讲述 iterator 的机制,但是事实上 Python 中以 `__next__` 方式来实现 iterator 的并不多。Python 在 2.2 版本中支持了 iterator,但是也同时给出了另外一种更灵活方便,也更重要的机制 —— generator。

识别 generator 的标志在 `yield` 关键字。上文的斐波那契数列,用 generator 来实现是:

```python
>>> def fib(maximum):
...     a, b = 1, 2
...     while a <= maximum:
...         yield a
...         a, b = b, a+b
...
>>> for i in fib(5):
...     print(i)
1
2
3
5
```

上面的 `fib()` 虽然也是用 `def` 定义,但是它的函数体中有 `yield` 关键字,因此它不是个普通函数,而是个 generator function。它返回的是一个 generator object,即 `fib(5)` 处。generator 是一种在语言层面被支持的 iterator,它的规则是:

* `next()` 调用一个 generator 时,Python 会执行函数体到下一个 `yield` 语句,并将 `yield` 后的值作用 `next()` 的返回值;然后该函数的执行暂停,直至下一次 `next()` 调用时,继续执行到下一个 `yield`
* 当整个函数体被执行完毕时,抛出 `StopIteration` 异常

这套规则清晰直观,可以将它套用在上面代码中验证一下。`yield` 及 generator 是非常重要的机制,不仅仅在于它比 iterator 更简单直观,而在于它同时引入了一种控制语言运行的机制。对于普通函数,一旦执行则必须从函数头执行到函数尾,之后才把控制权交给调用方;但是对于 generator function,你可以只执行一小段代码,即把控制权交回调用方(`yield` 时)。这种机制也对后面提出 coroutine 及 asyncio 中起到了重要的作用。

!! Generator Expression

试试运行下面的代码:

```python
>>> sum([i**2 for i in range(11)])
385
>>> sum((i**2 for i in range(11)))
385
>>> sum(i**2 for i in range(11))
385
```

后两种写法,跟第一种有什么区别呢?后两种即是 generator expression,是一种方便生成 generator 的语法糖,形式上是用括号包裹的 list comprehension。背后的理念大概是这样:list comprehension 是用来生成元素的,generator 也是用来生成元素的,那为什么不提供一种类似 list comprehension 语法的 expression 来表示 generator 呢?它跟下面的代码是等价的:

```python
def gen():
    for i in range(11):
        yield i**2

sum(gen())
```

至于第三种写法为啥不用括号包起来,是 Python 为了可读性故意设计的,如果作为唯一的函数参数使用,则可以省略。

!! 总结

定义上:

* 实现了 `__iter__` 或 `__getitem__`,并满足一定规则的类型是 iterable 的,它的实例是个 iterable
* 实现了 `__next__` 并满足一定规则的类型,它是一种 iterator,它的实例是个 iterator
* 在函数体中使用了 `yield` 的函数是 generator function;使用了括号包裹的类 list comprehension 是 generator expression。它们都会产生 generator

语言机制上:

* `for .. in` 循环所消费的对象,需要是个 iterable

它们之间的关联:

* 容器类型(`list`, `dict`, etc.)大部分是 iterable;`dict` 有多个不同函数生成不同用途的 iterator
* iterator 大部分情况下是个 iterable
* generator 是个 iterator,同时是个 iterable

nvie [[帖子|https://nvie.com/posts/iterators-vs-generators/]] 中的图片,形象地表达了上面的内容:

{{ python-iterable-iterator-generator-relationships }}
Python 标准库中的 logging 库已经非常好用。

[[coloredlogs|https://pypi.org/project/coloredlogs/]] 提供适合终端使用的带颜色的日志展示。
! HTTP

!! [[kennethreitz/requests|https://github.com/kennethreitz/requests/]]

`requests` is the best choice for manipulating HTTP protocol. Some plugins:

* [[dashea/requests-file|https://github.com/dashea/requests-file]]: file adapter for `files://` protocol



!! 预编译二进制库

[[这里|https://www.lfd.uci.edu/~gohlke/pythonlibs/]] 有第三方提供了编译好的 Python 库 Windows wheel 包,方便没有装 VC 编译器的用户安装带 C 扩展的库。

!! 编译器

带 C 扩展的 Python 包,需要有 VC 编译器(`cl.exe`)才能编译安装。在 [[WindowsCompiler|https://wiki.python.org/moin/WindowsCompilers]] 页面找到你所使用的 Python 版本对应的 VC 进行安装。

安装完后,在有需要编译 C 扩展的时候(比如 `pip install pycrypto`, `python setup.py build`),先运行「VS 2017的 x64_x86 交叉工具命令提示符」(也叫 `vcvarsamd64_x86.bat`)来设置环境变量,它会自动判断应该用 32 位还是 64 位。然后再运行相应的命令。

!! 具体库类的经验

pycrypto 在编译时会出错,参考这个 [[帖子|http://www.xavierdupre.fr/app/pymyinstall/helpsphinx/blog/2017/2017-01-03_pycrypto.html]] 做修改。

pywin32 往往是被需要的库,用 pip 安装它。

Python 实现树状结构的库的调研。RDBMS 处理树状结构的主要模型见 [[RDBMS: Pattern: Hierarchical Data]]。主要有这些库:

* [[django-tree-queries|https://github.com/matthiask/django-tree-queries]]:实现 adjacency list,用 [[CTE|SQL: Queries: CTE]] 做查询
* [[django-treebeard|https://github.com/django-treebeard/django-treebeard]]:实现 adjacency list、materialized path 及 nested set
* [[django-mptt|https://github.com/django-mptt/django-mptt]]:实现 nested set

django-tree-queries 的作者写了一篇 [[博客|https://406.ch/writing/django-tree-queries/]],表示它做这个库的原因以及对其他库的调研。

''django-treebeard'':

* adjacency list 没有使用 CTE 来查询,而是递归查询,性能差
* 该库最推荐 materialized path 方式
* materialized path 及 nested set 方式有 tree corruption 可能,需要使用方使用事务
* API 接口相对复杂且不够优雅(毕竟是个十几年的项目了)

''django-mptt'':Nested set 实现中最受推崇的。但是已经不再维护。

''django-tree-queries'':

* 使用 adjacency list 及 CTE
* 实现简单,没有 tree corruption 可能
* API 简单,可查完整 ancestors 及 descendants(支持 sibling 排序)
* Adjacency list 查直接 parent 或 children 非常简单
* 没有文档,需要看库的测试用例,但是用例非常易懂

总结:''个人觉得 django-tree-queries 是最佳选择''。但它文档较少,使用时看看它的 [[测试代码|https://github.com/matthiask/django-tree-queries/blob/main/tests/testapp/test_queries.py]]。

另外,这些库都不支持单节点多 parent 的模型。
!! Libraries

* [[PyMySQL/mysqlclient-python|https://github.com/PyMySQL/mysqlclient-python]]: fork of `MySQLdb1` with Python 3 support. Django recommend using this one, should consider ''using it first''
* [[farcepest/MySQLdb1|https://github.com/farcepest/MySQLdb1]]: unmaintained, but still stable. Use `mysqlclient-python` instead
* [[PyMySQL/PyMySQL|https://github.com/PyMySQL/PyMySQL]]: pure Python implement. Easier to install and can be "greened" by gevent, but doesn't support low level APIs `_mysql` provides like `data_seek`, `store_result` and `use_result`

!! Cursor behavior

All of these libraries use `cursor.Cursor()` by default ([[refer|https://mysqlclient.readthedocs.io/en/latest/user_guide.html#using-and-extending]]), which contains `CursorStoreResultMixIn`. When `cursor.execute()` is executed, the cursor would use `mysql_store_result()` to retrieve all result from server, which may cause `MemoryError` in a 32-bit Python environment.

You can use `cursor.SSCursor` instead to avoid this problem. `cursor.SSCursor` contains `CursorUseResultMixIn`, which use `mysql_use_result()` to fetch result set row by row.

```python
conn = MySQLdb.connect(cursorclass=cursor.SSCursor, ...)
```
Python 的最佳实践。主要放:

* 一些信息量不多,暂时不能成为单独篇章的内容
* 资源索引

!! Make a Library API

[[python-api-checklist|https://devchecklists.com/python-api-checklist/en/]] 提供了一份非常好的 checklist。当你写一个 Python 库时,务必看看这里的 checklist,有非常多很好的建议,比如写明 use case、提供 boilerplate 等。

!! Social Auth

[[python-social-auth|https://python-social-auth.readthedocs.io/en/latest/]] 实现了使用社交网站登录所需要的一系列功能,并且提供了与多种流行框架的整合,比如 Django。

!! Functional

[[Suor/funcy|https://github.com/Suor/funcy]] 是一个功能齐全的函数数工具库,类似 JS 中的 underscore。当你遇到这类问题时,看看 fancy 有无方便的解决方法:

* 需要对 sequence 或 collection 做各种操作,比如切割、筛选、反向遍历、组合、聚合等
* 需要编写 decorator 时
* 希望有简单方便的流程控制工具时,比如重试
* 希望有方便的调试工具时,比如打印执行时间、函数退出时打印日志等
<<.warning "这个文档使用的是 Python 2。">>

一个 URL 长得像这样([[来源|https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Examples]]):

```
                    hierarchical part
        ┌───────────────────┴─────────────────────┐
                    authority               path
        ┌───────────────┴───────────────┐┌───┴────┐
  abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
  └┬┘   └───────┬───────┘ └────┬────┘ └┬┘           └─────────┬─────────┘ └──┬──┘
scheme  user information     host     port                  query         fragment
```

对一个 URL 的操作主要有几点:

* 生成 URL
* 解析 URL
* 多个绝对 / 相对路径的 Join(用 `urlparse.urljoin`)
* `query` 的解析和生成
* `username`, `password` 的解析和生成

!! 生成 / 解析 URL

主要用的是 `urlparse` 中提供的 `urlparse` / `urlunparse` 以及 `urlsplit` / `urlunsplit` 函数。这两对函数的区别是,`urlsplit` 不处理 URL 中的 params (params 很少被用到),而是处理 path 中每个可能包含 parameters 的部分([[RFC 2396|https://tools.ietf.org/html/rfc2396.html]])。一般来说,''优先用 `urlsplit`''。

!! `query` 的解析和生成

解析可以用 `urlparse.parse_qs`,将一串 query string 转换成 dict。如果 query string 里面有一个 key 多个值的情况,用 `urlparse.parse_qsl`。

另外,`urlparse` 模块中实现了一个 `unquote` 函数,用来把 `%XX` 转换成相应的字符。但是这个函数没有开放出来。

生成的话,使用 `urllib.urlencode` 来生成。

需要注意的是 query string 中的非 ASCII 可打印字符,需要用 `%XX` 这种形式编码,`urllib` 提供了 `quote` / `quote_plus` 来做这个编码,`unquote` / `unquote_plus` 做解码。plus 版本会多一个逻辑,是将空格转换成 `+` 号。`urllib.urlencode` 使用的是 `quote_plus`。

!! `username`, `password` 的解析和生成

这两个字段也需要做 "percentage encoding",可以使用 `urllib.quote`。

参考这个 [[StackOverflow 问题|http://stackoverflow.com/questions/10050877/url-username-with]]。

!! 参考文献

# [[RFC 1738 - Uniform Resource Locators (URL)|https://tools.ietf.org/html/rfc1738.html]]
# [[Python 2 urlparse Document|https://docs.python.org/2/library/urlparse.html]]
# [[Python 2 urllib Document|https://docs.python.org/2/library/urllib.html]]
Python 的变量名和值之间的关系,这份材料讲得很清楚:

* [[Python Names and Values|https://nedbatchelder.com/text/names1.html]]
* 对应的 [[slide|https://nedbatchelder.com/text/names1/names1.html]]

''重点是'':

* ''Python 中 name 是有作用域的(scoped,比如函数、块等),value 是全局的(global,因为放在堆中)''<div>

```python
l = [1, 2, 3]
# 在堆上会建立一个 [1, 2, 3] 的数组,带有引用计数 1
# l 被放入全局变量的词典 `globals()` 中,
# 它的作用域是全局的(程序运行期不会失效),它指向堆上该数组的地址

def f():
    x = l
    # x 也指向堆上数组的地址,同时该数组的引用计数加 1
    # 函数退出后,x 的生命周期结束,该数组引用计数减 1

if __name__ == '__main__':
    f()
```

</div>
* 一个 name 只能指向一个 value,而多个 name 可以同时指向同个 value
* Python 的变量传递没有「传引用还是传值」之分,无论赋值还是函数参数传递,''传的都是引用'';''只是引用的值,有 mutable 和 immutable 之分''。Immutable 如数字、tuple 等,是无法被修改的

同时看看 Fluent Python 的 [[第八章|FluentPythonCh08]]。

[[browsercookie|https://bitbucket.org/richardpenman/browsercookie]] 库提供了一个读本地浏览器 Cookie 的能力,可以方便地搭配 `requests` 库发起请求。

Scrapy 是 Python 中最广泛地爬虫工具。
快速启动程序和定位文件的工具。

! Listary <<plat-win>>

[[Listary|http://www.listary.com/]] 可以非常方便地找到文件并进行操作,也可以快速启动程序(支持用拼音搜索),非常方便。

!! 激活码

我在 [[异次元|http://www.iplaysoft.com/]] 买了 Listary 5.0 正版,可以激活 3 台机器(目前已激活办公电脑一台),Gmail 里有注册码邮件:

```
Name: onlyice
Email: onlyice0328@gmail.com
Registration code: (six lines)
5MDE5LGWECZSYB2ER4ARW4H6DVEJVP9N
PZ5RQEM9PVZZNWPYXKWBLMKP2BJ5HWAF
WJLSZQE5XLZUFKN754K9C7TLRM8CNXXP
UJ7TTPUSNC2V928NVVN7QE6AP7PM9E2V
GC9BD9BYW89WBWRYNVTR3NUH4EU5HKKS
BQ6PRTA4DV92U5TMHKBKKXX5D9KLL346
```

!! 配置

在选项的「动作」列表中,新建一项「Open With Code」,置快捷键 <kbd>Alt-C</kbd>。VSCode 自带的「Open With Code」context menu 在 Listary 上表现不正常,应该是 Listary 的问题。

使用 <kbd>Win-Backtick</kbd> 做全局快捷键。

<kbd>Ctrl-Enter</kbd> 是默认的打开文件夹的快捷键。

! Plasma Workspace <<plat-linux>>

Plasma 5 提供了这种能力。按 <kbd>Alt-F2</kbd> 启动快速搜索的功能,或者按 <kbd>Alt-F1</kbd> 打开左下角的 Application Launcher 进行输入和搜索即可。

限制是不能搜中文文件名。但是比 Listary 好在可以搜文件内容。

! See also

与 [[Command Palette]] 紧密相关。
[[QL-Win/QuickLook|https://github.com/QL-Win/QuickLook]] 可以实现类似 MacOS 的,在文件浏览器中「按空格预览文件」的功能。


速率限制(rate limiting)是后台架构中常见的策略。

!! 场景

* ''保护服务不被过度使用而影响可用性'',防止级联故障(俗称「雪崩」,比如一台机器挂了后,流量压到其他机器导致更多机器被压垮),防止资源耗尽
* API 服务对使用方做配额控制
* 使用付费功能时,使用方避免费用超额而进行速率限制

!! 策略

* 应 ''整体地审视'' 服务调用链条中的速率限制策略,如:
** 底层服务没有速率控制功能时,调用此服务的服务应该对其前端做好限制
** 客户端也应该预留设计,比如收到服务端回包表示已限流时,应该采取 ''指数退避''<<footnote "?" "重试间隔呈指数级增加">>,或者等待到某一时间点再重试
* 服务对其调用方进行限流时,应该告知调用方,比如通过 HTTP 429(too many request)等方式
* 如果用于实现速率限制策略的工具或基础架构本身失败或无法访问,则服务应该启动「应急开启」功能并尝试处理所有请求。''不能因为限流功能故障而导致服务完全不可用''
* 调用方如果有基于时间表的请求(比如每小时正点请求一次),应该增加额外的随机时间及应用指数退避,避免集中到同一时间请求服务端

!! 算法

常见的有:令牌桶、漏斗、固定窗口、滑动窗口。''令牌桶'' 是相对适合流量突增情况的。

[img width=700 [rate-limiting-algorithm-1]]

[img width=350 [rate-limiting-algorithm-2]]

!! 架构设计

!!! 针对单个调用方节点 / 被调用方节点,有固定的配额

比如服务 A 调用服务 B,限制是:

* 服务 A 的单个节点 <<footnote "?" "可以理解为 A 分布在某台 VM / 容器上的进程">> 只能调用固定的次数;或者
* 服务 B 的单个节点只能被调用固定的次数

这种情况比较好设计,不管是在内存中维护配额、还是用外部存储(比如 Redis 来维护配额),都是非常简单的,仅需要计数并在限额达到时限制调用 / 被调用即可。

!!! 分布式系统中的速率限制

比如在多节点的环境中,服务 A 调用服务 B,要求服务 B 的全部节点在一段时间内只能被 A 调用 10k 次。问题的复杂点在于,''A 跟 B 都是多节点的''。

速率限制可以做在调用方(A),也可以做在服务方(B);方法是类似的,但有时你无法控制调用方的实现。下面的分析以服务方为例。

一个常用的做法是,''通过一个集中式的 data store 来维护配额信息''。服务收到请求时,向 data store 申请额度,如果还有额度就可以提供服务,否则就拒绝。实现过程要注意多个服务同时申请配额时带来的 ''竞争状态(race condition)''。一般 ''get-then-set'' 容易出现这种问题,换成 ''set-then-get'' 是比较好的,通过 set 过程的原子操作来保证该节点申请到了配额。''使用 Redis 时可以用其 Lua 脚本'',即可以揉入计算逻辑(比如令牌桶的计算),也可以保证执行过程原子化。

''集中式 data store 的问题在于'':

* 查询配额过程 ''会增加延迟''。优化方法是,''可以批量申请配额'',在服务节点本地做配额是否足够的判断,这样不用每次都查询 data store
* ''Data store 故障时影响限流功能''。服务的实现中应该做容灾,在 data store 故障时放行所有请求

!! 参考

* [[速率限制策略和方式 - Google Cloud|https://cloud.google.com/solutions/rate-limiting-strategies-techniques]](有中文)
* [[How To Design A Scalable Rate Limiting Algorithm|https://konghq.com/blog/how-to-design-a-scalable-rate-limiting-algorithm/]]


区别:

* [[SQL]]:包含 SQL 查询、事务等不区别于具体 RDBMS 实现(MySQL / PG)的部分。但 SQL 规范的约束力不强,各家实现都有差异,这里主要是以 PG 的文档做的参考
* [[PostgreSQL]]:PG 相关的内容
* [[MySQL]]:MySQL 相关的内容



树状结构如何存储在 RDBMS 中。树状结构常见的有:

* 电商网站的目录、子目录
* 论坛中的评论及评论的回复:<div>

[img width=800 [rdbms-hierarchical-data-comments]]

</div>

这份 Pocana 的 slide 非常好的描述了这几种方法:

* Adjacency list
* Path enumeration
* Nested sets
* Closure table

<<display-pdf path:"/files/archives/2021/04/models-for-hierarchical-data.pdf" title:"models-for-hierarchical-data.pdf">>

这篇 StackOverflow [[帖子|https://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database]] 更全面的总结了各种模型,包括前面提及的 4 种模型及其变种。

!! 各语言库类选型

* Python: [[Python: RDBMS: Hierarchical Data]]
!! Resource

Tutorials:

* [[JavaScript fundamentals before learning React|https://www.robinwieruch.de/javascript-fundamentals-react-requirements]]:学 React 前需要了解的 JS 知识
* [[vasanthk/react-bits|https://github.com/vasanthk/react-bits]]: React patterns, techniques, tips and tricks

Components:

* [[Ant.Design 文档|https://ant.design/docs/react/recommendation-cn]]: 这里推荐了一些业界最好的 React 组件,值得参考

Cheatsheets:

* [[React.js Cheatsheet - DevHint|https://devhints.io/react]]


Boilerplate 是模板,即一个 React 项目一开始的代码结构。React 的 boilerplate 提供良好的开发体验,集成了相关工具链,如 Babel、Webpack、CSS Postprocessor 等,使你无需再手动配置,开箱即用。有些会将模板作者对开发 React 项目的最佳实践揉合其中,如 [[react-boilerplate|https://github.com/react-boilerplate/react-boilerplate]]。还有些跟框架是相绑定的,如 [[Next.js]]。

下面我对这些 boilerplate 做一个对比。结论是:

* 对于 SPA,使用 [[Create App|https://createapp.dev/]] 而不是 create-react-app。前者更灵活不黑盒
* 对于需要 SSR 的站点,选择 Next.js 或者 Gatsby

!! Create React App

|!优点 |
|简单,方便上手 |
|社区庞大 |
|!缺点 |
|不够强大,比如没有整合 PostCSS、LESS |
|定制困难,需要配合社区解决方案(如 [[react-app-rewired|https://github.com/timarney/react-app-rewired]])来解决,增加了不稳定性 |
|一旦 eject 则失去了它本来的简洁特性 |

!! [[react-boilerplate|https://github.com/react-boilerplate/react-boilerplate]]

|!优点 |
|功能无比全面 |
|揉入了模板作者的最佳实践 |
|!缺点 |
|过于复杂,理解模板本身就非常耗时间 |
|复杂的东西只靠社区维护容易烂尾,最好有商业公司维护 |

!! Next.js

|!优点 |
|功能强大,主流的工具链都可以轻松整合 |
|文档详细 |
|社区庞大 |
|!缺点 |
|由于它要实现 SSR,框架实现上与 React SPA 有区别,比如在 [[数据获取|https://nextjs.org/docs/basic-features/data-fetching]] 这块比较复杂 |
|版本更新快,有些功能接口不太稳定 |

!! Create App

[[Create App|https://createapp.dev/]] 是一个 React 项目模板生成器。

|!优点 |
|按需选择你需要的工具链、库等 |
|清晰明了,全面掌握 |
|!缺点 |
|功能整合上不如 Next.js 全 |

在各种应用场景下的好用的 React 组件。

参考 Ant Design 维护的 [[社区精选组件|https://ant.design/docs/react/recommendation-cn]]。

对于超出一定行数的内容,很多场景下为了简洁,需要显示 `... (show more)` 字样:

[img width=400 [show-less-animation]]

现有的方案:

* [[react-show-more|https://www.npmjs.com/package/react-show-more]]: 基于 [[react-truncate|https://github.com/konforti/react-truncate]]。后者基于离屏 canvas 及 `measureText` 方法来判断内容宽度。缺陷是传入的内容只能是''纯文本'',不能是 HTML node。所以''无法搞样式'',只能继承父容器的样式。
* [[react-truncate-markup|https://www.npmjs.com/package/react-truncate-markup]]: 支持传入 HTML node,支持内容带样式。为了使内容带样式,它需要让这些内容实际被渲染出来,再用二分法将 JSX 内容减半,判断是否超出容器高度。重复数次后找到合适的内容量。它的实现原理更佳,而且作者写了大量使用样例,库质量看起来也不错。但它的缺点是,''传入的只能是 DOM 元素,不能是 ReactNode'';没有实现现成的 show more / show less 开关。官网有提供一个用额外代码实现的 [[示例|https://react-truncate-markup-guzutnrduf.now.sh/#custom-ellipsis]]。

实测这两种方式都比较纠结。大部分情况下,我是期望能对一个动态生成的 ReactNode 做截断的(因为大多数情况下内容都是动态的),但是 react-show-more 不能有格式(比如 `<p>`, `<br>`),react-truncate-markup 不能传 ReactNode,都比较鸡肋。

TODO: 调研这种 JavaScript 的 [[方案|https://web-crunch.com/posts/show-more-show-less-toggle-javascript]]。
表单字段非常多时,用 [[react-hook-form|https://react-hook-form.com/]] 这类成熟框架。
使用 [[React Icons|https://react-icons.github.io/react-icons/]]。

组件生命周期。

React [[文档|https://reactjs.org/docs/react-component.html#the-component-lifecycle]] 提供了详细的调用顺序。这个 [[图表|http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/]] 直观地显示了这个过程,''注意其中 React 更新 DOM 及 refs 的时机''。

最重要的是 `render` 方法。除此之外最常用的是 `componentDidMount` 及 `componentWillUnmount`,重点是:

* `componentDidMount`:第一次调用完 `render()`,更新 DOM 及 refs 后触发
* `componentWillUnmount`:在组件从 DOM 上被移除后触发

<div class="box">

''为啥是 `componentWillUnmount` 而不是 `componentDidUnmount`''?

因为如果组件已经(did)unmount,那组件已经被销毁,绑定在组件上的 clean up 代码也就无从做起。

</div>
HTML 的表单元素,如 `<input type="text">`, `<select>`, `<input type="file">` 会在内部保存其状态。React 发明了两个概念:

* [[Controlled components|https://reactjs.org/docs/forms.html]]
* [[Uncontrolled components|https://reactjs.org/docs/uncontrolled-components.html]]

!! Controlled components

这类组件会接管 HTML 表单元素的内部状态。你不再需要通过 DOM 的接口(如 [[HTMLInputElement.value|https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement]])来获取 input 元素的值,而是通过 React state。具体做法如下:

```javascript
class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}
```

缺点是对于每个 form element,你都需要定义 `onChange` 和 `value` 属性。而且有大量 validation 代码要编写。[[Formik|https://jaredpalmer.com/formik/]] 是 React 官方推荐的用来解决此问题的库。

另外有个常见的 pattern,是 ''即时修改用户的输入''。这在 React 上很容易实现:

```javascript
handleChange(event) {
  this.setState({value: event.target.value.toUpperCase()});
}
```

另外:

* `<textarea>` 使用与 `<input type="text">` 无异
* `<input type="checkbox">` 与 `<input type="radio">` 使用 `checked` 属性(而不是 `value`)
* `<select>` 也使用 `value` 来表示选中了哪个对象
** 传给 `value` 一个数组表示选中多个元素:<div>

```javascript
<select multiple={true} value={['B', 'C']}>
```
</div>
* 如果你不想再控制用户输入,将其 value 设为 null:<div>

```javascript
<input value={null} />
```
</div>

总结起来是([[来源|https://goshakkk.name/controlled-vs-uncontrolled-inputs-react/]]):

|!Element                    |!Value property        |!Change callback |!New value in the callback  |
|`<input type="text" />`     |`value="string"`       |`onChange`       |`event.target.value`        |
|`<input type="checkbox" />` |`checked={boolean}`    |`onChange`       |`event.target.checked`      |
|`<input type="radio" />`    |`checked={boolean}`    |`onChange`       |`event.target.checked`      |
|`<textarea />`              |`value="string"`       |`onChange`       |`event.target.value`        |
|`<select />`                |`value="option value"` |`onChange`       |`event.target.value`        |

!! Uncontrolled components

非受控的组件,即是说组件的状态保存在相应的 DOM 元素中。React 提供了 [[refs|React: Concept: Refs]] 来访问 DOM 元素:

```javascript
class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.input = React.createRef();
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.input.current.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={this.input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}
```

大部分情况下你都不应该用 uncontrolled 方式。但是处理文件的场景是例外,因为 `<input type="file">` 的值只能由用户来设置,无法通过 React 可编程地设置:

```javascript
class FileInput extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.fileInput = React.createRef();
  }
  handleSubmit(event) {
    event.preventDefault();
    alert(
      `Selected file - ${this.fileInput.current.files[0].name}`
    );
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Upload file:
          <input type="file" ref={this.fileInput} />
        </label>
        <br />
        <button type="submit">Submit</button>
      </form>
    );
  }
}

ReactDOM.render(
  <FileInput />,
  document.getElementById('root')
);
```

!! Controlled v.s. uncontrolled

Gosha Arinich 有一篇非常好的 [[文章|https://goshakkk.name/controlled-vs-uncontrolled-inputs-react/]],对比了这两种方式。总结起来是:

|!feature                                   |!uncontrolled |!controlled |
|one-time value retrieval (e.g. on submit)  |✅            |✅          |
|validating on submit                       |✅            |✅          |
|instant field validation                   |❌            |✅          |
|conditionally disabling submit button      |❌            |✅          |
|enforcing input format                     |❌            |✅          |
|several inputs for one piece of data       |❌            |✅          |
|dynamic inputs                             |❌            |✅          |

我觉得 uncontrolled 方式最大的缺点,是失去了利用 React 方便地做即时数据验证、修改数据格式(比如改成全大写)的能力。如果你用 uncontrolled,你还需要引入其他的 JS 代码来实现同样的功能。
<<.todo "我未深入了解 React 提供的 [[additional hooks|https://reactjs.org/docs/hooks-reference.html#additional-hooks]]。">>

React hook 的 [[官方文档|https://reactjs.org/docs/hooks-intro.html]] 写得非常好。看完之后看这篇 [[帖子|https://dev.to/dan_abramov/making-sense-of-react-hooks-2eib]],把 hook 设计上的理念讲得很清楚。

''Class component 的问题在于'':

* ''Huge components'' that are hard to refactor and test.
* ''Duplicated logic'' between different components and lifecycle methods.
* ''Complex patterns'' like render props and higher-order components.

这个视频可以直接地看出一些问题,class component 没法做到 separation of concerns,比如 `componentDidMount` 和 `componentWillUnmount` 中经常有好几套逻辑揉在一起:

<$videojs controls="controls" fluid="fluid">
  <source src=<<cosurl '/files/videos/2021/03/react-hook-code-reorganized.mp4'>> type="video/mp4">
</$videojs>

<<<
Hooks are fully encapsulated — each time you call a Hook, it gets isolated local state within the currently executing component.

Unlike render props or higher-order components, Hooks don’t create a “false hierarchy” in your render tree. They’re more like a flat list of “memory cells” attached to a component. No extra layers.

- [[Makeing Sense of React Hooks|https://dev.to/dan_abramov/making-sense-of-react-hooks-2eib]]
<<<

!! 核心思想

* `useState` 加强了封装性:
** 各逻辑和其 state 变量在同个 hook 中(比如 `useWindowWidth`,把 width 及 width 变化的处理封装在一起),
** 不再需要把不同逻辑的变量揉合进一个大的 state 变量中(像 class component 那样)
* `useEffect`:
** 组件 mount / unmount 时的 hook
** 执行副作用(修改 DOM、发起 AJAX 请求等)
** 通过监听某些变量有无修改来判断是否重新执行

!! 难点

* 对于 `useState` 的 [[理解|React: Concept: Hook: useState]]
* 通过 state 变量的传递 [[复用 hook|React: Concept: Hook: Reuse]]
* `useState` 返回的 setter,[[并不自动合并 object 字段|React: Concept: Hook: Setter]]
* `useEffect` [[基础|React: Concept: Hook: useEffect Basic]]
* 使用 `useEffect` 时 [[注意组件是否被 unmount|React: Concept: Hook: Avoid Updating State after Unmount]]

!! 最佳实践

React 将 hook 引入进来,是为了让某些逻辑更容易复用,更容易在 `componendDidMount` 函数们中间拆分出来。因此 custom hook 的逻辑应该尽量简单、可复用,而不是让使用者想用时需要花很大精力搞懂里面做了什么逻辑。
避免在 unmounted 组件上更新 state,因为这是无意义的:

```js
export default Component = () => {
    const [ data, setData ] = useState(null);
    useEffect(() => {
        (async () {
            setData(await someAsyncApiCall());
        })();
    }, []);
    return (<span>{ data }</span>);
}
```

如果 `someAsyncApiCall()` 返回数据时,组件已经被 unmount 的话,React 会在控制台输出警告:

```
Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
```

这篇 [[帖子|https://gustavostraube.wordpress.com/2019/06/24/avoiding-state-update-on-unmounted-react-component-within-useeffect-hook/]] 给了一个解决方法,使用一个 mount 变量来跟踪组件的生命周期:

```js
export default Component = () => {
    const [ data, setData ] = useState(null);
    useEffect(() => {
        let mounted = true; // Indicate the mount state
        (async () {
            const data = await someAsyncApiCall();
            if (!mounted) return; // Exits if comp. is not mounted
            setData(data);
        })();
        return () => { // Runs when component will unmount
            mounted = false;
        };
    }, []);
    return (<span>{ data }</span>);
}
```

`mounted` 变量不能是定义在 `useEffect()` 外。不然会报这样的错误:

```
Assignments to the 'mounted' variable from inside React Hook useEffect will be lost after each render. To preserve the value over time, store it in a useRef Hook and keep the mutable value in the '.current' property. Otherwise, you can move this variable directly inside useEffect.
```

但如果你有在 `useEffect` 外使用 mounted 变量的需求,你可以用 `useRef` 来传递一个 mutable value。比如下面的组件:

# 在组件 mount 时发起 API 请求,加载笔记列表
# 另外一个函数发起 API 请求,新增一条笔记

它们都需要考虑组件是否 mount:

<div class="limit-code-block-height">

```js
import React, { useEffect, useRef, useState } from "react"

import api from "utils/api"

export default function Home () {
  const [notes, setNotes] = useState([])

  let mountedRef = useRef(true)
  useEffect(() => {
      api.get("/notes")
        .then(data => {
          if (!mountedRef.current) {
            return
          }
          setNotes(data)
        })
      return () => {
        mountedRef.current = false
      }
    },
    []
  )

  const handleCreatingNewNote = (e) => {
    api.post("/notes", { content: content })
      .then(data => {
        if (!mountedRef.current) {
          return
        }

        setNotes(prevNotes => {
          return [data, ...prevNotes]
        })
      })
  }

  return (
    // ...
  )
}

```

</div>
复用 hook 是通过传递 state 变量:

```javascript
import { useState, useEffect } from 'react';

function useFriendStatus(friendID) {
  const [isOnline, setIsOnline] = useState(null);

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
    };
  });

  return isOnline;
}

function FriendStatus(props) {
  const isOnline = useFriendStatus(props.friend.id);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
```

重点在于:

* 即使 `isOnline` 是在 `useFriendStatus` 中被调用的,它实际上是存储在 `FriendStatus` 函数的实例中的。这意味着它在 `FriendStatus` 的实例中的值,跟另外一个使用 `useFriendStatus` 的函数式组件(如 `FriendListItem`)之间是不共享
* 本质上,`FriendStatus` 调用 `useFriendStatus` 的过程,可以当作把后者的实现拷贝过来
* `useFriendStatus` 的参数可以任意定,它需要什么就传什么;对于返回值,如果返回的内容有多个,可以用 object 包裹一下

同时,一个 hook 它的参数可以是另外一个 hook 的返回值,比如下面 `useFriendStatus` 使用的是 `useState` 的返回值。这意味着你可以把 state 中的变量作为参数传给 hook:

```javascript
function ChatRecipientPicker() {
  const [recipientID, setRecipientID] = useState(1);
  const isRecipientOnline = useFriendStatus(recipientID);

  return (
    <>
      <Circle color={isRecipientOnline ? 'green' : 'red'} />
      <select
        value={recipientID}
        onChange={e => setRecipientID(Number(e.target.value))}
      >
        {friendList.map(friend => (
          <option key={friend.id} value={friend.id}>
            {friend.name}
          </option>
        ))}
      </select>
    </>
  );
}
```

我做了个视频讲解:

<$videojs controls="controls" fluid="fluid">
  <source src=<<cosurl '/files/videos/2021/03/react-usestate-2.mp4'>> type="video/mp4">
</$videojs>
`useState` 返回的 setter,''并不自动合并 object 字段'':

```javascript
function Counter({initialCount}) {
  const [state, setState] = useState({a: 1, b: 2});
	
	function handleClick() {
	  // useState does not automatically merge update objects like class components do.
		// You should merge it manually with object spread or Object.assign
	  setState(prevState => {
		  a: 2, ...prevState
		})
	}
	
  return (
    <>
      Count: {count}
      <button onClick={handleClick}>Set A to 2</button>
    </>
  );
}
```

如果 state 变量的初始值需要复杂计算,不适合将它放在函数组件函数体中时(每次 render 时都会计算),应该放进 `useState` 的函数形式中:

```javascript
const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
});
```
`useEffect` 中的语句会 ''在组件第一次绘制后才执行''。这一般是被期望的行为,比如你在 `useEffect` 中监听事件,不影响浏览器展示内容时。如果你需要在绘制前就执行,用 `useLayoutEffect`;它除了初次被执行时间不一样外,其他都是一致的。

React 提供了在某些变量有变化时才触发执行的能力。比如下面的 `props.source`:

```javascript
useEffect(
  () => {
    const subscription = props.source.subscribe();
    return () => {
      subscription.unsubscribe();
    };
  },
  [props.source],
);
```

如果你只想在组件 mount 和 umount 时执行语句,而不想其中 render 时也执行,那么可以用空的依赖变量:

```javascript
useEffect(
  () => {
    const subscription = props.source.subscribe();
    return () => {
      subscription.unsubscribe();
    };
  },
  [],
);
```
对于这样一个例子:

```js
import React, { useState } from 'react';

function Example() {
  const [count1, setCount1] = useState(0);
  const [count2, setCount2] = useState(0);

  return (
    <div>
      <p>Count1: {count1} times</p>
        <button onClick={() => setCount1(count1 + 1)}>
          Click me
        </button>

     <p>Count2: {count2} times</p>
       <button onClick={() => setCount2(count2 + 1)}>
         Click me
       </button>
    </div>
  );
}

function AnotherExample() {
  return (
    <>
      <Example />
      <Example />
    </>
  )
}
```

我做了个视频讲解:

<$videojs controls="controls" fluid="fluid">
  <source src=<<cosurl '/files/videos/2021/03/react-usestate-1.mp4'>> type="video/mp4">
</$videojs>
这篇摘录了 React [[文档|https://reactjs.org/docs/lists-and-keys.html]] 的核心思想。

由于 JSX 并不提供一些模板引擎所提供的循环语法(如 Django 的 `{% for ... in ... %}`),因此你只能在它的 `{}`([[JavaScript expression|JSX: JavaScript Expression]])中生成一批元素。而 JS 的 for / while 循环等在这里显得不够优雅,因而一般用 `array.map()`:

```javascript
class TodoList extends Component {
  render () {
    const { items } = this.props

    return <ul>
      {items.map(item =>
        <TodoItem item={item} key={item.key} />)}
    </ul>
  }
}
```

需要注意的是,你需要给每个列表元素一个 key。key 需要满足:

* 在元素内容变化时,key 保持不变
** 例如,元素表示某个 todo 项,那么 todo 的内容、到期时间可能会变,不能当作 key;它的 ID 不变的话,可以当作 key
** 因此,数组索引并不适合作为 key。如果数据元素的排序变化,会有很大问题
* key 值只要保证在当前列表中唯一即可

为什么有这些限制呢?React 需要这个 key 来辅助它判断需不需要重新生成 / 绘制相应的 DOM 元素。因为 React 程序中最大的性能消耗往往在 DOM 元素的变化上,如果不给 key,对性能影响很大。
在 React 组件中,你可以创建 ref 对象使其指向一个子组件的实例或者 DOM 元素,这样你可以显式地调用它的 API 来改变它(而不是通过指令式的 props 和 state)。在 [[React: Concept: Form Elements]] 提到的 uncontrolled components 即使用了 ref。

!! 什么情况下可以用 refs?

大多数情况下你都不应该使用 ref,因为它是命令式的(即你会调用实际的 API 去改变组件状态),而不是通过 props / state 这种指令式让 React 帮你做改变。仅在这些情况下使用它:

* 有一些 DOM 元素的操作,无法通过 React 的指令式来改变时,比如操作 `<input>` 元素的 focus 状态、选中文本,或者控制媒体播放
* 调用命令式的动画
* 与第三方 DOM 库结合

这个例子表示什么样的过程是命令式和声明式。比如你有一个对话框组件,它默认是隐藏的,一旦你点击了开启的按钮,它会显示出来。那么:

* 调用这个组件的 `open()` 和 `close()` 函数来控制是否显示,即是 ''命令式'' 的
* 设计一个 `isOpened` 变量,由 React 判断这个变量来决定是否展示对话框,即是 ''声明式'' 的

!! 基本用法

在 class component 中使用 `React.createRef()`:

```javascript
class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    // create a ref to store the textInput DOM element
    this.textInput = React.createRef();
    this.focusTextInput = this.focusTextInput.bind(this);
  }

  focusTextInput() {
    // Explicitly focus the text input using the raw DOM API
    // Note: we're accessing "current" to get the DOM node
    this.textInput.current.focus();
  }

  render() {
    // tell React that we want to associate the <input> ref
    // with the `textInput` that we created in the constructor
    return (
      <div>
        <input
          type="text"
          ref={this.textInput} />
        <input
          type="button"
          value="Focus the text input"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}
```

在 functional component 中,使用 `useRef`:

```
function CustomTextInput(props) {
  // textInput must be declared here so the ref can refer to it
  const textInput = useRef(null);
  
  function handleClick() {
    textInput.current.focus();
  }

  return (
    <div>
      <input
        type="text"
        ref={textInput} />
      <input
        type="button"
        value="Focus the text input"
        onClick={handleClick}
      />
    </div>
  );
}
```

!! Callback Refs

如果你想更好的地控制 ref 的生命周期,可以用 callback refs:

```javascript
class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);

    this.textInput = null;

    this.setTextInputRef = element => {
      this.textInput = element;
    };

    this.focusTextInput = () => {
      // Focus the text input using the raw DOM API
      if (this.textInput) this.textInput.focus();
    };
  }

  componentDidMount() {
    // autofocus the input on mount
    this.focusTextInput();
  }

  render() {
    // Use the `ref` callback to store a reference to the text input DOM
    // element in an instance field (for example, this.textInput).
    return (
      <div>
        <input
          type="text"
          ref={this.setTextInputRef}
        />
        <input
          type="button"
          value="Focus the text input"
          onClick={this.focusTextInput}
        />
      </div>
    );
  }
}
```

它的重点是,将 `this.setTextInputRef` 传至 `<input type="text" ref={this.setTextInputRef} />`。React 保证:

* 在 `componentDidMount` / `componentDidUpdate` 前,以实际的 `<input>` node 作为参数调用 `setTextInputRef`。这样 `this.textInput` 便指向了 DOM 节点
* 在 `componentDidUnmount` 时(未提及前后),调用 `setTextInputRef(null)`,从而将 `this.textInput` 设置为了 null

除了更好地控制 `this.textInput` 变量之外,我翻了一些博客文章,并没有谁提到这个能力能应用在什么地方。也许适合在 unmount 时做一些清洁工作?

!! 传递 ref 给一个组件

非典型的使用场景。参考 React [[官方文档|https://reactjs.org/docs/forwarding-refs.html]] 以及 [[Exposing DOM Refs to Parent Components|https://reactjs.org/docs/refs-and-the-dom.html#exposing-dom-refs-to-parent-components]] 一节。

!! Reference

* [[Refs and the DOM - React|https://reactjs.org/docs/refs-and-the-dom.html]]
* [[Forwarding Refs - React|https://reactjs.org/docs/forwarding-refs.html]]
React 的 state 机制,主要参考 [[State and Lifecycle|https://reactjs.org/docs/state-and-lifecycle.html]]。

其中最值得注意的一点是:`setState` 函数是异步的,并不是同步的。官方文档有详述这个内容,但是这个 API 的名字和使用方式,很容易让人觉得是同步的。这会导致很多难以发现的 bug。比如文档 [[这一节|https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous]] 中的例子,告诉我们更新 state 时不要依赖于原有的 state / props 值:

```javascript
// Wrong
this.setState({
  counter: this.state.counter + this.props.increment,
});

// Correct
this.setState((state, props) => ({
  counter: state.counter + props.increment
}));
```

[[MobX|https://github.com/mobxjs/mobx]] 针对这个问题提出了解决办法。

了解完 MobX 的原理后,再读下 [[3 Reasons why I stopped using React.setState - Michel Weststrate|https://medium.com/@mweststrate/3-reasons-why-i-stopped-using-react-setstate-ab73fc67a42e#.p8zuloopk]] 中的相关部分。

!! 参考文档

# [[State and Lifecycle - React|https://reactjs.org/docs/state-and-lifecycle.html]]
# [[React.Component API Reference - React|https://reactjs.org/docs/react-component.html]]
# [[3 Reasons why I stopped using React.setState - Michel Weststrate|https://medium.com/@mweststrate/3-reasons-why-i-stopped-using-react-setstate-ab73fc67a42e#.p8zuloopk]]

React 的脚手架工具、框架等。

目前(2019 年 3 月)看 [[GatsbyJS|https://www.gatsbyjs.org/]] 及 [[Next.js|https://nextjs.org/]](Zeit 公司出品,即是 Now.sh 的开发商)的热度超过了 React 官方的 [[create-react-app|https://github.com/facebook/create-react-app]]。而且 GatsbyJS 和 Next.js 显得非常地 feature rich。

! React + Ant Design 快速上手

<<icon "user">> onlyice <<icon "edit">> Revision 2 <<icon "calendar">> 2017/05/05

!! 背景及目标

日常开发过程中,经常需要做一些 Web 管理平台供同事或自己使用。作为一个后台开发前台知识不扎实,很难简单快速做出易用的 Web 应用。但是 React 和 Ant Design 的出现使得这种情况有所改善。

这篇文章提供了一个路线图,供没有太多前台经验的开发快速上手,做出有一些交互的 Web 管理端。重点集中在以下几点:

* 提供两个学习路径,分别针对「快速上手」和「系统学习」两个场景
* 提供足够优秀的学习资源,覆盖重点内容
* 提供一种避开其他不必要的复杂性的方法,比如尽量避开前端构建工具

!! 为什么要用 React + Ant Design?

React 的优点:

# 组件化,写一个 UI 组件可以到处用(当然写通用的组件也不容易)
# 单向数据流,组件化的基本条件,使用组件跟函数调用一样简单

Ant Design 的优点:

# 提供了一堆高质量的 [[UI 组件|https://ant.design/docs/react/introduce-cn]],应有尽有

!! 使用 React 要求的背景知识

使用 React 主要要求这些背景知识:

* JavaScript
* 前端构建过程
** 包管理器(Package Manager)
** 转译器(Transpiler)
** 构建、打包工具(Bundler)

下面的内容会提供两种学习的途径,一种是「快速上手」,适合简单粗暴地学一点就上手用;另外一种是「系统学习」,适合系统性地了解。

!!! JavaScript

JavaScript 语言有几版:

|! |!时间 |!支持程度 |
|!ECMAScript 3 (ES3) |December 1999 |广泛支持 |
|!ECMAScript 5 (ES5) |December 2009 |<<es5-compatibility-table>> |
|!ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015) |June 2015 |<<es6-compatibility-table>> |
|!ECMAScript 7 (ES7) / ECMAScript 2016 (ES2016) |June 2016 |<<es-next-compatibility-table>> |

其中比较关键的节点是 ES6 (ES2015),加入了非常多的特性,更容易写 JS 代码的同时也引入了很多复杂度。对于 React 只需要了解 ES6 中的部分特性即可,但是 ES5 及之前的 JS 基础是需要掌握的。

如果你完全没有 JS 经验,那么:

* ES5 及以前:
** 快速上手:模仿别人写的代码照着写,以写 Python 的风格写
** 系统学习:看 //[[Speaking JavaScript|http://speakingjs.com/es5/]]// Chapter 1~3
* ES6 及以后:
** 快速上手:这些概念,过一遍代码例子,写代码时模仿下别人
*** [[Arrow Function|https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions]]
*** [[Spread Operator|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator]], [[Rest Parameters|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters]], [[Destructuring Assignment|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment]]
*** [[Classes|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes]]: 注意 JS 的 class 本质上还是基于原型链的 Object 结构演化而来,所以跟 Python / C++ 的 class 很不一样(比如没有类的静态变量)
*** Modules: 参考我写的 `JavaScript Module System.pdf`
** 系统学习:
*** [[ES6 In Depth Articles|https://hacks.mozilla.org/category/es6-in-depth/]]
*** [[You Don't Know JavaScript|https://github.com/getify/You-Dont-Know-JS]]
*** [[Modules|http://exploringjs.com/es6/ch_modules.html]]

!!! 包管理器

前端构建过程主要用到的工具都是 Node.js 编写的。因此你需要知道怎样管理 Node.js 包。

* 快速上手:Windows 环境下安装部署 npm 及 Yarn
** 安装 Node.js 及 npm ([[下载链接|https://nodejs.org/en/download/]])
** 安装 Yarn([[下载链接|https://yarnpkg.com/lang/en/docs/install/]])
** 命令行运行 `npm config set registry https://registry.npm.taobao.org`,设置淘宝提供的镜像加速访问
** 检查 `HTTP_PROXY` `HTTPS_PROXY` 环境变量设了没
** 掌握这些命令:
*** 往当前项目安装一个包:`yarn add <package_name>`
*** 安装当前项目指定的依赖:`yarn install`
*** `package.json` 和 `yarn.lock` 都要提交到 SVN
* 系统学习:查看 npm 及 Yarn 的文档,理解 Yarn 解决了什么问题

!!! 转译器

JS 社区标准的转译器叫 Babel,它将高版本的 JS 代码(比如 ES6),转译成低版本的 JS 代码(比如 ES5),以在仍不支持 ES6 的运行环境上(比如老版本的浏览器)运行 JS 代码。

* 快速上手:不用管它,React 的构建工具帮你搞定了
* 系统学习:看看它的文档

!!! 构建、打包工具

现在最流行的是 webpack。它很复杂。

* 快速上手:
** 知道 `import 'file.css'` 是它的 [[css-loader|https://github.com/webpack-contrib/css-loader]] 在起作用,并且 `import` 进来的 CSS / JS 文件最终会被 webpack 打包成一个大的 CSS / JS 文件
** 其他的不用管它,React 的构建工具帮你搞定了
* 系统学习:看看它的文档

!!! 开发工具

用 JetBrains 家的 [[WebStorm|https://www.jetbrains.com/webstorm/]]。

!! 学习 React 本身

学习 React 最重要的点在于,理解:

* JSX
* 组件化及单向数据流
* Virtual Dom

* 快速上手:
** 学 //[[Fullstack React|https://www.fullstackreact.com/]]// 前 4 章
** 通读 [[官方文档|https://facebook.github.io/react/docs/hello-world.html]] 中的 Quick Start 部分
** 了解脚手架 [[create-react-app|https://github.com/facebookincubator/create-react-app]] 的基础用法
*** `npm start`
*** `npm run build`
* 系统学习:在快速上手的基础上,
** 通读 [[官方文档|https://facebook.github.io/react/docs/hello-world.html]] 中的 Advanced Guides 部分
** 学点源码,推荐 [[SoundRedux|https://github.com/andrewngu/sound-redux]]
** 了解 Flux / Redux / MobX 等
* 深入了解:
** 主流框架间的比较:
*** [[Comparison with Other Frameworks - Vue.js|https://vuejs.org/v2/guide/comparison.html]]
*** [[和 Vue.js 框架的作者聊聊前端框架开发背后的故事|http://teahour.fm/2015/08/16/vuejs-creator-evan-you.html]]

一些关键的难理解的点:

* 与 Vue.js / Angular 不同,React 没有双向绑定(即 DOM 元素与其数据绑定),而是使用单向数据流。数据往下流通过 props,数据向上浮通过事件
* JSX 里面可以嵌套 JS 代码。不要把 JSX 理解成一种模板语言,它就是一种可以转译成 JS 的、用来简化书写的代码

!! 学习 Ant Design

用 Ant Design 就跟你之前用 Bootstrap 没什么区别:

# 参考 [[这里|https://ant.design/docs/react/use-with-create-react-app-cn]] 看看怎样把它加到项目来(很可能我已经帮你加好了)
# 把它的组件全部 [[过一遍|https://ant.design/docs/react/introduce-cn]],大概知道有什么组件可以用
# 懂它的布局系统(24 列系统)
# 想想你的场景适合什么组件,去相应的地方拷代码用

!! 常见问题和好的实践

!!! JS 写着很不爽啊

JS 太垃圾不方便,但是有个非常好用的 [[Lodash|https://lodash.com/docs/]] 库,提供了很多方便的函数,写起来可以很像 Python。如果你也不知道怎么用 Lodash,那么你在 Google 代码例子时,加上 lodash 关键词,比如 "lodash iterate object"。

在代码里使用 Lodash:

# `yarn add lodash`
# `import _ from 'lodash'`
# `_.after(...)`

!!! 如何找合适的第三方库?

# 参考 Ant Design 文档中的 [[社区精选组件|https://ant.design/docs/react/recommendation-cn]],看看有无适合你的库
# Google 相关的关键词,看看相应的库 GitHub 星星数等
# [[Awesome React|https://github.com/enaqx/awesome-react]] 里找找

!!! 去哪查文档?

JS, React, Lodash 都不熟,经常要看文档怎么办?[[DevDocs|http://devdocs.io/]] 上这几个文档都有,Enable 之后将内容下载到离线使用,查阅起来就很方便。
TODO: 这里的内容应该更体系化,应该被拆分。

# React 的事件绑定中,事件处理函数的 `this` 参数都是指向 component instance 本身的。而 JavaScript 中事件处理函数中的 `this` 好像没什么用处。
# React 使用了 Event delegation,原理即是:DOM 里面某些节点可能会经常被增加/删除,如果要监听他们的点击事件,可以在他们的父节点上增加 EventListener,再判断 Target。据说执行效率会高一些。
# `props` 的数据不要去变,要变的数据放在 `state` 里面
# React 认为 JavaScript 的执行速度不是瓶颈,瓶颈在于 DOM 的更新上。于是他们做了很多事情优化 DOM 的更新。比如 [[Child Reconciliation|https://facebook.github.io/react/docs/multiple-components.html#child-reconciliation]]
# 组件间有所属关系,数据从拥有者流向归属者。
# `props` 是单向数据绑定,而且值是不可变的;`state` 应该是双向的。

参考:

* [[State and Lifecycle - React|https://reactjs.org/docs/state-and-lifecycle.html]]

React 推荐 [[用组合来代替继承|https://reactjs.org/docs/composition-vs-inheritance.html]]。

实现可复用组件的方法有这些:

* [[Containment|React: Pattern: Reusable Component: Containment]]
* [[Higher-Order Components|React: Pattern: Reusable Component: Higher-Order Components]]
* [[Render Props|React: Pattern: Reusable Component: Render Props]]
* [[Hooks|React: Concept: Hook]]

鉴于 JSX 是类似 XML 的结构,可以在元素中包含元素,因此 React 也提供了方便地定义内嵌的元素的方法 `props.children`:

```javascript
function FancyBorder(props) {
  return (
    <div className={'FancyBorder FancyBorder-' + props.color}>
      {props.children}
    </div>
  );
}

function WelcomeDialog() {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        Welcome
      </h1>
      <p className="Dialog-message">
        Thank you for visiting our spacecraft!
      </p>
    </FancyBorder>
  );
}
```

同时,你也可以将 React 组件实例作为 props 的一个属性传入:

```javascript
function SplitPane(props) {
  return (
    <div className="SplitPane">
      <div className="SplitPane-left">
        {props.left}
      </div>
      <div className="SplitPane-right">
        {props.right}
      </div>
    </div>
  );
}

function App() {
  return (
    <SplitPane
      left={
        <Contacts />
      }
      right={
        <Chat />
      } />
  );
}
```

参考 React [[文档|https://reactjs.org/docs/composition-vs-inheritance.html]]。
高阶组件(HOC, Higher-Order Components),本质上是利用了 JavaScript 中,函数及 class 作为一等公民的能力来实现的一种 pattern。

React [[文档|https://reactjs.org/docs/composition-vs-inheritance.html]] 给了一个好的例子:

```javascript
// This function takes a component...
function withSubscription(WrappedComponent, selectData) {
  // ...and returns another component...
  return class extends React.Component {
    constructor(props) {
      super(props);
      this.handleChange = this.handleChange.bind(this);
      this.state = {
        data: selectData(DataSource, props)
      };
    }

    componentDidMount() {
      // ... that takes care of the subscription...
      DataSource.addChangeListener(this.handleChange);
    }

    componentWillUnmount() {
      DataSource.removeChangeListener(this.handleChange);
    }

    handleChange() {
      this.setState({
        data: selectData(DataSource, this.props)
      });
    }

    render() {
      // ... and renders the wrapped component with the fresh data!
      // Notice that we pass through any additional props
      return <WrappedComponent data={this.state.data} {...this.props} />;
    }
  };
}
```

用法:

```javascript
const CommentListWithSubscription = withSubscription(
  CommentList,
  (DataSource) => DataSource.getComments()
);

const BlogPostWithSubscription = withSubscription(
  BlogPost,
  (DataSource, props) => DataSource.getBlogPost(props.id)
);
```

上面例子中,`CommentList` 与 `BlogPost` 组件,只需要实现自己的 `render()` 函数,即可通过相应的 `WithSubscription` 组件获得自动监听信息源的能力。这种添加和移除监听事件的能力,就在两个组件间复用。关键的技术点是:

* `withSubscription()` 返回一个 class
* 从 `DataSource` 中获取数据的过程,通过 `selectData` 来传递
Render Props 可以看作一种动态的 [[containment|React: Pattern: Reusable Component: Containment]]。Containment 是将一个内层组件作为外层组件的 children,而 render props 是将内层组件本身通过一个 `render` 函数展示在外层组件中:

```javascript
class Cat extends React.Component {
  render() {
    const mouse = this.props.mouse;
    return (
      <img src="/cat.jpg" style={{ position: 'absolute', left: mouse.x, top: mouse.y }} />
    );
  }
}

class Mouse extends React.Component {
  constructor(props) {
    super(props);
    this.handleMouseMove = this.handleMouseMove.bind(this);
    this.state = { x: 0, y: 0 };
  }

  handleMouseMove(event) {
    this.setState({
      x: event.clientX,
      y: event.clientY
    });
  }

  render() {
    return (
      <div style={{ height: '100vh' }} onMouseMove={this.handleMouseMove}>

        {/*
          Instead of providing a static representation of what <Mouse> renders,
          use the `render` prop to dynamically determine what to render.
        */}
        {this.props.render(this.state)}
      </div>
    );
  }
}

class MouseTracker extends React.Component {
  render() {
    return (
      <Mouse render={mouse => (
        <Cat mouse={mouse} />
      )}/>
    );
  }
}
```

惯常的用法是,提供一个 `render` 函数,它接受外层组件的 `state` 作为参数,返回一个内层组件的实例。即上面代码中的:

```javascript
<Mouse render={mouse => (
  <Cat mouse={mouse} />
)}/>
```

与 [[HOC|React: Pattern: Reusable Component: Higher-Order Components]] 类似,也可以用 `withXXX` 模式来代码上面的 `MouseTracker`:

```javascript
function withMouse(Component) {
  return class extends React.Component {
    render() {
      return (
        <Mouse render={mouse => (
          <Component {...this.props} mouse={mouse} />
        )}/>
      );
    }
  }
}

const MouseTracker = withMouse(Cat);
```

当然你可以不用 `render` 作为函数名,用 `children` 或者其他有意义的名字也可以,但它们都被称为 render props。在你的组件 API 中,应该指明你所使用的 render props 是必须的:

```javascript
Mouse.propTypes = {
  children: PropTypes.func.isRequired
};
```

同时注意使用 render props 可能会导致 `React.PureComponent` 的好处被抵消。参考 React [[文档|https://reactjs.org/docs/render-props.html]]。
教程来源于 [[Awesome React|https://github.com/enaqx/awesome-react#react-general-tutorials]]。

!! 官方教程

<i class="fa fa-calendar"></i> 2016/08/18 <i class="fa fa-pencil"></i> 推荐

[[官方教程|https://facebook.github.io/react/docs/tutorial.html]] 质量较高,把 React 重要的概念都实践了一次。但是感觉官方没法把 React 的概念说得比较通俗易懂,比如我有一些疑问:

# 文档一直提到 JSX 就是 JavaScript,可是我看这些长得像 DOM 的代码,很难把它理解成 JavaScript。我觉得最好把 JSX 描述成可以嵌入 JavaScript 代码的一种模板语言。
# 为啥要有 state?全部用 props 不好吗?感觉文档没说明白。

总的来说有点晦涩难懂。但是应该主要是 React 的设计太糟糕所致。

!! React HN

<i class="fa fa-calendar"></i> 2016/08/18 <i class="fa fa-pencil"></i> 不推荐

[[React HN|https://github.com/mking/react-hn]] 是用 React 做一个 HackerNews clone。

优点是教程比较渐进,从搭建环境(babel, Browserify)到一步步实现各 Component 效果都有详细代码。

缺点是太简单了,只用到了 Properties 和基础的 `createClass`, `render`,连 `state` 也没涉及到。而且有些诸如 `title`, `comment` 拆成了多个函数,我觉得没什么必要,又不是可复用的。同时教程没有什么讲解,就是给你代码让你填进去,最后做个样子出来。

最后,注意这里使用的 React 版本比较旧,新的版本 `render` 函数是属于 ReactDOM 的,代码里面需要做一些改动。同时这里面用的 Browserify 应该不再是 React 官方推荐的构建工具了。
! classnames

[[classnames|https://github.com/JedWatson/classnames]] 这个 JS 库适合用于动态生成一个标签的 CSS classes:

```js
// before
var Button = React.createClass({
  // ...
  render () {
    var btnClass = 'btn';
    if (this.state.isPressed) btnClass += ' btn-pressed';
    else if (this.state.isHovered) btnClass += ' btn-over';
    return <button className={btnClass}>{this.props.label}</button>;
  }
});

// after
var classNames = require('classnames');

var Button = React.createClass({
  // ...
  render () {
    var btnClass = classNames({
      'btn': true,
      'btn-pressed': this.state.isPressed,
      'btn-over': !this.state.isPressed && this.state.isHovered
    });
    return <button className={btnClass}>{this.props.label}</button>;
  }
});
```

!! 参考资料

# [[Real Time Streaming Protocol - Wikipedia|https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol]]
# [[Session Description Protocol - Wikipedia|https://en.wikipedia.org/wiki/Session_Description_Protocol]]
|!Name |游戏改变世界(经典版) |
|!Author |[美] 简·麦戈尼格尔 |
|!Edition |N/A |
|!Release Date |September 2016 |
|!ISBN-13 |978-7550286870 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

!! 点评

评分:★★★☆☆

完整地看完 1~7 章后,我决定不继续看下去。

我玩过的 PC 游戏挺多,因此书内讨论的点,我过多或少思考过,观点对我来说不是太新颖。这本书最大的问题是,他对游戏的描述基本上只用文本,图片很少 (更别说更合适的视频了)。这使得如果你没玩过作者所说的游戏时,很难有非常切身的体会。

同时有一些材料,我觉得不是很有意思,比如「家务战争」这类所谓平行实境游戏,看起来一点都不吸引人,让人觉得作者并不是一个很深入的游戏玩家,这块内容很没吸引力。

如果你玩游戏玩得不多,我建议你看的时候一边了解下书内的游戏的核心机制,这样对理解有帮助。同时我觉得第九章开始,翻翻目录看看别人的总结就好了,对个人发展而言不是太有价值。

!! 引言

> 如果让所有游戏开发人员都学会优化人类体验、组织协作社区,并将之应用到现实生活,那么:
> 我预见,我们会开发出能让人高高兴兴起床、精力充沛地开始新一天的游戏;

这些愿望很美好。但是这样避免被政客利用,把生活变成一个你沉溺其中的数值游戏呢?我的意思是,会不会被政客也加入一些 成瘾性设计,让你盲目的追求政府有意定下的系列目标。

!! 第1章 提升人的幸福感

> 我们真正害怕的不是游戏,而是在游戏结束、现实开始时迷失了方向。

-

> 所有的游戏都有4个决定性特征:目标、规则、反馈系统和自愿参与。

奇怪的模型

-

> 已故的伟大哲学家伯纳德·苏茨(Bernard Suits)对游戏下了一个定义,将上述4个决定性特征涵盖在内。在我看来,这是有史以来最有用也最具说服力的游戏定义:玩游戏,就是自愿尝试克服种种不必要的障碍。

-

> 还有更糟糕的时候:现实生活里的工作不够艰苦。这让我们感到无聊,觉得没有充分利用自己的大脑;还让我们觉得自己不受重视,在浪费自己的人生。如果艰苦工作并非出于自己的选择,那么它一般都不会是一份天时地利人和的工作。从事这样一份工作,无法充分发挥我们的优势,无法控制工作流程,对自己的贡献没有清晰的认识,永远看不到最终带来的回报。别人要求我们所做的艰苦工作,不能以相同的方式激活我们的快乐系统,很难让我们打起精神、乐观向上、斗志昂扬。

-

> 所有优秀的游戏都是艰苦的工作,它是我们主动选择且乐在其中的工作。而当我们从事自己喜欢的工作时,就点燃了头脑里的那根快乐雷管。

可能对比较硬核类的游戏适用?

-

> 我们称为“放松”的每一种娱乐,比如看电视、吃巧克力、逛街,甚至是单纯地发呆,都不会让我们感觉好起来。根据调查结果,一旦我们开始“找些乐子”,就会感觉更糟:动力不足、信心不足、完全不能投入。但是,怎么会有这么多人完全搞错了什么是“娱乐”呢?难道对于什么能让我们感觉更好,一点准确的直觉都没有吗?

Think about that in daily life.

-

> 研究证实了玩家早就明白的观点:在承受能力范围内,我们宁肯艰苦工作,也不愿无聊娱乐。或许,这就是为什么较之其他人,游戏玩家用于看电视的时间全球最少。

!! 第2章 构建更美好的现实社会

> 心流是令人振奋的一刹那,它让我们感受到了激励。一次强烈的心流体验,可以在此后几个小时、甚至几天让我们心情愉悦。但它是一种极端的投入状态,最终会耗尽我们的体力和精力。我们不能随心所欲无限制地一直处在心流中。按照凯斯的说法,这就是为什么人类繁荣需要一种更“持续”的幸福方法,不能只有心流。我们必须找到享受世界和生活的方法,不一定非得随时随地全力以赴地发挥自己潜能的极限。
> 出于这一目的,我们碰到了一个可能是过去30年里游戏行业的核心困境:怎样让玩家玩得更多,却又不减少他们的真实生活。业内人士都知道,玩家渴望心流和自豪,游戏开发者给得越多,玩家投入心爱游戏的时间和金钱也就越多。但超出一定的极限后——对大多数玩家而言,每周投入游戏20个小时左右,玩家就会开始怀疑自己错失了真实的生活。

玩家之悔

-

> 积极心理学领域出现了多种相互矛盾的幸福理论,但如果说有一件事是所有积极心理学家都认同的,那就是:实现幸福有多种途径,但我们就是发现不了幸福。没有哪一种物体、事件、结果或生活环境一定能给我们带来真正的幸福。我们必须自己创造幸福:从事艰苦工作,从事那些能带来奖励的活动。
> 一方面,如果我们尝试在自身之外寻找幸福,就把焦点放在了积极心理学家称为“外在”奖励的东西上,即金钱、物质、地位或赞许。等我们得到了自己想要的东西,就会感觉很好。可惜,幸福的愉悦感不会持续太久。我们会对自己喜欢的东西产生耐受性,开始想要更多,需要更大、更好的回报才能触发同等水平的满足感和愉悦感。我们越是尝试“找到”幸福,就越难找到。积极心理学家称这个过程为“享乐适应”,它是长期保持生活满意的最大障碍之一。

-

> 心理学家、内在奖励领域的权威专家索尼娅·柳博米尔斯基(Sonja Lyubomirsky)解释说:“幸福活动持久性的一大原因在于……它们得来不易。你投入了时间和精力……展开了这些实践,而且有能力再次展开。这种能力和责任意识本身就是强大的推动力。”
> 当然,我们也开发了很多触发内在幸福系统的外部捷径,如吸毒、嗜酒、不健康的饕餮大餐、周期性血拼,等等。但这些方法不可持续,从长期来看没有效果。科学家已经证明,对外在奖励的享乐适应会导致我们沉溺于快捷的幸福行为,一步步走向失控,直到它们失去效果,或是让我们承受不起,甚至最终害死我们。

-

> 作家伊丽莎白·吉尔伯特(Elizabeth Gilbert)称自己是一个幸福探索家,她有段话说得好:“幸福是个人努力的结果……你必须坚持不懈地表现自己的幸福。”我们具备通过艰苦工作创造幸福的能力,体验内在奖励的工作越艰难,创造幸福的内在能力就越强。

-

> 玩游戏,并不是为了逃避现实生活,而是为了主动让现实变得更有价值!

这要看玩什么游戏。。

!! 第3章 更满意的工作

> 为什么我们渴望这种保证生产力的活动呢?在《幸福多了40%》(The How of Happiness)一书中,索尼娅·柳博米尔斯基写到,提高人们日常生活质量最快速的方法,就是“赋予人们具体的目标,一件可以去做又能保有期待的事情”。一旦明确的目标和特定的任务联系起来,我们就有了目的感,有了十足的冲劲。

制造明确的步骤和期待?

-

> 阿兰·德波顿(Alain de Botton)在《工作颂歌》(The Pleasures of Sorrow and Work)中提出:“工作只有在少数行动者手里迅速进行时才有意义。此时,对于工作日里干了些什么、所做的事情对他人有什么影响,工人可以在想象中为这两者建立联系。”我们要足够接近自己的行动,直接而迅速地看到结果,这样,工作才能满足我们对周围世界产生影响的渴望。没有和自己的努力清晰联系起来的明显结果,我们就不可能对自己的工作真正满意。但遗憾的是,很多人的日常工作正是如此。

-

> 尽管我们认为电脑游戏是虚拟体验,但它们给了我们真实的能动性,给了我们做一些结果可以衡量的具体事情的机会,以及直接作用于虚拟世界的力量。此外,玩家们还用他们的双手劳动,尽管他们操纵的是数字数据和虚拟对象。如果真实世界的工作不能变得更好,那么像《魔兽世界》这类游戏,便满足了人类的一大基本需求,即感受生产力。
> 要满足我们,工作必须具备如下条件:可以立刻行动的明确目标以及生动直接的反馈。

感受到生产力,这个表达太精确了

-

> 但这正好说明我们有多么渴望从事让人感觉真正在生产的简单动手工作。我们借助游戏缓解沮丧感,因为在实际工作中,我们常常毫无进展、毫无成效。

!! 第4章 更有把握的成功

> 每当玩家在《超级猴子球Ⅱ》里犯了错,就会立刻发生一件有趣的事情:猴子旋转着、哀嚎着从球道边缘落入空中。这段动画在让失败变成快乐的过程中起到了关键作用。飞舞的猴子是奖励:它让玩家发笑。但更重要的是,它生动地表现了玩家在游戏里的“能动性”。玩家不是被动失败的,他们失败得华丽、绚烂而又有意思。
> 很多时候,成功的希望比成功本身更刺激。成功固然愉快,但一旦成功,就少了好些有意思的事情可做。如果我们失败了,又如果我们可以再次尝试,那么我们就仍有任务在身。

有点像记忆碎片里的,you can be my John G.

-

> 奈斯主要研究的是抑郁症的进化起源。抑郁症为什么会存在呢?他提出,既然它在我们的基因库里存在了这么久,一定有些进化上的优势。他认为,抑郁症或许是为了防止我们受盲目乐观所害、把资源浪费在错误目标上的自适应机制。这是我们的进化优势:不把时间和精力浪费在不切实际的目标上。因此,如果没有明确的方法实现富有生产力的进步,我们的神经系统就会切换到低动力、低能量的默认状态。

-

> 游戏化的力量
> 研究表明,音乐视频游戏的玩家越来越有动力演奏真正的乐器。2008年,有人对7万多名《摇滚乐队》和《吉他英雄》的玩家做了调查,67%本来不会弹奏乐器的人报告说,自从开始玩这一类视频游戏,他们受到鼓舞,拿起了真正的乐器。此外,72%认为自己会玩乐器的玩家报告说,自从开始玩视频游戏,他们弹奏真正乐器的时间也更多了。

!! 第5章 更强的社会联系

> Lexulous的评论者总结了这一游戏跨越代沟的吸引力:“你的社交网络里的每一个人,包括你的母亲,都知道怎样玩拼字游戏。”毫无疑问,这就是为什么网上如潮的好评里总会提到“我妈妈”,比方说下面这一则:“我住在亚特兰大,我妈妈住在得克萨斯。我们爱死了跨越千里的游戏之夜。不过,我相信,因为我老是赢她,她得休息一阵子了。我爱你,老妈!”
> 我一辈子大部分时间都在读游戏评论,还从没见过这么多评论提到“妈妈”的情况。事实上,这么说也不算过分:对很多玩家来说,玩Lexulous意味着每天能找个理由跟妈妈聊天。

填字游戏 Lexulous。

-

> 克特纳说:“调侃就像社交疫苗,刺激接受方的情绪系统。”带有调侃意味的互飙废话令我们非常轻微地唤起了彼此的负面情绪——我们激起了极少量的愤怒、痛苦或尴尬。这种微小的挑衅具有两个强大的效果。

-

> 大型多人在线游戏以合作任务和团战而出名。但事实证明,绝大部分玩家更喜欢一个人玩游戏。有人对超过15万名《魔兽世界》玩家做了8个月的跟踪研究,发现玩家平均花70%的时间从事个人任务,几乎不跟其他玩家互动。斯坦福大学帕洛阿尔托研究中心的研究人员认为,这很奇怪,也有违直觉。既然你不想搭理别人,怎么会按月付费投入大型多人在线游戏的世界呢?
> 研究人员访问了玩家,与之进行深入探讨,发现哪怕在没有直接互动的情况下,他们也很享受共用虚拟环境。玩家们体验到高度的“社会临场感”(social presence),这是通信理论中的术语,指与其他人共享同一空间的感觉。虽说玩家并不互相对打或是一起做任务,但他们仍认为彼此在虚拟空间中互相陪伴。斯坦福大学帕洛阿尔托研究中心的团队将这种现象称为“一起各自玩”。

-

> 斯坦福大学帕洛阿尔托的研究人员认为,性格内向的玩家更容易喜欢上一起各自玩,新近的认知学研究也为这一理论提供了支持。人为什么分为内向和外向?对此科学家最准确的解释是,它跟大脑两种不同的活动有关。
> 首先,内向的人一般对外部的感官刺激更敏感,处理对象、空间、他人等外部世界信息的大脑皮层区域对任何刺激都都会产生强烈反应。反过来说,性格外向的人,皮层唤起较低。他们需要更多的刺激,才能感觉投入外部世界。这就让外向的人更有可能去寻求高度的社交刺激,而内向的人哪怕参与社会投入度较低的活动,也容易在精神上感觉疲惫不堪。
> 其次,外向的人往往会产生更多的多巴胺回应社会奖励,如笑容、笑声、对话和抚摸。反过来,性格内向的人对这些社会奖励较不敏感,但对心理活动,如解决疑难杂症和单独探索等高度敏感。研究人员说,这可以解释为什么外向的人似乎在周围有人、环境刺激时更快乐,他们比内向的人有着明显更为强烈的积极情绪。

-

> 不提及游戏在帮助我们对抗寂寞感的过程中所扮演的积极角色,是没有办法讨论它的社交奖励的。一般而言,我们更乐意跟朋友一起玩。但如果做不到,我们宁肯和陌生人玩,也不愿一个人玩。库克曼对普遍情绪做了概括:“在第一人称射击游戏里,一个对我大喊大叫的人能不能和我建立一段持久的友谊,我说不准,但这无论如何比一个人待着强。”

-

> 15年前,政治学家罗伯特·柏特南(Robert Putnam)十分担心美国变成一个人们“独自去打保龄球”的国家。他在自己论及扩展社群崩溃、影响力极大的作品里,记录了一种令人担忧的发展趋势:我们越来越喜欢窝着不动,只有几个人陪伴,不再喜欢参与民间组织或投身更广阔的社交环境。
> 帕特南认为,日常生活中扩展社群的崩溃对我们的生活质量造成了巨大的威胁,他的论证方式极具说服力。因此,自那以后多年,专家们一直在争论如何逆转这一趋势,公共机构也用尽全力重建传统的社会基础设施。但正如玩家们所知,重建传统联结方式,恐怕不是解决之道,彻底再造的效果或许更好。玩家再造着我们自以为是日常基础设施的东西,他们正在尝试通过新的方式创造社会资本,培养比保龄球联赛更善于提供更多社会纽带和联结的新习惯。

!! 第6章 更宏大的意义

> 我们怎样才能在生活中获得更多意义?其实很简单。哲学家、心理学家和精神领袖都赞同:为生活增加意义的最佳途径,就是把自己的日常行动与一件超出自身的事情联系起来,事情越大,效果越好。正如马丁·塞利格曼所说:“自我是一个意义匮乏的地方。”在宏大的社会背景之下,我们无关紧要。你附着的实体越大,获得的意义越多。

很像 SHIELD 里面 Coulson 经常说的,A man can accomplish anything when he realizes he's become part of something bigger.

-

> 心理学教授、《我一代》(Generation Me)一书作者简·滕格(Jean M. Twenge),曾极具说服力地指出,如今最年轻的一代,尤其是80后,“比以往任何时代都更可怜”。为什么呢?因为我们的文化越发强调“自尊”和“自我实现”。但正如无数心理学家、哲学家和精神导师所指出的:真正的实现,来自履行对他人的承诺。我们希望别人不是因为“我们是什么人”而尊敬我们,而是因为我们做了某件真正重要的事情而尊敬我们。

「真正的实现,来自履行对他人的承诺。」这个表达有问题。下文中主要阐述的是帮助、做奉献,而不是履行承诺。

-

> 心理学家亚伯拉罕·马斯洛(Abraham Maslow)说过一句名言:“了解自己想要什么并非常态,它是罕见而艰巨的心理成就。”但今天最优秀的游戏为我们提供了强大的工具,帮助我们获得这一罕见的自我认知。

了解自己想要什么,很难

!! 第7章 全情投入 当下游戏化的参与机制

> 这就是为什么数字一代的孩子们在传统课堂上比从前的孩子更辛苦。今天的学校基本上只是一大堆只能带来负面压力的长期的必要障碍,学业是强制性的、标准化的,一次失败,终身记录。因此,虚拟环境和传统课堂之间日益脱节。
> 《教育数字原生》(Teaching Digital Natives)作者马克·普伦斯基(Marc Prensky)描述了当下的教育危机:
> “不能激励我,就只会激怒我。”如今的学生是这样要求的。相信我,他们很愤怒。我们教育的所有学生,在生活里都拥有一种真正能激励他们、一种他们经常做也擅长做、一种具备了真正激励和创新元素的东西……游戏就是这种创造性激励参与的缩影。相比之下,学校如此乏味,习惯了别样生活的孩子们根本无法忍受。和前几代成长氛围里没有游戏的学生不一样,这一代的孩子知道真正投入的感觉是怎么一回事,他们很清楚自己渴望什么。

> 本章讨论的3个游戏,代表了开发平行实境、解决生活质量问题的3条主要途径。

感觉这些 idea 已经不再适用,现在的游戏娱乐性更强更好玩,相比之下这种平行实境游戏显得很蠢。
[[Reaper|https://www.reaper.fm/]] 是一个强力的 DAW(Digital Audio Workstation)软件,一般用来编辑音乐。我用它来编辑播客。

!! 入门

# 看官网的 [[入门视频|https://www.reaper.fm/videos.php]]
# 官网入门视频的同一作者 Kenny Gioia 的 [[reaper 视频|http://www.kennymania.com/reaper-videos/]]

其他:

* [[Reaper For Radio Tutorials Playlist - YouTube|https://www.youtube.com/playlist?list=PLpwX6qRvK2c731EeVQ5wwNVovJeq7si3K]]

|!Name |新生 |
|!Author |李笑来 |
|!Edition |N/A |
|!Release Date |2016 |
|!ISBN-13 |N/A |
|!Medium |[[网站|http://b.xinshengdaxue.com/index.html]] |
|!Rating |{{!!rating}} |

李笑来发布于 2016 年的书,网上可 [[免费阅读|http://b.xinshengdaxue.com/index.html]],Dropbox 上也放了一份 PDF。

整本书感觉不是太系统,比较零乱,像是想到哪写到哪,比《把时间当作朋友》的水准差好多。但是里面有一些小故事带有启发性。

!! 人生最重要的概念:复利

> ''不过,万幸的、也是公平的是,每个人都一样,在智力上、知识上、经验上,复利效应依然存在的——这是多么令人喜出望外的事实啊!''只要能积累的东西,基本上最终都会产生复利效应。如果没有继承资产,那么就持续积累知识罢,我们运气真的很好。
> 
> 我们恰恰活在一个知识变现很容易、且越来越容易、且变现金额越来越大的时代。

积累知识很重要。利用知识变现也很重要。

!! 最根本的学习与创作:践行

少说空话,多思考,多做事。坚决地做。

!! 我当初是怎样错过一辈子的

李笑来讲了个故事:

> 这个寒颤之前,我一直觉得自己 2000 年以 28 岁的“高龄”把自己关到一个小屋子里四个月就搞定托福、GRE 高分是一件值得自吹自擂的事情;可是这个寒颤之后,我突然发现我其实在许多年前,还“很傻很天真”(1993年)的时候,就有机会去考托福、GRE,可当时竟然以为那是“不可能”的事情;还自以为是地与其他同学一样叫那位同学“牲口”……

用来说明 ''观念'' 对人的行为的影响。

大家容易对很多观念没有深入思考就接受了,往往就错失了很多机会。仔细思考并且是很有必要的。

同时一个观念如果太笼统,把它具体化是有意义的:

> 很多其实很重要的建议,常常只不过是因为陈述过于笼统而难以传递,难以接受,难以践行。 比如,“日省三身”,就是一个过于笼统的陈述。明确一点的说法是什么呢?
> 找出那些想当然的念头,挨个审视一遍,看看它对不对?有没有道理?是否应该被升级,或者被替换?这事儿一定要仔细,因为那些不经审视就嵌入操作系统的“想当然”实在是太危险了……

!! 概念是一切知识的基石

这章的内容非常有价值。讲述的是一个通用的学习方法。

> 在这一点上,我非常幸运 —— 有个在图书馆工作的母亲。刚上初一的时候,母亲花了几分钟教我如何阅读教科书:
> 你看,这么厚厚一本书,其实就那么几个概念;讲一个概念就要花费一个章节的篇幅,从结构上来看,其实讲的都一样,无非是一个接一个的概念,要说清楚它是什么,它不是什么,它和别的概念有什么异同;然后就是与它相关的方法论,比如,使用的时候需要注意什么,怎样使用是正确的,怎样使用是错误的,容易发生错误的地方是什么…… 这些都弄明白了,一个概念就算是学透了,这些概念都弄明白了,这本书算是看懂了,就这么简单。

把知识抽象成一个个核心的概念是相当重要的。然后多使用这些概念去演绎、推导出新的知识,解释现实生活中的现象。这要求你在看到这些知识时,多与现实联系起来。

> 所谓的成长,从这个意义上描述,就是这样的:
> 1. 学会了哪些原本不知道的概念和方法论?
> 2. 哪些已有的概念和方法论被进一步打磨了?
> 这很重要,因为这样的描述使得“成长”多少可被量化 —— “可量化”很重要,因为量化的结果是最好的反馈。成长从来都是需要过程的(常常是漫长的过程),需要不断有足够的反馈机制去激励。成长可量化了,它就有了足够的动力。而这本身,也是“成长与重生的方法论”。

可量化很重要。我的 Wiki 的也有一部分根基是可量化、真实地看到知识的积累。

!! 解决问题的方法论

这篇也挺有价值的。各种各样的问题会伴随人们一生,学会如何与它共处、如何解决问题是非常有必要的。

# 有些问题是永远解决不了的。Live with it,尽力就好。比如父母的衰老有时是不可避免的,但是你可以做一些事情去让过程更好。
# 有些问题是不用解决的。绝大多数人的问题是''主次不分''。有些问题存在就存在,但是没那么重要,没有必要过于完美主义一定要解决它。
# 有些问题是其他人的问题。有时候别人(甚至绝大多数人)的观点跟你不一致时,不一定是你的问题。很多时候大多数人都是错误的。书里举了一些例子:
#* 时间就是不可管理的,管理时间的意愿和炼丹求长生没啥太大区别……
#* 与其控制情绪,不如继续求知,学识才决定人的品行和生活的品质……
#* 外语发音不好,甚至说不流利又怎样?我使用外语的最大用途是阅读……
#* 写作技巧都不重要,践行才是创作呢……我就这样把自己活成了行为艺术家……
#* 想要学什么,我就去教什么,反正我学得快,至少比大多数人的学习经验更多一些,学习时间更长一些……
#* 谁说不能同时做好几件事情?我跑步的时候还听音乐呢,我走路的时候还听电子书呢,我甚至在写文章的时候也同时看电影呢!DOS 就是理解不了 Unix 罢?

!! 调整焦点:一个不可或缺的方法论

这篇有一个很有意思的观点。它的讨论背景是一个大趋势来临时,人们如何应对它。

> 大多数人没有那样好的运气。当一个大的趋势来临的时候,绝大多数人即便绞尽脑汁,也想不出那大势如何为己所用。

> 于是,我开始动脑思考了。这样的时候,我总是要调用一个屡试不爽的方法论,''转换焦点'':
> * 不是问自己,这个大势如何才能为我所用?
> * 而是问自己,在这个大势中,我去做什么最划算?
> 这两个问题的区别在于,
> * 第一个问题的焦点是放在自己身上的;
> * 第二个问题的焦点是放在大势本身上的。

这就意味着,你很可能需要跨界,需要做自己不熟悉的事情(当然也需要靠近原有的知识结构),来顺应大势本身。

!! 为什么一定要自学?

> 而融会贯通的前提是什么呢?在《惊喜与创造惊喜的方法论》里,我其实已经论述过此事:
>> 只有概念多到一定程度的时候,它们之间才有机会产生“意外的连接”——即,所谓的融会贯通。
> 善于自学的人,时时刻刻都在学习、在思考,这极大地增加了他们“偶然”发现什么、“突然”想到什么、“忽然”就得到了什么新结论诸如此类的概率,对他们来说,即便是“偶然”,也是更为高频的“偶然”,进步、持续进步、大幅度进步,对他们来说是斜率更大的必然线条。

!! 如何真正消化一本书?

这是这本书里面质量''最好''的文章之一,值得以后回顾。里面提到一些观点:

# 李笑来说他阅读虚构类书籍的乐趣,已经转移到影视作品了。跟我的情况类似,我是转移到影视作品和游戏中。虚构类的书籍某些程度上没有必要再去看了。
# “阅读速度”是个没用的概念,在我眼里,只有“理解速度”,理解速度快,才能有效提高阅读量。
# 标题党的文章直接不看了——说实话,即便错过什么了,也没什么可惜。
# 看书之前要做好准备工作,比如先翻看前言和目录,对书的内容有一个大致的预期;可以看看网上的书评,判断这本书是不是值得投入时间。
# 阅读的过程中,要不断地向后总结,向前预期。这是一个简单的「输入、处理、输出」的过程,没有这种过程的读书很可能只是走马观花。
# 想办法把知识用起来。一定要用起来。分享是不错的方式,教是最好的学。
# 这个概念、这个方法论、这个道理、这个知识,还可以用在什么地方?
# 与喜欢学习的人泡在一起。

!! 选书的基本原则

了解这些点:

# 出版社:领域内出名出版社
# 作者:了解领域内能力
# 版次:越多越好,说明内容越经典
# 印次、印数:印越多说明销量越好、出版社信心越足
# 「编」与「著」:「编」的意思是「拿过来放一起」(比如一些高校教材),优先考虑「著」的
# 参考文献:知识类的书籍必须要有丰富的参考文献,才比较科学,同时提供了阅读地图
# 不要读译作、花时间看书评、看牛人荐书

!! 活在未来,而不是当下

为什么要活在未来?

* 大部分人已经活在当下了
* 提前准备迎接未来的事情
* 提前成为想象中的未来的自己

怎样活在未来?

# 笃信逻辑(因果思维)
# 用逻辑去判断明天会发生什么

---

后面理财系列的内容,并没有讲太多理财实操的内容,反而是讲一些观念上的东西。大多数比较常识化,就不做详细纪录了。

不过里面「理财:认识周期」不太理解,后续懂一点经济学后可以回顾一下。

! Dimensions of Analysis

* Domain
* Purpose
* Recommendation Context
* Whose Opinions
* Personalization Level
* Privacy and Trustworthiness
* Interfaces
* Recommendation Algorithms

!! Domain

A domain may refer to:

* News: the news in 今日头条
* Products: a book recommended by Amazon
* Matchmaking: online matching system in DotA 2 / 王者荣耀
* Sequences: music playlists recommended by Netease Music

Recommender should consider choosing whether a new item or ''new'' or a re-recommend ''old'' one.

!! Purpose

* Sales or other benefits for recommendations themselves (most of the time)
* Education of user / customer (very rarely)
* Some other nonsences

!! Recommendation Context

What's the user doing at the time of recommendation? Shopping, listening to music or reading news?

!! Whose Opinions

* Experts: wine shop with comprehensive reviews that only experts can provide
* Ordinary "phoaks"
* People like you: movie recommendations on Douban are based-on users' whose taste is similar with you

!! Privacy and Trustworthiness

* Privacy: who knows what about me and my data on the recommender system?
* Trustworthiness: Is the recommendation honest? Or business rules built-in by operator for commercial benefits?

!! Interfaces

Predictions? Recommendations? Explicit or implicit input?

!! Recommendation Algorithms

See [[Recommendation Algorithms|Recommender System: Recommendation Algorithms]].
! History

* Ants, Cavemen, and Early Recommender Systems – The emergence of critics
* Information Retrieval and Filtering
* Manual Collaborative Filtering
* Automated Collaborative Filtering
* The Commercial Era

! Information Retrieval

* [[Concept|https://en.wikipedia.org/wiki/Information_retrieval]]: An information retrieval process begins when a user enters a query into the system. Queries are formal statements of information needs, for example search strings in web search engines. In information retrieval a query does not uniquely identify a single object in the collection. Instead, several objects may match the query, perhaps with different degrees of relevancy.
* Static ''content base'' – Invest time in indexing content
* ''Dynamic'' information need – Queries presented in “real time”
* Common approach: [[TFIDF|https://en.wikipedia.org/wiki/Tf%E2%80%93idf]] (tf-idf, term frequency–inverse document frequency)
** Rank documents by term overlap
** Rank terms by frequency

! Information Filtering

* [[Concept|https://en.wikipedia.org/wiki/Information_filtering_system]]: a approach that select relevant information for a user based on the user's profile
* Characteristic:
** Reverse assumptions from Information Retrieval:
*** Static information need
*** Dynamic content base
** Invest effort in modeling user need
*** Hand‐created “profile”
*** Machine learned profile
*** Feedback/updates
** Pass new content through filters

! Collaborative Filtering

In the newer, narrower sense, collaborative filtering is a method of making automatic predictions (filtering) about the interests of a user by collecting preferences or taste information from many users (collaborating).

The most common application of collaborative filtering is user-based ''k-nearest neighbors algorithm''.

! Preference

Explicit preference:

* Rating
* Review
* Vote

Implicit preference:

* Click
* Purchase
* Follow

Ratings: star, thumbs / like, etc.

! Predictions and Recommendations

* Predictions: Estimates of how much you’ll like an item
** Often scaled to match some rating scale
** Often tied to search or browsing for specific products
* Recommendations: suggestions for items you might like (or might fit what you’re doing)
** Often presented in the form of “top-n lists”
** Also sometimes just placed in front of you


* Non-Personalized Summary Statistics
** Mean-based: 
*** Background: In a 5-star scale rating system
*** Symbols:
**** $$U_i$$ for users who rated item $$i$$
**** $$r_{ui}$$ for rating by user $$u$$ to item $$i$$
**** $$|U_i|$$ for number of user who rated item $$i$$
**** $$\alpha$$ for damping factor, larger would cause the rating floats more smooth
**** $$\mu$$ for global rating across all items and users
**** $$s(i)$$ for score of item $$i$$
*** Mean: $$s(i) = \dfrac{\sum_{u \in U_i}^n r_{ui}}{|U_i|}$$
*** Damped Mean: $$s(i) = \dfrac{\sum_{u \in U_i}^n r_{ui} + \alpha\mu}{|U_i| + \alpha}$$
** Association-based:
*** Background: typically in a shop that customs buying products
*** Symbols:
**** $$P(i|j)$$: probability of buying i when already buying j
*** Basic Association, measuring probability by counting:
**** Story: How many percentage of people who buying i also buying j among the whole people who buying i?
**** Formula: $$P(i|j) = \dfrac{P(i \land j)}{P(j)} = \dfrac{|U_i \cap U_j| / |U|}{|U_j| / |U|}$$
**** Bad case: if j is popular, then the result is bad
*** Bayes's Law: $$P(i|j) = \dfrac{P(j|i) P(i)}{P(j)}$$
*** Lift Association, measuring score by counting:
**** Story: people who bought i and j together more often means i and j are more associative
**** Formula: $$s(i|j) = \dfrac{P(j \land i)}{P(i) P(j)}$$
* Content-Based Filtering
** Information Filtering
** Knowledge-Based
* Collaborative Filtering
** User-User
** Item-Item
** Dimensionality Reduction
* Others
** Critique / Interview Based Recommendations
** Hybrid Techniques

|!Name |Redis in Action |
|!Author |Josiah L. Carlson |
|!Edition |1st |
|!Release Date |June 2013 |
|!ISBN-13 |978-1-617-29085-5 |
|!Medium |[[网站|https://redislabs.com/ebook/]] |

在 RedisLabs 网站上,可以 [[免费阅读|https://redislabs.com/ebook/]]。

! 1.1 What is Redis?

Redis v.s. memcached:

* 都是快速的 K-V 存储
* Redis 支持更多的数据结构,而 memcached 只支持 string => string
* Redis 可以落硬盘做持久化,memcached 不可以

所以 Redis 适用面更广。

同时简述了 Redis 持久化、主从复制机制,避免数据丢失、做容灾等。

! 1.2 What Redis data structures look like

对基本数据结构的操作做了演示,没太多复杂内容。里面的插图很赞。

! 1.3 Hello Redis

实现一个类似 HackerNews / Reddit 的投票应用、包括将 post 分到不同的 group。没有太多难度。


Redis 的数据类型。

!! string

功能:

* 普通操作:`SET` `GET`
* 带过期时间:`SET key value [EX seconds]`,`SETEX`
* 不存在则设置:`SETNX`
* 如果值是整数,可以 `INCR` `DECR`
* 可以做 bitmap 功能

原理:

* 内存分配:预留内存(capacity > length);不够用时,1MB 内翻倍增长,1MB 外每次加 1MB(来自书《Redis 深度历险》,未找到官方文档来源)

!! list

List 是链表不是数组。插入删除 O(1),查找 O(n)。

可以实现 ''队列和栈''。很多任务队列会使用 Redis list 作为存储。如果用来实现「生产者消费者」模型,可以用 Redis 提供的 blocking 命令,比如 `BLPOP`(blocking list pop),在 list 没有元素可 pop 时会 blocking,从而避免了轮询带来的开销。

''底层结构'':快速链表(quicklist)。原理是数据量少时连续存储,数据量大时分开。待深入。

<div class="box">

''为何 string 有 `INCR`,hash 有 `HINCRBY`,zset 有 `ZINCRBY`,但却没有针对 list 元素的 INCR 命令?''

因为列表的查找是 O(n),而其他几个数据结构的查找是 O(1)。如果为了做个简单如自增的操作而去遍历列表元素,是不太划算的,所以 Redis 没有支持列表元素的 INCR。

</div>

!! hash

hash 结构类似于 Java 的 HashMap。但 key 及 value 只能是 string。文档有 [[命令列表|https://redis.io/commands#hash]]。

```
> HSET books java "think in java"
> HSET books python "fluent python"
> HGETALL books
1) "java"
2) "think in java"
3) "python"
4) "fluent python"
```

内部结构也是「''数组 + 链表''」:

[img width=500 [redis-hash-data-structure-illustrated]]

Rehash 时,Redis 为了追求高性能,不阻塞服务,会使用 ''渐进式 rehash 策略'',即保留新旧两个 hash 结构,慢慢一次次把旧 hash 数据挪到新 hash。

!! set

跟 hash 类似,只是没有值。

!! zset

zset 是有序集合,是 Redis 特色。它类似 set,sorted set 中的元素是无序且唯一的。但是它的每个元素有一个关联的 score,这个 score 用来排序。score 相同时,将 key 按字典排序。

Sorted set 在内存中就是有序的,并不是请求过来再排序。''底层的数据结构是 skip list 结合 hash table''。

插入的时间复杂度是 O(log n),查询是 O(1)(未证实)。

Sorted set 支持按 score 范围查找:`ZRANGEBYSCORE hackers -inf 1950` 表示在查找 hackers 中分数为为 [-inf, 1950] 的元素。也可以按范围删除,通过 `ZREMRANGEBYSCORE`(z remove range by score)。还可以查某一元素的排名,通过 `ZRANK`。

Sorted set 通常被用于实现 ''排行榜''。

!! bitmap

Redis 的 bitmap 就是将对 string 的操作变成对位的操作。比如 `"h"` 的 ASCII 码是 `01101000`:

```
> SET mymap h
OK
> GETBIT mymap 0
0
> GETBIT mymap 1
1
```

除了 `GETBIT` `SETBIT`,Redis 还提供了 `BITCOUNT` 来数有几位 1,通过 `BITPOS` 来查指定范围第一个 0 或第一个 1。

Redis 还提供了 `BITFIELD`,不深入研究,它的 [[用意|https://redis.io/commands/bitfield#motivations]] 是:

<<<
The motivation … is that ''the ability to store many small integers as a single large bitmap'' … is extremely memory efficient, and opens new use cases … ''especially in the field of real time analytics''.
<<<

!! HyperLogLog

[[HyperLogLog]] 是一种概率论数据结构。针对大量数据去重统计的场景,比如 UV(unique visitor)。假如一个页面有一千万 UV,为了去重而去使用 set 是不经济的做法,会消耗非常多的内存。但是 HyperLogLog 可以避免这种问题,它最多占 12kB 内存,数据不多时甚至更少。但它不保证完全精确的统计,但误差也在 1% 以内。

''命令'' 仅有三个:`PFADD` `PFCOUNT` `PFMERGE`。PF 是发明这种数据结构的教授 Philippe Flajolet 名字缩写。
Redis 的一些 pattern 和 use case。

!! 队列和栈

''普通的队列和栈'':`LPUSH` `LPOP` `RPUSH` `RPOP`。

''取用户最新的 N 篇帖子'':按时间先后 `RPUSH`,用 `LRANGE` 取。

''保持列表为 N 大小'':`RPUSH` 后用 `LTRIM`。

''阻塞读任务队列'':`BRPOP` 等待 list 有元素 push 进来。

''流水线'':把元素从一个队列移除,再加到另外一个队列;使用 `LMOVE` `BLMOVE`,参考 [[这里|https://redis.io/commands/lmove#pattern-reliable-queue]]。

''循环队列'':使用 `LMOVE` `BLMOVE`,参考 [[这里|https://redis.io/commands/lmove#pattern-reliable-queue]]。

!! 存储用户相关的 K-V

使用 hash:

```
hmset user:1000 username antirez birthyear 1977 verified 1
```

!! 表达包含关系

用 set 表达包含关系。

Set 中的 `SPOP` `SRANDMEMBER` 随机 pop 或返回集合中的元素,可以用于 [[发牌|https://redis.io/topics/data-types-intro#redis-sets]]。

Set 可做各类集合操作,如 union。

!! 排行榜

Sorted set 可以用来实现排行榜。每个元素被加入时可以指定一个 score。`ZRANGE` `ZREVRANGE` 可以按 score 排名。`ZRANK` 可以给出某一元素的排名。



















! Reshift - 调节屏幕色温

Reshift ([[官网|http://jonls.dk/redshift/]]|[[ArchWiki|https://wiki.archlinux.org/index.php/Redshift]]) 是一个调节屏幕色温、亮度的软件,可以根据你的经纬度判断现在处于白天还是夜晚,并应用上不同的色温、亮度配置。类似 Mac / Windows 本台上的 [[f.lux|https://justgetflux.com/]]。

参考 ArchWiki,Arch Linux 官方仓库里已有 Redshift,直接安装即可。对于我现在在用的 Plasma 桌面,也有一个 GUI 界面的 widget [[plasma5-applets-redshift-control-git|https://aur.archlinux.org/packages/plasma5-applets-redshift-control-git/]] 可以使用。用 `yaourt` 安装后,在 Plasma 下方的任务栏上右键 => Add Widget 中可以找到这个 widget。可以使用这个 widget 调节配置,以及做开机自动启用。

下面截图是参考的配置,留意屏幕处的参数需要给个 0。

{{redshift-widget-config.png}}

!! Best Practises

* 总是使用 [[Redux Toolkit]]

!! Resources

* Redux [[官方文档|https://redux.js.org/]]
[[Redux Toolkit|https://redux-toolkit.js.org/]] 是 Redux 官方维护的一个工具库。主要解决的这几个问题:

* "Configuring a Redux store is too complicated"
* "I have to add a lot of packages to get Redux to do anything useful"
* "Redux requires too much boilerplate code"

它的 [[文档|https://redux-toolkit.js.org/introduction/quick-start]] 太优秀,以至于这里没有再描述的必要。
<<.todo "阅读 Redux 的中间件 [[文档|https://redux.js.org/advanced/middleware]]。">>

这个案例来自 Mosh 的 [[Redux 课程|https://codewithmosh.com/courses/783424]]。源码存放在 <<coslink "这里" "/files/archives/2020/05/redux-finish.zip">>。有几点值得一学:

* 如何组织 action、action creator、reducer 及 selector
* 如何编写 middleware 实现异步请求

!! 如何组织各元素

`store/bugs.js`:

```javascript
import { createSlice } from "@reduxjs/toolkit";
import { createSelector } from "reselect";
import axios from "axios";
import { apiCallBegan } from "./api";
import moment from "moment";

const slice = createSlice({
  name: "bugs",
  initialState: {
    list: [],
    loading: false,
    lastFetch: null
  },
  reducers: {
    bugsRequested: (bugs, action) => {
      bugs.loading = true;
    },

    bugsReceived: (bugs, action) => {
      bugs.list = action.payload;
      bugs.loading = false;
      bugs.lastFetch = Date.now();
    },

    bugsRequestFailed: (bugs, action) => {
      bugs.loading = false;
    },

    bugAssignedToUser: (bugs, action) => {
      const { id: bugId, userId } = action.payload;
      const index = bugs.list.findIndex(bug => bug.id === bugId);
      bugs.list[index].userId = userId;
    },

    // command - event
    // addBug - bugAdded
    bugAdded: (bugs, action) => {
      bugs.list.push(action.payload);
    },

    // resolveBug (command) - bugResolved (event)
    bugResolved: (bugs, action) => {
      const index = bugs.list.findIndex(bug => bug.id === action.payload.id);
      bugs.list[index].resolved = true;
    }
  }
});

export const {
  bugAdded,
  bugResolved,
  bugAssignedToUser,
  bugsReceived,
  bugsRequested,
  bugsRequestFailed
} = slice.actions;
export default slice.reducer;

// Action Creators
const url = "/bugs";

export const loadBugs = () => (dispatch, getState) => {
  const { lastFetch } = getState().entities.bugs;

  const diffInMinutes = moment().diff(moment(lastFetch), "minutes");
  if (diffInMinutes < 10) return;

  return dispatch(
    apiCallBegan({
      url,
      onStart: bugsRequested.type,
      onSuccess: bugsReceived.type,
      onError: bugsRequestFailed.type
    })
  );
};

export const addBug = bug =>
  apiCallBegan({
    url,
    method: "post",
    data: bug,
    onSuccess: bugAdded.type
  });

export const resolveBug = id =>
  apiCallBegan({
    // /bugs
    // PATCH /bugs/1
    url: url + "/" + id,
    method: "patch",
    data: { resolved: true },
    onSuccess: bugResolved.type
  });

export const assignBugToUser = (bugId, userId) =>
  apiCallBegan({
    url: url + "/" + bugId,
    method: "patch",
    data: { userId },
    onSuccess: bugAssignedToUser.type
  });

// Selector

// Memoization
// bugs => get unresolved bugs from the cache

export const getBugsByUser = userId =>
  createSelector(
    state => state.entities.bugs,
    bugs => bugs.filter(bug => bug.userId === userId)
  );

export const getUnresolvedBugs = createSelector(
  state => state.entities.bugs,
  state => state.entities.projects,
  (bugs, projects) => bugs.list.filter(bug => !bug.resolved)
);
```

这串代码非常长。作者使用 Redux Toolkit 来简化代码。

在命名规范上:

* Action:使用被动语态的单词,如 `bugAdded`、`bugResolved`
* Action creators:使用动词短语,如 `addBug`、`assignBugToUser`
* Selector:使用 `getXXX` 这种查询句式,如 `getUnresolvedBugs`

在 `export` 的内容上:

* Reducer 是被 `export default` 的
* 具体的各 action 是被 `export` 单个符号的
** 但是在这个场景中,各 action 实际上不被外部代码直接用到,而是通过 action creator 被使用,我认为也可以不 export 出去

!! 如何编写 middleware 实现异步请求

由于 reducer 中的函数实现是 ''不能有副作用'' 的,像发起异步请求这种操作,''需要放在 middleware 中做''。

首先在 `store/api.js` 中定义一套 action:

```javascript
import { createAction } from "@reduxjs/toolkit";

export const apiCallBegan = createAction("api/callBegan");
export const apiCallSuccess = createAction("api/callSuccess");
export const apiCallFailed = createAction("api/callFailed");
```

在 `store/middleware/api.js` 中定义中间件:

```javascript
import axios from "axios";
import * as actions from "../api";

const api = ({ dispatch }) => next => async action => {
  if (action.type !== actions.apiCallBegan.type) return next(action);

  const { url, method, data, onStart, onSuccess, onError } = action.payload;

  if (onStart) dispatch({ type: onStart });

  next(action);

  try {
    const response = await axios.request({
      baseURL: "http://localhost:9001/api",
      url,
      method,
      data
    });
    // General
    dispatch(actions.apiCallSuccess(response.data));
    // Specific
    if (onSuccess) dispatch({ type: onSuccess, payload: response.data });
  } catch (error) {
    // General
    dispatch(actions.apiCallFailed(error.message));
    // Specific
    if (onError) dispatch({ type: onError, payload: error.message });
  }
};

export default api;
```
!! Resources

* [[Glossary - Redux|https://redux.js.org/glossary]]。
Redux 的核心概念就几个:

* State:应用状态,是一个 plain object
* Action:描述运作及其参数的 plain object
* Reducer:一个''纯函数'',表示某类 action 对应的 handler,接受旧的 state 并输出处理过后的新 state

Redux 的处理过程即是,给定应用的状态数据 state,以及一套不同 action 的 reducer。后续传入的 action,会将老的 state 变成新的 state:

```
(previousState, action) => newState
```

这个理念跟函数式编程类似,即是让数据变化 predictable。具体例子看 [[官方文档|https://redux.js.org/introduction/core-concepts]]。

!! Reducer

Reducer 相对复杂,需要重点讲解。摘录 [[Basic Tutorial|https://redux.js.org/basics/reducers#handling-actions]] 中的一节:

It's called a reducer because it's the type of function you would pass to [[Array.prototype.reduce(reducer, ?initialValue)|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce]]. It's very important that the reducer stays pure. Things you should never do inside a reducer:

* Mutate its arguments
* Perform side effects like API calls and routing transitions
* Call non-pure functions, e.g. Date.now() or Math.random().
The Store is the object that brings them together. The store has the following responsibilities:

* Holds application state
* Allows access to state via `getState()`
* Allows state to be updated via `dispatch(action)`
* Registers listeners via `subscribe(listener)`
* Handles unregistering of listeners via the function returned by `subscribe(listener)`

!! Resources

* [[Store - Redux|https://redux.js.org/basics/store]]
Redux 采用的是一种「严格的单向数据流」(strict unidirectional data flow)。

Redux 的数据流如下:

# 你的业务代码调用 `store.dispatch(action)`
# Redux store 调用你提供给它的 reducer 函数
# 根 reducer 整合它的多个子 reducer 的结果到同个 state tree 中
# Redux store 保存根 reducer 整合好的 state tree

!! Resources

* [[Data Flow - Redux|https://redux.js.org/basics/data-flow]]
单页应用(SPA)越来越复杂,导致代码必须管理好几份状态数据:

* 从服务端拉来的数据
* 本地缓存的数据,如上一次从服务端拉来的数据
* 本地新增或者变化的、并且未同步到服务端的数据

前端开发也越来越复杂:

* UI 的状态也越来越复杂,比如需要管理路由、tab、分页控件等等。
* 一个 model 数据的变化,可能导致 UI 的更新,可能继续导致其他的 model 也跟着变化。我们已经难以理解我们构建的系统
* 对前端的要求更高了,比如 optimistic updates, server-side rendering, fetching data before performing route transitions

Redux 认为是这两个概念合在一起引起的混乱:数据可变性(mutation)及异步性(asynchronicity)。(这块我还不太理解,后面随着深入用 Redux 再加强理解。)于是它试图解决一个问题,''make state mutations predictable'',让状态数据的变化可以被预期。

使用 Redux 需要遵循的原则。

!! Single source of truth

The state of your whole application is stored in an object tree within a single store.

好处是:

* Server 端的数据可以很简单地合入 client 端
* 调试更容易了
* 开发阶段可以做一些数据保持,加快开发周期
* Undo / Redo 等本来比较难做的功能,也容易做了

!! State is read-only

The only way to change the state is to emit an action, an object describing what happened.

好处是所有操作都有顺序,而且可被纪录、序列化、存储及后续追溯。

!! Changes are made with pure functions

To specify how the state tree is transformed by actions, you write pure reducers.

好处显而易见,不加入副作用,才能保证整个 action 处理过程是稳定的。

!! Resources

* [[Three Principles - Redux|https://redux.js.org/introduction/three-principles]]
大 reducer 可以拆分成小 reducer 并组合起来。比如对于教程中的 To-do app,大 reducer 如下:

```javascript
function todoApp(state = initialState, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return Object.assign({}, state, {
        visibilityFilter: action.filter
      })
    case ADD_TODO:
      return Object.assign({}, state, {
        todos: [
          ...state.todos,
          {
            text: action.text,
            completed: false
          }
        ]
      })
    case TOGGLE_TODO:
      return Object.assign({}, state, {
        todos: state.todos.map((todo, index) => {
          if (index === action.index) {
            return Object.assign({}, todo, {
              completed: !todo.completed
            })
          }
          return todo
        })
      })
    default:
      return state
  }
}
```

拆分成小 reducer 后:

```javascript
function todos(state = [], action) {
  switch (action.type) {
    case ADD_TODO:
      return [
        ...state,
        {
          text: action.text,
          completed: false
        }
      ]
    case TOGGLE_TODO:
      return state.map((todo, index) => {
        if (index === action.index) {
          return Object.assign({}, todo, {
            completed: !todo.completed
          })
        }
        return todo
      })
    default:
      return state
  }
}

function visibilityFilter(state = SHOW_ALL, action) {
  switch (action.type) {
    case SET_VISIBILITY_FILTER:
      return action.filter
    default:
      return state
  }
}

function todoApp(state = {}, action) {
  return {
    visibilityFilter: visibilityFilter(state.visibilityFilter, action),
    todos: todos(state.todos, action)
  }
}
```

注意 `todos` 接受的 state 不再是带 `visibilityFilter` 的整个应用的 state 数据,而只有其中的 `todos` 部分。同时观察 `todoApp` 在这个过程中的变化。

Redux 提供了一个工具函数 `combineReducers()` 可以完成跟上述 `todoApp` 一样的功能:

```javascript
import { combineReducers } from 'redux'

const todoApp = combineReducers({
  visibilityFilter,
  todos
})
```


各类 Redux 框架(如 react-redux)或者 helper 可能提供了一些更易用的 API,使你不用自己关心这个拆分。


!! Key Points

* 正则表达式没有一个被广泛接受的规范,而 Perl 的实现是它的事实规范
* PCRE (Perl Compatible Regular Expression) 是单独开发的一个 C 库,目的是实现一个与 Perl 内置的正则表达式功能一致的库,得到了广泛的使用,如 Apache HTTP Server,php 等
* 现代编程语言基本上都实现了正则表达式,有的是内置的(比如 JavaScript 和 Ruby),有的以库的形式存在(如 Python 的 `re` 库)
* 也有一些特性是先在别的库中实现,再被 Perl 所实现的。比如有一些语义扩展是先在 PCRE 和 Python 上实现的,再被 Perl所采用

!! Playgrounds

# [[RegexPlanet|http://www.regexplanet.com/]]: 多种语言(Python,JavaScript,Go 等)
# [[pythex|http://pythex.org/]]: Python
# [[RegExplained|http://leaverou.github.io/regexplained/]]: JavaScript 版正则,在你输入时实时匹配,缺点是中文 / 长文本支持不好

!! Visualization

# [[Regexper|https://regexper.com/]]
# [[Regulex|https://jex.im/regulex/]]
# [[Debuggex|https://www.debuggex.com/]]
参考 [[wemake.services: Working with the client]] 中的分析过程。
TODO: Resilience 是一个非常宽泛的话题,因此我还没有做完研究写完笔记。有时间了看下「参考」部分的材料,列举一些被认为符合 resilience 的措施(比如怎样隔离出错的机器?)和具体的做法。Ignore, Retry, Undo, Coordinate 又是怎么应用的?

Longman DOCE 这么解释 resilience:

; Resilience
: the ability to become strong, happy, or successful again after a difficult situation or event

Resilience 在中文中大约可以被翻译成「韧性」。在系统设计中你经常会看到这个词。在 Ines Sombra 的 [[slide|https://www.slideshare.net/InesSombra/architectural-patterns-of-resilient-distributed-systems]] 中将 resilience 定义为:

> Resilience is the ability of a system to adapt or keep working when challenges occur.

这里的 ''challenge'' 包含很多方面:

* Fault-tolerance
* Evolvability
* Scalability
* Failure isolation
* Complexity management



!! 参考

* [[Architectural Patterns of Resilient Distributed Systems|https://www.slideshare.net/InesSombra/architectural-patterns-of-resilient-distributed-systems]]
* [[Refactoring Towards Resilience: Evaluating SendGrid Options|https://jimmybogard.com/refactoring-towards-resilience-evaluating-sendgrid-options/]]
* [[Refactoring Towards Resilience: Evaluating Coupling|https://jimmybogard.com/refactoring-towards-resilience-evaluating-coupling/]]
Tailwind CSS 在响应式设计上的一些 pattern。主要的方法是利用它 [[提供|https://tailwindcss.com/docs/responsive-design/]] 的各个 prefix。

!! 针对不同屏幕大小设置不同字体大小、margin

```html
<h1 class="mt-6 text-2xl sm:mt-8 sm:text-4xl lg:text-3xl">
  You can work from anywhere. 
</h1>
```

看运行的 <<coslink "实例" "/files/projects/tailwind-css/responsive-design/image-position/index.html">>。

!! 在小屏幕隐藏,在大屏幕显示的 block

先置一个对所有屏幕大小生效的 `hidden`,再置大屏幕时为 `display: block` (`lg:block`):

```html
<div class="hidden lg:block">
  <img src="/img/beach-work.jpg">
</div>
```

看运行的 <<coslink "实例" "/files/projects/tailwind-css/responsive-design/image-position/index.html">>。

!! 实现图片在不同屏幕下放在不同位置

这个 <<coslink "例子" "/files/projects/tailwind-css/responsive-design/image-position/index.html">> 演示了如何使海滩图片:

* 在小屏幕时置于下方
* 在大屏幕时置于右方
响应式网页设计。

这个条目同时包括设计上的和编码实现上的内容。比如 CSS 的 Media Query 会在这里指及(但是也应该有单独的条目)。内容待学习响应式设计时再补充完整。

!! Versus M-dot sites

事实上并不是全部网站都会使用 RWD 做一套 PC 端和移动端统一的网页。比如 Twitter、Facebook,它们的移动端是单独的页面。这类移动端网站一般以 `m.` 开头,比如 m.facebook.com。[[Learning Web Design Ch03]] 对此有非常好的解读:

> The point here is that Responsive Web Design is not a universal solution. For sites that feature mainly text content, a little layout adjustment may be all that is needed to deliver a good reading experience on all devices. For complex sites and web applications, a very different experience may be preferred. 
> The downside of a dedicated mobile site is that it is more than twice the work. It requires additional content planning, design templates, production time, and ongoing maintenance. But if it means giving your visitors the functionality they need, it is worth the investment. 
反向代理。

Rich Preview 是各 IM / SNS 软件提供的一个预览媒体内容的机制。比如 Telegram 提供的 [[Link Preview|https://telegram.org/blog/link-preview]] 功能:

{{ telegram-link-preview }}

在技术上,这些平台使用的是 [[Open Graph 协议|http://ogp.me/]],它会去抓取网页并分析其头部中的 Open Graph 协议信息。对于博客,一般关心这些字段:

```html
<!-- Open Graph -->
<meta property="og:locale" content="en_US">
<meta property="og:type" content="article">
<meta property="og:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}">
<meta property="og:description" content="{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}">
<meta property="og:url" content="{{ site.url }}{{ page.url }}">
<meta property="og:site_name" content="{{ site.title }}">
```

对于我现在用的博客框架 [[HPSTR|https://mademistakes.com/work/hpstr-jekyll-theme/]],你可以在 post 的 front matter 中定义页面的 title 和 description:

```yaml
layout: post
title: "从 Jonathan Blow 的故事说起"
description: "时隔数年,我终于搞懂 Braid 想表达什么。听完这期 Gadio pro,很多人留言表示要辞职做真正的好游戏。"
image:
  background: 2018/10/braid-cover.png
tags: 
```

[[Rich Preview|https://richpreview.com/]] 网站提供了一个能力,你可以输入 URL 让它帮你检查 Open Graph 的相关字段,并给出各社交软件上的预览效果。

Telegram 提供了一个 [[Webpage Bot|https://telegram.me/webpagebot]],让你可以刷新 URL 在 Telegram 上的 link preview 缓存。

[[HEAD|https://htmlhead.dev/]] 提供了比较全面的 `<head>` 中的标签说明,覆盖了各社交网站和浏览器。


很多软件会提供一些快速安装的方法,只敲一行命令就可以将软件安装进系统中。比如 [[sphf13-vim|https://github.com/spf13/spf13-vim]]:

```bash
sh <(curl https://j.mp/spf13-vim3 -L)
```

这篇文章探讨这些方法。

假如你写了个软件,想用户有方便的办法安装它到系统中,你可以先写一个安装脚本(如 `install.sh`)。你可以通过这个脚本,让用户去下载你的二进制可执行文件,也可以拉代码到本地再编译等等。

然后你将这个文件放到你的 CDN 上,如 https://example.com/install.sh 上。你想让用户下载它并运行。

<<.warning "下面有些操作是不够安全的。一般来说,你应该对下载的文件进行 hash 效验,防止被篡改。">>

!! 常规方式

下载下来的脚本先写到本地文件中,再运行:

```bash
curl https://example.com/install.sh -L > install.sh && sh install.sh
```

你也可以用 `wget` 来下载脚本,但是有些发行版并不会预装 `wget`:

```bash
wget -O install.sh https://example.com/install.sh && sh install.sh
```

如果 `install.sh` 本身带有参数,就在最后面带就可以:

```bash
sh install.sh <params>
```

!! 进阶方式 1

下载下来的脚本直接作为标准输入给 bash 执行:

```bash
curl -L https://example.com/install.sh | sh
```

```bash
wget -O - https://example.com/install.sh | sh
```

如果脚本想带参数:

```bash
... | sh -s -- <params>
```

<<.warning "如果你用 `root` 执行,那么管道后的 `sh` 需要用完整路径 `/bin/sh`。这应该是出于安全的考量。">>

!! 进阶方式 2

```bash
sh <(curl -L https://example.com/install.sh) <params>
```

<<.warning "使用这两种进阶方式时,`bash` 不会等到 `curl` 把整个文件下完就会开始执行,有多少行脚本就执行多少。这使得用 [[Makeself|Linux: General Packaging]] 制作的脚本可能不能使用这种方式运行。">>

!! 参考

* [[Salt Bootstrap|https://docs.saltstack.com/en/2017.7/topics/tutorials/salt_bootstrap.html]]
* [[Install via URL - Chef|https://docs.chef.io/install_omnibus.html]]
|!Name |人类简史:从动物到上帝 |
|!Author |[以色列]尤瓦尔·赫拉利 [译]林俊宏  |
|!Edition |N/A |
|!Release Date |November 2014 |
|!ISBN-13 |978-7508647357 |
|!Rating |{{!!rating}} |

Update 2019/10/26: 觉得看这本书时用的方法不对。因为我现在回来看这个笔记,也回忆不出书的内容和脉络。你让我讲这本书说了啥,我也讲不出来。我觉得应该做一个这样的 [[读书笔记|https://book.douban.com/annotation/32634070/]],理清脉络,并在之中夹杂一些书中金句。

下面的内容是我在微信读书上做的点评跟笔记。

!! 点评

点评此书★★★★★

这本书的翻译太赞了,读起来就像是用中文写的。内容很简单易懂,脉络清晰同时又融入很多新颖的观点。而且很多材料都有列出来源,感觉会比较可靠。

!! 第一章 人类:一种也没什么特别的动物

> 烹调让人类能吃的食物种类更多,减少所需的进食时间,还能缩小牙齿、减少肠的长度。有学者认为,烹调技术的发明,与人体肠道缩短、大脑开始发育有直接关系。不论是较长的肠道或是较大的大脑,都必须消耗大量的能量,因此很难兼而有之。而既然有了烹调,人就能缩短肠道、降低能量消耗,可以说是在不经意之间,烹调让尼安德特人与智人走上了让大脑更大的道路。[插图]

!! 第二章 知善恶树

> 然而,如果一大群人想合作共处,“说坏话”这件事可是十分重要。大约在7万年前,现代智人发展出新的语言技能,让他们能够八卦达数小时之久。这下,他们能够明确得知自己部落里谁比较可信可靠,于是部落的规模就能够扩大,而智人也能够发展出更紧密、更复杂的合作形式。

> 最有可能的情况是,无论是八卦理论或是“河边有只狮子”的理论,都有部分属于事实。然而,人类语言真正最独特的功能,并不在于能够传达关于人或狮子的信息,而是能够传达关于一些根本不存在的事物的信息。据我们所知,只有智人能够表达关于从来没有看过、碰过、耳闻过的事物,而且讲得煞有其事。

> 智人创造了秩序井然的模式,像是贸易网络、大规模庆祝活动、政治体制;而这些如果只有个人,是绝对做不到的。人类和黑猩猩之间真正不同的地方就在于那些虚构的故事,它像胶水一样把千千万万的个人、家庭和群体结合在一起。这种胶水,让我们成了万物的主宰。

!! 第五章 史上最大骗局

太残暴了…

> 有些畜牧部落过去的做法,是将小牛小羊宰杀食用,但拿东西塞回空的毛皮做成标本,再送回妈妈身边刺激它们产奶。而在苏丹的努尔族(Nuer)还更进一步,在标本上涂着牛妈妈的尿液,所以这只假小牛连闻起来也很像个样子。努尔族的另一项技术则是在小牛的嘴边绑上一圈刺,小牛想吃奶就会刺伤牛妈妈,好让牛妈妈排斥让小牛吃奶。

!! 第六章 盖起金字塔

> 绝大多数的农民都是住在永久聚落里,只有少数是游牧民族。“定居”这件事,让大多数人的活动范围大幅缩小。远古狩猎采集者的活动范围可能有几十甚至上百平方公里。当时这片范围都是他们的“家”,有山丘、溪流、树林,还有开阔的天空。但对农民而言,几乎整天就是在一小片田地或果园里工作,就算回到“家”,这时的房子也就是个用木头、石头或泥巴盖起的局促结构,每边再长也不过几十米。一般来说,农民就会和房屋这种构造建立起非常强烈的连接。这场革命意义深远,除了影响建筑,更影响了心理。在农业革命之后,人类成了远比过去更以自我为中心的生物,与“自己家”紧密相连,但与周遭其他物种画出界线。

> 甚至那些人们以为深深藏于自己内心的渴望,通常也是受了想象秩序的影响。

> 浪漫主义告诉我们,为了要尽量发挥潜力,就必须尽量累积不同的经验。必须体会不同的情感,尝试不同的关系,品尝不同的美食,还必须学会欣赏不同风格的音乐。而其中最好的一种办法,就是摆脱日常生活及工作,远离熟悉的环境,前往遥远的国度,好亲身“体验”不同的文化、气味、美食和规范。我们总会不断听到浪漫主义的神话,告诉我们“那次的经验让我眼界大开,从此整个生活都不一样了”。

> 一如古埃及精英分子,现在大多数人一生汲汲营营,也都是想盖起某种金字塔,只不过这些金字塔在不同文化里会有不同的名字、形体和规模罢了。举例来说,可能是一栋近郊的独栋透天别墅,有游泳池和大庭院,也可能是一个闪闪发光的高楼公寓,有着令人屏息的美景。但很少人会真的去问,究竟为什么我们会开始想建这些金字塔?

!! 第八章 历史从无正义

> 事实已经证明,大多数有钱人之所以有钱,只是因为他出生在有钱的家庭,而大多数穷人一辈子没钱,也就只是因为他出生在贫穷的家庭而已。

这个对比挺有意思

> [插图]
> 图15 18世纪的男人味:法国国王路易十四王室肖像。请注意路易十四戴着长假发,穿着丝袜和高跟鞋,站得像个芭蕾舞者,还带着一把巨大的剑。这一切在现代美国都会被认为真是个娘娘腔(除了那把剑),但在当时,路易十四可是欧洲男子气概和男人味的典范。
> [插图]
> 图16 21世纪的男人味:美国总统奥巴马官方照片。那些假发、丝袜、高跟鞋和剑都去了哪?就大权在握的男性而言,这大概是有史以来最呆板沉闷的形象。人类历史上,占主导地位的男人形象多半都是多彩绚丽,像是美洲印第安人酋长就戴着羽毛摇曳的头饰,印度大君也会穿着华丽的丝绸,配着亮眼的钻石。至于在整个动物界里,雄性往往也比雌性更丰富多彩、装饰夸张,像是孔雀的尾巴和狮子的鬃毛。

!! 第九章 历史的方向

> 农业革命之后,人类社会规模变得更大、更复杂,而维系社会秩序的虚构故事也更为细致完整。人类几乎从出生到死亡都被种种虚构的故事和概念围绕,让他们以特定的方式思考,以特定的标准行事,想要特定的东西,也遵守特定的规范。就是这样,让数百万计的陌生人能遵照着这种人造而非天生的直觉,合作无间。这种人造的直觉就是“文化”。

!! 第十二章 宗教的法则

> 如果根据纯粹的一神论,怎么可能会相信这种二元的概念?(顺道一提,《圣经·旧约》里压根就找不到这些情节。)这在逻辑上根本不通。真要合理的话,一来是相信确实有一个全能的神,二来就是要相信有两种对立的力量,而两者都并非全能。然而,尽管如此不合理,人类还是很能接受这种矛盾的概念。因此,我们看到有几百万虔诚的基督徒、穆斯林和犹太人居然能够相信既有全能的神,又有独立行事的魔鬼,倒也不用太过惊讶。更有甚者,无数的基督徒、穆斯林和犹太人居然还能想象善神需要人类的协助,好与魔鬼对抗,由此再推导引发了圣战和十字军东征。

> 释迦牟尼找到一种方法可以跳出这种恶性循环。在事物带来快乐或痛苦的时候,重点是要看清事物的本质,而不是着重在它带来的感受,于是就能不再为此所困。虽然感受悲伤,但不要希望悲伤结束,于是虽然仍有悲伤,也能不再为此而困。即使仍然悲伤,也是一种丰硕的经验。虽然感受快乐,但不要希望快乐继续,于是虽然仍有快乐,也能不失去心中的平静。但要怎样才能让心里接受事物的本质,而放下种种欲求,知道苦即为苦、乐即为乐?释迦牟尼制定一套冥想的技巧,能够训练心灵感受事物的本质而排除种种欲求。通过训练,心灵专注在“我现在是什么感受?”,而不是问:“为什么是我?”这种境界很难达到,但并非不可能。

!! 第十三章 成功的秘密

> 不仅如此,历史还是所谓的“二级”混沌系统。混沌系统分成两级,一级混沌指的是“不会因为预测而改变”。例如天气就属于一级混沌系统。虽然天气也是受到无数因素影响,但我们可以建立计算模型,不断加入越来越多因素,让天气预报也越来越准确。至于二级混沌系统,指的是“会受到预测的影响而改变”,因此就永远无法准确预测。例如市场就属于二级混沌系统。假设我们开发出了一个计算机程序,能够完全准确预测明天的油价,情况会如何?可以想见,油价会立刻因应这个预测而波动,最后也就不可能符合预测。

说得很有道理的样子。。

> 甚至还有学者认为,文化就像是精神感染或寄生虫,而人类就是毫不知情的宿主。寄生虫或病毒就是这样住在宿主体内,繁殖、传播,从一个宿主到另一个宿主,夺取养分,让宿主衰弱,有时甚至丧命。只要宿主能够活着让寄生虫继续繁衍,寄生虫就很少关心宿主的情形。至于文化,其实也是以这种方式寄生在人类的心中。它们从一个宿主传播到另一个宿主,有时候让宿主变得衰弱,有时候甚至让宿主丧命。任何一个文化概念(像是基督教在天上的天堂),都可能让某个人毕生致力于传播这种想法,甚至为此牺牲生命。于是,人类死亡了,但想法持续传播。根据这种说法,文化并不是某些人为了剥削他人而设计出的阴谋,而是因为种种机缘巧合所出现的心理寄生虫,从出现之后就开始剥削所有受到感染的人。

!! 第十四章 发现自己的无知

皇帝生个继承人还这么难。。

> 而以下数据列出了埃莉诺王后从1255~1284年间所生的16个孩子:
> 1.一个女儿,不知姓名,出生于1255年,出生时夭折。
> 2.一个女儿,取名凯瑟琳,1岁或3岁时夭折。
> 3.一个女儿,取名乔安妮,6个月时夭折。
> 4.一个儿子,取名约翰,5岁时夭折。
> 5.一个儿子,取名亨利,6岁时夭折。
> 6.一个女儿,取名埃莉诺,得年29岁。
> 7.一个女儿,不知姓名,5个月时夭折。
> 8.一个女儿,取名乔安妮,享年35岁。
> 9.一个儿子,取名阿方索,10岁时夭折。
> 10.一个女儿,取名玛格丽特,享年58岁。
> 11.一个女儿,取名贝伦加丽亚,2岁时夭折。
> 12.一个女儿,不知姓名,出生后不久夭折。
> 13.一个女儿,取名玛丽,享年53岁。
> 14.一个儿子,不知姓名,出生后不久夭折。
> 15.一个女儿,取名伊丽莎白,享年34岁。
> 16.一个儿子,取名爱德华。
> 这位最年轻的爱德华,不仅是第一个得以活过危险童年的儿子,而且在父王驾崩之后即位,成为英格兰国王爱德华二世。换句话说,埃莉诺王后尝试了16次,才终于完成了英格兰王后最重要的使命:让丈夫能有一位男继承人。她想必是一位耐心卓绝、毅力过人的女性。只不过,爱德华二世挑的王后、法国的伊莎贝拉就不是这种人了。她在他43岁的时候将他谋杀。

!! 第十六章 资本主义教条

以前的商业公司这么厉害

> 东印度公司就这样攻占了一个又一个的岛屿,印度尼西亚群岛一大部分都成了他们的殖民地,自此统治印度尼西亚近200年。一直要到1800年,印度尼西亚才改由荷兰政府统治,在接下来的150年间成为荷兰这个国家的殖民地。在今天,有人大声疾呼,认为21世纪的民间企业已经掌握了太多权力。但从现代早期的历史来看,我们早已看过放纵追求自我利益能到什么境界。

> 英国人将这个城市改名“纽约”(New York,即“新约克”,约克为英国郡名)。当时西印度公司曾在殖民地筑起一道墙,用来抵御英国人和美国原住民,这道墙的位置现在成了世界上最著名的街道:华尔街(Wall Street,直译为“墙街”)。

!! 第十七章 工业的巨轮

> 而且,同一个包装上还有另一个品牌“健康零嘴”(Health Treats)的广告:健康零嘴有大量谷类、水果和坚果,为您提供美味、愉悦而又健康的体验。在非正餐时间解您的嘴馋,完全符合健康生活习惯。真正的美味,让您享受更多。在历史上的大多数时候,这种文案不但无法引起消费欲望,反而还会激起极度的反感。在过去的人眼中,这种内容真是自私、堕落、道德沦丧!消费主义除了自身非常努力,还在大众心理学(像是“做就对了!”)的推波助澜之下,不断说服大众“放纵对你有益,而节俭是自我压抑”。

!! 第十八章 一场永远的革命

What the hell...

> 今天,地球上住着大约70亿的智人。如果把所有人放上一个大磅秤,总重量约达3亿吨。另外,如果把所有家禽家畜(牛、猪、羊、鸡等等)也放在另一个更大的磅秤上,总重更足足达到7亿吨。但相对的是,如果把所有还幸存的大型野生动物(包括豪猪、企鹅、大象和鲸鱼等等)也拿来称,总重量已经不到1亿吨。

GMT 时间的起源居然是火车推动的。。

> 1847年,英国各家火车业者齐聚一堂,研拟同意统一协调所有火车时刻表,一概以格林尼治天文台的时间为准,而不再遵循利物浦、曼彻斯特、格拉斯哥或任何其他城市的当地时间。在火车业者开了头之后,越来越多机构跟进这股风潮。最后在1880年,英国政府迈出了前所未有的一步,立法规定全英国的时刻表都必须以格林尼治时间为准。这是史上第一次有国家采取了全国统一的时刻表,要求人民依据人工的时钟来过生活,而不是依据当地的日升日落周期有所调整。

> 第二次大战期间,英国广播公司的新闻播送到纳粹占领下的欧洲地区,而每段新闻广播的开头就是大本钟报时钟声的现场直播,可以说正是自由的钟声。甚至还有些天才的德国物理学家,居然找出一套方法,只要靠着钟声在广播中的微小差异,就能判断伦敦当时的天气。对德国空军来说,这可是珍贵无比的战事情报。等到英国私密情报局也发现了这一点,就不再采用现场直播,而用一组录音来取代。

> 然而,生活在家庭和社群的怀抱里并不如想象中的理想,甚至差得远了。家庭和社群对成员的压迫绝不下于现代国家和市场,这些家庭和社群内部常常充满紧张和暴力,而且成员别无选择。在1750年左右,如果一个人失去家庭和社群的保护,几乎必死无疑,不仅没有工作、没有教育,生病痛苦时也得不到任何支持。没有人会借他钱,出了问题也没人保护。毕竟,当时没有警察、没有社工,也没有强制性的义务教育。为了求生,如果真的遇到这种情形,当时的人就得尽快寻找替代家庭或社群。离开原生家庭的男孩女孩,最好的情况大概就是找到新的家庭做帮佣;而最糟的情况,就是被迫从军或沦入风尘。

可能自杀的诱因也是暴力呢?

> 2002年的数字更夸张,在5700万死亡人口中,只有17.2万人死于战争,56.9万人死于暴力犯罪(也就是共74.1万人死于人类暴力)。相较之下,该年自杀的人数就有87.3万。[插图]所以我们看到,在“9·11”恐怖袭击后的一年,虽然恐怖主义和战争喊得震天价响,但说到某个人被恐怖分子、士兵或毒贩刺杀的可能,其实还比不上他自杀的可能。

!! 第十九章 从此过着幸福快乐的日子

我们总是想要设身处地去想想自己在那个情况下会如何感受。但这么一来,我们是把自己的期望放到了别人的物质条件上,结果当然就会失准。

> 这种想法可能很难理解。这里的问题在于,我们的心理深深埋藏着一个推理的谬误。在我们试着猜测或想象其他人有多快乐的时候(可能是现在或过去的人),我们总是想要设身处地去想想自己在那个情况下会如何感受。但这么一来,我们是把自己的期望放到了别人的物质条件上,结果当然就会失准。现代社会丰饶富裕,我们很习惯每天都要洗澡更衣。但在中世纪,农民好几个月都不用洗澡,而且也很少会换衣服。对现代人来说,光是想到要这样生活,就觉得真是臭到要命、脏到骨头里,完全无法接受。只不过,中世纪的农民似乎一点都不介意。这种衣服长时间没洗没换的触感和气味,他们早就已经习惯。他们并不是因为太穷而无法负担换洗衣服,而是压根儿就没有这种期望。于是,至少就衣服这一件事来说,他们其实很满足了。

> 人类演化的结果,就是不会太快乐,也不会太痛苦。我们会短暂感受到快感,但不会永远持续。迟早快感会消退,让我们再次感受到痛苦。举例来说,演化就把快感当成奖赏,鼓励男性和女性发生性行为、将自己的基因传下去。如果性交没有高潮,大概很多男性就不会那么热衷。但同时,演化也确保高潮得迅速退去。如果性高潮永续不退,可以想象男性会非常开心,但连觅食的动力都没了,最后死于饥饿,而且也不会有兴趣再去找下一位能够繁衍后代的女性。

> 佛教与现代生物学和新世纪运动的相同点,在于都认定快乐不在于外在条件。但佛教更重要也更深刻的见解在于,真正的快乐也不在于我们的主观感受。我们如果越强调主观感受,反而就越感到苦。佛教给我们的建议是,除了别再追求外在成就之外,同时也别再追求那些感觉良好的心里感受了。

!! 第二十章 智人末日

> 所以,关于未来的数字物种,可以说现在谁都还说不准。上面提的所有理想或说是梦魇,其实只是为了刺激大家的想象。我们真正应该认真以对的,是在于下一段历史改变不仅是关于科技和组织的改变,更是人类意识与身份认同的根本改变。这些改变触及的会是人类的本质,就连“人”的定义都有可能从此不同。我们还有多久时间?没有人真正知道。如同前面所提,有人认为到了2050年,就有少数人能够达到长生的状态。一些比较不那么激进的预测,则说时间点是在下个世纪或是下一个千禧年。然而,如果从智人长达7万年的历史来看,几千年又算什么呢?
屏幕截图、屏幕录制工具及经验。

截图主要考虑与工作流的整合,比如截图后上阴影、打标注等。

录屏主要根据输出的内容,分为两种形式:

* 输出长的、清晰的视频文件
* 输出短的、较模糊的 GIF 文件(一般在几秒)

!! 截图

需求点:

* 方便加好看的标注,比如加文本时可以指定字体和样式
* 自动加阴影

下面的内容未考虑这两点,后面有实际需求了再调研补齐。

!!! Windows

Windows 下做复杂的截图功能,用 [[ShareX|https://getsharex.com/]] (scoop) 就可以了。功能强大,开源免费,少数派上有一篇 [[教程|https://sspai.com/post/43937]] 讲解。似乎可以自动加阴影。

!!! Linux

Plasma 桌面上,简单的截图用 Spectacle,如果需要加标记、文字等,用 Deepin Screenshot。

!! 录视频

!!! OBS Studio <<plat-win>> <<plat-linux>> <<plat-mac>> 

[[OBS Studio|https://obsproject.com/]] 是个全平台免费的屏幕软件,支持多个源合成画面,支持多场景带动画切换,支持多路声音合成及降噪,感觉很不错。同时它的赞助商是 nVidia 以及 Logitech,意味着它的录屏质量也应该不错(这两家公司需要有软件帮游戏主播或者电竞玩家录制内容)。

来自 V 站网友 [[推荐|https://www.v2ex.com/t/651861]]。

!!! ShareX <<plat-win>>

首选 [[ShareX|https://getsharex.com/]],实测质量 OK 体积小。可配质量。

!!! PowerPoint <<plat-win>>

PowerPoint 中有视频录制功能。新建一个空白 PowerPoint 文档,在菜单中有「插入」=>「媒体」=>「屏幕录制」入口。

这个录屏功能有良好的预设,不足够流畅(24 FPS),但是作演示用途时够用,兼顾了视频大小与演示效果。

!!! Peek <<plat-linux>>

[[Peek|https://github.com/phw/peek]] 是一个现代且方便的工具,可以录成 GIF 或者视频。

!! 录 GIF

少数派中有一个系列「[[GIF 还能这么玩|https://sspai.com/topic/190]]」,提供了实用的 GIF 工具和经验。

!!! ShareX <<plat-win>>

首选 [[ShareX|https://getsharex.com/]],实测质量上乘体积小。

!!! ScreenToGif <<plat-win>>

[[ScreenToGif|https://www.screentogif.com/]] 是 Windows 下简单易用的录屏工具。少数派上有一篇 [[教程|https://sspai.com/post/40556]]。

!!! Gifsicle <<plat-win>> <<plat-mac>> <<plat-linux>>

[[Gifsicle|https://www.lcdf.org/gifsicle/]] 是一款全平台的 GIF 压缩工具。少数派上有一篇 [[教程|https://sspai.com/post/42916]]。

!! 实时显示键盘按键

录屏时经常有需求,要实时显示按了什么按键到屏幕上。

!!! KeyCastr <<plat-mac>>

[[KeyCastr|https://github.com/keycastr/keycastr]] 简单优雅地提供了这个能力。

!!! Carnac <<plat-win>>

[[Carnac|http://carnackeys.com/]] 提供了这个能力。

!! 给鼠标点击动作显示动画

一些 [[软件|http://www.markuswelz.de/software/features.html]] 提供了这种能力,但是感觉显示效果很丑陋。后面尝试下直接将鼠标调大。
! 搜索并跳转到特定的已打开的窗口

在 Windows 上工作时,如果打开的窗口过多,查找时效率就很低。想参考 Chrome 上这个 [[Tab Ahead|https://chrome.google.com/webstore/detail/tab-ahead/naoajjeoiblmpegfelhkapanmmaaghmi]] 插件,实现按某一按键时开启一个文本输入框,输入内容可以搜索当前打开的所有窗口中 Title 匹配该文本的,给出一个列表选择进行跳转。

实现上可能用 AutoHotKey 或者 AutoIt,做一番考察后确定。

参考:

# [[LifeHacker - The Best Time-Saving AutoHotkey Tricks You Should Be Using|http://lifehacker.com/5598693/the-best-time-saving-autohotkey-tricks-you-should-be-using]]

计算机安全与网络安全。

* The Web Application Hacker's Handbook: Finding and Exploiting Security Flaws 2nd edition,这本书看起来很不错,放了 PDF 在网盘中
* [[Computer & Internet Security: A Hands-on Approach|https://www.handsonsecurity.net/index.html]] 这本书似乎广受好评,使用的学校也很多。但是觉得需要有一定的 Linux 操作系统基础。可惜找不到电子版,纸质书太贵


刘十九写的这系列文章,「如何系统地提高自己的智慧?」,我觉得非常好。分成 [[上|https://zhuanlan.zhihu.com/p/21580049]] [[中|https://zhuanlan.zhihu.com/p/21610829]] [[下|https://zhuanlan.zhihu.com/p/21650887]] 三部分。

现代简明魔法站点上,有一篇疑似转载的 [[文章|http://www.nowamagic.net/librarys/veda/detail/2843]],是上面三部分的合集,阅读起来更连贯。

下面是一些笔记。

!! 系统性

> 但对一般人来说,我认为是否能在平时工作之外,找到一种方法,主动的 ''系统性'' 提高自己的智慧,部分决定了他 / 她可以走多远。

作者在文中多次强调 ''系统性'' 一词。我有所体会。所有知识,如果不能有系统性、形成体系,就很难发挥他的作用。大脑在记忆知识上并不强大,但是在推理、演绎上非常强大。如果把知识形成体系,并且打通它们之间内在的关联,这样你使用起来才会得心应手。

这阵子做的一个改变是,不再大量去涉猎内容了。我觉得这期 [[疯投圈|https://crazy.capital/28]] 中陈鸣讲了一个词非常好,叫「知识虚胖」。大量地涉猎知识,看起来似乎懂得很多,但是很多知识不去深挖,不去成体系地学,是不会留在脑子中的,也很难被用上。只有在你有目的性的,有意去了解一个领域、解决一些问题时,才去学习。当然如果你不知道自己想学什么,那先广泛地了解一些内容也不是不可。

!! 大脑的工作模式

> 如何理解这个复杂的现实世界呢?
> 我们建立对这个现实世界的简化模型。

大脑并无法处理现实世界如此巨大的信息量。它需要找到事物运作的规律性,将其抽象成思维模型,这个过程叫作归纳。然后它再按归纳出来的规则进行推理和演绎,去验证与现实世界是否相符,再不停修正这个模型。

> 思考大概就是使用和建立思维模型的过程。
> 智慧的第一步是学会质疑,质疑会把我们引向问题,问题会把我们引向真理。

所以,

* Step 1,建立思维模型,或者把别人出版的思维模型。这样至少能摆脱作为一只被填的鸭子
* Step 2,尝试去质疑这个思维模型的合理性,并通过推理、演绎和验证不停修正这个模型
* 当然还有 Step 3,也就是下文又说回来的系统性

!! 有机的系统

> 基本的、普世的智慧是什么?嗯,第一条规则是,如果你们只是记得一些孤立的事物,试图把它们硬凑起来,那么你们无法真正地理解任何东西。如果这些事物不在一个理论框架中相互联系,你们就无法把它们派上用场。
> 你们必须在头脑中拥有一些思维模式[注]。你们必须依靠这些模式组成的框架来安排你的经验,包括间接的和直接的。你们也许已经注意到,有些学生试图死记硬背,以此来应付考试。他们在学校中是失败者,在生活中也是失败者。你必须把经验悬挂在头脑中的一个由许多思维模式组成的框架上。

你可以把思维模型当作一个工具,形成一个有机的系统即是把这些工具组成一个可以互相协作的工具箱。你掌握的思维模型越多,工具箱也就越顺手。

但是原文在解释这一点时,给的示例感觉不是太理想。它更多在说明亚马逊及迪士尼的业务模式如何形成良性循环带动整个公司发展,试图描述思维模型也可以形成类似的有机系统达到良性循环。这个联想并不直观。

!! 你应试使用多种思维模型

如果掌握的思维模型太少,那么世界观会扭曲,你只能以自己固执的方式去理解世界。

!! 如何培养多种思维模型?

这部分我没什么好讲的,文章中的方法具体而有操作性,摘录在这里:

> 前面提到过,一个思维模式就是帮助我们更好的理解世界运转规律的想法。这些思维模式一定是非常固定的,很少改变,同时揭示了现实世界的一部分规律。所以第二种方法是通过学习重要学科,特别是基础学科的重要理论。

芒格指出:

> …这么说吧,第一条规则是,你必须拥有多元思维模型。这些模型必须来自各个不同的学科——因为你们不可能在一个小小的院系里面发现人世间全部的智慧。所以让我们来简单地看看哪些模型和技巧构成了每个人必须拥有的基础知识,有了这样的基础知识之后,他们才能够精通某项专门的艺术,比如说选股票。

在这一点上,John Reed, 在 //Succeeding// 一书进一步补充到:

> 当你首先可以学习一个领域时,好像你要学习上百万件事情。
> 你其实不必如此。
> 你只需要识别出这个领域最核心的原则——一般只有3-12个。你觉得你要记住的上百万的事情,不过是这些核心原则的不同组合而已。

查理 · 芒格也提到:

> 你们也许会说:「天哪,这太难做到啦。」但是,幸运的是,这没有那么难——因为掌握八九十个模型就占了 90% 的权重,差不多能让你成为拥有普世智慧的人了。而在这八九十个模型里面,非常重要的只有几个。

有一次,当被问到如何变得更聪明时,巴菲特举起来一叠纸,说:

> 每天阅读这样大小的 500 页书。知识就是这样积累起来的,就像复利一样。

芒格也有一段让人触动的话:

> 我们大量的阅读。
> 在我所见过的所有有智慧的人里,没有任何一个人是不大量阅读的。
> 但这还远远不够:你需要有这种个性,可以抓到关键并且真正领会它们。大部分人不能抓到正确的想法,或者并不知道之后要怎么做。
! Semantic Versioning

这篇文章中讨论的 Semver 版本为 2.0.0,同时讨论了 npm 对 Semver 的使用。

!! 目的

Semantic Versioning 的作用就是它名字所说,语义化的版本号。它定义了 MAJOR, MINOR, PATCH 三个部分,用来表示不同的含义:

> 1. MAJOR version when you make incompatible API changes,
> 2. MINOR version when you add functionality in a backwards-compatible manner, and
> 3. PATCH version when you make backwards-compatible bug fixes.
> Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.

他的意义是使开发者对它的项目中所使用的软件包版本号有一个把握。比如我有个项目 A 依赖项目 B,我在我的项目元信息文件中写入 B 的版本信息:

* 如果我写死了 B 的版本号,那么 B 如果有 bug fix 版本发布时,我也得更新我所使用的 B 的版本号,同时发一个新版让我的用户也更新到
* 如果我不想 B 发新版本我就得跟着发,那么我可能指定了 B 使用 [1.2.0, 2.0.0) 版本;但是假如 B 不遵循 Semver,那我不知道 B 会不会在 1.3.0 中引入了新的代码,把能在 1.2.0 中正常运行的代码搞挂了

表达得不太好,可以看看官方文档是怎样描述的。

!! 规则

一条 Semver 分成这几部分:

```
<normal_version>[-<pre_release_version>][+<build_metadata>]
```

如 `1.0.1-alpha.1+20160822`。

* `normal_version` 由 `<major>.<minor>.<patch>` 三部分组成,这三部分都必需是数字
* `pre_release_version` 是由 `.` 号连接起来的一串字符串,`.` 分隔的每一部分的字符都需要是 `[0-9a-zA-Z-]`
* `build_metadata` 是一个字符串,里面的字符需要是 `[0-9a-zA-Z-]`

比较时的规则:

* 两个版本号先比较 normal version,每一部分依次按数字大小进行比较:`1.9.0 < 1.10.0`
* pre-release 版本永远比同样的正常版本低优先:`1.9.0-alpha < 1.9.0`
* normal version 相同时,比较 pre-release version:`1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0`
* build metadata 部分不参与优先级比较

!! npm 处理 semver

npm 使用 semver 的主要场景是:

# `npm install` 命令行时指定版本号:
## `npm install [<@scope>/]<name>@<version>`
## `npm install [<@scope>/]<name>@<version range>`
# `package.json` 里指定版本号,最终被 `npm install` 解析

npm 的 semver 模块定义了一些操作符。常规的操作符 `<`, `<=`, `=`, `>`, `>=`。其中 `=` 操作符是可以省略的,比如 `=1.7.0` 与直接用 `1.7.0` 是等价的。

如果需要多个条件做 AND 逻辑,可以直接用空白字符分隔:`>=1.9.0 <2.0.0`;如果需要做 OR 逻辑,用 `ll` 操作符:`1.7.0 || >=1.9.0 <2.0.0`。

还有一些高级的语义:

Hyphen Ranges:

* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
* `1.2.3 - 2` := `>=1.2.3 <3.0.0`

X-Ranges:

* `*` := `>=0.0.0` (Any version satisfies)
* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)

A partial version range is treated as an X-Range:

* `""` (empty string) := `*` := `>=0.0.0`
* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`

Tilde Ranges `~1.2.3` `~1.2` `~1`:应该是比较常用的,可以用来你需要的 major.minor 版本,这样你的代码一般不会因为 minor / major 的版本升级而挂掉。具体规则就不贴出来了。

Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`:在项目还是 0.x 的情况下,小版本的变化往往被视为 breaking change。这个操作符是用来在依赖库为 0.x.x 情况下保证你的代码不挂掉的。

!! 参考文献

# [[Semantic Versioning 2.0.0|http://semver.org/]]
# [[npm Semver document|https://docs.npmjs.com/misc/semver]]

Smart Blogger 的 [[帖子|https://smartblogger.com/niche-website/]] 中提及了一些 SEO 工具,值得参考:

* [[Answer the Public|https://answerthepublic.com/]]
* [[Google Keyword Planner|https://ads.google.com/intl/en_sg/home/tools/keyword-planner/]]
* [[Wordtracker Scout|https://www.wordtracker.com/scout]]
* [[Keywords Everywhere|https://keywordseverywhere.com/]]

Service Mesh 概念由 Buoyant 公司 [[提出|https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/]],并发布了 [[Conduit|https://conduit.io/]] 作为开源的 service mesh for Kubernetes(这段还不清楚怎么表达,等后面理解深入了再修改)。

Buoyant 公司的 Phil Calçado 有 [[博客文章|http://philcalcado.com/2017/08/03/pattern_service_mesh.html]]([[中译文|http://blog.csdn.net/fl63zv9zou86950w/article/details/78245919]])深入浅出地描述了 Service Mesh 的想法从何而来。
Servlets 是 J2EE 中的一个概念。我感觉他是 J2EE 规范中比较底层的东西,兼容 J2EE 规范的框架,最终都必需符合 Servlets 的接口规范,比如将 Servlets API 封装整合成更易用、更强大的上层接口。它类似于 WSGI,提供了一个应用程序(你的业务代码)与 Web 容器(如 Tomcat,Websphere)间交互的方式。

一个 Servlets 需要实现 3 个函数,这 3 个函数都由 Web 容器去调用,而不是业务代码自己调用:

* `init()`:Web 容器启动时,会且仅会调用一次,一般做一些资源初始化
* `service()`:每个 HTTP 请求到达 Web 容器时,Web 容器会创建一个线程去执行这段代码
* `destroy()`:Servlets 生命周期结束时(比如 Web 容器停止、reload 配置),会且仅会调用一次,可以用来做清洁工作,如断开数据库连接,缓存写入磁盘等

示例如下:

```java
package example;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet implements Servlet {
    private ServletConfig servletConfig;

    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig = servletConfig;
    }

    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletResponse.setContentType( "text/html" );
        PrintWriter out = servletResponse.getWriter();
        out.println( "<html><head>" );
        out.println( "<title>A Sample Servlet!</title>" );
        out.println( "</head>" );
        out.println( "<body>" );
        out.println( "<h1>Hello, World!</h1>" );
        out.println( "</body></html>" );
        out.close();
    }

    public String getServletInfo() {
        return "Hello Servlet";
    }

    public void destroy() { }
}
```

还有一个更上层的 Servlet 类,叫 `HttpServlet`,多了一些 `doGet()`, `DoPost()` 函数。

!! 参考

* [[Servlets 2.5 Hello World Example|http://10minbasics.com/servlets-2-5-hello-world-example/]]
* [[Servlets - Life Cycle|https://www.tutorialspoint.com/servlets/servlets-life-cycle.htm]]
这里的谈及的 session 主要针对 [[web server session|https://en.wikipedia.org/wiki/Session_(computer_science)#Web_server_session_management]]。C/S 结构的程序(桌面端、移动端)也存在 session 机制,这在后面我接触到后再补充。

Wikipedia 上的定义:

> In computer science and networking in particular, a session is a temporary and interactive information interchange between two or more communicating devices, or between a computer and user (see login session). A session is established at a certain point in time, and then ‘torn down’ - brought to an end - at some later point.

!! 常见的使用场景

* Login session:用户在登录网站时,在服务端生成一个 session 并将 session ID 给到客户端,于是用户之后的操作会带上 session ID,即表示已经在登录中的状态
* Anonymous session:比如你在未登录状态下打开京东,将商品加入购物车,你刷新页面后会发现购物车中仍然有你加入的商品。这即是服务端为这个匿名会话存储了购物车物品

实现上,一般是服务端以 cookie 形式下发一个 session ID(aka. session token)给客户端,客户端在后续请求中会带上这个 ID,于是服务端即知道哪些请求是同一个用户发出的。这里的用户,即可惜是登录状态下的用户(此时服务端的 session 数据会带有用户在网站上的身份信息),也可以是未登录的用户(匿名用户)。

Session 本质上是把用户的部分应该在客户端上持久化的信息放在了服务端。比如:

* 出于安全性考虑的登录态信息
* 出于方便性考虑的购物车物品

但是你并非一定要用服务端的 session。有一些场景下,把信息放在浏览器的 local storage 或者 session storage 也是可行的。比如 QQ 音乐的 web 播放器,会把播放列表中的曲目信息存在 local storage 中。

!! 基础概念

* Session ID: 也称 session token,是服务端下发给客户端的一个 ID,客户端在后续请求中会带上这个 ID 标识自己
* Session 数据:服务端上存储的关于某个 session ID 的数据,比如它对应的用户名

!! 系统及功能设计

Session 系统及编程框架的设计,需要考虑下面这些点。

!!! 支持多种 engine 来存储 session 数据

比如数据库、缓存系统等。使用缓存系统时需要考虑 session 时效性。

!!! 支持多种 serializer 来序列化/反序列化 session 数据

比如 Django 默认用 JSON 来做序列化,但是 JSON 中没有 `datetime` 类型,同时 JSON 要求 value 必须是 unicode,不适合存储二进制数据。这种情况下可能需要定制 serializer。

!!! 支持定制 session 的有效时间

比如是一次性(关闭浏览器即失效)还是持续生效的。持续生效的可以持续多久。

!!! Session 续期(renewal)/失效(invalidation)

存在一些需要延长 session 有效期,或者让它立即失效的场景。

续期:

* 有些网站在用户有访问时会自动延长 session 有效期,方便用户使用
** 对于这种场景,建议多开一个 session ID 表示一个固定的失效时间(比如用户登录 30 天后)。服务端应试同时查看这两个 ID 来判断登录态是否过期。这样可以避免某个用户的 session ID 被黑客获取后,黑客无限期地使用它的身份
* 大多数网站出于方便,允许一个用户存在多个有效的 session;但是少部分网站出于安全性或者收费的考虑,仅允许存在有限的有效 session。比如网银只允许用户当前有一个登录,并且 10 分钟未操作可能会话就过期了。像收费观看内容的网站,根据收费策略可能限制了 session 数,使得你只能在有限台设备看它的内容,比如端传媒
* Django 在 session 数据有变化时会自动延长有效期(仍不太理解这个设计)

失效:

* 用户主动登出时,服务端应该将 session 失效
* 用户修改密码时,该用户当前所有 session 都应该失效
* OWASP 提到当用户的权限等级变化时(比如升级、从普通用户变为管理员等),应该重新生成 session ID。还不太理解它的用意

!!! 提供给用户查看当前未失效 session 的能力

比如 Google 提供了一个查看帐号已登录设备的 [[页面|https://myaccount.google.com/device-activity]]。它显示了设备类型(手机/PC)、操作系统、设备名和最近一次登录的地区。用户如果发现帐号被盗,可以将某一设备强行登出。

!!! 测试浏览器是否支持 cookie

有用户出于保护隐私关闭了浏览器 cookie 功能,可以提供一种机制来测试用户端是否支持 cookie,比如 Django 的 [[test cookies|https://docs.djangoproject.com/en/dev/topics/http/sessions/#setting-test-cookies]]。

!!! 定时清理过期 session

对于主动登出的用户,服务器可以清除其 session;但是对于过期却没有登出的用户,需要定期从 session 存储中清除避免存储过度膨胀。

!! 安全性考虑

!!! 可接受的 Session ID 交换机制

在客户端和服务端间交换 session ID 时,仅可以用 cookie 技术。有些老的框架用 URL 参数,这是非常不安全的,可能在 web server 的 access 日志等被泄露。

客户端及服务端的请求间应该开启 TLS。Session ID 的 cookie 应开启 secure flag 使其仅能在 HTTPS 形式下传输。并且应置 HTTP Only 防止被 JS 脚本获取。

SameSite 建议开成 Lax。Domain 及 Path 属性,视你的需求而设。

!!! 应当校验 session ID

客户端传输过来的 Session ID 是可以伪造的。应当像表单输入的参数一样做校验,防止被注入或者 XSS。

!!! Session 存储

存 session 数据时应该同时加入一个加了盐及使用了不公开密码的 hash 值,防止存储被爆破 session 内容被随意修改。数据表中不应该将用户 ID 以明文存储在 session 存储中,这会导致黑客获得网站全部 session 数据后很容易发现它要攻击的用户的数据是哪一条。

!!! 防止浏览器缓存需要登录态才可查看的内容

使用 `Cache-Control` 和 `Pragma` 来指导浏览器不去缓存需要登录态才可查看的内容。避免 Session 过期后,一些敏感信息仍然能从浏览器缓存中被读取。

!!! 攻击检测和防御

攻击者做暴力破解时,可能需要用一批 IP 发大量请求。监控这类请求以及时发现。设置限流或者验证码来防止大量尝试。

防止用户 Session ID 被盗的另一个方法是,将 Session ID 与客户端的某些属性绑定在一起,比如客户端的地理区域、设备类型等。如果发现该 Session ID 相关的客户端属性发生变化,那即有可能是被盗取。

!!! Session Hijacking and Session Fixation

Session Hijacking 是黑客通过手段获得用户 session key,使其可以伪装成用户。这一般通过 HTTP Only 的 cookie 等手段可以解决。

Session Fixation 是指黑客通过某种手段(CSRF、中间人攻击等)将其 session key 注入到用户的浏览器中,再诱导用户在目标网站登陆。一些 session 校验没做好的网站,在用户登陆后并不会更换 session key,因此用户跟黑客共享了一个 session key,从而实现攻击。

!! Django Session 实现

See [[Django: Session]].

!! Resources

* [[Session Management Cheatsheet - OWASP|https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html]]: 非常推荐的阅读材料,将各种需要考虑的安全点列得很详细
* [[How to use seesions - Django|https://docs.djangoproject.com/en/2.2/topics/http/sessions/]]: 值得参考的 session 系统设计
* 流行框架的实现值得参考,如 Django、Spring
* 大厂的实现值得参考,如 Google、Facebook、Instagram

!! See Also

* [[Auth: Authentication]]: 紧密相连的主题
用了一阵子 Fish Shell 后,还是不习惯于它的非 unix-compliant 的语法,配个什么东西经常要查文档;网上的教程大多数也是用的 bash / zsh 作为基础(比如 Kubernetes 的教程中列出的命令行),这样导致需要做转换才能在 Fish 上运行,浪费时间。还是用 zsh 靠谱,基本能力也不输于 Fish。

[[刘十九|https://www.zhihu.com/people/shijiuliu/activities]],主要关注的是他在知乎上的专栏 [[求智集|https://zhuanlan.zhihu.com/seekingwisdom]]。



Skip list(跳表)是一种以概率论为基础的线性数据结构。它可以说是有序链表的增强版。长得像这样:

[img width=700 [skiplist-overview]]

''支持'':插入新数据、搜索某一数据、删除某一数据。

''特点'':

* 多层结构。每一层都是一个有序的链表。越上层数据越稀疏。最下层包含全部数据
* ''对比有序链表'':因为稀疏的上层数据,使得搜索速度变快了,因此插入、删除操作也变快了
* 仍然保留有序链表插入、删除新数据的开销小、不用像数组一样挪动全部数据的特点

理解 skip list 的关键点在于理解它是 ''如何生成新的 level 的''。每当插入数据时,最下层(称之第一层)是一定必须插入的,之后第二层有 $$\frac{1}{2}$$ 概率要插入,第三层有 $$(\frac{1}{2})^2$$,第四层则是 $$(\frac{1}{2})^3$$,依此类推。一旦有一层不再插入,则整个插入结束。因此假如现在只有 3 层,但是插入一个新数据时使得第 4 层也有了数据,就需要建新的一层出来。

编码时可用编程语言提供的随机库(如 Python 标准库中的 random)来做概率判断。注意的是:在判断每一层是否应该插入时,要注意概率判断时的累积问题(看下面代码实现中 `random.getrandbits(1)` 处的注释)。

花花酱的 Python 语言实现:

<div class="limit-code-block-height">

```python
import random
 
class Node:
  def __init__(self, val=-1, right=None, down=None):
    self.val = val
    self.right = right
    self.down = down
    
class Skiplist:
  def __init__(self):
    self.head = Node() # Dummy head
 
  def search(self, target: int) -> bool:
    node = self.head
    while node:
      # Move to the right in the current level
      while node.right and node.right.val < target:
        node = node.right
      if node.right and node.right.val == target:
        return True
      # Move to the the next level
      node = node.down
    return False
 
  def add(self, num: int) -> None:
    nodes = []
    node = self.head
    while node:
      # Move to the right in the current level
      while node.right and node.right.val < num:
        node = node.right
      nodes.append(node)
      # Move to the next level
      node = node.down
    
    insert = True
    down = None
    while insert and nodes:
      node = nodes.pop()
      node.right = Node(num, node.right, down)
      down = node.right
      # 特别注意这一行:因为概率是会累积的,判断每一层是否要插入时,
      # 只需要有 50% 概率就行(也就是 random.getrandbits(1) 的意义)。
      insert = (random.getrandbits(1) == 0)      
    
    # Create a new level with a dummy head.
    # right = None
    # down = current head
    if insert:
      self.head = Node(-1, None, self.head)
 
  def erase(self, num: int) -> bool:
    node = self.head
    found = False
    while node:
      # Move to the right in the current level
      while node.right and node.right.val < num:
        node = node.right
      # Find the target node
      if node.right and node.right.val == num:
        # Delete by skipping
        node.right = node.right.right
        found = True
      # Move to the next level
      node = node.down      
    return found
        
# Your Skiplist object will be instantiated and called as such:
# obj = Skiplist()
# param_1 = obj.search(target)
# obj.add(num)
# param_3 = obj.erase(num)
```

</div>

!! 参考

* [[花花酱 LeetCode 1206. Design Skiplist - 刷题找工作 EP367 - YouTube|https://www.youtube.com/watch?app=desktop&v=783qX31AN08]]
* [[花花酱 LeetCode 1206. Design Skiplist – Huahua's Tech Road|https://zxi.mytechroad.com/blog/desgin/leetcode-1206-design-skiplist/]]
* [[Skip List - Brilliant Math & Science Wiki|https://brilliant.org/wiki/skip-lists/]]

切图。即把 PSD 或者 Sketch 的稿件中的内容提取出来,变成方便在编写网页时使用的图片。

[[大厂 H5 开发实战手册 - 京东凹凸实验室|https://juejin.im/book/5a7bfe595188257a7349b52a]] 中有一 [[章|https://juejin.im/book/5a7bfe595188257a7349b52a/section/5a8ebcabf265da4e9a496bdc]] 提到了切图工具。主要方法有:

* Extract Assets 资源生成器
* Artboards
* 利用 PS 动作切图


[[Cutterman|http://www.cutterman.cn/zh/cutterman]] 似乎是个方便不错的切图工具。

Snippets 这个分类,放一些这样的内容:

* 代码片断,方便复制粘贴;比如用 Gson 解析 JSON 数据的代码,等等。如果这块内容足够重要,也放一个对应内容模块下的 tag
* 工作相关的配置信息,比如 CDB 的 IP、端口,比如线上环境的地址
* 其他零碎的,不成体系的知识,更多需要快速检索而不是理解消化的内容

Software to manage code snippets, configs, etc.

!! Boostnote <<plat-win>> <<plat-linux>>

[[Boostnote|https://boostnote.io/]] is suitable for this task. Some key features I care about:

* No database, just plain files, make it easy to sync with Dropbox
* Global shortcut (`Win+Alt+S`) to search snippets, easy to preview and copy
** Update: 开发者把全局搜索窗口干掉了,说是没什么人用。Boostnote 不思进取,不再使用之

!! TiddlyWiki

Currently I use TiddlyWiki to manage [[snippets|Snippets]].

建立本地的 RPM 仓库。

<<.note "Dropbox 中放了一个 `tsf-yum-repo-builder.zip`,是现成的下载、构建本地仓库的解决方案。">>

在建立本地 RPM 仓库前,你可以先通过工具拿到你要 serve 的 RPM 包([[参考|Snippets: CentOS: Download rpm pacakge and it's dependencies]])。

把 RPM 包放到某个目录,参考官方的 [[目录结构|http://mirror.centos.org/centos/7/os/x86_64/Packages/]],如 `/root/centos/7/local/x86_64/Packages/`。运行 `createrepo`(`yum install createrepo` 如果你的机器上还没有它)建起仓库:

```bash
createrepo /root/centos/7/local/x86_64
```

新建 `/etc/yum.repos.d/local.repo` 文件:

```ini
[local]
name=CentOS-$releasever - local packages for $basearch
baseurl=file:///root/centos/$releasever/local/$basearch/
enabled=1
gpgcheck=0
protect=1
```

使用 `yum repolist` 看看是否正常。

仓库建好后,可以运行下列指令,让 yum 只使用你的 local repo 的包进行操作:

```bash
yum --disablerepo="*" --enablerepo=local install $PACKAGE_NAME
```

参考:

* [[HowTos/CreateLocalRepos|https://wiki.centos.org/HowTos/CreateLocalRepos]]:官方 wiki,但是内容有点老(CentOS 4 时代写的),目录结构已经不太一样。
下载一个 RPM 包及其所依赖的全部包(recusively)。

<<.note "Dropbox 中放了一个 `tsf-yum-repo-builder.zip`,是现成的下载、构建本地仓库的解决方案。">>

使用 [[yum-utils|http://yum.baseurl.org/wiki/YumUtils]] 中提供的工具。如果当前系统没有 yum-utils,使用 `yum install yum-utils` 安装。

方法 1:

```bash
mkdir package-bundle
yumdownloader --destdir package-bundle `repoquery --resolve --requires --recursive $PACKAGE_NAME`
yumdownloader --destdir package-bundle `repoquery $PACKAGE_NAME`
```

方法 2:

```bash
mkdir package-bundle
repoquery --requires --resolve --recursive $PACKAGE_NAME | xargs yumdownloader --destdir package-bundle
repoquery $PACKAGE_NAME | xargs yumdownloader --destdir package-bundle
```

<<.warning "`repoquery --requires` 不会输出你 query 的包本身。" >>

参考:

* [[build .rpm package with all its dependencies|https://serverfault.com/questions/619292/build-rpm-package-with-all-its-dependencies]]
* [[Linux 下离线安装包有什么好方法呢?|https://www.v2ex.com/t/483845#reply25]]
For CentOS 7:

```bash
wget -O mysql57-community-release-el7-7.noarch.rpm http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum localinstall -y mysql57-community-release-el7-7.noarch.rpm 
yum install -y mysql-community-server
```

Enable and start:

```bash
systemctl enable mysqld
systemctl start mysqld
```
CentOS 7 默认的 Kernel 是 3.10 版本,不支持 TCP BBR。升级到高版本支持它:

```
yum -y update
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml

grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
```

参考 [[这里|https://www.howtoforge.com/tutorial/how-to-upgrade-kernel-in-centos-7-server/]]。


```shell
curl -L --output /dev/null --silent --show-error --write-out 'lookup:        %{time_namelookup}\nconnect:       %{time_connect}\nappconnect:    %{time_appconnect}\npretransfer:   %{time_pretransfer}\nredirect:      %{time_redirect}\nstarttransfer: %{time_starttransfer}\ntotal:         %{time_total}\n' 'baidu.com'

lookup:        0.004
connect:       0.047
appconnect:    0.000
pretransfer:   0.047
redirect:      0.000
starttransfer: 0.092
total:         0.092
```

每个字段的具体含义可以看 curl [[文档|https://curl.haxx.se/docs/manpage.html]]。

```dockerfile
FROM python:3-slim
RUN sed -i 's/deb.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list && sed -i 's/security.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list
RUN apt-get update && apt-get install -y --no-install-recommends build-essential && apt-get autoclean

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple

RUN mkdir /app
COPY manage.py /app
COPY detail /app/detail
COPY app /app/app

WORKDIR /app
CMD python manage.py runserver 0.0.0.0:9080
```

通过 `net/url` 包可以做 URL 的解析和生成。url 库遵循 RFC 3986,所以像 PG 的 [[connection string|PostgreSQL: Client Interface: Connection String]] 也可以通过这种方式构建:

```go
import (
	"fmt"
	"net/url"
)

func main() {
	u := &url.URL{
		Scheme:   "postgresql",
		User:     url.UserPassword("squirrel", "iloveice"),
		Host:     "localhost",
		Path:     "squirrel",
	}
	fmt.Println(u.String())
}
```


这段代码演示如何将一个 `HttpRequestBase` 的请求体 body(如果有),转入到一个 String 中。

```java
public static String getRequestBody(HttpRequestBase request) {
    if (request instanceof HttpEntityEnclosingRequest) {
        // 有些 request 是不带 body 的,比如 HTTP GET 请求;
        // 如果 request 实现了 HttpEntityEnclosingRequest,说明它是 POST / PATCH / PUT / DELETE 请求,这类请求可以带请求体
        HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
        
        // HttpEntity 是一个 InputStream。如果它不是 repeatable 的,它无法被重复消费,那么大部分情况下不应该调用 EntityUtils.toString 去消费它
        if (entity.isRepeatable()) {
            return EntityUtils.toString(entity);
        }
    }
}
```
[[gson|https://github.com/google/gson]] 是一个 Google 出品的 JSON 序列化 / 反序列化 Java 库。

!! 序列化

```java
public static <T> String serializeToJson(T object) {
    StringWriter writer = new StringWriter();
    EscapeNonAsciiWriter escapeWriter = new EscapeNonAsciiWriter(writer);

    Gson gson = new GsonBuilder().disableHtmlEscaping().create();
    gson.toJson(object, escapeWriter);
    return writer.toString();
}
```

Gson 默认会有所谓 Html Escaping,会把诸如 `<` `>` `'` 等符号转义,为的是让 JSON 安全地嵌入在 HTML / XHTML 中([[来源|https://stackoverflow.com/a/23364300]])。我认为这不是现阶段 JSON 的常见用法,不需要开启。

Gson 不对 UTF-8 字符转义成 `\uxxxx` 形式,而是保留它原始的字节。它认为 JSON 的编码格式应该由用户代码去理解。但是在一些不允许使用非 ASCII 字符的场景(比如 HTTP 头中)会不方便。但是 Gson 提供了用户自定义 writer 的能力,因此我们可以写一个 `EscapeNonAsciiWriter` 解决这个问题:

```java
// 测试过这个类,对中文有效,对处于 Unicode Plane 1 的字符也有效
public class EscapeNonAsciiWriter extends Writer {
    private final Writer out;

    public EscapeNonAsciiWriter(Writer out) {
        this.out = out;
    }

    @Override
    public void write(char[] buffer, int offset, int count) throws IOException {
        for (int i = 0; i < count; i++) {
            char c = buffer[i + offset];
            if (c <= 0x7f) {
                out.write(c);
            } else {
                out.write(String.format("\\u%04x", (int) c));
            }
        }
    }

    @Override
    public void flush() throws IOException {
        out.flush();
    }

    @Override
    public void close() throws IOException {
        out.close();
    }
}
```

!! 反序列化

```java
public static SomePojo deserializeFromJson(String buffer) {
    Gson gson = new GsonBuilder().disableHtmlEscaping().create();
    return gson.fromJson(buffer, SomePojo.class);
}
```

`gson.fromJson` 的第二个参数,接受一个 class 对象(如 `Metadata.class`),由于 Java 存在 ''范型擦除''(`List<String>.class` 在字节码上就是 `List<>.class`),Gson 提供了 `TypeToken` 来方便指定类型。但是我不知道怎么用。对 Java 理解深了后看看 [[这篇文章|https://www.jianshu.com/p/d62c2be60617]]。

!! 参考

# [[你真的会用Gson吗?Gson使用指南(一)|https://www.jianshu.com/p/e740196225a4]]
# [[搞定Gson泛型封装|https://www.jianshu.com/p/d62c2be60617]]
Jackson 是 JSON 序列化、反序列化的库类。Spring 默认使用它。

!! Setup

```java
public class StandardContainerApiUtil {
    public static final Objec
    static {
        // 反序列化时忽略不存在的属性
        OM.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        // 序列化 Date 对象时不序列化成 timestamp
        OM.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }
}
```

!! 从 String 反序列化

```java
String result = "{\"createAt\": \"2008-09-15T15:53:00+05:00\"}";
OM.readValue(result, StandardCluster.class);
```

!! 序列化为 String

```java
StandardCluster cluster = new StandardCluster();
cluster.setCreateAt(new Date());
String result = OM.writeValueAsString(cluster);
```

!! 控制类字段是否被序列化

Jackson 默认会解析类中全部 getter 函数(即 `getXXX` 的函数,不管它是不是对应着一个字段)及 fields,用来判断要序列化成什么样子。

```java
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StandardCluster {
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String id;
    
    private String name;
    private String status;
    private String cidr;
    private Integer nodeNum;
    private Date createAt;
    private Date updateAt;
    
    @JsonIgnore
    public String getNodeNumDesc() {
        return "Node num: " + String.valueOf(nodeNum);
    }
    
    // ...
}
```

!! 处理日期

JSON 中没有表示日期的基本类型,你需要把它序列化为 string。我对日期的标准不熟悉,了解到比较常用的有 ISO 8601。Jackson 中有专门处理的 `ISO8601DateFormat`,但是根据这个 [[issue|https://github.com/FasterXML/jackson-databind/issues/1786]],它在 2.9 版本中被 deprecated 了。Jackson 建议直接用默认的 `StdDateFormat`。根据 [[文档|https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/util/StdDateFormat.html]],与 `java.util.Data` 类型互操作时:

* 序列化时会生成 ISO-8601 兼容的字符串
* 反序列化时可以识别 ISO-8601 和 RFC-1123 格式的字符串

不过注意 Jackson 默认会把 `Date` 类型的字段序列化成 UNIX Timestamp。你可以通过 disable 掉 `Objec
!! 参考

* [[Jackson - baeldung|https://www.baeldung.com/jackson]]
!! Iterating

```java
Map<String, Object> map = ...;

// iterate keys
for (String key : map.keySet()) {
    // ...
}

// iterate values
for (Object value : map.values()) {
    // ...
}

// iterate key-values
for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...
}
```

在 Spring Boot 应用中,如果用了 `FeignClient` 来描述远端接口,可以在 `application.yml` 或其他等同作用的配置文件中,加入下面的配置来使 Feign 发起的请求都打印在日志中:

```yml
feign:
  client:
    config:
      default:
        loggerLevel: basic
```

`loggerLevel`:

* NONE, No logging (DEFAULT).
* BASIC, Log only the request method and URL and the response status code and execution time.
* HEADERS, Log the basic information along with request and response headers.
* FULL, Log the headers, body, and metadata for both requests and responses.

把相应的大写改成小写即可。

!! 参考

* [[Declarative REST Client: Feign|https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html]]
* [[Feign Logging|http://projects.spring.io/spring-cloud/spring-cloud.html#_feign_logging]]
如何在 Spring Boot 中纪录函数的执行耗时。这利用了 Spring 的 AOP 特性,但是我还不完全整理 AOP,所以这篇 tiddler 的标题不是 AOP。

下面这个示例中,`com.tencent.tsf.resource.proxy` 中有大量访问外部服务的 API Helper,如:

```
[onlyice@onlyicelin-PC8 proxy]$ tree .
.
├── api
│   ├── AlaudaApiHelper.java
│   ├── ApiHelper.java
│   ├── ContainerApiHelper.java
│   ├── ContainerMasterApiHelper.java
│   ├── ContainerRegistryApiHelper.java
│   ├── DockerRegistryApiHelper.java
│   └── HarborApiHelper.java
├── cloudapi
│   ├── CAMCredentialCache.java
│   ├── CAMRoleCredential.java
│   ├── CAMRoleHandler.java
│   ├── CloudAPIHandler.java
```

因此用了 `* com.tencent.tsf.resource.proxy..*.*(..))` 来匹配这些函数(抄的别人的,具体的匹配规则我也没深究)。

```java
package com.tencent.tsf.resource.aop;

@Aspect
@Component
public class CommonLog {
    private static final Logger log = LoggerFactory.getLogger(CommonLog.class);

    @Around("execution(* com.tencent.tsf.resource.proxy..*.*(..))")
    public Object trackResourceRPCTime(ProceedingJoinPoint point) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();// 获取request
        long beginTime = System.currentTimeMillis();
        // 执行方法
        try {
            Object result = point.proceed();
            return result;
        } catch (Throwable t) {
            throw t;
        } finally {
            long time = System.currentTimeMillis() - beginTime;
            String message = String.format("Trace RPC time, RequestId: %s, %s used %dms",
                    request.getHeader(TSF.REQUEST_ID_HEADER_KEY), point.toString(), time);
            log.info(message);
        }
    }
}
```
怎样在 SpringBoot 应用中把 `JDBCTemplate` 执行时的 SQL 语句、参数值打印出来?

在配置中把 `org.springframework.jdbc.core.JdbcTemplate` 的 log 等级调成 debug,如:

```yaml
logging:
  file: /data/logs/tsf/${spring.application.name}/${spring.application.name}
  level:
    org.springframework.jdbc.core: trace
```

效果:

```
Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown
```

!! 参考

* [[Seeing the underlying SQL in the Spring JdbcTemplate?|https://stackoverflow.com/q/1932208]]
这个例子中,运行时会像你正常起一个 Spring 应用一样效果,会有 Bean 注入、Autowired 的值会被写入,等等。

注意 `@ActiveProfiles("local")` 必须在 `@SpringBootTest` 下面。不然不会加载配置文件。目录结构如下:

```
tsf-resource
    ├── pom.xml
    └── src
        ├── main
        │   ├── java.com.tencent.tsf.resource
        │   |   ├── controller
        │   |   ├── service
        │   └── resources
        │       └── application.yml
        └── test
            ├── java
            │   └── com.tencent.tsf.resource
            │       └── ApiHelperTest.java
            └── resources
                └── application-local.yml
```

```java
package com.tencent.tsf.resource;

import com.tencent.tsf.TsfApplicationStarter;
import com.tencent.tsf.resource.config.ContainerConfigV2;
import com.tencent.tsf.resource.proxy.api.ApiHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TsfApplicationStarter.class)
@ActiveProfiles("local")
public class ApiHelperTest {
    private Logger logger = LoggerFactory.getLogger(ApiHelperTest.class);

    @Autowired
    private ContainerConfigV2 containerConfig;

    @Test
    public void testQueryParams() {
        ApiHelper helper = new ApiHelper(containerConfig.getMaster());
        logger.debug("{}", containerConfig.getMaster());
        logger.debug(helper.getUrl("/simple/test/path", null));
    }
}
```
```java
Map<String, String> uriParams = new HashMap<>();
uriParams.put("ip", "127.0.0.1");
uriParams.put("port", "8080");
uriParams.put("serviceName", "producer");

MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
queryParams.add("instanceId", "ins-1");
queryParams.add("token", "t1);

String urlTemplate = "http://{ip}:{port}/rate/{serviceName}?instanceId={instanceId}&token={token}";

// Build and expand handles escaping
String url = UriComponentsBuilder.fromUriString(urlTemplate).
        queryParams(queryParams).buildAndExpand(uriParams).toUriString();

// Resulting "http://127.0.0.1:8080/rate/producer?instanceId=ins-1&token=t1"
```
!! Multi-line String

Java(至今 JDK 11)没有多行字符串的 literal。你可以复制一个多行字符串,再在 IntelliJ 里面的 `""` 中粘贴,IDE 会自动帮你生成多行字符串。

如果要手写多行字符串,可以参考这个 [[SO 回答|https://stackoverflow.com/a/878704/1189076]]。

!! Format String

Java 的字符串格式化。

用比较新的 `MessageFormat.format()` 或者 C 风格的 `String.format()`:

```java
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
String.format("%s %d", "hello", 1);

// Output: String is "foobar", number is 42
```

老的方式 `String.format`:

```java
String.format("Hello %s, %d", "world", 42);
```

!! Simple Template Substitute

[[org.apache.commons.text|https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/StrSubstitutor.html]] 包提供了一个简单的方法:

```java
Map valuesMap = HashMap();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";
StrSubstitutor sub = new StrSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);
```

!! Join

[[Join and Split Arrays and Collections in Java|https://www.baeldung.com/java-join-and-split]]:

```java
@Test
public void whenConvertArrayToString_thenConverted() {
    String[] animals = new String[] { "Dog", "Cat", "Bird", "Cow" };
    String result = Arrays.stream(animals).collect(Collectors.joining(", "));
 
    assertEquals(result, "Dog, Cat, Bird, Cow");
}
```

!! Context

```bash
kubectl config set-context onlyice --namespace=main
kubectl config get-contexts
kubectl config use-context onlyice
```

!! Viewing, Finding Resources

如果你在 context 中指定了 namespace,则下面的命名中 `-n` 参数可以不带。

```bash
# get all pods
kubectl get pods -n <namespace>
# describe all pods
kubectl describe pods -n <namespace>

```

!! Get Running Container Shell

```bash
# get pod name
kubectl get pods
# get detail infomation about specific pods including containers
kubectl describe pod/<pod_name> -n <namespace>
# get a shell to the container
kubectl exec -it <pod_name> -c <container_name> -- sh
```

参考:[[Get a Shell to a Running Container|https://kubernetes.io/docs/tasks/debug-application-cluster/get-shell-running-container/]]

!! 参考

* [[kubectl Cheat Sheet|https://kubernetes.io/docs/reference/kubectl/cheatsheet/]]
部分代码拷贝自 [[Wikibook|https://en.wikibooks.org/wiki/MySQL/CheatSheet]]。

```sql
SHOW DATABASES
SHOW TABLES
SHOW FIELDS FROM table / SHOW COLUMNS FROM table / DESCRIBE table / DESC table / EXPLAIN table
SHOW CREATE TABLE table
SHOW CREATE TRIGGER trigger
SHOW TRIGGERS LIKE '%update%'
SHOW PROCESSLIST
KILL process_number
SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '**yourdbname**';
```

```bash
$ mysqlshow
$ mysqlshow database
```
!! Connect

```bash
mysql -h <host> -u <user> -p<passwd>

# Typing password interactively
mysql -h <host> -u <user> -p
Enter password: ********

mysql -u user -p

# Using local host and local user
mysql

# Typing password interactively
mysql -h <host> -u <user> -p <Database>
```

!! Client Connection Encoding

客户端与服务端交互时,用什么编码是很重要的。最佳实践是一直用 UTF-8。有几个办法:

# 在 `mysql` 命令行上添加 `--default-character-set=utf8`
# 进入 `mysql` 客户端的交互模式后,输入 `SET names utf8`
# 在配置文件 `my.cnf`(用 `~/.my.cnf`,参考 [[这里|https://dev.mysql.com/doc/refman/8.0/en/option-files.html]])中,添加以下内容:

```ini
[mysql]
default-character-set=utf8
```
常见例子:

```sql
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

FLUSH PRIVILEGES;
```

`'jeffrey'@'localhost'` 的 host 部分可以省略(也可以用 `'%'` 代替),表示不限制 `jeffrey` 是在哪台机器访问的。

参考 [[MySQL 8.0 文档|https://dev.mysql.com/doc/refman/8.0/en/grant.html]]。
```sql
INSERT INTO table1 (field1, field2, ...) VALUES (value1, value2, ...)
INSERT table1 SET field1=value_1, field2=value_2 ...

LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE table1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'

DELETE FROM table1 / TRUNCATE table1
DELETE FROM table1 WHERE condition
-- join:
DELETE FROM table1, table2 WHERE table1.id1 = table2.id2 AND condition

UPDATE table1 SET field1=new_value1 WHERE condition
-- join:
UPDATE table1, table2 SET field1=new_value1, field2=new_value2, ...
WHERE table1.id1 = table2.id2 AND condition
```
```sql
CREATE DATABASE [IF NOT EXISTS] mabase [CHARACTER SET charset] [COLLATE collation]
CREATE DATABASE mabase CHARACTER SET utf8
DROP DATABASE mabase
USE mabase

ALTER DATABASE mabase CHARACTER SET utf8
```
! MySQL 导入 / 导出数据

也可以叫作 MySQL 数据的备份与恢复。

!! 导出

导出一整个数据库:

```cmd
$ mysqldump -hhost -Pport -uuser -ppasswd database > database.sql
```

导出某个数据库里面的特定几张表

```cmd
$ mysqldump -hhost -Pport -uuser -ppasswd --single-transaction database table1 table2 > database.sql
```

对于 InnoDB 作为引擎的数据表,需要加 `--single-transaction` 参数。不然你需要锁表,并且需要有 `LOCK TABLE` 权限。

''注意'':即使用了 `--single-transaction`,也不能在 dump 过程中修改表结构,比如 `ALTER TABLE`, `DROP TABLE`, `RENAME TABLE`, `TRUNCATE TABLE`。因为背后的多版本数据技术(multiversioning)并不能隔绝表结构的修改。

!! 导入

```cmd
$ mysql -hhost -Pport -uuser -ppassword < database.sql
```

或者可以先用 MySQL Cli 登录上数据库,再执行 `source database.sql`。

对于 `database.sql` 文件里面没有指定数据库的,还没仔细看怎样解决。
```sql
CREATE TABLE table (..., PRIMARY KEY (field1, field2))
CREATE TABLE table (..., FOREIGN KEY (field1, field2) REFERENCES table2 (t2_field1, t2_field2))
ALTER TABLE table ADD PRIMARY KEY (field);
ALTER TABLE table ADD CONSTRAINT constraint_name PRIMARY KEY (field, field2);
```
```sql
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
ALTER USER 'user'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, DELETE ON base.* TO 'user'@'localhost' IDENTIFIED BY 'password';
REVOKE ALL PRIVILEGES ON base.* FROM 'user'@'host'; -- one permission only
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'host'; -- all permissions

DROP USER 'user'@'host'
```
!! Query

```sql
SELECT * FROM table
SELECT * FROM table1, table2, ...
SELECT field1, field2, ... FROM table1, table2, ...
SELECT ... FROM ... WHERE condition
SELECT ... FROM ... WHERE condition GROUP BY field
SELECT ... FROM ... WHERE condition GROUP BY field HAVING condition2
SELECT ... FROM ... WHERE condition ORDER BY field1, field2
SELECT ... FROM ... WHERE condition ORDER BY field1, field2 DESC
SELECT ... FROM ... WHERE condition LIMIT 10
SELECT DISTINCT field1 FROM ...
SELECT DISTINCT field1, field2 FROM ...

SELECT ... FROM t1 JOIN t2 ON t1.id1 = t2.id2 WHERE condition
SELECT ... FROM t1 LEFT JOIN t2 ON t1.id1 = t2.id2 WHERE condition
SELECT ... FROM t1 JOIN (t2 JOIN t3 ON ...) ON ...
SELECT ... FROM t1 JOIN t2 USING(id) WHERE condition
```

!! Conditionals

```sql
field1 = value1
field1 <> value1
field1 LIKE 'value _ %'
field1 IS NULL
field1 IS NOT NULL
field1 IN (value1, value2)
field1 NOT IN (value1, value2)
condition1 AND condition2
condition1 OR condition2
```
```sql
CREATE TABLE table (field1 type1, field2 type2, ...)
CREATE TABLE table (field1 type1 unsigned not null auto_increment, field2 type2, ...)
CREATE TABLE table (field1 type1, field2 type2, ..., INDEX (field))
CREATE TABLE table (field1 type1, field2 type2, ..., PRIMARY KEY (field1))
CREATE TABLE table (field1 type1, field2 type2, ..., PRIMARY KEY (field1, field2))
CREATE TABLE table1 (fk_field1 type1, field2 type2, ...,
  FOREIGN KEY (fk_field1) REFERENCES table2 (t2_fieldA)
    [ON UPDATE] [CASCADE|SET NULL|RESTRICT]
    [ON DELETE] [CASCADE|SET NULL|RESTRICT])
CREATE TABLE table1 (fk_field1 type1, fk_field2 type2, ...,
  FOREIGN KEY (fk_field1, fk_field2) REFERENCES table2 (t2_fieldA, t2_fieldB))
CREATE TABLE table IF NOT EXISTS (...)

CREATE TABLE new_tbl_name LIKE tbl_name
  [SELECT ... FROM tbl_name ...]

CREATE TEMPORARY TABLE table (...)

CREATE table new_table_name as SELECT [ *|column1, column2 ] FROM table_name

DROP TABLE table
DROP TABLE IF EXISTS table
DROP TABLE table1, table2, ...
DROP TEMPORARY TABLE table

ALTER TABLE table MODIFY field1 type1 
ALTER TABLE table MODIFY field1 type1 NOT NULL ... 
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 NOT NULL ...
ALTER TABLE table ALTER field1 SET DEFAULT ...
ALTER TABLE table ALTER field1 DROP DEFAULT
ALTER TABLE table ADD new_name_field1 type1
ALTER TABLE table ADD new_name_field1 type1 FIRST
ALTER TABLE table ADD new_name_field1 type1 AFTER another_field
ALTER TABLE table DROP field1
ALTER TABLE table ADD INDEX (field);
ALTER TABLE table ADD PRIMARY KEY (field);

-- Change field order:
ALTER TABLE table MODIFY field1 type1 FIRST
ALTER TABLE table MODIFY field1 type1 AFTER another_field
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 FIRST
ALTER TABLE table CHANGE old_name_field1 new_name_field1 type1 AFTER another_field

ALTER TABLE old_name RENAME new_name;
```


```javascript
const puppeteer = require('puppeteer');

(async () => {
  // Set up browser and page.
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.setViewport({ width: 1280, height: 926 });

  // Navigate to this blog post and wait a bit.
  await page.goto('https://intoli.com/blog/saving-images/');
  await page.waitForSelector('#svg');

  // Select the #svg img element and save the screenshot.
  const svgImage = await page.$('#svg');
  await svgImage.screenshot({
    path: 'logo-screenshot.png',
    omitBackground: true,
  });

  await browser.close();
})();
```

创建和销毁 PG 数据库、用户的脚本。

假设项目名为 `issue_board`。一般而言先通过 `sudo -iu postgres` 变用户,然后有两种方式做操作:

!! 通用 SQL 命令操作

```sql
/*
This file is used to bootstrap development database.

Run this command:
    psql -U postgres -f sql/create_database.sql

Note: ONLY development database;
*/

CREATE USER issue_board_admin SUPERUSER;   /* LOGIN PASSWORD 'password' */
CREATE DATABASE issue_board OWNER issue_board_admin ENCODING 'utf-8';
```

```sql
/*
This file is used to drop development database;

Run this command:
    psql -U postgres -f sql/drop_database.sql

Note: ONLY development database;
*/

DROP DATABASE issue_board;
DROP USER issue_board_admin;
```

!! 通过命令行工具操作

```shell
# Create a new postgres database superuser, enter the password
createuser -s -P issue_board_admin

# Create a new database owned by user created above
createdb -l en_US.UTF-8 -O issue_board_admin issue_board
```

```shell
dropdb issue_board
dropuser issue_board_admin
```




Code snippets copied from [[Practical Django 2 and Channels 2]]. Related django documentation: [[Customizing authentication|https://docs.djangoproject.com/en/2.2/topics/auth/customizing/]].

```python
# main.models.py
from django.contrib.auth.models import (
    AbstractUser,
    BaseUserManager,
)

class UserManager(BaseUserManager):
    use_in_migrations = True
		
    def _create_user(self, email, password,**extra_fields):
        if not email:
            raise ValueError("The given email must be set")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
				
    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra_fields)
				
    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        if extra_fields.get("is_staff") is not True:
           raise ValueError(
               "Superuser must have is_staff=True."
           )
        if extra_fields.get("is_superuser") is not True:
            raise ValueError(
               "Superuser must have is_superuser=True."
           )
        return self._create_user(email, password, **extra_fields)
				
class User(AbstractUser):
    username = None
    email = models.EmailField('email address', unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    objects = UserManager()
```

Then add a configuration directive to settings.py:

```python
AUTH_USER_MODEL = "main.User"
```

Add these codes to `main/admin.py` (copy and adapt from DjangoUserAdmin class):

```python
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from django.utils.translation import gettext_lazy as _

@admin.register(models.User)
class UserAdmin(DjangoUserAdmin):
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name')}),
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
        }),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2'),
        }),
    )
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    search_fields = ('first_name', 'last_name', 'email')
    ordering = ('email',)
```
Copied and adapted from [[here|https://docs.djangoproject.com/en/2.2/topics/logging/]]:

```python
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}
```
安装完 PG 后,先新建数据库:

```shell
# Switch to postgres user
sudo -iu postgres

# Create a new postgres database superuser, enter the password
createuser -s -P squirrel_admin

# Create a new database owned by user created above
createdb -l en_US.UTF-8 -O squirrel_admin squirrel
```

将 Python 的 PG 库 psycopg2 加入项目中:

```shell
poetry add psycopg2
```

在 Django 的 `settings.py` 中这样配置:

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'squirrel',
        'USER': 'squirrel_admin',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '5432',
        'OPTIONS': {
            'client_encoding': 'UTF8',
            'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ,
        }
    }
}
```

PG 默认的事务隔离级别是读已提交,我认为可重复读更佳,在上面的 `isolation_level` 中配置。
自定义分页功能。

下面定义了 `page_size` 作为 API 中指定每页大小的查询参数:

```python
# <your_project>/<your_project>/pagination.py
from rest_framework import pagination


class CustomPagination(pagination.PageNumberPagination):
    page_size_query_param = "page_size"
    max_page_size = 100
```

在 `settings.py` 中加入:

```python
REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_CLASS': '<your_project>.pagination.CustomPagination',
}
```
这是一个 DRF 中 `urls.py` 的写法示例,减少重复看文档的时间。

```python
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from main.views.book import BookViewSet, BookAuthorViewSet, BookPublisherViewSet
from main.views.user import SignupView

router = routers.DefaultRouter()
router.register('books', BookViewSet)
router.register('authors', BookAuthorViewSet)
router.register('publishers', BookPublisherViewSet)

urlpatterns = [
    path('', include(router.urls)),

    path('signup/', SignupView.as_view(), name='signup'),

    path('admin/', admin.site.urls),
]
```
用 `openpyxl` 来操作 Excel。下面例子用的版本是 2.5.3。

```python
def generate_excel_file(dest_file, questions):
    wb = Workbook()
    ws = wb.active

    # Header
    ws['A1'] = '题目'
    ws['B1'] = '选项'
    ws['C1'] = '答案'

    # Styling
    ws.row_dimensions[1].font = Font(b=True)   # 首行加粗
    ws.freeze_panes = "B2"   # 冻结首行

    ws.column_dimensions['A'].width = 100
    ws.column_dimensions['B'].width = 60
    ws.column_dimensions['C'].width = 15

    al = Alignment(wrap_text=True)   # 自动换行

    # Data
    for i, q in enumerate(questions, 2):
        ws[f'A{i}'] = q.title
        
        # alignment 的设置,对 Cell 有效,对 column / row 无效,原因不详
        ws[f'A{i}'].alignment = al
        
        ws[f'B{i}'] = "\n".join(q.options)
        ws[f'B{i}'].alignment = al
        ws[f'C{i}'] = ''.join(q.answers)

    wb.save(dest_file)   # dest_file 是文件路径
```
!! 安装和配置

{{ Snippets: Python: Initscript-like scripts for Gunicorn with Conda: install.sh }}

!! 依赖维护和启停脚本

{{ Snippets: Python: Initscript-like scripts for Gunicorn with Conda: runner.py }}

!! Tiddlers

echo "Installing miniconda..."

# 包发布并不会检查自定义安装脚本的返回码。这里返回非 0 返回码都不会被理会,依然是安装成功。。

# Python 3 版本的 Miniconda 一样可以建 Python 2 的 env
sh #INSTALL_PATH/scripts/installer/Miniconda3-4.3.31-Linux-x86_64.sh -b -f -p #INSTALL_PATH
if [ $? -ne 0 ]
then
  echo "Install miniconda3 failed."
  exit 1
fi

# 织云包发布不可以有 dot files,我也是醉了
echo "Copying .condarc to conda dir..."
cp #INSTALL_PATH/scripts/condarc #INSTALL_PATH/.condarc
if [ $? -ne 0 ]
then
  echo "Copy .condarc to conda dir failed."
  exit 1
fi

# 把私有 PyPi Server 写进 pip.conf 中,因为 Conda 残废的 environment.yaml 机制并不好去加 PyPi Server
mkdir -p /home/user_00/.config/pip
cat > /home/user_00/.config/pip/pip.conf <<EOF
[global]
index-url = http://10.123.16.167:8080/simple
trusted-host = 10.123.16.167
format = columns
proxy = fm-proxy.oa.com:8080
EOF

# 检查下 DNS OK 不
dig +time=1 +tries=1 fm-proxy.oa.com
if [ $? -ne 0 ]
then
  echo "Conda installed successfully. But DNS not working."
  echo "It's probably DNS servers are not set in local machine."
  echo "Lookup README to find the solution."
  exit 1
fi

echo "Installation succeed."
#!#INSTALL_PATH/bin/python
# coding=utf8

import argparse
import filecmp
import json
import logging
import os
from pathlib import Path
import shutil
import signal
import subprocess
import sys
import time

GUNICORN_CONF = 'gunicorn_conf.py'
CONDA_BIN = '#INSTALL_PATH/bin/conda'
SUPPLEMENT_PACKAGES = ['gunicorn=19.7.*', 'gevent=1.2.*', 'setproctitle=1.1.*']

logger = logging.getLogger('runner')


def setup_logging():
    logger.setLevel(logging.DEBUG)

    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)

    formatter = logging.Formatter('[%(levelname)s] %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)


def join_args(args):
    """join command arguments mixed with Path and string"""
    return ' '.join(str(x) for x in args)


def get_project_name(project_root):
    """
    从 /usr/local/services/radio_api_server-1.0 中,提取出 radio_api_server。
    织云包发布上的项目名,允许杠杆和下划线。
    """
    return '-'.join(project_root.name.split('-')[:-1])


def test_is_gunicorn_process(pid):
    # 避免用 psutil,这样只用标准库就能运行
    with open(f'/proc/{pid}/comm') as f:
        comm = f.read().strip()

    # comm 会被 truncate 到 16 字节
    return comm.startswith('gunicorn')


def get_conda_env_dir():
    # Preparing conda env
    result = subprocess.run([CONDA_BIN, 'info', '--json'], 
                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    conda_info = json.loads(result.stdout)
    return Path(conda_info['envs_dirs'][0])


def prepare_conda_env(project_env_dir, project_root, project_name):
    env_file = project_root / 'environment.yaml'
    previous_env_file = project_root / 'environment.yaml.latest'

    if project_env_dir.exists():
        if previous_env_file.exists():
            is_same_file = filecmp.cmp(env_file, previous_env_file)
            if is_same_file:
                logger.info("environment.yaml is the same during last deployment. No need to update conda env.")
                return
            
        logger.info('environment.yaml is changed during last deployment. Updating conda env...')
        conda_args = [CONDA_BIN, 'env', 'update', '-n', project_name, '-f', env_file]
        result = subprocess.run(conda_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        logger.info(f'\n{result.stdout.decode()}\n')

        if result.returncode != 0:
            logger.error(f"Update conda env failed. args: {join_args(conda_args)}, return {result.returncode}.")
            sys.exit(1)
        logger.info('Update conda env succeed.')
    else:
        logger.info('Creating conda env...')
        conda_args = [CONDA_BIN, 'env', 'create', '-n', project_name, '-f', env_file]
        result = subprocess.run(conda_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        logger.info(f'\n{result.stdout.decode()}\n')

        if result.returncode != 0:
            logger.error(f"Update conda env failed. args: {join_args(conda_args)}, return {result.returncode}.")
            sys.exit(1)
        logger.info('Create conda env succeed.')

    logger.info(f'Installing gunicorn related packages: {SUPPLEMENT_PACKAGES}...')
    conda_args = [CONDA_BIN, 'install', '-n', project_name, '-y', *SUPPLEMENT_PACKAGES]
    result = subprocess.run(conda_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    logger.info(f'\n{result.stdout.decode()}\n')

    if result.returncode != 0:
        logger.error(f"Install supplement pacakges failed. args: {join_args(conda_args)}, return {result.returncode}.")
        sys.exit(1)
    logger.info('Install supplement pacakges succeed.')

    shutil.copyfile(env_file, previous_env_file)


def deal_with_gunicorn(project_root, project_name, project_env_dir, app_module, command):
    # TODO: log rotation / retention
    var_path = project_root / 'log'
    pid_file_path = var_path / 'gunicorn.pid'
    access_log_path = var_path / 'access.log'
    error_log_path = var_path / 'error.log'

    gunicorn_bin = project_env_dir / 'bin' / 'gunicorn'
    gunicorn_conf_file_path = project_root / 'gunicorn_conf.py'

    if command == 'start':
        if pid_file_path.exists():
            pid = int(pid_file_path.open().read())
            try:
                is_gunicorn = test_is_gunicorn_process(pid)
            except IOError:
                logger.warning('gunicorn pid file exists, but process is gone.')
            else:
                if is_gunicorn:
                    logger.error('gunicorn has already started before.')
                    sys.exit(1)

        start_args = [
            gunicorn_bin, '-c', gunicorn_conf_file_path, '-n', project_name,
            '--pythonpath', project_root, '-p', pid_file_path, '--daemon',
            '--access-logfile', access_log_path, '--error-logfile', error_log_path,
            '--capture-output', app_module,
        ]

        result = subprocess.run(start_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        logger.info('Starting gunicorn...')
        logger.info(f'\n{result.stdout.decode()}\n')

        if result.returncode != 0:
            logger.error(f"Start gunicorn failed. args: {join_args(start_args)}, return {result.returncode}.")
            sys.exit(1)

        logger.info(f"Start gunicorn finished. If things aren't going well, check {error_log_path}.")

    elif command == 'restart':
        deal_with_gunicorn(project_root, project_name, project_env_dir, app_module, 'stop')

        logger.info("Wait a second for gunicorn to exit...")
        time.sleep(5.0)

        deal_with_gunicorn(project_root, project_name, project_env_dir, app_module, 'start')

    elif command in ['reload', 'stop']:
        if not pid_file_path.exists():
            logger.error("gunicorn pid file is missing. May be it't not running?")
            sys.exit(1)
        
        pid = int(pid_file_path.open().read())
        try:
            is_gunicorn = test_is_gunicorn_process(pid)
        except IOError:
            logger.error('gunicorn pid file exists, but process is gone.')
            sys.exit(1)

        if not is_gunicorn:
            logger.error(f'process name of pid {pid} is not gunicorn. Need manual operation.')
            sys.exit(1)

        signal_to_send = dict(reload=signal.SIGHUP, stop=signal.SIGTERM)[command]
        logger.info(f'Sending signal {signal_to_send} to {command} gunicorn process...')
        os.kill(pid, signal_to_send)

        logger.info(f"{command.capitalize()} gunicorn finished. If things aren't going well, check {error_log_path}.")


def main(project_root, command, app_module):
    setup_logging()

    env_file = project_root / 'environment.yaml'
    if not env_file.exists():
        logger.error(f'{env_file} is missing. We need this file to prepare conda env.')
        sys.exit(1)

    gunicorn_conf = project_root / GUNICORN_CONF
    if not gunicorn_conf.exists():
        logger.error(f'{gunicorn_conf} is missing. We need this file to run gunicorn.')
        sys.exit(1)
    
    project_name = get_project_name(project_root)
    project_env_dir = get_conda_env_dir() / project_name   

    prepare_conda_env(project_env_dir, project_root, project_name)

    if command == 'prepare':
        sys.exit(0)
    
    deal_with_gunicorn(project_root, project_name, project_env_dir, app_module, command)


if __name__ == '__main__':
    description = """Task runner based on conda env and config files.

`command' argument should be one of the following:
    start   - start the app, failed if already started
    stop    - stop the app, failed if not running
    restart - basically stop and start
    reload  - restart the app graceful (if applicable)
    prepare - just prepare the conda env and don't do anything else
"""

    parser = argparse.ArgumentParser(description=description,
                                     formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('-p', help='project root dir', required=True)
    parser.add_argument('-t', help='run type', choices=['gunicorn'], required=True)
    parser.add_argument('--app-module', help='app module for gunicorn', required=True)
    parser.add_argument('command', choices=['start', 'stop', 'restart', 'reload', 'prepare'])

    args = parser.parse_args()

    main(Path(args.p), args.command, args.app_module)
`requests`:

```python
import requests

proxies = {
    'http': 'socks5h://user:pass@host:port',
    'https': 'socks5h://user:pass@host:port'
}
requests.post(url, proxies=proxies)
```

`python-telegram-bot`:

```python
import telegram
from telegram.utils.request import Request
from telegram.ext import Updater

# bot 发消息的脚本
bot = telegram.Bot(token='token', request=Request(proxy_url='socks5h://user:pass@host:port'))
bot.send_message(chat_id='chat_id', text='hello')

# bot 服务
updater = Updater(token='token', request_kwargs={'proxy_url': 'socks5h://user:pass@host:port'})
```

!! See Also

* [[Python: Daily Tasks]] 中描述 socks5 代理的部分
* [[Python: URL Handling]]
Python 的 MySQL 库,优先使用 [[mysqlclient|https://github.com/PyMySQL/mysqlclient-python]],条件不支持的话用 [[MySQL-python|https://github.com/farcepest/MySQLdb1]]。

TODO

具体的代码例子,参考 [[这里|https://mysqlclient.readthedocs.io/user_guide.html#mysqldb]] 补充进来。考虑下 `connect` 的各参数,给出一个比较好的实践。

```python
import asyncio

from pyppeteer import launch


async def main():
    browser = await launch({'headless': True, 'args': ['--no-sandbox']})
    page = await browser.newPage()
    await page.setViewport({"width": 1280, "height": 926})
    await page.goto('https://intoli.com/blog/saving-images/')
    await page.waitForSelector('#svg')

    # Select the #svg img element and save the screenshot.
    svg_image = await page.querySelector('#svg')
    await svg_image.screenshot({
        'path': 'logo-screenshot.png',
        'omitBackground': True,
    })

    await browser.close()


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())
```
    
这里通过一段示例代码来描述如何使用 Python 的 puppeteer binding 库 `pyppeteer`。

```python
import asyncio

from pyppeteer import launch


async def main():
    # 启动 Headless Chrome,需要带 `--no-sandbox` 参数,不然会报错
    # 具体原因不详,参考 https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md
    browser = await launch({'headless': True, 'args': ['--no-sandbox']})
    page = await browser.newPage()
    # 注意,不带 headless 参数时,实时的 viewport 大小并不是这个值,可能受各系统 DPI 参数 / UI 缩放等影响
    await page.setViewport({"width": 1366, "height": 768})

    for enterprise in Enterprise.select().where(Enterprise.status == 'pending'):
        print(f"Running {enterprise.name}")

        # 打开网页
        await page.goto('https://www.szcredit.org.cn/web/index.html')
        # 聚焦
        await page.focus('input[name="txtKeyword"]')
        # 输入
        await page.type('input[name="txtKeyword"]', enterprise.name)
        # 点击按钮
        await page.click('#btnSend')

        # 由于点完按钮会发 AJAX 请求显示验证码,这里强行等 2 秒
        await page.waitFor(2000)

        # 由于 headless 和非 headless 模式下 viewport 不一,为了调试,只好弄两套 clip 参数
        headless_clip = {'x': 550, 'y': 250, 'width': 320, 'height': 175}
        not_headless_clip = {'x': 550, 'y': 250, 'width': 320, 'height': 175}
        clip = headless_clip if HEADLESS else not_headless_clip

        # 截图,即可截全图、滚动截图(加上参数 fullPage: True),也可只截一块;保存在 code.png 上
        # WARNING: 这段代码是为了截验证码图片,但它不是好的实践。参考 wiki 中截取图片的内容
        await page.screenshot({'path': 'code.png', 'clip': clip})

        code = input("Verify Code: ")

        # 网页用了 iframe,从 frame 列表中找到你要的那个
        verify_code_frame = [f for f in page.frames if f.url.endswith('/web/GSPT/ShowCheckCode.aspx')][0]
        await verify_code_frame.focus('#txtCheckCode')
        await verify_code_frame.type('#txtCheckCode', code)
        await page.click('.layui-layer-btn0')
        # 点上面按钮后会有新 tab 弹出,等待加载完成
        await page.waitForNavigation()

        # 等待特定的 DOM 元素出现,但是效果似乎不是想象中的
        await page.waitForSelector('#result', {'visible': True})
        await page.waitFor(2000)

        # 这段代码演示如何从网页结构中提取数据,比较纠结
        anchors = await page.querySelectorAll("#result a")
        for anchor in anchors:
            info = await page.evaluate('(anchor) => Object({"href": anchor.href, "text": anchor.innerText})', anchor)
            if info['text'] == enterprise.name:
                enterprise.sz_credit_url = info['href']
                enterprise.status = 'success'
                print(f"URL of {enterprise.name} saved: {enterprise.sz_credit_url}")
                break
        else:
            enterprise.status = 'skipped'
        enterprise.save()


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())
```

判断某一 xpath 在页面中是否存在:

```python
anchors = await page.xpath(f'//a[text()="股东登记信息"]')
if anchors:
    print("Exists")
else:
    print("Not exists")
```
对于点击 `<a target='_blank'>` 标签打开新 tab 页的场景,Puppeteer目前(2019-03,v1.13.0)没有现成的 API 支持。因此需要一些 walkaround 来解决。有几个方案。

!! 提取 `href`,手动打开新 page 去访问

```python
url = await page.evaluate('() => $("a").attr("href")')
detail_page = await browser.newPage()
# goto 带了 waitForNavigation 的作用
await detail_page.goto(detail_page_url)
```

!! 使用点击,再去轮徇 pages

代码如下。这个方案的问题在于,拿到 `detail_page` 时并不知道页面是否 `load` 完成了,在这个时候调用 `.waitForNavigation()` 可能会超时报错(因为没有 `load` 事件被 fire)。如果页面有 AJAX 请求,你可能需要写额外的 `waitForSelector` 来确保你要的数据已经在页面上。

```python
# 点击完后出现新 tab 页
await page.click(f'#panel-5 tr:nth-child({index + 1}) a')

# 等新 Tab 页 ready,即 pages 中有新 tab 页。由于没有现成 API,只能靠等
detail_page = None
for i in range(5):
    pages = await browser.pages()
    try:
        detail_page = next(page for page in pages if 'biangeng.html' in page.url)
    except StopIteration:
        await asyncio.sleep(1)
    else:
        break
if detail_page is None:
    msg = "New page did not show up or show up so slowly."
    logger.error(msg)
    raise Exception(msg)
```
下面的代码来自给晓冰做 [[工商信息截图|https://github.com/onlyice/take-szmqs-screenshots]] 时制作的 bot。

当时使用的 `python-telegram-bot` 库是 1.11 版,但是 1.12 已经进入了 beta。1.12 对 API 做了 ''比较多的调整''。下面的代码可能不如官方文档有参考价值。

同时注意下代码中使用 `socks5h://` 的原因。

!! Bot Service

```python
import logging

import requests
from celery import chain
from requests import RequestException
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
from telegram.ext import Updater, CommandHandler, Filters, MessageHandler, CallbackQueryHandler

import utils
from tasks import capture, send_mail, on_error
from utils import TELEGRAM_TOKEN

REQUEST_KWARGS = {
    'proxy_url': 'socks5h://127.0.0.1:1080',
}

logger = logging.getLogger('telegram_app')

updater = Updater(token=TELEGRAM_TOKEN, request_kwargs=REQUEST_KWARGS)
dispatcher = updater.dispatcher
queue = updater.job_queue


def start(bot, update):
    markup = InlineKeyboardMarkup(
        [[InlineKeyboardButton('截工商信息', callback_data='screenshot_instruction')]]
    )
    bot.send_message(chat_id=update.message.chat_id, text="欢迎使用 🌈⛈🎉🌹🐧😊", reply_markup=markup)


def test(bot, update, args):
    company_name = ''.join(args).strip()
    (capture.si(company_name, update.message.chat_id))()


def screenshot_instruction(bot, update):
    query = update.callback_query

    bot.edit_message_text(text="请直接输入公司名称🐧",
                          chat_id=query.message.chat_id,
                          message_id=query.message.message_id)


def kiss(bot, update):
    query = update.callback_query

    bot.edit_message_text(text="😘😘😘",
                          chat_id=query.message.chat_id,
                          message_id=query.message.message_id)


def screenshot(bot, update):
    company_name = update.message.text.strip()

    s = requests.Session()

    ua_headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}

    # 种 Cookie
    r = s.get('https://app02.szmqs.gov.cn/outer/entSelect/gs.html', headers=ua_headers)
    r.raise_for_status()

    # 查公司存不存在
    url = 'https://app02.szmqs.gov.cn/outer/entEnt/detail.do'
    headers = dict(
        Origin='https://app02.szmqs.gov.cn',
        Referer='https://app02.szmqs.gov.cn/outer/entSelect/gs.html',
        **ua_headers
    )
    data = {'unifsocicrediden': '', 'entname': company_name, 'flag': 1}
    r = s.post(url, headers=headers, data=data)

    chat_id = update.message.chat_id
    try:
        r.raise_for_status()
        # 不存在时返回 {"data":[{"data":[],"name":"data","vtype":"attr"}]}
        if not r.json()['data'][0]['data']:
            bot.send_message(chat_id=chat_id, text="公司不存在,请确定输入是否正确 😞")
        else:
            chain(
                capture.si(company_name, chat_id).on_error(on_error.s()),
                send_mail.si(company_name, chat_id).on_error(on_error.s())
            )()
            bot.send_message(chat_id=chat_id, text="截图抓取中,稍后以邮件发送结果🐧")
    except (RequestException, KeyError) as e:
        logger.exception(e)
        bot.send_message(chat_id=chat_id, text="查询公司失败,请重试 😞")


def main():
    dispatcher.add_handler(CommandHandler('start', start))
    dispatcher.add_handler(CommandHandler('test', test, pass_args=True))

    dispatcher.add_handler(CallbackQueryHandler(screenshot_instruction, pattern='screenshot_instruction'))
    dispatcher.add_handler(CallbackQueryHandler(kiss, pattern='heart'))

    dispatcher.add_handler(MessageHandler(Filters.text, screenshot))

    updater.start_polling()


if __name__ == '__main__':
    utils.setup_logging('telegram_app')
    main()
```

!! Sending Message Script

```
import telegram
from telegram.utils.request import Request

# bot 发消息的脚本
bot = telegram.Bot(token='token', request=Request(proxy_url='socks5h://user:pass@host:port'))
bot.send_message(chat_id='chat_id', text='hello')
```
没有给 Bash / Zsh 等单独开分类。因为它们作为一门语言的能力实在是太弱了(比如连个浮点数运算都没有,只能操作整数),必须跟大量的工具一起工作才有价值。

Bash cheetsheet: https://devhints.io/bash

Bash 做算术运算。

!! Floating Point

Bash 本身无法支持符点数运算,需要结合 `bc` 做:

```bash
# scale 表示精确到几位小数,不是四舍五入,而是直接字符串截断
$ echo "scale=2; 1/8" | bc
.12
$ bc <<< "scale=3; 12.2 * 8"
97.6
```

`bc` 对于小于 1 的浮点数,不输出小数点前的 0。可以用 `printf` 来输出:

```bash
$ printf "%.3f\n" "$(echo "scale=3; 1/8" | bc)"
0.125
```
你有个文件,你想备份它,并且让备份后的文件名带有时间信息:

```bash
cp a.jar{,."$(date +%Y%m%d%H%M)"}
```

结果是类似 `a.jar.201805251938`。

可以写一个 Bash 函数:

```bash
function backup() {
   cp $1{,."$(date +%Y%m%d%H%M)"}
 }
```

使用:

```bash
$ backup <your-file-name>
```
`dos2unix` 可以修改 line ending,同时它只会修改文本文件,不会修改二进制文件:

```bash
dos2unix <file_path>
```

整个目录改 line ending:

```bash
find ./ -type f -exec dos2unix {} \;
```
使用 `iconv` 转换文件的编码。常见的任务是将 GBK 转成 UTF-8:

```
iconv -f gbk -t utf8 "$file" >"$file.new" &&
    mv -f "$file.new" "$file"
```

我在 `~/.zshrc.local` 中定义了一个函数:

```shell
function iconv-gbk-to-utf8-inplace() {
    iconv -f gbk -t utf8 "$1" >"$1.new" && mv -f "$1.new" "$1"
}
```

使用方法:

```shell
$ iconv-gbk-to-utf8-inplace <your-file>
```
```bash
# Add command to crontab
(crontab -l; echo "*/5 * * * * perl /home/mobman/test.pl") | crontab -
 
# Remove it
crontab -l | grep -v 'perl /home/mobman/test.pl' | crontab -
```
`set -e` 或者 `set -o errexit` 指出错时脚本立即退出,但是有很多 [[奇奇怪怪的问题|http://mywiki.wooledge.org/BashFAQ/105]]。

`set -x` 或者 `bash -x <script.sh>` 可以打印详细的执行信息。
```
find /path/to/files/ -type f -name '*.jpg' -mtime +30 -exec rm {} \;
```

`-mtime +30` 表示文件已经有至少 30 天这么旧。
获取你所运行的脚本所在的目录:

```bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
```

然后可以 `cd` 进去。
如果你有一个文件,或者一串字符串,想看看它的十六进制表示,你可以用 `xxd` 命令。它在 `vim` 的包里面。

```bash
echo example | xxd
cat <your-file> | xxd -p
```
这个 snippet 描述在 Bash 脚本中如何提供给用户选项,并让用户选择。

```bash
PS3="Which distro you're currently using: "
options=("CentOS 7" "RHEL 7 / Oracle Linux 7")
select opt in "${options[@]}"
do
    case $opt in
        "CentOS 7")
            echo "> Installing mariadb client tools..."
            yum -Cy install $SRC_DIR/mariadb/el7/mariadb-*
            break
            ;;
        "RHEL 7 / Oracle Linux 7")
            echo "> Installing mysql client tools..."
            yum -Cy install $SRC_DIR/mysql/el7/mysql-community-{client,common,libs}-*
            break
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done
```
sed 是一个通用的文本操作工具,它可以对文件 in-place find and replace,但是它不是一个 template engine。Sed 在自己的 [[script 格式|https://www.gnu.org/software/sed/manual/sed.html#Command_002dLine-Options]] 中使用了大量的特殊字符来做控制功能。所以在用 sed 做模板替换时,需要考虑几点。

!! 用什么方式表示模板中要被替换的变量?

这个 [[SO 回答|https://stackoverflow.com/a/8842048/1189076]] 提供了一种机制:

```bash
sed -e "s/:param1:/$param1/g" \
    -e "s/:param2:/$param2/g" \
    -e "s/:param3:/$param3/g" \
    httpd.conf.template > $HTTPDHOME/etc/httpd.conf
```

我觉得简明有效。这里对 `:param1:` 这种替换名的格式选择,需要避开 sed 本身的 [[控制字符|https://unix.stackexchange.com/questions/32907/what-characters-do-i-need-to-escape-when-using-sed-in-a-sh-script]]。

!! 模板中变量的值是否跟 sed 的控制字符冲突?

我还不知道,后面遇到了这类使用场景再考虑。
|!Name |软技能 - 代码之外的生存指南 |
|!Author |[美] John Sonmez [译] 王小刚 |
|!Edition |N/A |
|!Release Date |June, 2016 |
|!ISBN-13 |978-7115429476 |
|!Medium |多看阅读 |
|!Rating |{{!!rating}} |

这本书我是在多看上看完的。上面有相应的读书笔记。

里面提到的点大多数未具体落实成方法。
各种使用场景下的最佳软件和相关经验。

大的话题,例如 [[知识管理|Knowledge Management]],[[数据备份|Data Backup]],不列出这个分类内。


软件工程相关的流程、实践。

* [[需求分析|Requirements Analysis]]
* [[绘制图表|Making Diagrams]]
使用一些软件库时(比如 Vue.js,Poco 等)遇到问题,可以考虑几方面去查找解决办法。

首先还是查 Google。目前看 Google 对软件库的官方文档、StackOverflow 的结果权重比较大。大多数库的官方文档并没有写得像 Django、ArchWiki 这样详细,可能查不出什么东西来。StackOverflow 也有自己的一些局限,见下文讨论。

其次是查这个项目的 Issue / Bug Tracker,以及邮件列表、论坛。你遇到的问题往往也有别人遇到,并且提出来做了讨论。Google 对这类信息的权重不高,很少能在 Google 中搜到 GitHub 的 Issue,或者邮件列表的内容。所以需要你主动去了解使用的软件库做讨论的地方。

最后,实在搞不定了,可以去技术社区发帖问人。不过我没尝试过这种方式,不知道效果如何。

!! StackOverflow

StackOverflow 适合的场景是:

# 常用语言的入门问题,比如 Python 的 generator 怎么用,C++ 的 STL 的使用方法、陷阱等
# 非常流行的软件库,比如 jQuery、Python 标准库的一些用法和疑难
# 容易精确描述的问题,比如某个函数的出错信息
# C / C++ 的语言实现细节。这个社区实在很喜欢讨论这些东西

StackOverflow 不适用的场景:

# 不容易描述的问题,往往 Google / StackOverflow 搜索出来的结果不是太理想
# 小众 / 高端的语言、软件库等
[[李松蔚:人际互动的奥秘|https://www.zhihu.com/lives/752271603613564928]] 这期 Live 主要讲了两个处理人际关系上的思维。李松蔚将 Live 中讲的这两点又单独发了两篇文章:

# [[影响力是一个虚妄的说法|https://zhuanlan.zhihu.com/p/22483566]]
# [[每个人都只能为自己负责|https://zhuanlan.zhihu.com/p/22783831]]

这两篇文章的论述覆盖了 Live 的大部分内容。

!! 影响力是一个虚妄的说法

这篇文章的主要价值是,论述了这个道理:

> 互动最基本的定义是,''一定有双方或多方角色的参与'',不是单方面的事。
> 社交是一个双方的游戏,而不是你的单人舞。

为了方便理解,他又提出了一个概念,叫 ''授权'':

> 你打开手机,点进一个app,就在授权这个app占用你的时间。
> 看一篇文章,就在授权这篇文章影响你的思想。
> 听我讲这场 Live,你就在授权我成为这一刻的讲者。

我不太喜欢 ''授权'' 这个概念,感觉它不够直观,似乎抹杀了作为互动一方的 ''我'' 的做为,而只有对方在实际做出影响。但是这个概念它的实际意义在于,他强调了互动时并不只是对方在完全主导,而你的授权也起了巨大的作用。这有助于思考自己在其中的意义。

!! 每个人都只能为自己负责

这一部分很有意思。

人际互动的元规则:

> ''在人际互动中,你可以做一切事情,但无法控制这么做的结果。''
> 你可以犯法,可以违反道德,而你会为此承担后果。

同时有第二条原规则:

> ''我们永远不可能真正知道别人是怎么想的。''
> 要知道,别人告诉了你他的想法之后,你仍然不能判断他说的是不是真话——除非你「相信」他说的是真话。所以表面上我们通过沟通,了解到对方的想法,事实上我们了解的只是对方的「说法」。从说法到对方的内心世界之间,是永远不能穿越的一层屏障。

所以:

> 所以,第二条元规则的推论就是,你自己的感受才是你唯一可以确定的一点,在心理咨询中,就会在这一点上做大量工作。如果前面讲课的例子发生在一个来访者身上,他说学生在睡觉,咨询师就会问他的感觉如何,他说我觉得学生不喜欢我,但这都是他的猜测。咨询师会进一步追问——注意这个提问:「''如果你觉得'' 大家不喜欢你,这对你意味着什么?」
> 记住这个问题:「''这对你意味着什么?''」在之后的部分,当我们讨论一些复杂的人际现象时,我们会反复回到这个问题。在一个人际互动中,你真正能看到并且把握的只有你自己的感受,由此得出的推论是:你只需要为自己的感受负责,也只能为自己的感受负责。阿德勒把这一点称为课题分离,他认为,每个人在互动中的一切行为,都是在''为了自己''。

例子:

> 这个说法常常引起广泛的误解。有人说,这岂不是在倡导自我中心?哪怕你让别人不舒服了,你也不用管他,只要把你自己照顾好就行?这算什么呢?其实,这不是说我们不用「管」别人的感受。如果我做的事「可能」让对方不舒服,我会感觉到内疚或者担心,然后会考虑做一些事情去补偿。但我并不确定对方是不是真的不舒服,我补偿的是什么呢?
> 如前所述,我确定的只有自己的内疚或担心。
> 我补偿的并非对方的不舒服,而是我本人的负面感受。从课题分离的角度来看,我的补偿——不管我有多相信它是为了对方——本质上只是我在处理我自己的感受。
> 「我为我自己负责,你为你自己负责」<<footnote "[1]" "理解为:「我为我自己的感受负责,你为你自己的感受负责」">>

这个道理叫作:你为他人做的行为,本质上都是为了你自己的感受。

文末「初夏」写得很好:

> “每个人只能为自己负责”,最初得知这一观点时,觉得甚是有理。过往困扰我的人和事,斩断七七八八,只去琢磨自己的感受,也就清晰明了。但,如何用这句话处理当下的亲密关系呢?大多数负性事件中,人是非理性的,即便道理是对的,感受上也似乎觉得有些疏离。而对于亲密关系,感受往往比道理更重要。“你说我应该为自己的感受负责,但我现在很难受,我不知道该怎么办?(潜台词:你不管我了吗?)”如此非理性的诉求,跨越界限要求对方为自己的感受负责,是否要拒绝?后来我想明白了一点,“我们只能为自己负责”这句话,在当下的亲密关系中的意义,不在于做什么或不做什么,而是明确,我所做的一切都是出于自愿,满足自己的需求。以此减少自己的攻击性,避免更坏更混乱的结果。继续上面的例子,若我想满足自己想要“缓解矛盾/帮助对方处理自己的感受”的意愿,我这么做了,但结果变的更糟。没关系,我是出于自己的意愿,而不是“为了她/他”,因此也不会因对方不领情而激发愤怒等攻击性的情绪。我可以继续根据自己的意愿做其他的努力,或者我改变自己的意愿。另外,“我们只能为自己负责”这句话对个人意义非凡。我们能够更清晰的看到自己,认识自己,改善自己。

注意「每个人只能为自己负责」更多地是一种自省,而不是用来要求其他人的道德准则。
|!Name |Speaking JavaScript |
|!Author |Axel Rauschmayer |
|!Edition |1st |
|!Release Date |February 2014 |
|!ISBN-13 |978-1-4493-6503-5 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |

看完第八章。后面的内容我觉得不用看了,当参考书翻就好了。重点学习下 ES6 然后开始写代码。

!! 历史原因

JavaScript 参考了很多语言的特性,所以它是个杂揉体。很多时候,学习 JavaScript 不止是学语言特性本身,还有学习它的 ''common pattern''。

JavsScript 在 ES3 之前没有异常处理机制,所以它的语言特性里面,遍布了各类隐式转换和 failed silently。比如:

```js
>>> '1' < 3          // true
>>> 1/0              // Infinity
>>> Number("abcd")   // NaN
```

从规范上看,JS 中的数字都是浮点数(`1.0 === 1`),但是 JS 解释器为了效率,会在内部实现上尽量用整型。

!! Closure

> A closure is a function plus the connection to the variables of its surrounding scopes.
> From //Speaking JavaScript//

!!! The IIFE Pattern: Introducing a New Scope

IIFE (immediately invoked function expression, pronounced “iffy”),可以用来创建一个 Scope。

```js
var result = [];
for (var i=0; i < 5; i++) {
    result.push(function () { return i });  // (1)
}
console.log(result[1]()); // 5 (not 1)
console.log(result[3]()); // 5 (not 3)

for (var i=0; i < 5; i++) {
    (function () {
        var i2 = i; // copy current i
        result.push(function () { return i2 });
    }());
}
```

ES6 引入了 `let` 替代 `var` 以实现 block scope。

!! Expressions vs Statements

Expression 是指可以返回一个右值的式子,如 `myvar`,`1+2`。Statement 表示一个行为,它往往是由 expression 组成的。比如 `var salutation;` 是一行 statement,它由一个 declaration expression 组成。

!!! Using ambiguous expressions as statements

有些语句可能有歧义:

```js
// 既可以表示一个有 foo 属性的 Object,
// 也可以表示一个 block,里面有一个 label foo 调用了 bar(3, 5)。
{
    foo: bar(3, 5)
}
```

```js
// 既可以表示一个 Named Function Expression,返回一个函数对象,
// 也可以表示一个函数声明,给 foo 变量赋值为一个函数。
function foo() {}
```

所以 JS 规范要求,一个 expression statement 必须:

# 不以大括号开头
# 不以 `function` 关键字开头

这会有一些影响,比如你向 `eval` 传递一个 Object literal 时,必须用括号包起来:

```js
> eval('{ foo: 123 }')
123
> eval('({ foo: 123 })')
{ foo: 123 }
```

比如你用 IIFE (Immediately Invoked function expression) 时,必须这样写:

```js
> (function () { return 'abc' }())
'abc'

// 函数声明需要一个函数名
> function () { return 'abc' }()
SyntaxError: function statement requires a name

// 函数声明不能马上被调用
> function foo() { return 'abc' }()
SyntaxError: Unexpected token )
```

!! Automatic Semicolon Insertion

JS 解析器提供了一种自动插入分号的机制,用来使分号变成可选的。它判断是否需要插入分号有这几个依据:

* A line terminator (e.g., a newline) is followed by an illegal token.
* A closing brace is encountered.
* The end of the file has been reached.

比如:

```js
if (a < 0) a = 0
console.log(a)

// a = 0 后不能出现 console
// console 一行是文件尾
if (a < 0) a = 0;
console.log(a);
```

```js
function add(a,b) { return a+b }
function add(a,b) { return a+b; }    // closing brace
```

这种机制可能会带来一些问题:

```js
return
{
    name: 'John'
};

// 转换成下面的代码:
// 返回 undefined;然后跟着一个块,块里面有一个 label 叫 name
return;
{
    name: 'John'
};
```

```js
func()
[ 'ul', 'ol' ].foreach(function (t) { handleTag(t) })

// 转换成下面的代码:
// 'ul', 'ol' 被逗号表达式了,返回 'ol'
// JS 解析器认为 func() 可能返回一个对象,可以取它的 'ul' 属性
func()['ol'].foreach(function (t) { handleTag(t) });
```

对于 JS 这种语法设计不够精妙的语言来讲,''最好是自己加分号'',不要相信解析器(它也没办法做到精准)。

!! Types, Primitives, Wrapping and Unwrapping Primitives

JavaScript 有六种类型,分别是:`bool`, `number`, `string`, `object`, `null`, `undefined`,其中除了 `object` 其他五种都被叫做 Primitive Values。`bool`, `number`, `string` 有对应的 Wrapper Object Class,分别是 `Boolean`, `Number`, `String`。

```js
> String(123)    // number 转换成 string
'123'
> let a = new String(123)     // 定义一个 String 类实例
> a
[String: '123']
> a.valueOf()    // String 类实例 unwrap 成 primitive
'123'
> a === '123'     // primitives 与 object 作比较时永远不相等
false
```
还没深入学,内容待组织,可能会很乱。

摘录自这个 [Stack Overflow 答案](https://stackoverflow.com/questions/35856454/difference-between-interceptor-and-filter-in-spring-mvc):

Quoting from `HandlerIntercepter`'s [javadoc][1]:

> `HandlerInterceptor` is basically similar to a Servlet `Filter`, but in
> contrast to the latter it just allows custom pre-processing with the
> option of prohibiting the execution of the handler itself, and custom
> post-processing. Filters are more powerful, for example they allow for
> exchanging the request and response objects that are handed down the
> chain. Note that a filter gets configured in `web.xml`, a
> `HandlerInterceptor` in the application context.
> 
> As a basic guideline, fine-grained handler-related preprocessing tasks
> are candidates for `HandlerInterceptor` implementations, especially
> factored-out common handler code and authorization checks. On the
> other hand, a `Filter` is well-suited for request content and view
> content handling, like multipart forms and GZIP compression. This
> typically shows when one needs to map the filter to certain content
> types (e.g. images), or to all requests.

With that being said:

> So where is the difference between PostHandle() in Interceptor and
> doFilter() in Filter?

`postHandle` will be called after handler method invocation but before the view being rendered. So, you can add more model objects to the view but you can **not** change the `HttpServletResponse`, since it has already committed. `doFilter` is much more versatile than the `postHandle`. You can change the request or response and pass it to the chain or even block the request processing.

Also, in `preHandle` and `postHandle` methods you have access to the `HandlerMethod` that processed the request. So, you can add pre-post processing logic based on the handler itself. For example, you can add a logic for handler methods that have some annotations.

> What is the best practise in which use cases it should be used?

As the doc said,  fine-grained handler-related preprocessing tasks are candidates for `HandlerInterceptor` implementations, especially factored-out common handler code and authorization checks. On the other hand, a `Filter` is well-suited for request content and view content handling, like multipart forms and GZIP compression. This typically shows when one needs to map the filter to certain content types (e.g. images), or to all requests.
根据 Spring [[文档|https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files]] 及这个 StackOverflow [[回答|https://stackoverflow.com/a/26142103/1189076]],Spring Boot 默认会去依次这几个地方找外置配置文件(`.properties` / `.yml`):

# A `/config` subdirectory of the current directory
# The current directory
# A classpath `/config` package
# The classpath root

这个「外置配置文件」对应这个 [[文档|https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html]] 中的「Application properties outside of your packaged jar (application.properties and YAML variants)」。
如果一个文件在 classpath 上,你可以:

```java
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("fileTest.txt");
String data = readFromInputStream(inputStream);
```

你也可以用 Spring 的 `@Value` 注解:

```java
import org.springframework.core.io.Resource;

@Component
public class MyClass {
    @Value("classpath:data/resource-data.txt")
    private Resource resourceFile;
}
```

对于 `@Value` 中的 "classpath:data/resource-data.txt" 串,也可以用 "file:somefile.txt" 实现不同的效果。

!! 参考

* [[Spring Core 文档|https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#resources]]
Spring 提供了一种各种按条件注入 Bean / Configuration 的机制,如 `@ConditionalOnProperty`:

```java
@Component
@ConditionalOnProperty(value = "test.configname", havingValue = "value1")
public class HarborImageProxy implements IStandardImageProxy {
    // ...
}
```

当你有多个条件组合时,可以用这几个类:

* [[AllNestedConditions|https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/AllNestedConditions.html]]:当多个条件同时成立
* [[AnyNestedCondition|https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/AnyNestedCondition.html]]:当多个条件任一成立
* [[NoneNestedConditions|https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/NoneNestedConditions.html]]:当多个条件都不成立

代码示例可以看各类的 Javadoc。这里举一例:

```java
// Condition 定义
class ConfigNameCondition extends AnyNestedCondition {
    public ConfigNameCondition() {
        super(ConfigurationPhase.PARSE_CONFIGURATION);
    }

    @ConditionalOnProperty(name = "test.configname", value = "value1")
    static class Value1Condition {
    }

    @ConditionalOnProperty(name = "test.configname", value = "value2")
    static class Value2Condition {
    }
}

// Condition 使用
@Bean
@Conditional(ConfigNameCondition.class)
public SomeBean someBean() {
    return new SomeBean();
}
```
!! include 机制

Spring 提供了一个 `spring.profiles.include` [[机制|https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html]],用于将不同的 profile 包含进来,类似文本替换。这套机制在你使用 `.properties` 时没有什么问题,但是当你使用 yaml 来作为配置格式时,就会有问题。

比如你有这么 3 个配置文件:

```yml
# application-test1.yml
root:
  a: 1

# application-test2.yml
root:
  b: 2

# application.yml
root:
  whatever: 3
```

你使用 `spring.profiles.include=test1,test2`,想让 `root` 下面有 3 个属性(`a`, `b`, `whatever`),但是事实上按加载顺序做覆盖,而没有把几颗树合并。于是最后 `root` 下面只有一个属性(具体哪一个我也没做实验)。

如果你想避开这个问题,可以把 `test1`, `test2` 的配置文件使用 `.properties` 格式。生命不应该浪费给调试 Spring Profile 的加载逻辑。
<<.todo "看到 PG 文档第 [[7.3|https://www.postgresql.org/docs/current/queries-select-lists.html]] 章(7.3 未看)。">>

这里的内容大多数是读 PostgreSQL 文档时录入的。语法上可能会带 PG 方言。

如果想看 SQL 的全局脉络,去 PostgreSQL 的 [[文档索引|https://www.postgresql.org/docs/current/sql.html]]。

Learning PostgreSQL Docs:

* 跳过:
** 4.2 Value Expressions:里面讲的 expression,后面很多都会讲
** 4.3 Calling Functions:感觉我使用函数的场景不多。后面也应该会讲函数

|!Name |SQL Antipatterns: Avoiding the Pitfalls of Database Programming |
|!Author |Bill Karwin |
|!Edition |1st |
|!Release Date |May 2010 |
|!ISBN-13 |978-1-93435-655-5 |
|!Medium |电子书 |

! Chapter 1: Introduction

This chapter talks about the structure of this book, what's this book trying to explain and what's not. And an example database is provided for future use.
! Chapter 2: Jaywalking

* Objective: Store Multivalue Attributes
* Antipattern: Format Comma-Separated Lists

```sql
CREATE TABLE Products (
product_id
 SERIAL PRIMARY KEY,
product_name VARCHAR(1000),
account_id
 VARCHAR(100), -- comma-separated list
-- . . .
);
```

This chapter explains why using a comma-separated lists to store multivalue data is a bad practice by providing many case:

* Querying Products for a Specific Account
** `SELECT * FROM Products WHERE account_id REGEXP '[[:<:]]12[[:>:]]' ;`
* Querying Accounts for a Given Product
* Querying Products for a Specific Account
* Making Aggregate Queries
* ...

The solution is to create ''an intersection table''.

The best part of this chapter is that the author is telling you how to think about a specific design is suitable or not. By providing use cases, you can compare two choices of design and consider which one is better.
聚合函数(aggregate functions)。

!! 不能被使用在 where 从句中

因为 where 是用来判断哪些行被包含在聚合计算中,它必须发生在聚合计算的前面:

```sql
-- Wrong: Aggregate functions can not be used in where clause
SELECT city FROM weather WHERE temp_lo = max(temp_lo);
```

!! WHERE 与 HAVING 的差别

```sql
SELECT city, max(temp_lo)
   FROM weather
   WHERE city LIKE 'S%'
   GROUP BY city
   HAVING max(temp_lo) < 40;
```

* ''WHERE'' 筛选输入的行,再将这些行用来做聚合运算和分组(group by)
* ''HAVING'' 则是筛选分组后的行;HAVING 语句中应该只用聚合函数作为条件判断,例如上面的 `max(temp_lo)`
!! Default Value <<.p1>>

```sql
CREATE TABLE products (
    product_no SERIAL,
    name text,
    price numeric DEFAULT 9.99
);
```

`SERIAL` 是 PostgreSQL 的自增 integer。`DEFAULT` 关键字指定了默认值;如果没有 `DEFAULT`,`INSERT INTO` 如果不给值,列的默认值为 null。

!! Generated Columns <<.p3>>

一个字段是根据另一字段计算而来。感觉不实用。

```sql
CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
```

!! Constraint <<.p1>>

See [[SQL: Data Definition: Constraint]].

!! System Columns <<.p3>>

有部分名字被系统所保留,不能作为列名。具体看 [[文档|https://www.postgresql.org/docs/current/ddl-system-columns.html]]。

!! Modifying Tables <<.p1>>

没有多少需要理解的内容。具体操作方法看 [[文档|https://www.postgresql.org/docs/current/ddl-alter.html]]。

!! Privileges <<.p2>>

数据库系统,可以针对 object(如表、库、函数等)做权限控制。比如可以使你可以读写某一个表,但是其他人只能读。

PG 提供了一个 ''特殊的角色 PUBLIC''。对 PUBLIC 授权的能力,会对所有角色都可用。

具体的命令、可以控制的粒度,看 [[PG 文档|https://www.postgresql.org/docs/current/ddl-priv.html]]。这里不做细化。

!! Row Security Policies <<.p3>>

不重要,略。

!! Schemas <<.p1>>

<<.center "Cluster > Database > Schema > Table">>

每一个 PG 的 cluster(一个或者多个 server 组成的 PG 服务),包含多个 database。每个 database 可以有多个 schema,也都包含默认的 ''public'' schema。Schema 中包含 tables。

一个客户端(psql、client library 等)一次只能访问一个 database。

具体的 SQL 语句,看 [[PG 文档|https://www.postgresql.org/docs/current/ddl-schemas.html]]。

!!! Search Path <<.p3>>

一般在写 SQL 或者写程序时,你需要使用 `schema.table` 这种方式来指定一张表,如 `ecomerce.products`。如果没有带 schema 名,则默认先搜同用户名的 schema,再搜 public。`SHOW search_path;` 可以看到搜索路径:

```sql
 search_path
--------------
 "$user", public
```

比如对于 `SELECT * FROM product`,如果你连接上数据库的用户名是 joe,数据库会先尝试搜 `joe.product`;没有的话再找 `public.product`。

!! Inheritance <<.p3>>

PG 提供了 table 继承的能力。感觉不实用。略过。

!! Table Partitioning <<.p2>>

See [[SQL: Data Definition: Table Partitioning]].

!! Foreign Data / Other Database Objects <<.p3>>

PG 的这两节文档没有看,不太重要。

!! Dependency Tracking <<.p2>>

数据库中各种 object 会互相依赖,比如某个表可能被另外一个表中的外键所依赖:

```sql
DROP TABLE products;

ERROR:  cannot drop table products because other objects depend on it
DETAIL:  constraint orders_product_no_fkey on table orders depends on table products
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
```

你可以给 DROP 语句加上 `CASCADE`,这样会把上面例子 DETAIL 中的描述的对象全部删掉。在这个例子中会删掉 orders_product_no_fkey 这个外键约束:

```sql
DROP TABLE products CASCADE;
```
!! Check Constraint <<.p3>>

```sql
CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0),
    discounted_price numeric CHECK (discounted_price > 0),
    CHECK (price > discounted_price)
);
```

最后一行 `CHECK` 是一条 table constraint。上面的两个 `CHECK` 是 column constraint。功能是一样的。

!! Not-Null Constraints <<.p1>>

列默认是 `NULL` 的。加 `NOT NULL` 要求它不能为空:

```sql
CREATE TABLE products (
    product_no integer NOT NULL,
    name text NOT NULL,
    price numeric
);
```

!! Unique Constraints <<.p1>>

单列唯一:

```sql
CREATE TABLE products (
    product_no integer UNIQUE,
    name text,
    price numeric
);
```

多列唯一:

```sql
CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    UNIQUE (a, c)
);
```

给 constraint 加上名字:

```sql
CREATE TABLE products (
    product_no integer CONSTRAINT must_be_different UNIQUE,
    name text,
    price numeric
);
```

''注意'':对于 PG、MySQL 及 SQL 标准来说,NULL 间是互不相等的。意味着如果 unique constraint 中有一列的值可以是 NULL,那可能会有重复的数值出现。

!! Primary Keys <<.p1>>

PRIMARY KEY = UNIQUE + NOT NULL

```sql
CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);
```

Multi-column primary keys:

```sql
CREATE TABLE example (
    a integer,
    b integer,
    c integer,
    PRIMARY KEY (a, c)
);
```

!! Foreign Keys <<.p1>>

```sql
CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    product_no integer REFERENCES products (product_no),
    quantity integer
);
```

`REFERENCES` 表示外键。`products (product_no)` 中 `(product_no)` 可以省略,省略时表示默认使用 products 表的主键。

多列外键,使用 table constraint 来表达:

```
CREATE TABLE t1 (
  a integer PRIMARY KEY,
  b integer,
  c integer,
  FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
);
```

多个外键以实现多对多关系,如下示例的 order_items 表:

```sql
CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products,
    order_id integer REFERENCES orders,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);
```

外键存在时,对删除的控制:

```sql
CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    order_id integer REFERENCES orders ON DELETE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);
```

其中:

* 对 product_no 启用的 RESTRICT:表示当 order_items 中还存在某一 product 时,这个 product 无法在 products 表中被删除
* 对 order_id 启用的 CASCADE:表示当 orders 表中某一 order 被删除时,它相关的 order_items 行也会被删除

此外还有跟 RESTRICT 非常像的 NO ACTION(不深究,使用 RESTRICT 即可);以及 SET DEFAULT 和 SET NULL。后两者表示 referenced row 一旦被删,则 referencing row 中相应的字段设为默认值或者 NULL;比如 product 被删,那么其在 order_items 中有关联的行的值会被设置成默认值或者 NULL。

Referenced column 应该是 PRIMARY KEY 或者 UNIQUE 的。这意味着它是带索引的。Referencing column 不会被自动建索引,但是建议去建,因为 referenced table 中一旦有行被删,数据库需要扫一遍 referencing table 中哪些行引用了它。

!! Exclusion Constraints <<.p3>>

(略)
表格分区,指把一张数据库大的表,分散到多个小的物理存储块中。好处在于:

* 查询性能得到显著提高,特别是热点行处于同个分区中时
* 如果分区规划得好,使得查询或更新时数据大多处在同个分区中时,性能会大幅提升。因为可以利用硬盘的顺序读,而不用使用随机读取散落在各处的数据
* 批量操作更快了

在数据库系统有分区功能之前,人工进行分表已经是常见操作。数据库直接提供分区直接,则方便了使用者。

''分区在表特别大时才有意义''。一般来讲特别大指表的数据量超过了 DB 服务器的物理内存大小。

!! 使用 <<.p1>>

建一张大表,表示按 `logdata` 字段分区:

```sql
CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);
```

然后建分区:

```sql
CREATE TABLE measurement_y2006m02 PARTITION OF measurement
    FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');

CREATE TABLE measurement_y2006m03 PARTITION OF measurement
    FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');

...
```

这表示向 `measurement` 中插入数值时,会按 `logdata` 的值分到不同的分区去存储。如果 `logdata` 的值所处的 ''分区不存在则会报错''。

对于被用来分区的字段,建一个索引来加速查询是惯常的做法:

```sql
CREATE INDEX ON measurement (logdate);
```

!! 删除数据 <<.p2>>

删掉老数据是常见场景。有两种方法:

* 直接 DROP 相应的表:`DROP TABLE measurement_y2006m02`。这个操作速度很快,因为不需要像没分区时去一张大表一行一行删除;但是它在删除期间仍然会给母表上一个 `ACCESS EXCLUSIVE` 锁
* DETACH 分区(推荐):`ALTER TABLE measurement DETACH PARTITION measurement_y2006m02`。这个操作不会删除数据,速度更快,不会上锁。后续对母表的查询,则再查不到这块数据

!! Partition Attachment <<.p3>>

分区表也可以先在外部创建,再 attach 到母表上。这样做的好处是,可以从外部加载数据,对数据做校验或者清理工作后,再 attach 到母表上被使用。操作示例:

```sql
CREATE TABLE measurement_y2008m02
  (LIKE measurement INCLUDING DEFAULTS INCLUDING CONSTRAINTS)
  TABLESPACE fasttablespace;

ALTER TABLE measurement_y2008m02 ADD CONSTRAINT y2008m02
   CHECK ( logdate >= DATE '2008-02-01' AND logdate < DATE '2008-03-01' );

\copy measurement_y2008m02 from 'measurement_y2008m02'
-- possibly some other data preparation work

ALTER TABLE measurement ATTACH PARTITION measurement_y2008m02
    FOR VALUES FROM ('2008-02-01') TO ('2008-03-01' );
```

注意:第二步中的 CHECK 如果不做,attach 时分区表和母表都会上锁。Attach 后再把这个 check constraint 去掉即可。

!! 其他 <<.p3>>

其他细节没有深究。有需要时再查 [[文档|https://www.postgresql.org/docs/current/ddl-partitioning.html]]。

!! 分区的类型

* Range Partitioning
* List Partitioning
* Hash Partitioning













!! Inserting Data

```sql
--- Single Row
INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);

--- Multiple Row
INSERT INTO products (product_no, name, price) VALUES
    (1, 'Cheese', 9.99),
    (2, 'Bread', 1.99),
    (3, 'Milk', 2.99);
```

如果需要大批量插入数据,PG 的 `COPY` 命令在性能上是更好的选择(但是灵活性不如 `INSERT`)。

!! Updating Data

```sql
UPDATE products SET price = 10 WHERE price = 5;
UPDATE products SET price = price * 1.10;
UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;
```

!! Deleting Data

```sql
DELETE FROM products WHERE price = 10;
DELETE FROM products;
```


!! Returning Data

```sql
--- Insert
CREATE TABLE users (firstname text, lastname text, id serial primary key);
INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;

--- Update
UPDATE products SET price = price * 1.10
  WHERE price <= 99.99
  RETURNING name, price AS new_price;

--- Delete
DELETE FROM products
  WHERE obsoletion_date = 'today'
  RETURNING *;
```
!! Foreign Key

```sql
CREATE TABLE cities (
        city     varchar(80) primary key,
        location point
);

CREATE TABLE weather (
        city      varchar(80) references cities(city),
        temp_lo   int,
        temp_hi   int,
        prcp      real,
        date      date
);
```

!! Views

```sql
CREATE VIEW myview AS
    SELECT city, temp_lo, temp_hi, prcp, date, location
        FROM weather, cities
        WHERE city = name;

SELECT * FROM myview;
```
内容来源于 PostgreSQL [[文档|https://www.postgresql.org/docs/13/sql-syntax-lexical.html]]。

!! Identifier

可以用 ''双引号'' 包裹(quoted),也可以不包裹(unquoted):

```sql
-- Unquoted
UPDATE MY_TABLE SET A = 5;

-- Quoted
UPDATE "my_table" SET A = 5;
```

* Unquoted:大小写不敏感。PG 会将其统一成小写;SQL 标准统一成大写
* Quoted:大小写敏感

Identifier 可以用 Unicode:`U&"d\0061t\+000061"`。

!! Constants

!!! String Constants

字符串常量,用 ''单引号'' 包裹:`'data'`。同时可以用:

* Unicode: `U&'d\0061t\+000061'`。注意这里是单引号,区别于 identifier 中的双引号
* C-style escapes: `E'Hello\nWorld'`
* Bit-String Constants: `B'1001'`
* Dollar-quoted string constants: `$$Dianne's horse$$`

Dollar-quoted string constants 是比较奇怪的设计。当你的字符串常量中有单引号时,你需要写两个 `''` 来表示:`'Dianne''s horse'`。Dollar-quoted 可以让你避免这种麻烦:

```sql
$$Dianne's horse$$
$SomeTag$Dianne's horse$SomeTag$
```

被 `$$` 或者是 `$SomeTag$` 包裹的部分即是字符串常量,不需要转义单引号 `'`。

!!! Numberic Constants

数值常量。略。

!!! 类型转换

语法:

```sql
CAST ( <expression> AS <type> )
<expression>::<type>
```

SQL 在设计上,除了数值之外的绝大部分类型,都支持接受一个字符串,再做类型转换成本类型。比如 `date`,支持 `YYYY-mm-dd` 字符串。`INSERT INTO` 时,如果传一个字符串给这种类型时,DB 会做隐式的类型转换,不需要你手动转。
这一节讲如何从数据库中查询数据。

通用的语法是:

```sql
[WITH with_queries] SELECT select_list FROM table_expression [sort_specification]
```

`SELECT` 的对象可以是表中的列,也可以是算术表达式,也可以是一个特别函数。例子:

```sql
SELECT * FROM table1;
SELECT a, b + c FROM table1;
SELECT 3 * 4;
SELECT random();
```

!! Table Expressions

Table expressions 指由必须有的 `FROM` 之句和可选的 `WHERE` `GROUP BY` `HAVING` 组成的表达式。

See [[SQL: Queries: Table Expressions]].

!! Subqueries

Subqueries 是子查询,指在一个语句中(outer query)内嵌另外一条查询语句(subquery,inner query)的行为。

See [[SQL: Queries: Subqueries]].

!! Combining Queries

Combining queries 指把多个查询的结果结合起来,比如合并、取相交、取差。

See [[SQL: Queries: Combining Queries]].

!! Common Table Expressions

See [[SQL: Queries: CTE]].












SQL 支持把多个查询结果做集合操作,包括合并、相交和取差:

```sql
query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2
```

`ALL` 是可选的,如果没有 `ALL`,重复的行会被去除,与 `DISTINCT` 功能相同;如果有 `ALL` 则不会被去除。

可以链式使用这些操作:

```sql
query1 UNION query2 UNION query3
```

做集合操作的各个查询结果(query1、query2),它们的列的数量必须是一致的,而且按顺序匹配的列的数据类型需要是相兼容的。

!! 参考

* [[PostgreSQL: Documentation: 13: 7.4. Combining Queries|https://www.postgresql.org/docs/current/queries-union.html]]
CTE 即 Common Table Expressions,使用 WITH 子句表达。

Postgres 的文档没有给太 tutorial 式的内容,我主要参考了下面的博客帖子。

另外我只关心使用 CTE 做查询的能力,但它还有 [[做修改的能力|https://www.postgresql.org/docs/current/queries-with.html#QUERIES-WITH-MODIFYING]],这一部分暂无涉及。

<<tabs "[tag[SQL: Queries: CTE]]" "SQL: Queries: CTE: Introduction">>

!! 用 Recursive CTE 查询 adjacency list 的例子:

构建出一颗树:

```
      1
     / \
    2   3
   / \   \
  4   5   6
           \
            7
```

```sql
CREATE TABLE tree (
    id INT,
    parent INT
);

INSERT INTO tree VALUES 
  (1, NULL),
  (2, 1),
  (3, 1),
  (4, 2),
  (5, 2),
  (6, 3),
  (7, 6);
```

查询 7 到根节点的全部节点:

```sql
WITH RECURSIVE route(id, parent) AS
(
  SELECT id, parent FROM tree WHERE id=7
  UNION all 
  SELECT tree.id, tree.parent FROM tree, route WHERE route.parent IS NOT NULL AND route.parent = tree.id
)
SELECT id FROM route;
```

结果是:

```
7
6
3
1
```
<<display-pdf path:"/files/archives/2021/04/introduction-to-cte.pdf" title:"introduction-to-cte.pdf">>
<<display-pdf path:"/files/archives/2021/04/non-recursive-ctes.pdf" title:"non-recursive-ctes.pdf">>
<<display-pdf path:"/files/archives/2021/04/recursive-ctes.pdf" title:"recursive-ctes.pdf">>
Postgres 的官方文档并没有给 subquery 多少篇幅。主要的信息来源是 [[essentialsql.com|https://www.essentialsql.com/blog/]],这上面的文章写得挺不错的。具体内容见下面各 PDF。

<<tabs "[tag[SQL: Queries: Subqueries]]" "SQL: Queries: Subqueries: Introduction">>
<<display-pdf path:"/files/archives/2021/04/subqueries-in-the-from-clause.pdf" title:"subqueries-in-the-from-clause.pdf">>
<<display-pdf path:"/files/archives/2021/04/subqueries-in-the-having-clause.pdf" title:"subqueries-in-the-having-clause.pdf">>
<<display-pdf path:"/files/archives/2021/04/introduction-to-subqueries.pdf" title:"introduction-to-subqueries.pdf">>
<<display-pdf path:"/files/archives/2021/04/subqueries-in-the-select-statement.pdf" title:"subqueries-in-the-select-statement.pdf">>
<<display-pdf path:"/files/archives/2021/04/subqueries-in-the-where-clause.pdf" title:"subqueries-in-the-where-clause.pdf">>
Table expression 包含几个子句:`FROM`,`WHERE`,`GROUP BY` 和 `HAVING`。DB 在处理查询语句的顺序是:

# 从 `FROM` 指示的表中拿出数据
# 如果有 `JOIN`,按 `JOIN` 的条件组合数据
# 按 `WHERE` 筛选数据
# 按 `GROUP BY` 聚合数据
# 按 `HAVING` 筛选聚合后的数据

!! The `FROM` Clause

语法:

```sql
FROM table_reference [, table_reference [, ...]]
```

Table reference 可以是:

* 一个表名
* 派生的表,比如子查询所产生的表
* JOIN 结构
* 上述几项的组合

多个 table reference 一起出现在 `FROM` 子句中时,它们是 cross-joined(交叉相联)的。Join 后的结果作为一个虚拟表继续被处理。

!!! Joined Tables <<.p1>>

See [[SQL: Queries: Table Expressions: Join]].

!!! Table And Column Aliases <<.p1>>

See [[SQL: Queries: Table Expressions: Alias]].

!!! Subqueries <<.p1>>

子查询在 SQL 语句中被括号包起,并且需要指定一个表别名。它的查询结果作为一张虚拟表继续被处理。例如:

```sql
FROM (SELECT * FROM table1) AS <alias_name>
```

子查询也可以是一个 `VALUES` 列表:

```sql
FROM (VALUES ('anne', 'smith'), ('bob', 'jones'), ('joe', 'blow'))
     AS names(first, last)
```

!!! Table Functions <<.p3>>

少看到有人使用,略。

!!! `LATERAL` Subqueries <<.p3>>

少看到有人使用,略。

!! The `WHERE` Clause <<.p1>>

`WHERE` 相对简单,它接受一个返回 boolean 值的表达式。常见示例:

```sql
SELECT ... FROM fdt WHERE c1 > 5
SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)
SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2)
SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)
SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100
SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)
```

!! The `GROUP BY` and `HAVING` Clauses <<.p1>>

`GROUP BY` 会把某列里面同样的值聚合成一行返回:

```sql
=> SELECT * FROM test1;
 x | y
---+---
 a | 3
 c | 2
 b | 5
 a | 1
(4 rows)

=> SELECT x FROM test1 GROUP BY x;
 x
---
 a
 b
 c
(3 rows)
```

它经常跟聚合函数(aggregate function)一起配合使用,比如 `sum()`:

```
=> SELECT x, sum(y) FROM test1 GROUP BY x;
 x | sum
---+-----
 a |   4
 b |   5
 c |   2
(3 rows)

=> SELECT product_id, p.name, (sum(s.units) * p.price) AS sales
    FROM products p LEFT JOIN sales s USING (product_id)
    GROUP BY product_id, p.name, p.price;
```

在 PG 中,`GROUP BY` 后面的列可以是 `SELECT` 中的列,也可以是某个 value expression(没有示例)。

`HAVING` 子句则是在 `GROUP BY` 之后做一轮筛选:

```sql
SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit
    FROM products p LEFT JOIN sales s USING (product_id)
    WHERE s.date > CURRENT_DATE - INTERVAL '4 weeks'
    GROUP BY product_id, p.name, p.price, p.cost
    HAVING sum(p.price * s.units) > 5000;
```

`HAVING` 中的条件,可以使用聚合函数也可以不使用(`WHERE` 中的条件则无法使用聚合函数);这些条件也不必跟 `SELECT` 列表中的某项一致,比如上面例子中的 `sum(p.price * s.units)` 并没有出现在 `SELECT` 列表中。

!! `GROUPING SETS`, `CUBE`, and `ROLLUP` <<.p3>>

略。

!! Window Function Processing <<.p3>>

略。
别名。

表别名的写法:

```sql
FROM <table_reference> AS <alias>
FROM <table_reference> <alias>
```

一般用来简化长表名:

```sql
SELECT * FROM some_very_long_table_name s JOIN another_fairly_long_name a ON s.id = a.num;
```

一旦用了别名则不再可以使用原表名:

```sql
SELECT * FROM my_table AS m WHERE my_table.a > 5;    -- wrong
```

别名一般是用来简化语句。但''表与自身做 JOIN 时就必须用别名'':

```sql
SELECT * FROM people AS mother JOIN people AS child ON mother.id = child.mother_id;
```

别名的优先级高于 JOIN:

```sql
--- my_table as b
SELECT * FROM my_table AS a CROSS JOIN my_table AS b ...

--- join result as b
SELECT * FROM (my_table AS a CROSS JOIN my_table) AS b ...
```

列别名不重要。
JOIN 结构的通用语法如下:

```sql
T1 <join_type> T2 [ <join_condition> ]
```

其中 join type 有两种:cross join 及 qualified join。

!! Cross join

Cross join 比较好理解。比如 JOIN 两个表,那么第一个表的每一行,都与第二个表的每一行合并成一个大行,这个行里面有两个表的全部列。假如表 1 表 2 分别有 N 和 M 行,那 join 后的虚拟表就有 NxM 行。

语法:

```sql
T1 CROSS JOIN T2
```

`FROM T1 CROSS JOIN T2` 等效于 `FROM T1, T2` 和 `FROM T1 INNER JOIN T2 ON TRUE`。

!! Qualified joins

语法:

```sql
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON <boolean_expression>
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( <join column list> )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2
```

之所以叫 qualified,是因为这类语句中需要用 `ON` `USING` 或者隐式的 `NATURAL`,来指定两个表 ''如何关联在一起''。

!!! 如何关联在一起?

`ON` 是最常见的 join 条件,它后面带一个 boolean expression:

```sql
SELECT * FROM T1 JOIN T2 ON T1.a = T2.b;
```

`USING` 是一种简化,当用来匹配的列在两个表中同名时可使用:

```sql
SELECT * FROM T1 JOIN T2 USING (a, b);

--- equivalent to
SELECT * FROM T1 JOIN T2 ON T1.a = T2.a AND T1.b = T2.b;
```

`NATURAL` 则是对 `USING` 的一种简化,会把两个表中所有相同列名的列用在 `USING` 列表中。如果两个表没有相同列名,则它的效果就是一个 cross join。

!!! 两个表如何整合

对于在集合(数学意义上的 Set)层面上两个表如何整合,有两种形式:

* Inner Join,表示两个表相交(intersect)
* Outer Join,表示两个表联合(union)。对于不匹配部分如何显示的问题,有
** Left Outer Join
** Right Outer Join
** Full Outer Join

其中 `INNER` `OUTER` 两个关键字是可以不写的。默认是 `INNER`;有 `LEFT` `RIGHT` 和 `FULL` 出现时则表示是 `OUTER`。

<div class="box">

''注意'':

`ON` 中的条件是在 JOIN 前处理的,而 `WHERE` 中的条件是在 `JOIN` 后处理的。这意味着:

* 对于 outer join,`JOIN` + `ON` 是必须的,`ON` 来表达匹配规则;PG 没有对等的 `WHERE` 写法
* 对于 inner join,用 `JOIN` + `ON` 或者 `WHERE` 来表达是一样的

写 SQL 时需注意这点。

</div>


下面的示例来自这个 [[SO 答案|https://stackoverflow.com/a/38578/1189076]]。

A,B 两张表,对应有 a、b 两个字段,数据如下:

```
A    B
-    -
1    3
2    4
3    5
4    6
```

''Inner join'':

```sql
SELECT * FROM a INNER JOIN b ON a.a = b.b;
SELECT a.*, b.* FROM a,b WHERE a.a = b.b;

a | b
--+--
3 | 3
4 | 4
```

''Left outer join'':

```sql
SELECT * FROM a LEFT OUTER JOIN b ON a.a = b.b;

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4
```

''Right outer join'':

```sql
SELECT * FROM a RIGHT OUTER JOIN b ON a.a = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6
```

''Full outer join'':

```sql
SELECT * FROM a FULL OUTER JOIN b ON a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5
```
!! 子查询结果在 where 语句中做相等判断

```sql
-- Wrong: Aggregate functions can not be used in where clause
SELECT city FROM weather WHERE temp_lo = max(temp_lo);

-- Wrong
SELECT city FROM weather
    WHERE temp_lo = (SELECT temp_lo FROM weather);

ERROR:  more than one row returned by a subquery used as an expression

-- Right
SELECT city FROM weather
    WHERE temp_lo = (SELECT max(temp_lo) FROM weather);

     city      
---------------
 San Francisco
(1 row)
```
数据库事务。

案例是 Alice 转账给 Bob。

!! Basic

```sql
BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
COMMIT;
```

!! Savepoints

```sql
BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
-- oops ... forget that and use Wally's account
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';
COMMIT;
```
<<.note "Window Function 在我看来过于复杂,未深入研究。需要用时看看 PG 的文档:[[3.5|https://www.postgresql.org/docs/13/tutorial-window.html]],[[4.2.8|https://www.postgresql.org/docs/13/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS]],[[9.22|https://www.postgresql.org/docs/13/functions-window.html]],[[7.2.5|https://www.postgresql.org/docs/13/queries-table-expressions.html#QUERIES-WINDOW]]。">>

窗口函数(Window Functions),定义:

> A window function performs a calculation across a set of table rows that are somehow related to the current row.
> - From PostgreSQL Docs

感觉用在数据分析上比较有用。

列出员工工资及其部门平均工资:

```sql
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
```

```
  depname  | empno | salary |          avg          
-----------+-------+--------+-----------------------
 develop   |    11 |   5200 | 5020.0000000000000000
 develop   |     7 |   4200 | 5020.0000000000000000
 develop   |     9 |   4500 | 5020.0000000000000000
 develop   |     8 |   6000 | 5020.0000000000000000
 develop   |    10 |   5200 | 5020.0000000000000000
 personnel |     5 |   3500 | 3700.0000000000000000
 personnel |     2 |   3900 | 3700.0000000000000000
 sales     |     3 |   4800 | 4866.6666666666666667
 sales     |     1 |   5000 | 4866.6666666666666667
 sales     |     4 |   4800 | 4866.6666666666666667
(10 rows)
```

列出员工工资以及其在部门中的工资排名:

```sql
SELECT depname, empno, salary,
       rank() OVER (PARTITION BY depname ORDER BY salary DESC)
FROM empsalary;
```

```
  depname  | empno | salary | rank 
-----------+-------+--------+------
 develop   |     8 |   6000 |    1
 develop   |    10 |   5200 |    2
 develop   |    11 |   5200 |    2
 develop   |     9 |   4500 |    4
 develop   |     7 |   4200 |    5
 personnel |     2 |   3900 |    1
 personnel |     5 |   3500 |    2
 sales     |     1 |   5000 |    1
 sales     |     4 |   4800 |    2
 sales     |     3 |   4800 |    2
(10 rows)
```

Window function 的语法关键点是 ''OVER''。如果顺序不重要,ORDER BY 可以不要;如果不需要分区(虽然不分区意义不大),PARTITION BY 也可以不要,FROM、WHERE 等筛选出来的全部数据组成一个唯一分区。
SQLAlchemy 是 Python 语言中最强大的 SQL 工具。它分为 Core 和 ORM 两个部分。

SRE 指 site reliability engineering,指为了保障可伸缩性(scalable)和稳定性(reliability)而采取的一系列措施,包括 [[容错性|Fault Tolerance]](fault tolerance)、[[限流|Rate Limiting]] 等等。
!! 资源

* [[SSH implementation comparison|https://ssh-comparison.quendi.de/comparison/cipher.html]]
日常使用 SSH 相关的内容。

!! Generate Key Pair

```bash
$ ssh-keygen
```

!! Keep Alive

将这些内容写入 `~/.ssh/config`:

```bash
Host *
    ServerAliveInterval 60
```

!! SSH Agent

!!! Linux

SSH Agent 可以让你不需要输入 passphrase 就可以访问 key。用 Systemd 建一个 user 级的 service 并运行。service 文件已经提交到 [[dotFiles|Dotfiles Management]] 仓库。

```bash
$ yadm pull
$ systemctl enable --user ssh-agent
$ systemctl start --user ssh-agent
```

然后将你的私钥加进 agent 中:

```bash
$ ssh-add ~/.ssh/id_rsa
```

注销后重新登录,`~/.pam_enviroment` 才生效。

!!! Mac

Mac 默认在你第一次使用时起 SSH agent。

把默认 key 加入 SSH Agent:

```
ssh-add -K
```

把非默认位置的私钥文件加入 SSH Agent:

```
ssh-add -K /path/to/private/key/file
```

!! 参考

* [[SSH Keys - ArchWiki|https://wiki.archlinux.org/index.php/SSH_keys]]
SSH 常见故障定位。

!! SSH 时等提示输密码等很久

和这种现象类似的,还有使用 Jsch 等 SSH 库时的 `ReadTimeout`。

根据这个 [[回答|https://askubuntu.com/a/246330]] 以及我自身的经验,一般是两种问题:

* 服务端启用了 reverse DNS lookup,试图将客户端的 IP 反查出域名。这个过程可能耗时很长,而且大部分时间并查不出什么来。可以在服务端的 `/etc/ssh/sshd_config` 中置 `UseDNS no`,并重启 sshd 解决
* 客户端及服务端启用了 GSSAPI 鉴权方式(Authentication Method)时,有时候协商过程会持续很久。我不太了解这种方式的具体原理。你可以在客户端的 `/etc/ssh/ssh_config` 或是 `~/.ssh/config` 中置 `GSSAPIAuthentication no`。如果你是用软件库进行连接,可以在相应的鉴权方式配置中不启用 GSSAPI
SSH tunneling 有两种功能:

* Local port forwarding,一般讲 port forwarding 是指这个
* Remote port forwarding,也称 reverse tunnel

它们被用来 bypass 某些防火墙策略。简单来讲:

Local port forwarding:

* 你想访问 B server 的某个端口,但是被防火墙挡住了
* 你有通过 SSH 访问 A server 的能力,同时 A server 可以访问 B server 的这个端口
* 你通过 SSH client,在本地 bind 某个端口,使得向这个端口的请求,通过 SSH 转发到 A server,再由 A server 的 SSH server 转发到 B server
* 此时你可以访问 B server 了

Remote port forwarding 则是反过来:

* 外部想访问你的本地某端口服务,但是被防火墙挡住了
* 你跟外部之间,共同可以访问 A server
* 你通过 SSH 访问 A server,要求 A 的 SSH server bind 某个端口,使得到这个端口的请求,通过 SSH 传到你本地上、想被外部访问的端口
* 此时外部就可以访问你本地的端口了

这篇 [[文章|https://www.tunnelsup.com/how-to-create-ssh-tunnels/]] 讲得很清晰直观。

同时注意,SSH 不仅可以 tunneling 端口,也可以是 sock 文件。

!! 通过 XShell 配置

XShell 提供了图形化配置的能力:

{{ xshell-ssh-tunneling }}

其中源主机是指你的本地主机,侦听端口是指 tunnel 建立后会 bind 的本地端口,可以通过这个端口来访问远端主机的服务。

目标主机是指你的远端主机去访问服务时用的名称。如果你的 MySQL 服务 IP 是 1.2.3.4,那么目标主机就写这个 IP。目标端口即服务的端口,比如 MySQL 的 3306。

配置好后,你需要重开 / 重连你的 XShell session,这个 tunnel 才会建立起来。

!! 命令行

假如你的远端机器是 `5.6.7.8`,远端机器可访问的 MySQL 服务地址是 `1.2.3.4`。如果你想通过访问本机的 9000 端口,来访问到远端的这个 MySQL 服务,那需要在你的本地机器上运行:

```bash
ssh -CNL 9000:1.2.3.4:3306 onlyice@5.6.7.8
```

* `L` 表示这是 port forwarding
* `C` 表示压缩请求
* `N` 表示不登陆到 server 上,仅打开 tunnel;不指定 N 时会给你一个 server 的命令提示符,跟正常 SSH 登陆 server 一样
栈(先进后出,FILO,first in first out)和队列(先进先出,FIFO,first in first out)。

栈和队列可以用同样的底层数据结构来实现,比如用双向链表(doubly linked list)。因此在一些算法实现中,栈可以随时变成队列,反之亦然。

!! 通过栈使元素反向排列

比如把 1, 2, 3, 4, 5 分别压入栈。如果想知道这串输入的反向是怎样的,可以依次 pop 元素出来,就变成 5, 4, 3, 2, 1。

在实现 [[二叉树的后序遍历|Binary Tree: Depth First Traversal]] 中有使用。


接受付款的方式。

做 AlgoCasts 的 Hawstein [[表示|http://hawstein.com/2019/08/26/algocasts-monthly-report-2019-07/]] [[PayJS|https://payjs.cn/]] 是不错的选择。但他一开始并没有接入,而是直接放了微信和支付宝的付款码。
关于具体业务模式的信息。

里面的内容,与诸如 [[Startup: Marketing]] 的区别在于,marketing 是放之各业务均需要的过程,是更泛化的领域。

!! Glide

[[Glide|https://www.glideapps.com/]] 是一个通过 Google Sheets 生成 app 的应用。你可以把数据存在 Google 表格中,在 Glide 上配置相应的展现,然后 Glide 可以生成一个 PWA(Progressive Web Application),在 iOS / Android 上用浏览器打开时,都可以加入到主屏幕变成一个 web app。

Glide 新颖的地方在于:

* 用 Google 表格作数据存储,对用户来说减少了开发后台管理端的成本
* 页面排版时可以用各种组件,使得数据的展示非常清晰
* 支持数据间的关系
代理商赚差价。


软件外包。


案例分析。参考 [[这里|https://www.softwaredevelopmentcompany.co/software-development-outsourcing/]] 列举的公司来了解更多信息。


!! wemake.services

wemake.services 提供 [[技术审查|https://wemake.services/meta/rsdp/audits/]] 的服务。它审查的内容包含:架构审查、技术审查。

架构审查耗时一天,定价固定为 30000 卢布(折合 ¥3300),会输出这些内容:

# Will your system allow further changes?
# Will you be able to easily change the team in case you will need to? And do you really need to change it?
# Is the code quality acceptable? It may contain things that will make it impossible to continue the development of this project
# Is it easier to rewrite everything from scratch? Sometimes it is, but often it is not

技术审查耗时一天,定价为每个 bug 1000 卢布(折合人民币 110 元)。Bug 的定义为:

# Bad design decisions
# Something is not clear from the docs and the code itself (readability issues)
# Coding style issues (if there is no coding style in the project, then we use our own)
# Not following best-practices (defined by the documentation or the community)
# General errors
# Not creating project’s issues properly
案例分析。来源:

* Indie Hackers
* Twitter 或者各种渠道获得
* 豆瓣上,我维护了一个 [[独立创作者|https://www.douban.com/contacts/list?tag=423931]] 的列表



!! See Also

与 [[Creator]] 联动。
[[Listen Notes|https://www.listennotes.com/]] 是一个播客搜索引擎。它提供的功能有:

* 一个可以检索的播客数据库。它给节目生成了主题、分类、人物、语言、区域等信息
* 稍后再听的 Listen Later 功能;剪辑节目中某段内容的 Listen Clips 功能;监控某一关键词在播客节目中出现的 Listen Alert
* 一批付费购买的数据内容,如根据语音生成的 transcript,按条件搜索出来的数据集等等

在我惊讶的地方在于,这个功能这么丰富的产品,它只有一个员工兼老板 Wenbin Fang,开发、产品、运维、运营一条龙全包。Wenbin 在 Listen Notes 的 [[博客|https://www.listennotes.com/blog/]] 上写了很多文章,涵盖了他在技术、产品、运营等等方面的思考,让我觉得收获很大。

博客文章:

* [[Good enough engineering to start an Internet company|https://www.listennotes.com/blog/good-enough-engineering-to-start-an-internet-27/]],March 11, 2019(<<coslink "本地存档" "/files/archives/2020/05/good-enough-engineering-to-start-an-internet-company.pdf">>,<<coslink "幻灯片" "/files/archives/2020/05/tamu-talk.pdf">>)
* [[The boring technology behind a one-person Internet company|https://www.listennotes.com/blog/the-boring-technology-behind-a-one-person-23/]],Jan. 24, 2018(<<coslink "本地存档" "/files/archives/2020/05/the-boring-technology-behind-a-one-person-internet-company.pdf">>)

Wenbin 对待技术的态度非常务实。他在技术选型上,一直强调的是「boring technology」「good enough engineering」,不需要追新,''成熟、自己熟练、好用且可以解决问题的技术'' 就可以了。他在技术决策上非常务实。比如:

* 不使用 Docker / Kubernetes / serverless。作者觉得中型及以上的公司才有必要去考虑这些技术
* 不做纯粹的前后端分离,网页中有一半是后端生成(Django Template),有一半是前端渲染(React)
* 使用的都是发展多年的成熟技术,比如 PostgreSQL、Ansible 等。Wenbin 说这些技术可以让他晚上睡得好一些

Wenbin 在旧金山租了一间 WeWork 办公室给自己办公。租金不便宜,但是他乐意花钱在工作效率上,而不是在家或者咖啡厅,花更多时间完成同样的工作。

他也提到他的创业哲学:

> Most of time, the biggest obstacle of building & shipping things is over thinking. What if this, what if that. Boy, you are not important at all. Everyone is busy in their own life. No one cares about you and the things you build, until you prove that you are worth other people’s attention. Even you screw up the initial product launch, few people will notice. Think big, start small, act fast. It’s absolutely okay to use the boring technology and start something simple (even ugly), as long as you actually solve problems.
> Your overthinking is my opportunity.

我简单翻译一下:

> 大部分情况下,构建和发布一个产品最大的障碍是 ''过度思考''。今天想着这样,明天想着那样。事实上,你的想法一点都不重要。每个人都忙于过自己的生活,没有人关心你做了些什么,直到你做的东西足够好到引起别人的注意。所以即使你一开始发布的产品不怎样,也很少人会注意到。要有宏大的构思,从小处着手,并且快速去实现。使用无聊的老技术来开始做你简单(又丑陋)的产品是绝对 OK 的,只要你的产品能实际上解决问题。
> 你的过度思考是我的机会。

另外,这两个帖子中也提及它使用的工具、技术、开发流程和使用的 SaaS 服务,很值得作为一个参考。
[[Lunch Money|https://lunchmoney.app/]] 是 [[Jen Yip|https://twitter.com/lunchbag]] 独立开发的一个应用。

Jen Yip 大概与我同龄(27 ~ 29 岁),工作经历大致是:

# 在 Twitter 工作 2~3 年,换了 3 个 team,技术面比较广
# 从 Twitter 离职,与室友做宠物方向的产品,发现对宠物产品没有激情,被 YC 创业营拒绝两次,倍感沮丧,离开旧金山与男友开始数字游民生活
# 开始构思记账软件。在日本福冈生活了四个多月期间,高强度地开发了第一版的 Lunch Money
# 至今(2020 年 5 月)开发了一年半左右,有一批付费用户,大部分来自一大型记账软件 Mint

我是通过 Indie Hackers 的 [[播客节目|https://www.indiehackers.com/podcast/150-jen-yip-of-lunch-money]] 了解到它的。听完播客节目后,我又阅读了 Jen Yip 的 [[博客|https://lunchbag.ca/]],给了我很多启发。

<div class="box">

''对于市面上已经有两大记账软件 Mint 和 YNAB,再做一个记账软件的意义是什么?''

> But I think you also bring up a good point that a lot of people feel that the personal finance and budgeting app space is oversaturated. I don’t think that at all, because I feel that personal finance is a ''very personal thing''. Everyone has their own way that they like to do things.
> I don't think that this is something where you’re going to find over 50% of people share the same budgeting philosophy. ''So I feel that if you have a preferred way of doing something, you could probably find a cohort out there that feels the same way.''

Jen 认为记账这个过程是非常 personal 的。每个人的方式、着重考虑的点可能不一样。因此只要你有一种独特实用的方式去记账,那总会有一批人会喜欢你的方法,与你产生共响。

事实上 Jen 在开发 Lunch Money 前就用了很多表格来管理她自己的账务和预算。后面她将这个方式推荐给了一些周围的人,发现的确有人坚持用她的方法。加上她希望老公也一起用,因此才有了开发 Lunch Money 的想法。

另外,她提到 Mint 有 1300 万的用户量。假如她能获得 0.05% 的用户量,她觉得也足够了。

</div>

<div class="box">

''关于怎么在高强度的工作中不 burn out:''

> But I’ve noticed that my working cadence is, I’ll be deep into a major feature or maybe a group of improvements that I’d like to make on a particular feature and I’ll work on it for three days. Once I deploy and I notify my users, it’s like this wave comes crashing down and I lose the motivation to work a little bit.
> I think that’s my body telling me, hey, I need a break. So my schedule is basically work really hard for three to four days and then take a day, day and a half off. I find that that works well for me.

Jen 的方式大概是,集中三四天时间做一个大的 feature 或者搞定一批事情,然后就休息一两天。

</div>

<div class="box">

''关于如何获得动力:''

> Reflecting on my own experiences so far, I would say that an overarching theme is self-driven change. I know that’s not easy for everyone. It can be scary to change things up. But personally, ''I realized that I have a tendency to leave when things start to get too comfortable''. That has always been a net positive for me in the end.
> ''For example, changing teams at Twitter helped me round out may skills as an engineer.'' Stepping away from the grind of Silicon Valley and moving away from SF reinvigorated my love and passion and for programming, and it also helped me to regain a sense of personal purpose.
> Even now, as part time digital nomads, changing our environment every winter forces us to reestablish new routines, which is sometime easier than just trying to change one aspect of an otherwise rigid routine.
> So I feel like not being afraid of change and embracing the unknown and the unexpected would prepare you to be an Indie Hacker, because once your product is out there, you put a lot of yourself out there and it’s scary.
> ''Things come at you left and right, and most of the time you can’t plan for these things. All you can do is have a prepared mindset and a good attitude about the whole thing.''

Jen 会希望在自己不要过得太舒适。当过得太舒适时,她会选择一些新的挑战。它觉得要有一个 "prepared mindset" 去面对各种各样的变化。

</div>

<div class="box">

''关于是否要将事务性工作自动化:''

Jen 认为一些事情并 ''不需要急着自动化'',除非到了你觉得需要去做的那天。有些事务性工作出现的频率并不高,对比起花费在将其自动化上的时间,可能人工搞搞会更省时省力。特别是对于 Lunch Money 这种早期的产品,功能特性处在快速变化中,一些事务性的工作可能过阵子就不需要再做了。

</div>

<div class="box">

''关于如何做营销:''

Jen 试了找记者、在 Reddit / Twitter 写回复、买广告,效果都不好。甚至因为在两个跟金融理财相关的 subreddit 发帖而被封号。

对她来说,最有用的方式是把她作为独立开发者的经历写出来,通过 Indie Hackers、Hacker News 和 Twitter 等发布,给她带来了很多有效的客户。同时她尽力把产品做得足够好,这样可以让用户口口相传带动注册量稳步上涨。

> ''Writing about my experience as a solo founder'' and posting them on mediums such as Hacker News, LinkedIn, Twitter and Indie Hackers have proven to be most successful in drawing new users to Lunch Money. ''And continuously improving Lunch Money keeps my current users happy and drives word-of-mouth marketing.''

</div>

<div class="box">

''关于如何将市场推广与特性发布结合:''

当 Jen 做一轮推广后,会有一波新用户集中注册和试用,他们会提出自己想要的特性或者反馈 bug。这时 Jen 会抓紧把这些建议收集起来,并且在几天内集中精力开发和修复,并在用户的 15 天试用期结束前将这些功能发布,再通知一波用户。此时用户的转化率比较高。

我觉得这是个很聪明且实诚的方法,让用户看到背后的开发者是真的非常投入在做事情。

</div>

<div class="box">

''如何在有限的时间精力里做出最大的产出?''

> No single mistake that I’ve made was detrimental, but I can think of a lot of potential mistakes I could have made which would totally have derailed the progress of Lunch Money. I’d have to attribute the avoidance of these to being a solo founder– since I’m stretched so thin, I don’t actually have time to dive so deep into one thing that I lose sight of where I should be going. ''I’m constantly re-prioritizing the most important things to do and if something is taking me more than, say, 1 week, I think really hard about whether or not it’s really worth that time.''

Jen 觉得自己作为独立开发者,时间精力都非常有限,因此她希望自己不因为陷入一件事情太深而忘了真正应该做的事情。没当一件事情需要超过一周来完成,她会想重新评估是否值得做。并且她经常给手头的工作重新定优先级。

</div>

<div class="box">

''关于如何处理用户反馈:''

Jen 使用了第三方服务,可以将用户反馈推送到她的 Gmail 邮箱中。她再通过 Gmail 的过滤功能给邮件打上标签做分类。另外她会针对特定场景优化用户体验。比如有很多用户因为银行帐户启用了二步验证,导致无法通过 Lunch Money 同步账单数据,提了很多工单给到 Jen。

Jen 分析之后,在 Lunch Money 中同步账号的组件上,添加了一个小的 details pop-up,问用户是否遇到了同步问题。如果是,会弹出一个对话框,里面用户可以描述自己的问题并提交。同时对话框里面也有关于二步验证的描述,让用户能自行定位下是否二步验证引起的问题。这让这方面的工单量大幅下降。

这是很针对性解决问题的一个范例。

</div>

<div class="box">

''关于如何保持积极:''

> This intense context-switching and practice of self-discipline trained me for the life of a solopreneur. Being able to switch between engineering, marketing and customer support in the blink of an eye helps with my overall time efficiency and ''being constantly aware of the bigger picture is my source of motivation for getting through a tedious task''.

</div>

<div class="box">

''关于业余爱好:''

> Having hobbies that are not work-related is really helpful. I’ve been consistently attending in-person classes to strengthen my Mandarin Chinese since July 2019. While being pulled away for 2+ hours every other day during the work week isn’t always welcomed at the time, I usually feel good about getting out of the house or focusing on something that isn’t work-related and it allows me to get back to the grind with a clearer mind.

有一份跟工作无关的爱好挺好的。从工作切换到爱好是一种休息。再回来工作后可能有更好的精神。我做自由职业以来,有些时候连续几天都在搞工作,很有透支而厌恶技术的感觉。我觉得平衡好是很重要的。

</div>

<div class="box">

''关于是否在初期做移动端:''

> Looking back now, it was the right decision to hold off on a mobile app. Keeping parity with both web and mobile while iterating regularly on the product would have been nearly impossible. The web version changed so quickly with many features having been completely re-written in the last 6 months. That would have taken more than twice the time if I also had to consider the mobile app whose update cycles are at the mercy of Apple and Google.

Jen 的结论是 ''在产品初期不要急着做移动端''。因为:

* 作者对移动端技术不熟悉,同时开发桌面端和移动端势必会拖慢迭代速度
* 移动端的发布速度还受限于 Apple 和 Google

也许在网页版发展不错时,再考虑做移动版?甚至一开始可以用 Flutter 之类做一个简单的移动版,再有不错的盈利时再考虑雇人做个更好的移动版。

</div>

<div class="box">

''关于要不要写下产品背后的故事?''

> After some initial feedback, I decided to implement an About page and start sending a welcome email to new users introducing myself as the one-woman team behind the product.
> I now regularly get emails back from users letting me know that they find my story inspiring, or that they love the fact that an indie developer is behind the product! 🥰

Jen 一开始是不太想写的,她担心让用户发现这个产品只是一个人在做时,用户会觉得不靠谱。后来她还是写了一些关于自己和产品研发过程的故事。这反而让她的用户非常敬佩。很多人向她表示受到了启发和鼓舞。

我觉得作为初创产品,一个好的、打动人心的故事是非常有益于宣传的。故事是连接人与服务的最好工具。

</div>

<div class="box">

''关于产品帮助文档系统的选型:''

使用 Jekyll 配合 ThemeForest 上的模版构建。不使用付费服务,因为文档系统本身不难实现,市面上已经有很多静态网站生成器。同时付费服务提供的额外功能,比如评论和 Live Chat,并没有什么用。

</div>

<div class="box">

''关于用户反馈邮件:''

用户发送到域名邮箱 support@lunchmoney.app 时,一开始 Jen 使用免费服务 Mailgun 转发到她的个人邮箱中。但问题是,她通过 Mailgun 回复的邮件,无法送达到 Outlook.com / Hotmail.com 中,原因是有大量 spammer 也通过 Mailgun 发送垃圾邮件,导致一些 Mailgun IP 进了垃圾邮件黑名单。Sendgrid 跟 Mailgun 都有类似的问题。
最终她还是使用了 G Suite,可以绑定域名邮箱。

</div>

<div class="box">

''关于 Drip Campaign:''

Jen 用了 [[Postmark|https://postmarkapp.com/]] 邮件来做 Drip Campaign。

</div>


另外,播客节目中也提到「如何获得周围亲友对自己产品的真实看法」这一问题。他推荐了一本书 //The Mom Test//。有一个 Medium [[帖子|https://medium.com/@feelinspired/things-i-learnt-the-mom-test-by-rob-fitzpatrick-9d9d58ce8098]] 详细地描述了这本书。
; Niche Website
: A niche website is an online resource that focuses on a particular interest, topic or theme that is common to a narrow group people in a larger market.
: While targeting a very specific term that people type into the search engines, a niche site offers its visitors helpful and quality content that aims to answer a question or to solve a problem that those searchers share among themselves. ([[incomeprodigy.com|https://incomeprodigy.com/what-is-a-niche-website/]])

[[NiucoData·词云小工具|https://cloud.niucodata.com/]] 的产品形态很好理解:

{{ niuco-data }}

这个案例有趣的点在于,它的作者王登科讲述的如何将其 [[快速改造为收费产品|https://greatdk.com/1607.html]]。期望的效果是:

* 超过十万字时,使用此系统需要付费
* 不希望有注册、登录机制,保持简单
* 不需要开发支付相关的功能代码

王登科用了一个非常取巧的方法。他拥有一个产品叫 [[面包多|https://mianbaoduo.com/]],可以供用户放置他的付费内容提供给其他人购买。同时它提供了查询订单信息的接口。于是它做了一篇付费帖子放在面包多上,想用词云高级版的朋友需要在上面付费,然后获得一个订单号作为 key,在词云上输入即可。词云的后台会调用面包多接口校验这个 key 对应的订单是否存在。

唯一的问题是,这其实是把登录、注册过程从词云迁移到了面包多。对用户来说仍然相对复杂。
案例信息来自 IndieHackers [[页面|https://www.indiehackers.com/product/remotive]] 及 [[采访|https://www.indiehackers.com/interview/bootstrapping-to-12-000-mo-as-a-non-technical-founder-d635b7619b]]。

!! 发展历程

一开始 Rodolphe Dutel 加入了一个远程工作的公司。他朋友希望他写一些远程工作的经验,于是他在 Medium 写了一些 tips,并被选为当天热文 #3。于是他设想搞一个邮件列表,分享远程工作经验,并在 Medium 文章中放入了订阅链接。他成功吸引到一批人订阅,但是他并不知道他能提供什么有价值的内容,于是他向每个订阅者写了一封欢迎邮件,''并在邮件中询问对方期望获得怎样的信息''。结果很多人回复了他。

<<.tip "我觉得直接询问你的受众是个非常好的方法,值得借鉴。另外他在这个过程中,利用 LinkedIn 的 [[插件|https://business.linkedin.com/sales-solutions/compare-plans/sales-navigator-for-gmail]] 可以看到对方邮箱所对应的 LinkedIn 账号的信息,也帮他理解了受众的背景。">>

后来他们做了自己的网站,提供了一个订阅入口。并且在网站上放了个 Jobs 入口,但是这个功能实际上是未开发出来的,点进这个入口后会有一个 TypeForm 问卷,会问访客想找的工作类别等信息。

<<.tip "这个方式我觉得也非常赞。不是凭空做出一个产品,再让用户去感受好不好,而是一开始就问潜在的客户需要些什么。">>

它的增长方式是:

* 不投放广告,依赖于社交媒体,主要是 Twitter。同时 All-in ProductHunt(估计是在社交媒体做宣传、利用一些影响力大的人帮忙推广),在 PH 上成绩不错,得到一定曝光,转化率不错
* 后来他建立了一些 Google 表格,用来共享数据,比如这个 2019 年远程工作者的薪酬、地域等信息的 [[表格|https://docs.google.com/spreadsheets/d/1VOehQv0bOs2pY7RkKJ8RmlUbuu8UmSgzfvjR0m5hyxQ/edit]]
* 好的内容,持续地为受众带来价值

商业模型和收入:

* Newsletter Ads: We charge businesses $850 to get in front of 25k remote workers. We vet advertisers, only one Ad per email & two newsletters/month.
* Job board: Remote startups place Job Ads with us, paying $299-$448 for a 30-day feature. This is our main source of revenue.
* Community: Our Slack community is a virtual co-working space for remote workers. Currently 1,300+ members. Priced $149/lifetime access or $99/yr
* Companies: We offer remote employer branding services, promoting remote startups. Packages start at $799/mo. Enquire anytime ;)
* Leadership: A private Discourse where leaders of remote teams network and share. Approved applicants pay $25/mo or $250/yr.
* Misc: On and off special deals, such as display deals, courses, partnerships, etc.

主要在网站功能(工作板),配合付费圈子(Slack 及 Discourse)、咨询服务、广告和付费课程等。

!! 感悟

> In 2014, I decided to answer that question my friends kept asking about how to land a great remote job. I had plenty of experience by then, and it felt like something I could easily speak to.
> So I blogged about it. My colleagues shared the post on social media and the timing was just right. Tons of people were curious about remote work, since NomadList had come out a few months earlier. Yet few people had worked remotely before. My article went viral on Medium, so I added a free MailChimp capture form and collected 100+ emails. One month later, I launched Remotive as "a newsletter on Remote Work" on Product Hunt, and we were #1 on launch day!

作者做这件事情的大背景是远程工作的潮流刚刚兴起,这对他的内容流行起来应该有很大的帮助。

!! 了解市场

产品:[[Product Hunt|https://www.producthunt.com/]]

在这期 [[Teahour 节目|Teahour Vol.086: Xitu Yimin about Entrepreneurship and Technology]] 中,掘金创始人阴明强力推荐一本书:[[Who Gets What and Why: The New Economics of Matchmaking and Market Design|http://www.goodreads.com/book/show/22749723-who-gets-what-and-why]],讲的是共享经济相关的一些知识,可以考虑阅读。

[[着眼小众市场,程序员的微型创业项目指南|http://liujinkai.com/2017/06/01/start-small-stay-small/]]:

```
* 从你喜欢的领域着手
** 看看你平时关注的领域有哪些?体育、学术、艺术、雕刻还是健康?
* 从你周边开始
** 有哪些是你了解的朋友或者你周边人了解的行业,职业,解决他们的痛点
* 借鉴
** 去这些网站里你可以参考下,看看别人都有哪些点子
*** http://ycombinator.com/ideas.html
*** http://www.ahbbo.com/ideas.html
** ''你也可以去国家统计局网站上看下相关的数字,或者 58 同城等网站上寻找一些小众市场人群,为他们提供产品服务。''
```

我觉得 HackerNews 可能太高端,不一定合适。58 同城 / 国外一些论坛可能更合适。难点是在于理解另外一个人群做的事情,以及他们的需求。

!! 评估想法

[[着眼小众市场,程序员的微型创业项目指南|http://liujinkai.com/2017/06/01/start-small-stay-small/]] 中提到一个方式,我觉得挺好:

```
确定了你的细分市场之后,怎么来检验你的产品是否有用户愿意购买呢?可以通过一个迷你站点来帮助你。

通过下面这些步骤具体操作:

# 从你的想做的产品中选择最吸引你的来做
# 构建你一个迷你站点,包括 2 到 3 个页面
## 首页
## 产品介绍
## 定价 & 注册
# 你的首页和展示产品页需要包含产品的截图(这个页面不一定真的实现出来,你可以找设计师仅仅做个图片出来),一些功能特性的描述,产品信息。一个try/buy的按钮。
# 如果你的产品可以下载并少于 $40,引导用户去点击“Buy Now”
# 如果你的产品可以下载并大于 $40,需要引导用户点击“免费试用”按钮
# 如果你的产品是一个 SaaS 或者移动应用,引导用户点击“购买”
# 创建 AdWords 广告,并设置流量到你的站点
# 当有人点击“试用”或者“购买”,用 Google 的 AdWords 来跟踪转化,并提示用户你的产品正在开发当中。希望他们留下邮箱,会在产品上线的时候及时通知。他们可能留下邮箱,也可能不会。没关系,**你需要通过 AdWords 来知道哪些关键字的转化是最有效的**,每个转化大概需要花费多少。

你可能会觉得在没有产品的情况下,对用户这样不太好。但是你要知道,网上的用户如果对你的产品不感兴趣,他们是不会点击购买或者试用的。而真正有兴趣试用你的产品的人,也会等上几个月的时间来等待你的上线的。

同时你获得了可以衡量的参考来知道哪些关键字是最有效的。

在 100 至 200 人访问了你的网站之后,看看“试用”和“购买”的数据。假设有2%到5%的人点击了“试用”。点击“试用”的这些人中的 40% 可能会有意愿完成购买。

通过这种方式需要你投入一些时间和钱。但是你要知道,如果你投入了8个小时来做这个测试工作,你会有足够的信心来在接下来的几个月时间里来开发完成你的产品。如果测试不理想,也会节省你数百小时的投入来开发一个根本没有人愿意使用的产品。
```

这种试不一定完全合适,但是里面的理念很好。要有一种方式能够量化、快速验证这个想法是否可靠,比如文中提到的 AdWords 关键词。

!! 营销和流量

```
好的流量是访客跟你的目标用户非常接近,而且他们了解并信任你。

那些你邮件交流过多次的用户显然比一般流量到你网站的用户转化率更高。相差10倍都不止。这也是高质量的好处。

很难说哪种流量适合所有的网站。但是基于作者的这些年的经验。流量的策略大概分成长期持续策略和补充策略。

最优流量:

# 邮件
# 博客、播客、视频blog
# 自然搜索流量

辅助流量:

# 社交化媒体
# 点击广告
# 论坛
# 产品发布会
# Affiliate 程序
# 其它

重要的是明白,投入时间在Twitter和Facebook上确实比较有意思,而且能带来一些流量。但是构建长期、可持续的流量才是最重要的。

通过邮件、blog或者podcast触达用户是最好的方式。我推荐你至少使用其中一个。

**最后,SEO是必须的,创建每个页面的关键词列表并不断优化你的搜索的排名。**
```
曹政的书 [[你凭什么做好互联网:从技术思维到商业逻辑|Ni Ping Shen Me Zuo Hao Hu Lian Wang]] 创业、投资、产品、经营管理等话题有一些见解。如果我有做创业了,可以重新翻看下,可能有更深的体会。
Notion 中亦维护了一份 [[项目灵感|https://www.notion.so/onlyice/b1f4fb4fe1ad4b0fa9316ee71912745e]]。


创业、投资、市场推广、内容创作等领域,可靠的信息来源:

* 我维护的 [[Twitter 用户列表|https://twitter.com/onlyice0328/lists/list]],时常翻阅它
* [[Indie Hackers|https://www.indiehackers.com/]]

不错的独立开发者中文社区:

* [[独立开发者|https://indiehackers.net/]]:定位类似国外的 [[Indie Hackers|https://www.indiehackers.com/]]
* [[电鸭社区|https://eleduck.com/]]:论坛,信息量少
* [[创造者日报|https://creatorsdaily.com/posts]]:定位类似国外的 Product Hunt

在《[[你凭什么做好互联网:从技术思维到商业逻辑|Ni Ping Shen Me Zuo Hao Hu Lian Wang]]》中看到一段:

> 伊光旭(“冷笑话精选”创始人)最开始是借助豆瓣搞营销号、拉粉丝,豆瓣当然也是个不错的平台,但是毕竟规模有限,然后微博兴起,他立即研究微博的传播规律,去转战微博;当微信开始兴起的时候,他又第一批转战微信,在刚开始微信公众号还很稀缺的时候,以最低成本获得了惊人的粉丝订阅数,这就是跟对了势。现在人家身价几个亿,挂上新三板,巨大的商业价值已经体现无疑。

我觉得应该对新平台保持热情,积极去研究它的 ''传播规律'',利用新平台的红利期推广自己的产品和内容。

应该理解完整的用户获取、留存、推广的过程和方法。不要陷入产品做好了,自然有人会来的错误中。而且初期的种子用户是非常重要的,需要认真运营。
总结我在各内容平台上的影响力。主要以粉丝数、点赞数等来衡量。在 [[Notion|https://www.notion.so/onlyice/291a55f6ea3c448cb56c1d0f56398073]] 上维护。
各种服务商。

视频点播服务商。

有这些测评文章:

* [[六大维度,对六家云视频服务商展开系统的横向测评|http://www.woshipm.com/evaluating/607023.html]]

Hawstein 在它的 AlgoCasts 上 [[选择了保利威|http://hawstein.com/2020/02/17/be-an-indie-hacker-for-613-days/]]。

保利威的功能很全面,拿来就能用,开发成本低。而且它的防下载似乎做得不错(加密以及分片乱序)。但是定价模式似乎不太好,官网已经把价格表下掉了,但是还能搜到之前最便宜的价格是 3999 元每年,带 200G 空间和流量 500G 流量。另外我考虑做跟视频同步展示的 show notes 功能(类似机核电台节目播放器的富媒体版),不确定保利威的 JS 事件是否足够使用。保利威的播放器 UI 不好看。保利威在视频清晰度上最高只支持 1080p,而我会考虑上 4K 视频。

不考虑版权保护的话,从技术角度更愿意使用纯 H5 的视频。这样可以利用 [[开源库|https://blog.bitsrc.io/5-open-source-html5-video-players-for-2018-38fa85932afb]](如 Plyr)做更好地控制。

如果保利威的价格不合适,优先考虑腾讯云的点播服务。

客户管理。

!! 问卷调查

[[TypeForm|https://www.typeform.com/]] 是不错的工具。
认识市场这一步,曹政的《[[你凭什么做好互联网:从技术思维到商业逻辑|Ni Ping Shen Me Zuo Hao Hu Lian Wang]]》书中给了一些方法。

判断品牌的热门程度:

* [[百度指数|http://index.baidu.com/v2/index.html#/]]:曹政多次推荐
* [[360 趋势|https://trends.so.com]]
* [[Google Trends|https://trends.google.com]]

判断站点的热门程度:

* [[爱站|https://www.aizhan.com]]:不确定多可靠

理解行业和人群:

* 百度指数
* 极光大数据报告
* 百度知道:曹政提过可以去搜「91助手垃圾」「91助手豌豆荚」「豌豆荚垃圾」,这样就知道用户大致的痛点的什么以及跟竞品的对比
静态网站生成器。

!! 有什么选择?

传统的有:

* Jekyll
* Hugo
* Hexo

新潮的有:

* [[VuePress]]
* [[Docusaurus|https://v2.docusaurus.io/]]

糅合了静态生成和动态内容的有:

* [[Next.js]]
* [[Gatsby]]

!! 如何选择?

如果是 ''软件项目的文档'',用 VuePress 最好,功能太丰富了,排版和 UI 都好看,而且它本来也是用来运行 Vue 的文档的。Docusaurus 也是非常不错的选择。

如果是 ''博客或者不需要用户交互的站点'',除非 Gatsby 或 Next.js 有现成的好用模板,不然应该用传统的 Jekyll 等。后者的生态应该更丰富,也不引入 Gatsby / Next.js 的复杂度。

如果即提供内容又有用户交互,那不是静态网站了,不适用于此处的讨论。
Link:

* [[喜马拉雅|https://www.ximalaya.com/qinggan/3385682/]]
* [[iTunes Podcast|https://itunes.apple.com/cn/podcast/steve%E8%AF%B4/id1073852728?mt=2]]

<iframe height="40" width="260" src="https://www.ximalaya.com/thirdparty/player/sound/player.html?id=120584815&type=red" frameborder=0 allowfullscreen></iframe>

这期觉得比较有启发。时间长,但是内容密度不高。

郑永锴提到他研究星座、塔罗牌的过程,说并不是为了算命,而是这个过程会让你更去关注你自己,思考自己是怎样的人,跟星座上的描述是否符合。这个过程让我想起郑攀(小学朋友)在小学时就研究星座的故事,而且他是相对深入的研究,比如一般人只知道太阳星座,但是他还知道月亮星座和上升星座。是否研究星座的过程让他对自己的了解更多,启动了一些大多数人没做过的思考,对自己的思考?

很多父母很爱孩子,但是不知道怎样去爱,比如他们会给孩子买他想要的东西,但是却不懂得引导孩子说出自己的感受,不懂得去倾听。

家长的无条件的爱,对于孩子来说,可以创造一个安全的空间,让他们的注意力不仅仅是放在外界的压力上,还可以去倾听自己的声音,去表达。

「[[牧羊少年奇幻之旅|https://book.douban.com/subject/27116268/]]」这本书,Steve 和郑永锴都非常非常推崇,是一本改变他们人生观的书。

我是在 2020 年 5 月体验的 3.0.0-beta 版。

!! 使用流程

用 strapi 的 CLI 生成一个项目后运行它。在 Content-Types Builder 建立一些模型:

[img width=1000 [strapi-content-type-builder]]

建立时,strapi 后台做了这样的事情:

* 为你的 content-type 生成一系列的代码,比如 model 定义文件、API 路由、OpenAPI 文档等
* 重启自己

下面这张图中的 `api` 目录,即是 strapi 用来存放生成的文件:

[img width=1000 [strapi-content-type-files]]

然后它自动提供了最基础的 RESTful 接口,以及可以使用 GraphQL 进行查询。

它也有素材管理的功能(Media Library),但我使用下来觉得 ''功能太简单了'',连建目录、选 tag 都做不了,别说对素材做版本管理了。

!! 好处与不足之处

对于 Content-Types Builder:

* 优点:
** 简单易用,不需要手写代码就可生成 models
** 内置了富文本编辑器
** 关系的指定非常简单明了
* 缺点:
** 字段的类型不够多,比如 Django 提供了 `DurationField` 来表示时长,strapi 就没有;意味着你需要用数字来存储时长,并且写额外的代码将其序列化成 `00:01:32` 格式
** 能配置的数据格式校验不多,可能需要额外写代码实现

对于 RESTful API:

* 优点:自动生成 API endpoint 及文档
* 缺点:默认的 RESTful 只会输出一层的关系,如果要实现多层关系一起输出,或者额外的逻辑,可能需要写代码

对于素材管理(Media Library):

* 优点:上传界面简单直观
* 缺点:
** 没有提供第三方存储(如 Amazon S3、各种云服务对象存储)的选择,目前只能存在 strapi 服务器的 `uploads` 目录中
** 功能太简单了,无法建目录、无法标 tag,更没有版本管理

对于用户注册、登陆:

* 优点:
** 提供了现成的 API 去注册和登陆
** 可以与社交网络账号关联,比如 Google、Facebook
** 提供了注册时邮箱确认、重置密码时邮箱找回的能力
* 缺点:
** 整套流程过于简单,真实的账号系统可能会更复杂
** 可扩展性差,比如如果你想在注册时显示一验证码,那并不是很容易在这里做到

权限管理:跟 Django 差不多,可以针对不同的 model 做细分的操作权限设置。

!! 总结

如果你的产品是内容型的,并且内容生产是站方提供而不是用户提供,那么 strapi 可能是个不错的选择,毕竟你不需要花太多心思就能构建一个可发布内容的后台系统,而不太需要考虑新增内容时的字段校验。如果涉及到用户提供内容,那你可能需要写额外的代码逻辑去处理(比如格式校验、文件上传等等),这使得它跟其他的 web 框架没太多区别。



结构化数据,有时也称消息交换格式(message interchange format)。一般用在编程语言中,将某一内存结构编码(encode / marshal / serialize)成字节序列,反之亦然。

按编码后的字节序列是否人类可读,分为:

* 文本格式:如 JSON, XML
* 二进制格式:如 Protobuf, Thrift

文本格式对比二进制格式:

* 二进制格式占用更少的空间(序列化后)
* 二进制格式序列化、反序列化时,性能更高
* 文本格式更容易使用,可以手写、肉眼可读

对比各种格式 / 序列化框架时,考虑几点:

* 时空效能(efficiency),比如序列化、反序列化性能,序列化后的大小
* 是否语言、平台中立
* 开发起来是否简单、快速
* 是否提供一种 IDL,用来描述数据本身的格式
* 基础数据类型有何差异,比如 pb2 中并没有 `map` 结构,Thrift 有;是否支持组合类型
* 是否支持范型、反射等高级能力
* 这些协议经常用在 RPC 场景中,存在客户端和服务器的角色,因此要考虑:
** 两方的协议格式文件变动,引起的兼容性问题。比如新增字段、删除字段等



!! Resources

* [[Designing Data-intensive Applications Ch04]]
* Dropbox 中 `pbvsthriftvsavro.pdf` 对比了 Protobuf 和 Thrift 方方面面,虽然是 12 年写的,但是内容很不错

!! Resources

[[dbohdan/structured-text-tools|https://github.com/dbohdan/structured-text-tools]] 罗列了用于处理各种结构化数据的工具。

管理你订阅的信息。

互联网的内容越来越多,你可能在各种内容平台和社交工具上都有关注了大量信息:

* Twitter 上的帐号
* Telegram Channel
* Podcast
* 知乎专栏
* 博客的 RSS 订阅源

当订阅的内容越来越多,就会面临一些管理上的困难:

* 我订阅这个 podcast 是干嘛用的?为什么订阅它?我的订阅太多了,能归个类吗?
** Podcast 软件并没有提供对订阅源写备注的能力,亦没有进行分组的能力
* 这个 TG channel 似乎不错,但是我不想它出现在 TG 的会话列表中,太杂乱了
* 各种内容源的质量不一,有些我想深度看,有些我每隔一段时间集中翻翻就行。但是大多数的平台并没有提供这种能力

解决办法是用 [[RSS 聚合器|Web Syndication]] 来聚合内容,制定相应的阅读规则,而不在分散地在各平台阅读。这就会有几个问题:

# RSS 订阅源从哪来?
# 怎样管理聚合的内容?

!! RSS 订阅源从哪来?

视你想订阅的内容而定。大部分博客自带了 RSS 输出。大部分社交或者内容平台可以通过 [[RSSHub|https://docs.rsshub.app/social-media.html]] 生成 Atom.xml。微信公众号没有稳定可用的 RSS 源服务商,RSSHub 也 [[不支持|https://github.com/DIYgod/RSSHub/issues/64]]。

!! 怎样管理聚合的内容?

用 Inoreader 的文件夹做分类:

[img width=200 [inoreader-category]]

修改每个订阅源的标题,将其内容的主题以 hashtag 的形式加入进来,比如上图中的 GeekPlux。这样如果后面自己忘了这个源提供的是什么内容时,可以快速通过 hashtag 知晓。不使用 Inoreader 自带的标签功能,是因为它是个发布工具而不是筛选工具。Inoreader 没有提供视图来展示一个 tag 下的内容。

!! 用 RSS 代替社交平台订阅的例子

如上图中的「马大为」文件夹中,放了 [[马大为|https://www.bmpi.dev/]] 的博客和 TG 频道。由于我的 TG 订阅频道越来越多,显得杂乱和信息过载,因此我用 RSSHub 给它的 TG 频道生成了 RSS feed,用 Inoreader 来订阅,然后在 TG 中将其三个频道都退订。

!! See Also

[[Web Syndication]] 讨论了:

* 应该使用哪个 feed reader
* 应试使用 Atom 还是 RSS

[[Podcast App]] 说明了我用什么软件收听播客,以及如何管理订阅的播客内容。

SVN 没有类似 `.gitignore` 文件的机制。它有两套机制用来忽略文件。

!! Global Ignore

全局忽略,即可以让 SVN 忽略一些特定的文件夹 / 文件。可以通过修改配置文件来加入自己的 ignore pattern。配置文件的路径在:

* Windows 平台:%APPDATA%/Subversion/config
* Linux 平台:/etc/subversion/config

在里面搜索 `global-ignores` 属性,加入自己的 pattern 即可。

这种方式只对自己本机有效,对其他使用同个版本库的人无效。

<<.warning "对于已经加入 SVN 版本控制的文件夹,再加入 `global-ignores` 中是没有用的,SVN 还是会跟踪它的改动。">>

参考:

# [[SVN 官方文档|http://svnbook.red-bean.com/en/1.8/svn.advanced.confarea.html]]
# [[Is there a concept of global ignores in svn? - StackOverflow|http://stackoverflow.com/questions/2694900/is-there-a-concept-of-global-ignores-in-svn]]

!! SVN Properties Ignore

使用 SVN 的 properties 机制,可以让 ignore patterns 写入版本库服务器中,这样其他使用同个版本库的人,也会自动应用这些 ignore patterns。

方式如下:

```bash
> svn st
M  source
?  cache
> svn propset svn:ignore cache .
```

提交该目录后,这些属性就被写入 SVN 服务器中。

参考:

# [[SVN 官方文档|http://svnbook.red-bean.com/en/1.8/svn.advanced.props.special.ignore.html]]
# [[How do I ignore a directory with SVN? - StackOverflow|http://stackoverflow.com/questions/116074/how-do-i-ignore-a-directory-with-svn]]

`systemd-swap` 提供了把磁盘文件当 swap 分区用的能力。pacman 安装后,把下面的配置写到 `/etc/systemd/swap.conf.d/00-enable.conf` 中:

```bash
swapfc_enabled=1
swapfc_chunk_size=1G        # Allocate size of swap chunk
swapfc_max_count=8          # 0 - unlimited, note: 32 is a kernel maximum
```

然后 Systemd enable + start systemd-swap 服务。用 `free -m` 检查 Swap 空间大小。

注意 chunk_size 介于 512M 到 4G。根据自己需要去增减。

缓存无从不在,CPU 就有寄存器、L1 L2 缓存,内存经常作为磁盘的缓存,Redis 作为 RDBMS 的缓存,等等。

''什么时候用缓存''?

# 取数据慢时,比如 Redis 可以比 RDBMS ''显著减少时延''
# 取数据成本高时,比如 RDBMS 联表操作耗费性能大,且面对高 QPS 要求时不易满足;使用 Redis 做缓存则可以显著 ''提升吞吐量''
# 请求集中在一部分热点数据上时(即 time-based locality)
# 请求集中在一小块区域的数据上时(即 space-based locality),比如数据库的相邻行是存储在一起的,此时 CPU 顺序读可以达到比较好的性能

''缓存系统设计目标'':优化延时及吞吐量。这要求 cahce hit 显著多于 cache miss。

!! 读写策略

场景是 cache server 作为 database 的缓存。

Amazon ElastiCache 给的 [[建议|https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Strategies.html]] 是,''使用 lazy loading 配合 write through''。

!!! Lazy loading

Lazy loading 指读数据时,如果 cache miss 则从数据库拿数据,并更新缓存。

好处:

* 仅有被请求的数据被缓存,不需要缓存全部数据浪费空间
* Cache server 崩溃、换新时没有影响,从数据库中再捞数据写进来就好

坏处:

* Cache miss 的成本很高,需要 3 round trip
* 数据陈旧:数据如果没有过期,就不会从数据库中刷新;这个可以结合下面的 write-through 策略解决

!!! Write-through

Write-through 指每当更新数据库时,同时更新缓存。

好处:

* Cache 中的数据永远不是陈旧的
* 写的延时增加了,但是读的延时会减少(cache miss 出现的概率降低了)

坏处:

* 缓存中丢失数据:如果一个缓存 server 重启或者新的 server 上线,此时缓存为空,无法起作用。这可以通过结合上述 lazy loading 机制解决
* 没有被使用的数据也被写入了缓存,浪费了空间。这可以通过设置 TTL(time to live)来解决

!!! 小结一

使用 lazy loading 配合 write-through 是比较好的策略。同时应该给缓存内容设置 TTL。

!!! 异步更新

国内有一些实践采用异步更新缓存的方式。写完数据库后,可能有几种方式来更新缓存:

* 通过往消息队列发送更新消息,再由 worker 将其更新入缓存
* 编写代码作为数据库从机,通过 binlog 来感知数据库变化并更新缓存,比如 [[alibaba/canal|https://github.com/alibaba/canal]] 方案。京东有文章表示他们使用此方案

!!! 缓存作为代理层

使用这种方案时,读写均对缓存 server 进行(可以是自己实现的,而非使用 Redis 等通用组件),再由缓存对数据库做修改。这种方案很少见,实现复杂且丢失了 RDBMS 的优势。

!! 缓存置换策略

指缓存容量有限时,采用怎样的策略来决定缓存什么内容、什么内容会被置换出缓存。

常用的有 LRU(least recently used)、LFU(lest frenquently used)以及它们的结合版 LFRU(least frequent recently used)。没有深究。

!! 常见问题

这几种场景在中文技术文档中经常出现,但是我没有找到对应的英文内容。

!!! 缓存雪崩

缓存雪崩指的是大量缓存在同一时间全部失效,使得该时间 cache miss 增多,数据库流量突增。解决方法:

* 设置缓存失效时间时,针对不同的 key 设置不同的时间,避免同时失效。比如在固定的时长(如 5min)基础上加上随机的时长(0 ~ 2.5min)
* 程序实现上,使得有线程在更新某 key 的缓存时,其他要访问该 key 的线程 blocking wait

!!! 缓存击穿

缓存击穿跟缓存雪崩很像,雪崩是大量 key 同时失效,击穿是一个热点 key 失效,一样会造成大量请求到数据库。解决方法类似:

* 程序实现上,使得有线程在更新某 key 的缓存时,其他要访问该 key 的线程 blocking wait

!!! 缓存穿透

指大量访问不存在的 key 造成数据库压力上升。解决方法:

* 使用布隆过滤器,快速检测 key 有无存在数据库;或者
* 即使该 key 不存在,也在缓存上放入该 key 并置其值为空,并设置一个短的 TTL;这样仍能挡住一小段时间的频繁访问
* 应用层先判断该 key 是否合法(比如 key pattern 不符,应该是数字却传了个字符串),如果不合法就挡住,不再访问缓存 server 及数据库;也可应用类似防 DDOS 方法来挡住恶意攻击

!! 参考

* [[那些不得不知的缓存知识 - 掘金|https://juejin.cn/post/6944249384137818143]]
* [[Caching strategies - Amazon ElastiCache|https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Strategies.html]]
* [[Caching: system design interview concepts|https://igotanoffer.com/blogs/tech/caching-system-design-interview]]:质量一般
* [[donnemartin/system-design-primer|https://github.com/donnemartin/system-design-primer#cache]]:质量一般


!! Resources

* [[systemd Cheat Sheet|https://www.linuxtrainingacademy.com/systemd-cheat-sheet/]]
* [[journalctl Cheat Sheet|https://www.cheatography.com/airlove/cheat-sheets/journalctl/]]


! Systemd 延迟启动服务

可以用 systemd-timer 中的 `OnStartupSec` 配置来让一个 service 延迟启动。在 `/usr/lib/systemd/system/` 新建一个 `.timer` 文件,比如 `tiddlywiki.timer`:

```ini
[Unit]
Description=Delay start tiddlywiki

[Timer]
OnStartupSec=2min

[Install]
WantedBy=timers.target
```

`OnStartupSec=2min` 表示开机后两分钟执行。

为了让它生效,还需要运行:

```shell
$ sudo systemctl enable tiddlywiki.timer
$ sudo systemctl start tiddlywiki.timer
```
<div class="tc-table-of-contents">
  <<toc-selective-expandable 'TableOfContents'>>
</div>
Tailwind CSS 非常优秀:

* [[文档|https://tailwindcss.com/docs/installation/]] 非常好,详细同时深入浅出
* 提供的 utility 非常全面和方便
* 容易将 CSS 复用

Tailwind CSS 与普通的 CSS 框架(如 Bootstrap、Bulma 等)不同,它侧重于灵活性,侧重于提供各种各样的 utilities 让你可以流畅地设计样式。所以它并不提供现成的 UI 组件。这导致普通开发者,如果没有很强的设计能力,难以 copy-and-paste 来生产一个相对好看的页面。当然官方也意识到了这个问题,所以有这些产出是来解决这个问题的:

* 作者开发了 [[Tailwind UI|https://tailwindui.com/]]。虽然写着 UI,但是它不是传统的 UI 库,而是将一些好看的 UI 用 Tailwind CSS 写成 HTML 代码片断,这样你可以直接复制拷贝使用
* 官方的 components [[文档|https://tailwindcss.com/components/alerts]],提供了一些常见组件的示例
* 官方编写的 [[custom forms|https://github.com/tailwindcss/custom-forms]],提供了表单组件样式的聚合样式,如 `form-input`, `form-textarea`, `form-select`

同时,它的第三方生态也不足够好。awesome-tailwind-css 上的项目缺乏商业公司支持,难免质量一般。''因此使用 Tailwind CSS 时你需要花一些精力把常见的组件(比如 navbar)做出来。同时你要有好的设计能力。''

如果你要自己做页面设计,非常建议看看 Tailwind CSS 的 [[screencast|https://tailwindcss.com/screencasts/]],以及作者 Adam Wathan 的 YouTube [[频道|https://www.youtube.com/channel/UCy1H38XrN7hi7wHSClfXPqQ]],有非常好的案例教学。

!! VSCode

[[Tailwind CSS IntelliSensePreview|https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss]] 提供了自动补全的能力。

但要注意的是,你需要先 `npm install tailwindcss`,同时需要用 `npx tailwind init` 在项目根目录初始化一个 `tailwind.config.js` 配置文件,再重启 VSCode。不然这个插件无法正常工作。
Tailwind CSS 是 PostCSS 写的,而 Next.js 又默认内置的 PostCSS,因此你不需要额外安装 PostCSS。

官方文档有一份 [[指导|https://nextjs.org/docs/advanced-features/customizing-postcss-config]],如何自定义 PostCSS 的配置。对于整合 Tailwind CSS,重点在于在 PostCSS 的配置中加入 `tailwindcss`。我整了一份基于 Next.js 9.2 的配置和 Tailwind CSS 1.4.0 的配置:

```js
let plugins = {
  'tailwindcss': {},
  'postcss-flexbugs-fixes': {},
  'postcss-preset-env': {
    autoprefixer: {
      flexbox: 'no-2009',
    },
    stage: 3,
    features: {
      'custom-properties': false,
    },
  },
}

module.exports = {
  plugins: plugins
};
```

注意,根据 Next.js 的 [[开发者说明|https://github.com/zeit/next.js/issues/11783#issuecomment-611984418]],一旦你写了 `postcss.config.js`,意味着你不需要 Next.js 来帮你自动管理 PostCSS 的配置。因此你在配置文件中用的插件,全部需要你手动安装而不能依赖 Next.js 本身的依赖:

```shell
npm install --save-dev tailwindcss postcss-flexbugs-fixes postcss-preset-env
```

然后在 `styles/tailwind.css` 中引入 Tailwind CSS:

```css
/* purgecss start ignore */
@tailwind base;
@tailwind components;
/* purgecss end ignore */

@tailwind utilities;
```

添加好后,在你的 `pages/_app.js` 中 `import ../styles/tailwind.css` 文件即可。

<<.warning "如果同时使用 Bulma 及 Tailwind CSS,则不要引入 Tailwind 中的 base 和 components。在 [[Web UI Framework: Guidance]] 了解更多。">>

StaticKit 写了一篇 [[文章|https://statickit.com/guides/next-js-tailwind#configure-the-build-pipeline]],关于如何整合 Tailwind CSS 到 Next.js 中。我亦其 <<coslink "备份" "/files/archives/2020/03/how-to-use-tailwind-css-with-next-js-statickit.pdf">> 到 wiki。

|!Origin |{{!!web-page-url}} |

一般大公司或者像 Uber 这种不大但是成长迅速的公司,会给人一种感觉就是技术很强。一开始 Uber 工程师发了 [[这篇文章|https://eng.uber.com/mysql-migration/]] 表示他们从 PostgreSQL 迁移到 MySQL,我第一感觉他们应该是有道理的,应该是有理有据地分析过后采取的措施,所以是不是 PostgreSQL 真的有一些明显的缺陷导致它不如 MySQL?但是我对 RDBMS 的理解几乎没有,所以也没有细看它的文章。

今天看到霍炬写了《聊聊 Uber 公司迁移数据库这件事》。他分析了 Uber 文章中的问题,觉得 Uber 这个迁移没有意义也不解决问题。我同时看了下 Redis,发现也很多人对这个迁移觉得不理解,觉得没有做对。

我突然觉得自己之前的理解有点肤浅。对于自己不熟悉的领域,不应该盲信权威(而且 Uber 也不能算权威)。如果自己还没有判断的能力,就不要在心里默默下一些主观的结论,直接忽略这个信息就好。

! 和『掘金』创始人阴明聊聊创业和技术

Teahour 链接:http://teahour.fm/2016/08/08/xitu-yinm.html

!! 关于创业

!!! 创业是很认真的事情

创业需要全身心投入,而不想着顺手做个东西,如果它火了再投入进来。

!!! 需求才是重点

用户往往不关心你做的这个东西是不是好看,而是看你有没有解决他的痛点。而有一些创业者喜欢在诸如交互、技术上下文章,不一定重要。要懂得市场。

!! Growth Hacking

# 产品一定有足够好的留存,再去做 growth hacking (我觉得把 growth hacking 换成「营销」也是说得通的)(不然就变成洗用户了)
# 阴明认为 Growth Hacking 里面最好的方法,是类似 Airbub, Uber 这样,推荐新用户可以返利

!! Medium 成功之处在哪?

写作者可以在 Medium 平台上保留自己的影响力。Medium 一开始只能用 Twitter 帐号登录,给人一种感觉,就是你在 Medium 上写的文章还是属于你这个 Twitter 号的,这样你在 Medium 上写的文章可以很容易通过 Twitter 传播出去,使你在 Twitter 上的影响力可以起作用。

同时 Medium 的老板很厉害,可以一开始就把产品做到 80 分。这导致 Medium 上面的优质内容很多,你总能在上面找到想看的,用户口碑非常好。

!! 掘金的价值是什么?

移动时代,之前在独立博客上写文章的人难以获取到流量,但是微信公众号等渠道不适合技术文章的书写。所以掘金填补了这一空缺。同时掘金通过几种手段来使得它上面的内容质量比较高:

# 人工审核内容
# 类似 Hacker News 的算法来做排序

!! 前端技术

阴明很喜欢 Vue.js,觉得 vue-loader 就是他心目中的前端组件化的最佳实践。

!! 工具推荐

阴明推荐了 [[moo.do|https://www.moo.do/]],非常不错,后续有需要的话替换掉 TickTick。
! 与 Hawstein 和左程云聊算法和数据结构

Teahour 链接:http://teahour.fm/2019/01/02/algo-with-hawstein-and-chengyun.html

!! Information

* Google 有专门的页面指导应聘者怎样准备算法及其他面试过程
* Host 和 guest 推荐的内容:
** 01:34:55,[[故事:材质、结构、风格和银幕剧作的原理|https://item.jd.com/11540392.html]]:编剧相关的一本书。「艺术家必须精通于形式」,类似计算机中的算法与数据结构。我觉得值得一看。
** 01:37:05,[[得意忘形|https://www.lizhi.fm/1959617/2579980425340183046]] 播客,主要内容围绕个体自由、创作,有深度
** [[Make|https://makebook.io/]]:一个成功的自由职业者写的关于他怎样运营这几个项目的书籍
** [[自卑与超越|https://item.jd.com/12026441.html]]:Dingding 推荐的心理学书籍

!! Some Ideas

* 定期去外面面试;当你在一家公司,你觉得最舒服的时候要去面试,而不是在要换工作的时候去面试
* (调侃向)算法分三种,书本里的,面试的,ACM 的
* 考算法是成本低的、简单地判断一个人 CS 相关能力的方式
* 一道道做算法题容易,但是怎样把类似的题目总结出 pattern 难
* 开源软件中使用的算法,也值得一看
写这类读书笔记时,多记一些「道」而不是「术」。

比如 [[FluentPythonCh16]] 中描述的 coroutine 相关的内容,提到 `yield from` 语法时,重点时在于语言设计者为什么设计这个语法,这是「道」;至于具体语法怎么用,这种「术」是很容易查到的东西,需要用的时候再查一下就好。而且往往如果理解了「道」,那么「术」就是非常直观的东西。

再比如,如果让你想给一门编程语言中添加一套通用的 Sequence 操作,实现取长度、取某个 index 下的值等等,你会怎么做?如果是动态语言,你会怎么做?如果是静态语言会怎么做?前面的问题即是「道」。如果你对这个问题做一些思考,再去看 Python、Java、Ruby、C++ 各怎么做,就会对他们的设计有更深入的理解。

看什么书,学什么内容时都要谨记这一点,不要在思考上懒惰,想清楚书本描述的知识点的背景,这个知识点的作者遇到了什么问题,想了什么方式去解决等等,而不是在具体的知识内容上。



See LibHunt for some comparison between template engines:

* [[Python|https://python.libhunt.com/categories/266-template-engine]]
* [[JavaScript|https://js.libhunt.com/libs/templating-engines]]

[[Jinja2|https://github.com/janl/mustache.js]] (Python) and [[mustache|https://mustache.github.io/]] (various languages) should be considered first.

[ext[链接文字|/files/1.pdf]]
|!Name         | |
|!Author       | |
|!Edition      | |
|!Release Date | |
|!ISBN-13      | |
|!Medium       | |
|!Rating       |{{!!rating}} |
<div class="box">

</div>
|!目标                |!内容长度 |
|                     |🍕🍕🍕🍕🍕 |
|                     |🍕🍕🍕🍕🍕 |
<<display-pdf path:"/files/path/to/your.pdf" title:"your.pdf">>
<<display-pdf path:"/files/path/to/your.pdf" title:"your.pdf">>
<$videojs controls="controls" fluid="fluid">
  // 常见 MIME type:mp4 => video/mp4,mp3 => audio/mpeg
  // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter
  <source src=<<cosurl '/files/voice-memos/voice-memo-20201225.mp3'>> type="audio/mpeg">

  // 没有字幕就删掉这行
  <track label="Subtitle" kind="subtitles" srclang="zh-Hans" src=<<cosurl '/files/voice-memos/voice-memo-20201225.vtt'>> default>
</$videojs>
<<coslink "链接文字" "/files/1.pdf">>
<div class="limit-code-block-height">

```

```

</div>
<<cosurl "/files/1.pdf">>
|!Name |象与骑象人 |
|!Author |[美]乔纳森 • 海特 |
|!Edition |N/A |
|!Release Date |December, 2012 |
|!ISBN-13 |9787213050145 |
|!Medium |微信读书 |
|!Rating |{{!!rating}} |

豆瓣链接:[[https://book.douban.com/subject/20260640/]]。

如果想 ''详细'' 回顾书的内容,上微信读书看原书及我做的划线和笔记。

这本书里面作者描述了对很多事物的看法,比如人的心理机制,人如何感到幸福,人的心理如何成长,人生的意义与宗教的结合等等。

!! 总结

对我来说有启发的内容有:

* 人的幸福和对自己的驾驭,需要使大象(情感)和骑象人(理智)互相配合
* 人经常为自己的行为想法杜撰出理由,有时候甚至不自知
* 严重沮丧忧郁的人的思维方式和改变的方法
* 流言也许是人类发明和使用语言的重要目的,并且流言对人类社会是有积极意义的,使得做出对他人不利行为的人会收到影响和限制
* 幸福在于持续有进展,而不是一个大目标的达成。大目标达成之后,过一段时间后又会回到平均的快乐程度
* 人的平均快乐程度跟遗传有很大关系。这个说法很令我震惊
* 沉浸在一份极具挑战性、又与自己能力相当的工作会很令人沉醉。有人称之为「心流体验」
* 人需要与社会、他人产生联系。凡事只关心自己利益者不会活得快乐
* 人在合适的时间遭遇逆境、遇到挫败,可以激发潜能,从中受益。但重要逆境最好在成人前后再出现,儿童和青少年难以承受和处理,可能弊大于利
* 「义务论者」与「结果论者」关于怎样的行为符合道德的论战
* 道德戒律和壮阔自然景色带来的提升感
* 恶心的起源和宗教仪式对洁净的追求

作者讲到的东西包罗万象,像关于道德和宗教的论述我还不能很深刻理解,后面生活阅历更丰富了可能可以再去翻阅。

!! 部分摘录和评论

> 这种动不动就杜撰各种理由来解释自己行为的病症被称为“虚构症”(confabulation)。动过裂脑手术的病人以及其他脑部受过伤的病人都常表现出“虚构症”的症状,加扎尼加称左脑的语言中枢为大脑的诠释模块,它的作用是针对自我所做的一切,马上做出评论,即使它根本无从得知“自我行为”的真正原因或动机,也还是会做出反应。举例来说,如果对右半球闪现“走”这个字,病人可能就会站起来走掉。不过问他为何站起来,他也许会回答:“我要去拿可乐。”左脑的语言中枢非常擅长编出各种解释,但却不知道行为背后真正的原因。

人会给自己的行为想出理由。我观察过小外甥,他比较怂,有时候被其他小朋友打了一下后,他不敢还手,但是会跟人说「他这样做是不对的,所以我不跟他一样(还手)」。其实他会知道自己是害怕了,但可能只是一个隐约的感受在,并没有让它清晰出来。但人就是会马上想出一个理由来解释自己的行为,掩盖不想暴露的感受。

这让我觉得,也许我们的人生故事也有很大一部分是不完全精确的。现在的我去解释以前的我,往往是不精确的,比如现在的我会觉得之前读书的时候很简单、高考很简单,但是这个观点可能只是服务于现在的我对知识的理解(我认为比起高中知识这种简单不连贯的知识,有更多更好的、有挑战的知识),但过去的我可能是会觉得学习很难的。

文中的这段观点是类似的:

> 上述研究的重点就是,道德判断就跟审美判断一样。当我们看到一幅画时,通常马上就知道自己喜不喜欢。如果有人要我们解释为什么喜欢,我们就会乱编出一番说辞。其实我们并不完全了解自己为什么会觉得这幅画很漂亮,但我们的诠释模块(骑象人)就跟加扎尼加在裂脑研究中所发现的一样,很会编理由。你想为自己喜欢这幅画找出一个冠冕堂皇的理由,所以你就会抓住第一个说得过去的原因(可能是颜色或光线)。道德判断也一样。两人对某事意见相左时,其实是感觉在先,后来再来编理由反驳对方。就算你驳倒对方,难道对方就会改变心意,接受你的论调吗?当然不会,因为你驳倒的,并非对方真正的立场,他的立场是在他有了判断之后才临时编出来的。

|!Name |The Linux Programming Interface |
|!Author |Michael Kerrisk |
|!Edition |1st |
|!Release Date |October 2010 |
|!ISBN-13 |978-1593272203 |
|!Medium |电子书 |
|!Rating |{{!!rating}} |
|!Name |百万富翁快车道 |
|!Author |[美]MJ·德马科 |
|!Edition |N/A |
|!Release Date |May, 2017 |
|!ISBN-13 |978-7508670614 |
|!Medium |纸质书 |
|!Rating |{{!!rating}} |

豆瓣链接:[[https://book.douban.com/subject/27041645/]]。

!! 总结

这本书比较口水化,但是道理讲得还可以。如果你没有想过如何赚钱致富这一回事,这本书会给你一些启发。作者的观点比较激进,这让我觉得是个加分项;中规中矩的方式能带来的改变太少。

!! 放弃「缓慢致富」

这本书从批判「缓慢致富」开始:

> 这就是所谓的缓慢致富,听起来像是这样:上学,毕业,取得好成绩,找个好工作,在股票市场投资,最大化401K保障,少刷信用卡,尽量使用优惠券。然后终究有一天,或许是65岁的时候,你就会很有钱。
> 说白了,缓慢致富就是:牺牲你的今天、你的梦想、你的人生,当你生命几近尾声时,你将得到支付的股息。坦率地说,如果财富之路吞噬你充满活力的成年生活,那这条路一定是很烂的。如果你的财富之路过度依靠华尔街并且要赌上你毕生的时间,那么这条路一定是肮脏烂污的死胡同。

因为缓慢致富是需要大量时间的。当你老了的时候,钱可能不如青春和时间宝贵。

作者对财富的定义是 3F:

<<.center "''家庭(family)或人际关系、健康(fitness)和自由(freedom)''。">>

作者构筑了几个人生路径的比喻:

* 人行道:无视收入多少,提前消费,透支信用卡,没有储蓄,人生忙于还债
* 慢车道:认真上班,控制消费,做简单投资,期望复利能让你发财
* 快车道:找到方法努力赚钱,更快地赚钱,年轻时候就赚到钱

采用「人行道」方式的问题不用多说。而且这种情况可能更多出在信贷较宽松的美国,而不是中国人的常态。关于「慢车道」和「快车道」的演绎值得一提。

!! 慢车道

慢车道的典型行为有:

* 节省消费
* 认真上班,期望公司给予更高的收入
* 做投资,期望钱增值

节省消费没什么问题,问题在于慢车道的收入公式:

<<.center "''财富 = 工作收入 + 投资收益''">>

工作的好处是:

* 让你了解工作流程、行业及业务知识
* 锻炼技能
* 如果你出名了,或者公司带有光环(比如核心大公司),那么在市场上会比较受认可

而工作收入存在的问题是:

* 你没有控制权。给你多少钱是你老板说了算
* 你创造的收益肯定比老板支付给你的薪水多(不然公司靠什么赚钱)
* 升值空间有限,老板不可能每年都给你 20% 涨幅
* 高额税收
* 风险仍然存在:能否一直健康?能否不受解雇?工作业务保持增长?

投资收益存在的问题是:

* 它需要大量的时间,使复利起作用
* 它并不是无风险的。2008 年的股市可以让一个人损失掉一半的积蓄
* 通货膨胀可能让货币贬值,从而使你实际的收益率降低

所以靠慢车道发家致富是不太现实的。

!! 快车道

走快车道意味着要构建商业系统。而慢车道者的工作只是商业系统中的一环。一旦商业系统成型,你的收入便来源于你的实际销售,你可以拥有你的所有利润。而且你的商业系统可以作为一种资产售出。财富公式:

<<.center "''财富 = 净利润 + 资产价值''">>
<<.center "''净利润 = 销售数量 x 利润率''">>
<<.center "''资产价值 = 净利润 x 行业乘数''">>

为了提升净利润,你可以:

* 提升销售数量。比如:
** 利用互联网作为杠杆传播内容或者软件服务
** 提高转化率或者访问量
* 提高利润率,比如通过自动化的系统

资产价值中的「''行业乘数''」,类似于股市中不同行业的市盈率。互联网行业的市盈率会比传统制造业要高。假如你的公司处于一个市盈率为 30 的行业中,如果你的净利润为 100 万元一年,那么你可以把公司卖出 3000 万元。如果你还会讲一个好的故事(比如瑞幸),那你的公司的乘数可以更高。

!! 怎样的商业系统能使财富快速增长?

怎样的商业系统才适合实现快速的财富增长?考虑:

* 这个业务最好能规模化。规模化使得即使单个产品利润少,也可以产生足够多的利润
* 被动性越高,你的系统越不需要人打理,从而间接提升了利润率

作者举了五种生意:

* 租赁系统。比如出租房屋、卖版权、卖专利使用权。这些几乎不需要怎样打理就有源源不断的收入
* 计算机 / 软件系统。电脑不需要睡觉,而且互联网使你的服务随时都可以被任何人访问
* 内容系统。做视频、写文章、出书等等,传播容易,复制成本低
* 分销系统。连接买家和卖家。比如 App Store,比如亚马逊。如果你的渠道能帮人很好地卖出产品,那就是好的分销系统。我理解「今日头条」是好的内容分销系统,「拼多多」是好的商品分销系统
* 人力资源系统。即是雇人来帮你干活。但这种系统的被动性较低,需要管理

!! 决策方法

如果你要做一个有风险的决定时,可以考虑这两种方法。第一种是「更坏情况分析(WCCA)」,需要你回答 3 个问题:

* 这个选择最坏的后果是什么?
* 这种后果的概率是多少?
* 这是一个可以授受的风险吗?

回答这几个问题后你可能就知道要不要做此决定。但我觉得这种方法仅适合于做一些 ''相对负面的冲动型选择'',比如赌博、出轨等。

另外一个方法是加权平均决策矩阵。比如你在犹豫要不要搬家,你可以采用这种方法综合评估:

|!因素 |!底特律 |!凤凰城 |
|天气(10) |2 |8 |
|学校(3) |2 |3 |
|生活成本(6) |5 |7 |
|商业氛围(2) |6 |4 |
|税收(7) |6 |7 |
|治安环境(4) |3 |6 |
|娱乐(8) |5 |2 |
|离家远近(7) |10 |0 |
|!总分 |!232 |!228 |

这种方法本身并不难理解,而且看起来比较科学。但其中存在的 ''问题'' 是,你可能很难对这么多因素都给一个合理的权重,而且对于每一个因素在不同场景下的得分也不是那么好打。但它的确会帮你认清哪些因素是需要考虑的。你最好把每个调研结果都用文字表达出来,再辅以分数。

!! 个人成长的通用原则

我将作者的对于个人成长的方法论总结成一条公式:

<<.center "''成长 = 利用时间的效率 x 时间投入''">>

如果你想要获得足够快的成长:

* 提高利用时间的效率,这意味着:
** 提高个人状态,比如保持好的心情、好的身体状态,使你在单位时间上的产出足够高
** 做更重要的事情
** 通过教育提升自己的技能水平
* 提高时间投入,这意味着:
** 节约浪费的时间:
*** 不浪费时间去排队买折扣品
*** 不浪费太多时间在没有成长的工作上
** 利用空隙时间或者一心多用

你可以给你的单位时间定一个价格,比如你的一小时值 100 元。如果你想买一件可有可无的东西,想想它会花掉你多少小时的收入。如果你白白度过了几小时,想想你损失了多少钱。''一旦时间的价值可以被量化,人们对浪费时间的感知会变明显。''

!! 如何打造成功的商业系统?

本书的第七篇——通往财富之路,是最有价值的部分。如果你想打造一套有影响力的商业系统,作者提出了几个戒律。

!!! 需求戒律

* 去解决实际问题,去帮助他人,为他人创造价值
** 而不是创造需求
** 而不是去「做你喜欢的事」(当然可以结合两者更好)

!!! 进入戒律

大家都在做的事情,必然道路拥挤,竞争激烈。做有门槛的事情,构筑护城河。

!!! 控制戒律

作者提出了一个「搭便车者」的概念。「搭便车者」即是利用别人的商业系统盈利的人:

* 投资基金,利用别人管理的基金盈利
* 加盟别人开的连锁店
* 作为内容提供商通过 AdSense 等广告平台收取广告费

「搭便车者」存在的问题是:

* 对核心的商业系统没有控制权:
** 一旦对方不再让你搭便车,你便无法再从中获得。比如:
*** 如果 Google AdSense 调整的盈利规则,或者禁止你的网站使用它,你便无法再获得广告费
** 意味着巨大的风险,你的收入可能一夜间中断
* 只能赚小钱,大钱被你依赖的商业系统获得

因此本质上还是要构建自己的商业系统。同时要打造自己的品牌,这是保持商业系统长青的一个保障。

!!! 规模戒律

什么是规模?规模在这里的定义,是「能否成倍增长」:

* 这个生意能否从每月赚 2000 元增长到 200000 元?
* 这个生意能否影响到数百万人?能否从某个小社区扩展到全世界?
* 卖出 100 件到卖出 10000 件有多难?

比如,如果你在城里开了一家咖啡店,但是你无法在别的地方开同样的咖啡店,那这个生意就不具有规模效应。

能规律化往往是快速致富的捷径。但如果你能提供比较高单价的商品(也往往意味着门槛高),也可以在一个规模稍小的市场获得不错的收益。

!!! 时间戒律

快车道生意的一大目标是 freedom,即你不需要像工作时一样,用时间换取金钱。让你无法脱身的生意只是一项工作。

!! 互联网生意

本书描述了 7 种互联网业务模式:

* 订阅服务:如每月付费才能使用的 SASS 平台(但我觉得订阅只是一种支付方式,一次性买断功能也不是不可以)
* 内容服务:提供免费内容,靠广告收费;内容可能是你自己生产的(比如博客),也可能不是(比如 V2EX 之类社区)
* 引导性销售:比如产品评测中网站中带有电商平台返利链接
* 社交网络:比如做一个 LinkedIn、Facebook。我感觉门槛较高,没有去了解过小型社交网络成功的例子
* 中介系统:如 Upwork、淘宝、携程,在每笔交易中收费
* 广告:比如 Google 广告系统,接受广告费,帮助广告主分发内容或获取订单
* 电子商务:指一般人把它的商品放到网上售卖。商品可以是实体内容也可以是电子的,比如电子书

!! 营销的重要性

> 和所有创新一样,生产只是一场大战中的一个小战斗,销售才是记得大战役的关键。如果一个产品无法送到人们手中,那它就毫无用处。要使它实现价值,则需要销售。
> 世界上最棒的著作可能无人问津,而平淡无奇之作却卖出了几百万册。区别点是市场营销,公共关系以及这项古老行业里的诀窍。写书并非一项生意,卖书才是。如果我有意将这本书卖出数百万册,我就得先制造,然后还得将书分销出去。我不得不营销、推广、露面、演讲、访谈和写作,我还得在分销方面投入时间和精力。

!! 如何找到机会?

> 机遇和开放的大路其实无处不在。瞧瞧周边,那个人正在小店柜台报怨,这是机会;在你致电给银行时,那个愚蠢的语音播报害得你晕头转向,这是机会;那栋卖不出去的房子无人理睬,这是机会;那里有个扔在路边的垃圾桶,这是机会;那盘放在冰箱里两天就腐败了的沙拉,这是机会;那些成天在论坛上吵来吵去的人,这是机会。

''任何的痛点、不够好的地方,都能成为机会。''

如果你想到了一个点子,但是有人已经在做了。没关系,看看他怎么做的,他哪里做得不够好。你往往想不出别人没想过的点子,但是你可以在 ''执行'' 上做得更好。

!! 设定目标的重要性

第 37 章非常值得一读。如果你没有明确的目标:

* 你不知道你在这条路走了多少,什么时候可以停下来庆祝下阶段性的胜利
* 你的目标一旦含糊,你可能没有充足的动力走下去

作者给出了一个思考的框架:

# 定义生活方式:你想要什么?
# 评估成本:你的梦想需要多大代价?
# 设定目标:建立金钱系统和生意收入目标。
# 实现:找到方法并去做!

作者的例子是:

# 定义生活方式:3 辆汽车,500 平大房子,山上小木屋,一年旅游 3 次,孩子上私立学校
# 评估成本:算出每个月需要多少钱才可以实现上面的生活方式。作者算成的生活总成本在 14000 美元/月,考虑交税将该值除以 0.6,得到一月的成本为 23333 美元
# 设定目标:
#* 商业系统目标:作者用生活总成本乘以 5,为 70000 元。即你的商业系统每月收入要达到 70000 元。他考虑到 40% 交税,40% 给金钱系统做投资,20% 用于维持生活方式
#* 金钱系统目标:假如你没有其他收入,纯粹靠投资来生活。按年 5% 收益计算,作者需要 560 万的本金
# 实现:规划一个路线图,并在过程中不断地执行它、细化它。时常回顾下自己完成了总目标的多少。以金钱为衡量单位,会比较明确

另外,管理金钱系统,懂一些 ''财务知识'' 很重要,包括:

|利率 |应税和非税收益 |抵押货款分期偿还 |支票余额 |基本比率计算 |计算投资回报率 |
|股票为何上涨和下跌 |<|为何一个 15% 回报的银行存单是骗局 |<|<|股票期权是什么 |
|保险 |共同基金 |债券 |全球通货 |<|<|

!! 执行

执行力很重要。''好的执行应该是以最快的速度解决最高优先级的事情。''

如果你想融资,商业计划书并不一定很重要,让投资人看到你前期执行的效果更重要。

根据数据来做判断。多做 A/B Test。

在关键领域比竞争对手做得好,超出用户的期望,形成口碑。一旦客户对你的产品有了忠诚度,他就是你免费的员工,会帮你宣传,带来新的客户。

想好你的目标用户是什么,照顾好他们的感受;如果他不是你的目标用户,可以不必理会他的报怨和投诉。

!! 建立自己的品牌

当人们谈到沃尔沃,人们想到的是安全;保时捷则象征速度;法拉利,对应的是富有;丰田则是可靠。品牌能让人脱颖而出。

找到自己产品的独特优势,给出简短清晰的销售主张(「你的车会在 20 天内出售,否则不收费」),将销售主张放进所有营销材料中,不管是实体的货车还是网站的标语、名片、电邮签名等等。

在定价时不要一味考虑消费者的性价比。如果你定得太低,可能会折损消费者对你的品牌的认可。''价格实际上包含了你的产品的高品质所建立起来的品牌带来的溢价''。

!! Q&A

本书最后的「读者反馈」部分挺有意思。作者是个比较激进的人,它的观点尖锐而理性,很值得一看。

作者不认为每周工作四小时可以致富。每周工作四小时是快车道的结果而不是过程。「我从未遇到过哪个百万富翁是每周只工作四小时的」。

他也不相信 [[联盟行销|Affiliate Marketing]] 是有价值的。他认为这种生意门槛太低、缺乏控制权(依赖于广告系统),能做到赚大钱的概率太低。

-- End --
|!Name |为什么精英这样沟通最高效 |
|!Author |桦泽紫苑(著),郭勇(译) |
|!Edition |N/A |
|!Release Date |August, 2019 |
|!ISBN-13 |978-7540491260 |
|!Medium |纸质书 |
|!Rating |{{!!rating}} |

First comment:

这本书很特别,它不像其他畅销书一样会花大篇幅去讲它的理论有多少科学支持(但是读者也分辨不出是真是假)、有多少这样那样的实验(读者也不知道实验是否被科学界同行认为有说服力),它基本不废话,围绕每一个小点仅用 2-4 页篇幅描述,且内容偏实用型,插图直观漂亮,读起来很轻松且能马上运用。

Second comment:

这本书的形式我很喜欢。整本书有八十多个话题,每个话题基本上是 2-4 页,配合大量插图,非常容易看。不像很多畅销书在讲一个简单的理念时,喜欢列一长段一长段的所谓科学依据,再写几个可有可无的例子,好几十页就过去了;这本书没太多废话,简单的描述好处,然后就讲具体的实践方式,而且往往会为最重要的信息配图和高亮文本,看起来很方便。同时里面很多理念我也非常认同,大部分也已经是个人方法论中的一部分。但是它的内容组织形式也带来一个问题,就是感觉这本书是一个更适合于播客这种没那么干货的形式,通过聊天来讲出这些观点似乎更好。作为一本书时,我就会有种期待,觉得应该是有深层次并且系统组织的内容,但这本书并不是这种类型。

这本书插图很多,核心理念都在插图中。如果想回顾的话建议拿起书来翻阅,比在这里看笔记会更简单。

!! Core Ideas

!!! 输出的重要性

* 在自我成长过程中,最重要的并不是输入的量,而是沟通输出的量。
* 输入包括阅读、听讲座等等方式,输出包括做习题、写文章、向他人讲述等等方式。每段输入都应该有相应的输出。输入与输出的量应该在 3:7
* 多做输出的好处:更深刻的记忆、理解;实现自我成长;带来快乐

!!! 如何沟通

* 多做纪录,比如写日志
* 正能量、不说消极语言,显著提升幸福感
* 沟通时不一定只用嘴,表情、肢体动作更有效
* 与其聊得久,不如经常聊
* 提问是非常好的沟通工具
* 学会拒绝,为了优先做自己真正想做的事情

拒绝的公式:道歉(感谢)+ 理由 + 拒绝 + 替代方案,比如:

> 上司请求我加班,我会这样回绝:“不好意思(道歉)!您能选我加班,真是我莫大的荣幸,非常感谢(感谢)!不过,今天我儿子的补习班召开家长会,我必须得去一趟(理由),所以非常遗憾,今晚不能加班(拒绝)。如果时间能宽限到明天中午,我一定能在规定时间之前做完(替代方案)。

!! 写作

* 产生创意:[[Writing: Gathering Materials]]

!! 行动力

* 让“通过努力可以实现”的状态不断重复出现:这句话很精辟。定一个稍微有些难度、但又可以通过努力实现的目标。
* 不管怎么样,先做起来再说:解决拖延症、状态不佳的最好方法
* 用语言“排毒”:痛苦的事情,一吐为快,找别人倾诉或者写日志下来,会舒服很多
* 降低要求,完成工作:不要做完美主义者,先 60 分,再 90 分
* 做出一副笑容,你就会真的开心起来
* 深呼吸是平复情绪的好方法。一分钟深呼吸法:
*# 用 5 秒钟慢慢吸气
*# 用 10 秒钟慢慢呼气
*# 再用 5 秒钟将肺里的空气全部排空
*# 重复 3 遍

!! 7 种纪录方法

* 写日志
* 写心情,纪录心情好坏,想并写下原因
* 写读后感:领悟 + Todo
* 在网上发表文章
* 在社交媒体发表信息
* 写博客
* 围绕兴趣爱好写文章:我理解最好是完整的、有价值的一系列文章





安装及维护:

* [[安装及初始化 TiddlyWiki|TiddlyWiki: Install and Initialize]]
* [[TiddlyWiki 目录结构|TiddlyWiki: Directory Structure]]
* [[对 Node.js Server 启用 lazy-loading|TiddlyWiki: Lazy Loading for Node.js Server]]
* [[对 Node.js Server 启用匿名只读|TiddlyWiki: Readonly for Node.js Server]]
* [[发布到线上|TiddlyWiki: Publish]]

内容操作:

* [[重命名 tiddler 时自动更新引用处|TiddlyWiki: Renaming Tiddler Done Right]]
* [[批量删除 tiddler|TiddlyWiki: Batch Delete Tiddlers]]
* [[批量导出 tiddler|TiddlyWiki: Export Multiple Tiddlers]]
* [[Markdown 与 WikiText 格式互转|TiddlyWiki: Conversion between Markdown and WikiText]]

图标及样式:

* [[嵌入 FontAwesome 到 TiddlyWiki 中|TiddlyWiki: Embed FontAwesome]]
* [[TW 官方维护的适用于写文档的宏|TiddlyWiki: Document Macros]]
* [[我编写的宏,用于更好地表达|TiddlyWiki: Custom Macros]]
* [[我单独编写的 UI 元素、样式等|TiddlyWiki: Custom UI]]
* [[将打开的 tiddlers 以 tab 形式显示在 tiddler 上方|TiddlyWiki: Use Story Tabs for Open Tabs]]

文本片断:

<<list-links "[tag[TiddlyWiki: Text Snippet]]">>

内容:

* [[导入外部媒体内容|TiddlyWiki: Import Media Contents to TiddlyWiki]]
* [[如何在一个列表项中放入多行内容|TiddlyWiki: Multi-line Content in List]]
* [[使用录音来做表达|TiddlyWiki: Using Recodings]]
* [[给每个 tag tiddler 插入以它子结点形成的 TOC|TiddlyWiki: Generate TOC for Tag Tiddler]]
* [[在侧边栏显示人生进度|TiddlyWiki: Life Progress]]

交互式图表:

* [[使用 SVG 制作多个点击可跳转区域|TiddlyWiki: SVG and Interactive Diagrams]]
* [[TiddlyMap 使用经验(不推荐)|TiddlyWiki: TiddlyMap]]

阅读:

* [[实现 Tiddler 内的 TOC 展示|TiddlyWiki: In Tiddler TOC]]

内容整合:

* [[10 章最近的自省笔记|TiddlyWiki: 10 Most Recent Tiddlers of Introspection]](非公开)
* [[按时间排序显示全部 Tiddler|TiddlyWiki: All Tiddlers sort by Date]]

资源:

* [[TiddlyWiki 官网及其他资源|TiddlyWiki: Resources]]
全部 tiddler,按创建时间排序:

<<timeline dateField:created limit:1000000 subfilter:"!untagged[]" format:"YYYY/MM/DD">>
<<.warning "在做这个操作时,''一定'' 要 ''慎重慎重再慎重''。最好是在一个保存下来的单 HTML Wiki 中做这个操作,而不是在 Node.js 版中做这个操作。">>

参考官网文档中的 [[ActionDeleteTiddlerWidget|http://tiddlywiki.com/#ActionDeleteTiddlerWidget]]。

例子是:

```
<$button>
<$action-deletetiddler $filter="[tag[TableOfContents]]"/>
Delete tiddlers tagged "~TableOfContents"
</$button>
```
[[jeffrey4l/pandoc-addons|https://github.com/jeffrey4l/pandoc-addons]] 提供了两个 pandoc 的 lua 脚本用于做转换,转换质量很不错。我将仓库内容保存在网盘上了。使用前需要先安装 pandoc。

用法:

```shell
cd ~/OneDrive/Journey/Toolbox/TiddlyWiki/markdown-to-wikitext

# Markdown to WikiText
pandoc -t md2tid.lua example.md -o example.tid

# Markdown to WikiText
pandoc -t tid2md.lua example.tid -o example.md
```
在 [[$:/macros/onlyice/handy]] 中定义了一些实用的宏。

!! Icon

任务是否完成的 icon:

* `<<task-undone>>` <<task-undone>>
* `<<task-done>>` <<task-done>>

区分软件平台:

* `<<plat-win>>` <<plat-win>>
* `<<plat-mac>>` <<plat-mac>>
* `<<plat-linux>>` <<plat-linux>>
* `<<plat-android>>` <<plat-android>>
* `<<plat-chrome>>` <<plat-chrome>>

表示是程序代码(而不是可执行文件):

* `<<icon-code>>` <<icon-code>>

图标:

* `<<icon-star-full>>` <<icon-star-full>>
* `<<icon-star-half>>` <<icon-star-half>>
* `<<icon-star-empty>>` <<icon-star-empty>>
* `<<icon play>>` <<icon play>>

ES 兼容性表格:

* `<<es5-compatibility-table>>` <<es5-compatibility-table>>
* `<<es6-compatibility-table>>` <<es6-compatibility-table>>
* `<<es-next-compatibility-table>>` <<es-next-compatibility-table>>

!! 文本格式

* 强调 `<<.s "Hello World">>` <<.s "Hello World">>
* 居中 `<<.center "Introduction">>`:<div>
<<.center "Introduction">>
</div>

!! 功能性宏

展示 PDF:

```
<<display-pdf path:"/files/path/to/your.pdf" title:"your.pdf">>
```

也定义了一个 [[snippet|Text Snippet: Inline PDF]]。

!! 辅助信息

块:

* `<<.todo "第四章未读。">>`:<div>

<<.todo "第四章未读。">>

</div>

知识点重要性:

* `Basic Usage <<.p1>>`:Basic Usage <<.p1>>
* `Query <<.p2>>`:Query <<.p2>>
* `Generated Columns <<.p2>>`:Generated Columns <<.p3>>


我自定义的 UI 元素放在这些 tiddler 中:

|!一些不太有用的宏定义 |$:/macros/onlyice/handy |
|!使用 Open Sans 字体 |$:/styles/onlyice/opensansfont |
|!脚注样式 |$:/styles/onlyice/popup-style |
|!大量样式调整 |$:/styles/onlyice/theme-tweak |
|!UI 元素 |$:/styles/onlyice/ui-elements |

!! Box(盒子)

Box 是一个视觉工具,用来区分内容块。用法:

```html
<div class="box">

> 代码和媒体(内容)是杠杆,是资产,在睡觉时仍然为你干活。

这个观点我觉得很有启发。对比资本以及人力这种杠杆,做一个产品自动为用户服务,而且边际复制成本又极低,是快速有效的方法。
</div>

<div class="box">

> 提供社会大众想要但是他们还不知道如何获取的东西,你就会因此而致富。但有一点:你必须 ''规模化'' 地供应社会。

''规模化'' 很重要。如果你做的东西市场很小,那它的价值不会被放大。

</div>
```

效果:


<div class="box">

> 代码和媒体(内容)是杠杆,是资产,在睡觉时仍然为你干活。

这个观点我觉得很有启发。对比资本以及人力这种杠杆,做一个产品自动为用户服务,而且边际复制成本又极低,是快速有效的方法。
</div>

<div class="box">

> 提供社会大众想要但是他们还不知道如何获取的东西,你就会因此而致富。但有一点:你必须 ''规模化'' 地供应社会。

''规模化'' 很重要。如果你做的东西市场很小,那它的价值不会被放大。

</div>

!! 限制代码块的高度

有些长度的代码,你可能并不希望它占据太大的版面。于是我写了一个 CSS 类,用于限制它的高度。写法如下(点击编辑看源码):

<div class="limit-code-block-height">

```
this
is
a
very
very
very
very
very
very
very
very
very
very
very
very
very
very
very
long
code
block
.
```

</div>

一个 Basic client-server edition 版本的 TiddlyWiki 的目录结构大概是这样子的:

```
├─ tiddlywiki.info
└─ tiddlers
    ├─ a.tid
    └─ b.tid
```

其中 tiddlers 文件夹存储了各个 tiddler、插件文件、主题文件等内容,整个 Wiki 的全部组件、内容都以纯文本形式存储在这里。TiddlyWiki 并不会在意 tiddlers 文件夹里面的目录结构是怎样的,它只会关心每一个文件的元信息(比如文件头部的属性,`type`, `title` 等),然后将它载入进来。所以你可以在 tiddlers 文件夹里面按自己方便管理的方式来随意组织目录结构。

不建议把 PDF 也变成一个 tiddler,因为 PDF 最终会以 [[Data URIs|http://caniuse.com/#feat=datauri]] 的形式出现在 TiddlyWiki Web 端上,但是 PDF 体积过大(?),可能会使浏览器不渲染它。同理其他体积较大的资源文件也类似,尽量不要以 tiddler 形式存储进来,会造成生成的 HTML 里面嵌入太多数据而过大。最佳的实践是只放图片进来。

<$macrocall $name=".tip" _="另外,插件是可以在 [[控制面板|$:/ControlPanel]] 里面安装的,不要自己费力手动装了。">
! TiddlyWiki 文档宏

TiddlyWiki 的官方文档引入了一些文档宏,它们有助于表达。我把它的宏文件下载下来,放到了 `Dropbox/Journey/Wiki/tiddlers/system/` 中,分别是 `doc-macros.tid` 与 `doc-styles.tid` 文件。

对于其他 tiddlywiki 想使用这个功能的,可以把下面两个链接拖到自己的 wiki 网页上 import 进去:

* [[$:/macros/tw5.com/doc-macros]]
* [[$:/styles/tw5.com/doc-styles]]

可以在 [[官方文档|https://tiddlywiki.com/static/Documentation%2520Macros.html]] 查看 Documentation Macros 一节,有详细的描述。复制了里面常用的文档宏说明过来。

!General

|!Macro |!Used for |!Example |
|.def |the defining instance of a term |<<.def widget>> |
|.em |minor emphasis within a sentence |<<.em not>> |
|.place |a placeholder for the user to fill in |<<.place tagname>> |
|.strong |major emphasis within a tiddler |<<.strong Important!>> |
|.word |a mention of an ordinary word or phrase |<<.word "hello world">> |

!Advice

|!Macro |!Used for |!Example |
|^.tip |^hints and tips |<<.tip "Turn your screen on, otherwise<br>you won't be able to see much.">> |
|^.warning |^warning advice |<<.warning "Make a backup of your file<br>before you upgrade.">> |
|^.info |^important stuffs |<<.info "Don't tell your password<br>to anyone.">> |

`.info` 是我自己加的,用来作强调的作用。

注意这里有一些奇怪的问题,用这种方法排版,后面的那段文字会截断并错乱:

`<<.tip "content"`

用这种方式就不会:

`<$macrocall $name=".tip" _="""content"""` 

会产生这个问题的文字:

> 这篇 tiddler 用了 `list-before` 宏,并赋给它一个空值,用于使它在 `<<list-links "[tag[TiddlyWiki]]">>` 中置于首位。

怀疑是各种符号转义带来的问题,暂时不想去深究。

!Blocks
|!Macro |!Used for |
|.preamble |an introductory sentence that stands apart from the rest of the tiddler |

<<.preamble """这是一块开场白。""">>
TheDiveO 做了一个[[插件|https://github.com/TheDiveO/TW5FontAwesome]],将 FontAwesome 的字体文件以 Base64 的形式嵌入一个 CSS 中,与 Icon 的 CSS 类(如 `fa-circle-o`)整合起来作为一个大 CSS,然后就可以以 Stylesheet 形式导入到 TiddlyWiki 中使用。

导入的具体做法是(可能后面会有变化):

# 打开 [[这个网页|http://thediveo.github.io/TW5FontAwesome/output/fontawesome.html]]
# 按里面的指引将 `$:/plugins/TheDiveO/FontAwesome/fonts/FontAwesome` 这个链接拉到你的 TiddlyWiki 网页上 Import 进来
# 随便在一个 Tiddler 里输入 `<i class="fa fa-flag"></i>`,看看有无 <i class="fa fa-flag"></i> 图标出现,有的话就 OK 了

我改了下这个导入的 tiddler 的标题,使它简单一点:[[$:/plugins/TheDiveO/FontAwesome]]

!! 参考

* [[TheDiveO 方案|https://thediveo.github.io/TW5FontAwesome/output/fontawesome.html]]
* [[Font Awesome 5 Free SVGs for TiddlyWiki|http://fa5-free-svg.tiddlyspot.com/]]
日常使用中经常有一些场景,需要只导出部分的 tiddler。比如分享给朋友关于翻墙的部分内容时,那我只想要那部分相应的 tiddler 导出。

批量导出有两种方式。

一种是 TiddlyWiki 内置的支持,通过 [[$:/AdvancedSearch]] 的 Filter 页,把你想要的 tiddler 全部 filter 出来。再点击输入条右方的 export 按钮。这种方式的缺陷在于,导出来的 HTML 文件中,tiddler 是全部平趟开来的,这有点影响阅读。而且全局的 TOC 树,搜索功能等,全部没了。

另外一种,是用代码去分析 tid 文件,然后把所需要的 tiddler 文件等复制到一个新的地方,再用 Node.js 的 tw5 server 去启动新的 wiki,从而导出成单 HTML。`Dropbox\Journey\Toolbox\TiddlyWiki\tw5_bundler.py` 有一个例子。
给每个 tag tiddler 插入以它子结点形成的 TOC。

使用了 TiddlyWiki 的 ViewTemplate 机制。代码在 [[Display TOC for Tags]]。注意如果想给 toc 宏传递 sort 参数,可以在 tag tiddler 的 field 中添加 sort 参数,比如:

* [[Popular Book]] 中 `sort` 值为 `!sort[read-start]`,表示按 read-start 属性降序排序,把最近读的书排在上面
* [[OSTEP]] 中 `sort` 值为 `sort[created]`,表示按创建时间正序排序
在 TiddlyWiki 添加外部媒体内容。内容可以是图片、音视频、PDF 等等,但由于 TW 的单 HTML 特性,视频 / PDF 等体积较大的内容并不适合直接加载进 TW。仅推荐导入图片。

!! 导入图片

使用图片有两种方式:

* ''将图片导入进来'',这会使得 TW 的单页 HTML 体积明显增大(因为包含了图片的 Data URI)
* ''使用 [[外部图片|https://tiddlywiki.com/#ExternalImages]] 的机制'',在打开图片所在 tiddler 时再做加载

我目前的实践是:

* 本地的 wiki 使用导入图片的方式。这样离线也可以正常察看及编辑
* 线上的 [[公开 wiki|https://wiki.zhiheng.io/]] 使用外部图片机制,这使得生成的单页 HTML 小,而且图片可以放在 COS / CDN 等加速加载。这套 [[发布流程|TiddlyWiki: Publish]] 已经自动化

!!! 导入图片的方法

将图片拉进 TW 页面中 import 进来,然后修改它的标题。我一般用小写字母加连字符,不带文件格式后缀,如 `git-cheet-sheet`。这样做之后,`tiddlers/` 目录中会多两个文件,如 `git-cheet-sheet.jpg` 及 `git-cheet-sheet.jpg.meta`。

!!! 外部图片的方法

外部图片的方式仅与导入图片方式略有不同。过程如下:

# 使用上面讲的导入图片方式先导入图片,获得两个文件,如 `http-basic-auth.png` 及 `http-basic-auth.png.meta`
# 图片发布到 COS,得到链接如 `https://wiki-1251140025.cos.ap-shanghai.myqcloud.com/tiddlers/assets/http-basic-auth.png`
# 将 `http-basic-auth.png` 内容清空(可以用文本编辑器强行打开并删空,也可以用程序清空)
# 在 `http-basic-auth.png.meta` 中加入 `_canonical_uri` 属性,如:<div>

```txt
_canonical_uri: https://wiki-1251140025.cos.ap-shanghai.myqcloud.com/tiddlers/assets/http-basic-auth.png
created: 20200415234405142
modified: 20200820061954300
title: http-basic-auth
type: image/png
```

</div>

这样就可以了。

我写了 [[发布脚本|TiddlyWiki: Publish]] 来实现自动化过程。

!!! 嵌入图片到 tiddler 中

无论使用的是上述哪种方法导入图片,使用图片的过程都是一样的:

# 可以使用 img 标签,可以带 `width`:`[img width=500 [css-core-concepts-diagram]]`
# 或者使用更简单的 [[Transclusion|https://en.wikipedia.org/wiki/Transclusion]]:`{{Git Cheat Sheet}}`,缺点是无法控制图片的各项属性

参考 [[Images in WikiText|http://tiddlywiki.com/static/Images%2520in%2520WikiText.html]] 。

我还没找到一种足够好的实践来管理图片,等后面图片内容多了后再思考下。

!! 导入音视频

参考 [[TiddlyWiki: Using Recodings]]。视频与音频类似。

!! 导入 PDF

将 PDF 文件放在 `/files` 或者是 COS 中。使用 [[Text Snippet: Inline PDF]] 这个 snippet 来插入 PDF。Chrome 浏览器需要搭配安装 [[PDF Viewer 插件|https://chrome.google.com/webstore/detail/pdf-viewer/oemmndcbldboiebfnladdacbdfmadadm]]。具体示例看 [[HyperLogLog]]。
Tiddlywiki 在设计哲学上,倾向于 tiddler 是短小的、易于组合的;但是以我的使用场景,tiddler 往往可能很长,并且存在层级。这时候需要一个 tiddler 内的 TOC 来方便梳理内容的脉络,并快速检索、跳转。

看过 Tiddlywiki 的 Google Group,似乎实现这种 TOC 并不容易(讨论 [[1|https://groups.google.com/d/topic/tiddlywiki/6zBxrj4nV34/discussion]] [[2|https://groups.google.com/d/topic/tiddlywiki/23PzU2qCsj4/discussion]])。但是我又发现一个曲线救国的办法。

有一个 Chrome 插件叫 [[Smart TOC|https://chrome.google.com/webstore/detail/smart-toc/lifgeihcfpkmmlfjbailfpfhbahhibba]],安装后可以在任意页面显示当前内容的 TOC。这样你用 Tiddlywiki 时也可以借助它实现 In tiddler TOC。

---

作者在 [[这里|https://groups.google.com/d/msg/tiddlywiki/6zBxrj4nV34/NucvoBSuscYJ]] 提到了对于 TOC in Tiddler 的看法:

> That implies making sections behave exactly like tiddlers. That's problematic because it means that all the behaviours we've built for using and manipulating tiddlers need to be re-engineered to work with sections. In some cases that's extremely tricky.
> For example, how would you make a location hash link to a section (eg http://example.com/#my-section-12)? There's no syntax within the location hash to identify the string as being a section name and not a tiddler title.
> Another example, to use the $list widget to list all sections of tiddlers tagged bar would require us to be able to process section names within filters. That implies that sections would need unique IDs - once again, making them meet the definition of a tiddler.
> Basically, TiddlyWiki is a mechanism for manipulating tiddlers. Everything about it is predicated on the idea of a tiddler as the smallest unit of content. Your requirements describe something else: a mechanism for manipulating sections of monolithic hierarchical documents.

他的说法值得参考,往往你在设计一个灵活的软件结构时,一开始打开的根基、一开始的设计会影响到后续的方方面面。比如在 Tiddlywiki 中,一个 Tiddler 应该是最小的有效信息单位;如果抛弃这个设定,那系统的一些其他设计会显得奇怪。这是作者不主张加一个 Section 概念的重要原因。
! 安装及初始化 TiddlyWiki

首先你需要安装 TiddlyWiki 的 Node.js 命令行程序:

```cmd
$ sudo npm install -g tiddlywiki
```

然后建立一个新的 Wiki 项目:

```cmd
$ cd /home/onlyice/Dropbox/Journey
$ tiddlywiki Wiki --init full
```

然后就可以运行 tiddlywiki 了:

```cmd
$ tiddlywiki --server
```

打开 http://127.0.0.1:8080 可以看到 Wiki 界面。

它的 [[GitHub 页面|https://github.com/Jermolene/TiddlyWiki5]] 上有详细的说明。

<$macrocall $name=".tip" _="""这篇 tiddler 用了 `list-before` 宏,并赋给它一个空值,用于使它在 `<<list-links "[tag[TiddlyWiki]]">>` 中置于首位。"""/>
```shell
tiddlywiki --listen root-tiddler=$:/core/save/lazy-all gzip=yes
```
在 wiki 侧边栏上展示人生进度。其中假定我的寿命为 75 岁,前 60 年是健康的。

通过 SidebarSegments 将其加入侧边栏:[[$:/ui/onlyice/SideBarSegments/countdown]]。其中使用了 `list-before` 来使其位置处于工具栏之上。

显示 progress bar 及百分比的宏:

* [[$:/macros/onlyice/life-progress.js]]
* [[$:/macros/onlyice/healthy-life-progress.js]]
* [[$:/macros/onlyice/year-progress.js]]
* [[$:/macros/onlyice/progressbar.js]]

上面这些宏使用的是 [[JavaScript Macros|https://tiddlywiki.com/dev/static/JavaScript%2520Macros.html]]。

其中进度条的样式参考了 [[这里|https://changaco.oy.lc/unicode-progress-bars/]]。
有一些场景下,需要在有序列表中的某个项目(item)下展示代码或者段落。但是默认情况下,TiddlyWiki 认为一换行就到下个项目(item)。比如下面的例子,code blocks 并不被认为是第一项里面的,同时也没有正确的缩进:

<div class="box">

# 新建 `styles/style.sass` 文件,写入:
```
@charset "utf-8"

// 对 Bulma 定义的变量做修改时,应该放在 import 语句之上
$box-padding: 0.75rem

@import "../node_modules/bulma/bulma.sass"
```
# 将 `styles/style.sass` 编译成 CSS

</div>

官方提供的 [[解决方法|https://tiddlywiki.com/#Lists%20in%20WikiText]] 是使用 `$transclude` 或者加个 `<div>` 元素。这里使用 `<div>` 对上面代码做改造:

<div class="box">

# 新建 `styles/style.sass` 文件,写入:<div>

```
@charset "utf-8"

// 对 Bulma 定义的变量做修改时,应该放在 import 语句之上
$box-padding: 0.75rem

@import "../node_modules/bulma/bulma.sass"
```
</div>
# 将 `styles/style.sass` 编译成 CSS

</div>

现在就是正常的展示了。
|!2016 年 3 月 |开始使用 |
|!2017 年 2 月 |编写了 230+ 个条目 |

Nothing much to say here...
原理是配置可匿名读,但是写需要登录,然后给一个猜不到的用户名密码:

```shell
tiddlywiki --listen "readers=(anon)" writers=joe username=joe password=dasff11354z[
```
[[Relink|$:/plugins/flibbles/relink]] 插件可以使你重命名 tiddler 时,将引用到这个 tiddler 的各个地方更新,比如 `list` field、文章中的链接等。
[[官方网站|http://tiddlywiki.com/]] 的信息非常多,同时可以看看 [[Community|http://tiddlywiki.com/#Community]] 的例子,有一些做得很不错的例子,很有启发。

Tobibeer 制作并整理了很多插件,放在这个 [[网站|http://tobibeer.github.io/]] 上。
使用 SVG 实现图片局部可点击跳转的效果。

各种尝试后,目前可行的方法是:

# 使用亿图的桌面端画图,导出 SVG(使用「''导出选中的图形''」这个功能)
# 将 SVG 文件放到网盘的 `Work/Diagrams` 目录中,注意命名上用 ''小写加连字符''(如 `mysql-architecture.svg`)
# 如果 SVG 文件中有文字需要链接到 wiki 条目,即 ''想实现点击 SVG 图片某一部分可跳转的能力'' 时,新建一个 JSON 配置文件(如 `mysql-architecture.json`),在里面的 `links` 字段中写对应关系,如:<div>

```json
{
    "links": {
        "Server 层": "MySQL"
    }
}
```
</div>
# 运行目录下的 `transfer.py` 程序,会自动将文件转为 tid 文件并复制到 TiddlyWiki 目录下的 `tiddlers/diagrams` 目录中
# 重启 TW Server 使新的 tid 文件生效
# 在想包含这个 SVG 图形的 tiddler 中,使用 transclude 将 SVG tiddler 包裹进来。例子看 [[MySQL]]

转换脚本 `transfer.py` 做的事情有:

# 将 SVG 文档其中的 `<style>` 中的 CDATA 去掉。CDATA 这段对于单独一个 SVG 文件是合适的;但是 SVG in HTML 时,浏览器不认这段 CDATA,因此去掉 CDATA 后使其成为 HTML 中的 CSS style(不确定 SVG 的样式跟 HTML 中的 CSS 有无差异性)
# 如果该 SVG 有对应的 JSON 配置文件,获取其中的文字与链接对应关系。再遍历 SVG 中的节点,如果有找到相应的文本,修改为 TW 的 `[[Text|Link]]` 格式(注意 TW 5.1.22 及之前的版本在这里有 bug,tid 渲染时会无法显示这些文字)
# 用修改后的 SVG 文件生成一个 tid 文件,复制到 TW 的 `tiddlers/diagrams` 文件夹中

<<.note "不要执着于使 wiki 中的 SVG 与亿图客户端中的展示完全一致。有一些差异。在亿图中做图时尽量 ''使用细线条''。">>

!! Troubleshooting

!!! 空白字符的问题

使用 [[做图软件|Making Diagrams]] 生成的 SVG 时,注意 ''不要去做 prettify''。因为 prettify 后会向 SVG 文档加入额外的空格,而浏览器在渲染这些空格后,效果就跟原来的排版不一样了。

!!! 使用 SVG 嵌入 TiddlyWiki 存在的问题

TiddlyWiki 大概支持两种方式嵌入 SVG:

* 作为单独的 SVG tiddler(即该 tiddler 的 type 为 image/svg+xml)。这种方式使得这个 tiddler 无论是单独展示,还是被嵌入(transclude)其他 tiddler 时,它都是以 data URI 形式作为图片展示。这使得你没法复制其中的文字或者点击其中的链接
* 作为内联元素嵌入一个 text/vnd.tiddlywiki 类型的 tiddler。类似在 Markdown 里面支持写 HTML,WikiText 中也支持写 HTML 或者 SVG

尝试了亿图(Edrawsoft)的导出 SVG。在线版导出的 SVG 与桌面版的不一样。当作为 inline SVG 嵌入 tiddler 中时:

* 在线版的 ''不显示文字''。但 SVG 单独打开时是正常的。可能跟它使用了 `<foreignObject>` 有关系
* 桌面版的 ''正常'',但显示效果与桌面中有小差异(比如厚度看起来不太一样)

因此,可以用桌面版实现 SVG image map,即点击 SVG 中某一元素,跳转到某一 tiddler。

[[TiddlyMap|http://tiddlymap.org/]] 是个非常不错的插件。它可以定义不同 tiddler 间的关系,并可以在一张图中将其表示出来。

这使得:

* 可以在 TW 中展示复杂的层次结构和关系,比如架构图
* 弥补了 TiddlyWiki 在这方面展示能力的不足

但我实际使用之后,觉得仍然有一些可用性问题:

* 项目用的 Vis.js 已经不再维护了。我发现一个 SVG 图标无法展示的问题,大概率是 Vis.js bug,无法解决
* 图表能表示的仅有点和边,无法自定义画图,因此无法做出比较好看的架构图

因此我还是把它从我的 wiki 中去掉了。''不推荐使用''。
效果如图:

[img width=900 [story-tabs-illustrated]]

在 Tiddler 上方显示一条标签栏,使得定位已打开的 tab 变得容易。

插件来源于 [[BJ Tools|http://bjtools.tiddlyspot.com/#%24%3A%2Fplugins%2Fbj%2Fstorytabs]]。

''安装方法'':

* 打开上述 BJ Tools 的链接,打开 Control Panel,打开 plugins tab,定位到 story tabs 的插件
* 将其拉到你的 wiki 页面,即安装成功

''需要做的配置'':

* 在你的 Control Panel => Appearance => Story View,改为 zoomin
* 在你的 Control Panel => Info => Basic,将 animation duartion 改为 0

''样式优化'':

插件本身的 tab bar 下面没有一根分隔线,我加了一根。改动在 [[$:/plugin/bj/storytabs]] 中(用以覆盖插件中的原文件),在这个页面将它的链接拉入你的 wiki 中即可使用。改动点在这两行:

```html
<!-- 加了 style 部分,使用负边距让分隔线贴近 -->
<div class="tc-tab-buttons" style="margin-bottom:-1px">
<!-- 加了这行,表示分隔线 -->
<div class="tc-tab-divider tc-sidebar-tabs-main"></div>
```
有些内容用文本来表达不如用语音:

* 一些复杂的、但是非硬知识的内容(比如为人处事之道等),适合用语音来表达,这样更像是两个人在对话,更容易理解。比如 [[Introvert or Extrovert, This is a Choice]] 这篇就适合用语音,用文字反而难理解
* 情感用录音来表达更丰满,语速语调中包含信息
* 想讲一些话给未来的自己听
* 用方言(比如我用的潮汕话)来表达更方便,比如 [[My Family Stories]] 中老叔一段的内容

但同时希望:

* 语音能被转写成文字,方便快速阅读及搜索
* 语音播放时可以加速

流程:

# [[录音|Video Editing: Task: Recording]]
# [[降噪|Video Editing: Task: Noise Reduction]]
# [[字幕处理|Video Editing: Subtitle]]
# 嵌入 TiddlyWiki

对于前三个步骤,目前摸索出来的较简单的方法是:

# 录音相对随意,在电脑录比较好操作,比如讲得不流畅的部分重录
# 录完的音频在 Audacity 做降噪,生成 M4A 音频文件
#* ''注意'':这一步的过程中不要去调快语音速度(压缩音频长度),因为会损失信息。对于把音频压缩成 2/3 长,或者一段原始长度音频以 1.5 倍速播放,听完的时间是一样的,但是压缩过长度的那段听起来会不自然,应该是压缩过程中信息少了。
# 做语音听写,生成初始的 SRT
# 用 Aegisub 编辑字幕,纠正错误字,保存进 SRT 并生成一份不带时间信息的纯文本字幕稿
# 用 astisub 将 SRT 转换成 WebVTT 字幕文件

最后,如何嵌入 Tiddlywiki?有两种方式:

* 使用 TW 内建的语音支持了([[参考|http://tiddlywiki.com/#Audio]]),即把音频作为一个 tiddler。但这样会显著增加 TW 的 HTML 体积,也无法使用自定义的 JS 播放器
* 使用 TW 内建的 [[静态文件服务器|https://tiddlywiki.com/#Using%20the%20integrated%20static%20file%20server]]。好处是不增加 TW HTML 的体积,也可以使用自定义 JS 播放器;缺点是不支持分段加载(`Accept-Ranges`),在播放时无法拖动进度条
* 将文件传至 COS 等网络存储中。这样可以支持拖动进度条,也方便发布到互联网

我的方式是 ''结合静态文件服务器及网络存储''。文件先放置到 `files` 中,保证 single source of truth,再将其同步到 COS 中。[[TiddlyWiki: Publish]] 中详细描述此过程。

同时我安装了 [[TheDiveO/TwTube|https://github.com/TheDiveO/TwTube]] 的插件,将 Video.js 引入进来,方便显示字幕。

使用时参考 [[Text Snippet: Inline Video]]。因为代码较复杂,没有写成宏。
2019 年 11 月发现了 [[ActivityWatch|https://activitywatch.net/]],非常实用,可以解决我这里描述的大部分需求。

! 背景

随着工作年限一年年增加,年龄一年年增长,我越来越觉得更好地利用自己的时间是很重要的事情。看完「[[把时间当作朋友|https://book.douban.com/subject/3609132/]]」以及「[[奇特的一生|https://book.douban.com/subject/2212128/]]」后,感觉有必要做一个称手的工作辅助我完成这个事情。

试用过市面上一些已有的时间纪录工具,有一些不满意:

# 这些工具往往不够 Hackable,他们制订了一套较为死板的工作流
# 各类视图不够直观,没法灵活地制订视图
# 操作较为繁琐,选时间的过程真是痛苦
# 往往又有一些鸡肋的 GTD / 项目管理功能
# 有一些应用把使用者的角色限定为自由工作者

作为一个完美主义者,我希望自己做一款足够好的应用。它应该有这些特点:

# 引导用户关注时间使用的重要性,而不是强调纪录时间方法本身
# 有足够灵活的统计能力和制订视力的能力。用户可以在这个能力基础上自己实现:
#* 显示各类自定规则的统计
#* 项目管理的能力
#* GTD,管理目标等
# 有足够舒适的操作体验

目前的想法是,用 Web 做产品实现,先实现 PC 端,有精力的话做 Android 客户端。
! 数据结构

这个系统是以标签为基础的时间纪录系统。主要的数据结构有:

* 带层次的标签
* 时间片断

!! 标签

标签有好几种体系:

* 市面上常用的分类体系,严格遵循树状结构,每个结点都是单独的
* 市面上常用的标签体系,每一个标签都互不相关,扁平结构
* Tiddlywiki 的标签体系,与分类体系类似,但是一个结点可能有多个父结点

我最喜欢的是 Tiddlywiki 的标签体系。「分类体系」具结构性但缺乏灵活,「标签体系」没有结构性,而 Tiddlywiki 的标签体系同时保留了结构性和灵活性。

!! 时间片断

标识某一段时间相关的信息,比如在什么时间段做了什么事情,划在什么标签下等等。
Last Update: {{!!modified}}

!! 目前可以用、深入理解的应用

* Everhour 目前最佳,参考 [[Time Tracker: Features]]
* TMetric(可能很快放弃)
* [[HubStaff|https://hubstaff.com/]]
* Harvest

!! 试用但是放弃的应用

原则:

* 只有移动版,没有 Web / 桌面版的应用都不考虑;电脑才是生产力工具,手机上只能纪录生活
* 没有多端同步,或者多端同步要收费的不考虑
* 没有靠谱的 task 结构的不用

这类应用包括:

* [[aTimeLogger|http://www.atimelogger.com/]]: 没有 Web / PC 端
* [[Timesheet|http://timesheet.io]]: 多端同步收钱
* [[Toggl|https://www.toggl.com]]: 靠谱的 task 都没有
* [[HourStack|https://hourstack.io]]: 整个应用就是个 Calendar View,连个 Project 列表都没有;没有靠谱的 Task 机制

如果他们没有大更新去优化这些点,就不用再试。
[[The 10 Best Time Tracker Apps in 2018 - Zapier|https://zapier.com/blog/best-time-tracking-apps/]] 这篇帖子给了我一些启发。同时我深度使用了 Everhour 和 TMetric 的时间纪录功能。

!! 任务结构

Everhour 是 Project => Section => Task 三级结构。TMetric 是 Project => Task。

三级结构更好,如果你不需要三级,那中间的 Section 开一个默认的即可。

!! Time Entry

Time entry 是被纪录下来的一段时间。这段时间有一些属性:

|! |时长 |开始时间 |结束时间 |所属任务 |
|!Everhour |有 |无 |无 |有 |
|!TMetric |有 |有 |有 |有 |

Everhour 故意去掉了开始时间及结束时间,这两项的确带来了额外的维护成本。

!! Notes

项目、Setion、任务、time entry 都应该要有描述的能力,在名称不足够表达内容时,可以有地方纪录额外的信息。最好支持 Markdown。不要支持附件上传。

对于 Everhour,它支持项目、任务带 notes,但是 time entry 不支持,只能支持对于某一 task 在今天占用的时间,写一条 time log。

TMetric 则仅支持项目 notes,不支持任务、time entry 的 notes。这个做得很差。

Time Entry 的 log,可以用来解释你做这个任务时遇到什么问题(导致花了什么时间),或者细化任务中的步骤等。

!! Task

Everhour 提供了针对一个 task 的估时功能,能看到当前所用时间与估时的差异。同时还有 task 的 accuracy 信息,会列举出这个 task 的 time log 有多少是人工加的,有多少是用定时器记时的。这几个能力我觉得很赞。

!! 分拆 Time Entry

这个是我自己的想法,可能并不一定有价值。有些时间段你可能在做好几件 Task,比如一边发布代码上线,一边调试功能,一边与同事沟通事情。假如这个过程花了半小时,但是你的 timer 只挂在了发布代码上线上。这个时候如果有方便的手段可以把这里面的 20m 拆给另外两个 task 会很棒。

!! Tags

可以针对 section / tasks 设计。比如不同的 project 里,都可能会有一个 section 叫「公共事务」,表示你做的团队性的事务。

但是这个功能难以把握到度,感觉容易做得不好用。不如考虑下 Tiddlywiki 的 tags 结构。

!! Calendar Integration

我想要这个。能在日历上看到各个时间点做了什么。
[[tinylog|http://b0llix.net/perp/site.cgi?page=tinylog.8]] 是 perp 工具集中的一个工具。接受标准输入,并按大小做 rotation。

使用场景是,你有个程序 `myapp` 向 stdout 打日志,你可以:

```bash
myapp | tinylog -k 10 -s 10485760 ./logs
```

这会把 `myapp` 的输出存在 `./logs` 里,保留 10 个备份(`-k 10`),每个备份大小为 10M (`-s 10485760`)。

这个 [[Superuser 帖子|https://superuser.com/questions/291368/log-rotation-of-stdout]] 给出了很多类似的工具,大多是基于 multilog 做修改。他们有个问题是 rotate 后的文件都用了 `@400000005b10bdfd337d3894.s` 这种 TAI64N 格式的时间字符串,人眼不能读。因此放弃。

Tinylog 有一些问题:

* 似乎于非 ASCII 字符不识别,会转义成 `?`
* 用 `httpdump | tinylog` 时,运行一段时间后 `httpdump` 会处于 `futex(0xb820c8, FUTEX_WAIT, 0, NULL` 的状态,不再输出内容,不知道啥原因
PDF 及笔记:

<<display-pdf path:"/files/books/the-linux-programming-interface/ch29-threads-introduction.pdf" title:"tlpi-ch29">>

!! 部分笔记

!!! Linux 对 POSIX pthread 标准的实现

POSIX 标准定义了一套线程机制和 API 标准,称为 pthread。

Linux 实现了 pthread 标准,该实现被称为 NPTL(Native POSIX Threads Library)。旧的 Linux 版本的实现为 LinuxThreads,目前已不主流。

!!! 多线程程序的内存布局

<figure>
{{ linux-multi-threads-memory-layout }}
<figcaption>多线程程序的内存布局</figcaption>
</figure>

!!! pthread API 的返回值风格

一般系统调用的 API,其返回值为 0 表示成功、-1 表示失败;具体失败原因从 errno 中取。

pthread API 不同,0 表示成功,正整数表示失败,且其值同 errno 定义的一致。

不同线程拥有自己的 errno。在 Linux 上,读取 errno 实际上是通过一段 macro 将其转化为一个函数调用(而不是读一个全局变量)。

!!! 线程间共享和不共享的数据

<<<
Besides global memory, threads also share a number of other attributes (i.e., these attributes are global to a process, rather than specific to a thread). These attributes include the following:

* process ID and parent process ID;
* process group ID and session ID;
* controlling terminal;
* process credentials (user and group IDs);
* open file descriptors;
* record locks created using fcntl(); z signal dispositions;
* file system–related information: umask, current working directory, and root directory;
* interval timers (setitimer()) and POSIX timers (timer_create());
* System V semaphore undo (semadj) values (Section 47.8);
* resource limits;
* CPU time consumed (as returned by times());
* resources consumed (as returned by getrusage()); and
* nice value (set by setpriority() and nice()).

Among the attributes that are distinct for each thread are the following:

* thread ID (Section 29.5);
* signal mask;
* thread-specific data (Section 31.3);
* alternate signal stack (sigaltstack());
* the errno variable;
* floating-point environment (see fenv(3));
* realtime scheduling policy and priority (Sections 35.2 and 35.3);
* CPU affinity (Linux-specific, described in Section 35.4);
* capabilities (Linux-specific, described in Chapter 39); and
* stack (local variables and function call linkage information)
<<<

!!! 线程结束自身运行的数种方式

<<<
* The thread’s start function performs a return specifying a return value for the thread.
* The thread calls pthread_exit() (described below).
* The thread is canceled using pthread_cancel() (described in Section 32.1).
* Any of the threads calls exit(), or the main thread performs a return (in the main() function), which causes all threads in the process to terminate immediately
<<<

值得注意的是最后一种方式,无论哪个线程调用了 `exit()`,整个程序、所有线程都会马上结束。

!!! 编码考虑点

调用完 pthread_create() 后,操作系统并不保证马上调度到该线程运行。

线程执行完后,其返回值(一般是指针)不该指向线程的栈。因为这块内存区域在线程结束后会被 OS 回收利用。

!!! 线程间等待结束的机制

线程间等待结束和回收资源 `pthread_join()` 与进程间 `waitpid()` 不同之处:

# 不同线程之间是对等关系,任意线程可以调用 `pthread_join()` 等待其他任意进程结束;进程间则需要是父进程回收子进程
# 由于线程间并没有父子关系,pthread 没有提供一个可以 join 任意线程的 API(进程则有)
#* 如果可以 join 任意线程,可能会把当前进程使用的第三方库的线程也 join 了,引起混乱
#* pthread 设计上希望线程只 join 自己知道(known)的其他线程
#* 但是 pthread 提供了 condition variables 机制可以模拟这一效果

!!! 线程与进程对比

章末总结的线程与进程对比,是本章的 ''重点''。

* ''共享数据'':
** 线程比进程容易;进程需要额外的 IPC 代码
** 线程间读写数据,需要额外的同步机制,避免同时写同块数据
* ''创建和调度成本'':线程低一个数量级
* ''使用第三方库的考虑'':多线程时需要开发者确认使用的库是否是线程安全的;如果不是,需要以线程安全的方式调用它。多进程没有此问题
* ''线程间共享虚拟内存地址带来的问题'':
** 如果一个线程出现 bug,错误地修改了另外一个线程的内存,可能引起很难定位的 bug;进程无此问题
** 同一进程的多个线程,其所使用的虚拟内存总和不能超过单进程的限制(比如 x86-32 中的 3G);而多进程时,每个进程都能使用 3G。当然在 64 位系统普遍的今天不是什么大问题
* ''多线程在其他编程上的考虑点'':
** ''信号处理'':很难正确的处理,因此多线程程序一般不配合使用信号机制
** ''多线程运行的代码只能来自一个可执行程序''(尽管可能是不同的函数);多进程则可以运行不同程序
** ''多线程还共享了 fd、当前工作目录、user / group ID 等'';视情况可能是优点也可能是缺点
PDF 及笔记:

<<display-pdf path:"/files/books/the-linux-programming-interface/ch30-threads-synchronization.pdf" title:"tlpi-ch30">>

!! 部分笔记

''Critical seciton(临界区)的定义'':一段代码如果访问了线程间共享的资源、并且执行时需要是原子的(资源在其执行期间不被其他线程同时访问),这段 ''代码'' 则称为临界区。

''即使像变量自增(`glob++`)这样简单的操作,也不能保证是原子的。''比如在 RISC 精简指令集下,自增也需要被拆分成几个指令执行。

!!! Mutex

''Mutex'' 是 mutual exclusion 的意思,中文翻译为「''互斥锁''」:

* 状态:locked, unlocked
* 动作:
** 加锁:lock / acquire
** 解锁:unlock / release

''规则'':

# 一个线程加锁后,就拥有这个锁,只有它能将其解锁
# 其他线程也尝试加这个锁时,会阻塞或者失败(视加锁方式而定)
# 锁是加在临界区(critical section)的,即是加在某段代码中,而这段代码中往往有访问共享资源的逻辑
# 但锁并不能强行保护共享资源。如果其他线程无视锁的存在,在访问共享资源前不先尝试加锁,那么它仍然可以访问该资源

''使用 mutex 保护临界区'':

[img width=500 [linux-mutex-usage]]

看 PDF 代码示例会加深理解。

''有额外的加锁方式'':`trylock()` 及 `timedlock()`。

''Mutex 的性能好'',大部分情况下是在 user space 做操作,没有系统调用带来的消耗。

''使用 mutex 可能带来死锁''。最简单的场景:线程 A 加了锁 1,准备加锁 2;线程 B 加了锁 2,准备加锁 1。两者会无限期的互相阻塞。

解决方法:

* 定义一套锁的层次结构,各线程加锁时都遵循一样的顺序
* 各线程使用 `trylock()`,一旦无法加锁,就把之前加的锁全部释放,在一定时间间隔后再重试

''有不同的 mutex 类型''。它们针对这三种场景有不同的行为:

* 同个线程对同个 mutex 加锁多次
* 一个线程对一个它不拥有的锁做 unlock 操作
* 一个线程对一个还没被上锁的锁做 unlock 操作

三种不同的 mutex type 有不同的行为:

* NORMAL:没有死锁检测。线程加锁其已拥有的锁时,造成死锁。Unlock 其不拥有的锁或者未加锁的锁时,行为是未定义的(Linux 下不会报错)
* ERROR_CHECK:上述三种场景都会报错。这种 mutex 性能比 NORMAL 稍差,但适合用来调试
* RECURSIVE:一个线程不停对某个 mutex 加锁时,这种模式下系统会记录一下加锁计数。线程需要做跟其加锁次数一样多次的 unlock ,才能将一个 mutex 释放。对于其他两种场景,这种模式下会报错

SUSv3 规定默认的模式为 DEFAULT,但它对上述三种场景的行为故意没有定义。在 Linux 下,默认模式等同于 NORMAL。

!!! Condition Variables

Condition variables 是一种线程间协作的机制。典型场景是:

* 多个线程共同操作、关心某些共享变量,它们可以通过 condvar 来传递信号
* 线程 1 修改完变量后,可以调用 `pthread_cond_signal()` 触发关心这些变量的其他进程醒来
* 其他进程通过 `pthread_cond_wait()` 收到信号醒来后,检查共享变量并执行相应的逻辑

看代码示例会加深理解。代码写起来有一些较难理解的部分,我在 PDF 中加了注释。
!! PDF 及笔记

<<display-pdf path:"/files/books/the-linux-programming-interface/ch31-threads-thread-safety-and-per-thread-storage.pdf" title:"tlpi-ch31">>

!! 视频讲解

线程安全:

<$videojs controls="controls" fluid="fluid">
  <source src=<<cosurl '/files/videos/2021/03/thread-safety.mp4'>> type="video/mp4">
</$videojs>

线程专有数据(thread-specific data)及线程本地数据(thread-local data):

<$videojs controls="controls" fluid="fluid">
  <source src=<<cosurl '/files/videos/2021/03/thread-specific-data.mp4'>> type="video/mp4">
</$videojs>

后续的思考:thread-specific data 的主要用处在于,''让线程在其生命周期内有一块专有的堆上的内存''。对比其他几种方式:

* 在线程函数内使用自动变量:变量在函数结束(而不是线程结束)时就被销毁
* 在线程函数内使用 malloc 分配堆上内存:需要在函数结束(而不是线程结束)前 free 该内存,不然会引起内存泄露
* 使用全局变量:全局变量的生命周期比线程长;无法是线程独享,各线程会互相覆盖;使用时需要加锁

因此 thread-specific data 是好的解决方法,这块内存随着进程创建而创建、销毁而销毁。

而 thread-local storage 则更进一步,使得你不需要去 malloc / free 这块 buffer。它的底层实现我暂不了解。

[[Traefik|https://containo.us/traefik/]] 是一个跟随容器生态成长起来的 HTTP 负载均衡器以及反向代理。

!! 安装

我对 Traefik 的使用经验仅限于在 [[k3s]] 环境中。如果让 k3s 自动安装 Traefik,你无法修改 Traefik 配置文件,因为 k3s 重启时会覆盖它。于是应该让 k3s 不自动安装 Traefik。我编写了一个 [[YAML 文件|https://github.com/onlyice/services/blob/master/traefik.yaml]],将它放在 `/var/lib/rancher/k3s/server/manifests/` 中即可安装 Traefik,同时它配置好了自动获取 Let's Encrypts 证书的相关配置。

!! 调试

先拿到 Traefik 的 pod ID:

```shell
kubectl get pods -n kube-system
```

再查看它的日志:

```shell
kubectl logs <traefik-pod-id> -n kube-system
```

我的 [[公共 wiki|https://wiki.zhiheng.io]] 用容器运行在 k3s 中,并通过 Traefik 将流量导入以及自动申请 Let's Encrypt 证书。具体做法如下。

编写 `public-wiki.yaml`,将 wiki 程序运行起来并编写 Traefik 路由规则:

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: public-wiki
  labels:
    app: public-wiki
spec:
  containers:
  - name: public-wiki
    image: onlyice/public-wiki
    ports:
    - containerPort: 8080
    command: ["tiddlywiki"]
    # Implement anonymous read, authenticated write
    # https://tiddlywiki.com/#WebServer
    args: ["--listen", "root-tiddler=$:/core/save/lazy-all", "gzip=yes", "host=0.0.0.0", "port=8080", "readers=(anon)", "writers=joe", "username=joe", "password=wj9127x,x-3"]
---
apiVersion: v1
kind: Service
metadata:
  name: public-wiki
spec:
  ports:
    - protocol: TCP
      name: web
      port: 10000
      targetPort: 8080
  selector:
    app: public-wiki
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: public-wiki
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: wiki.zhiheng.io
    http:
      paths:
      - path: /
        backend:
          serviceName: public-wiki
          servicePort: web
```

这里描述我在制订 TSF 容器 API 规范时总结的经验。

TODO:部分内容待补充

!! Request ID

在 HTTP 请求的头部带上 `X-Request-ID`,用来唯一标识一个请求。回包必须将该 `X-Request-ID` 以 HTTP 头形式原样带回。示例:

```
X-Request-ID: 921e2b45-83db-4ecd-b17a-2f7a7cf0bd0f
```

一些调研:

* `GET` 请求无法带请求体,所以在请求体中(比如 JSON 结构中)放 request ID 并不合适
* `X-Request-ID` 不在 HTTP 规范中,但是相对广泛使用(参考 [[Wikipedia|https://en.wikipedia.org/wiki/List_of_HTTP_header_fields]])
* 有些代理服务器可能会 strip 掉这个头
* [[Correlation IDs for microservices architectures|https://hilton.org.uk/blog/microservices-correlation-id]] 这篇描述了挺长篇幅,应该有有价值的内容,有时间看看

!! 关于 API 请求成功时,是否返回 201 / 204 的问题

关于 201 (Created) / 204 (No Content) 回包可能没有回包,与 API 回包设计中 {"code", 0, "message": ""} 在设计上的冲突,需要考虑下。

!! 按 ID 批量查询资源

API Handyman 的这篇 [[文章|https://apihandyman.io/api-design-tips-and-tricks-getting-creating-updating-or-deleting-multiple-resources-in-one-api-call/#a-response-containing-responses]] 给出了一个常见的 URL pattern 设计:

```
GET /resources?ids=ID1,ID2
```

其中有几点需要考量:

# 用逗号(`,`)作分隔符是否合适?
# 返回体的结构设计
# 分页及不存在的 ID 处理

!!! 用逗号作分隔符

根据这个 SO [[回答|https://stackoverflow.com/a/38816380/1189076]],用逗号作分隔符是 OK 的。query component 指 URL 中 `?` 到 `#`(如果没有,则到 URL 末尾)的中间部分,这部分可以包含的字符有

* `a`-`z`, `A`-`Z`
* `0`-`9`
* `/` `?` `:` `@` `!` `$` `&` `'` `(` `)` `*` `+` `,` `;` `=` `-` `.` `_` `~`
* percent-encoded characters

其中 `,` `/` 这些虽然叫作 [[reserved character|https://tools.ietf.org/html/rfc3986#section-2.2]],但是这里的 reserved 并不是不能用,而是说如果这些字符如果没有使用它的特殊含义(如作为分隔符),而是当作普通的字符串使用,那么你应该 percent-encode 它。

一些使用了 reserved character 的场景:

* Google Drive 的文件查看功能:`https://drive.google.com/viewerng/viewer?url=http://journals.plos.org/plosone/s/file?id=body.pdf`
* 电商网站中经常会看到 `,`
* 一些 OAuth 的 callback URL 

!!! 返回体的结构设计

API Handyman 用的方案是:

```json
{
  "ID1": {
    "status": "201",
    "headers": [
      {"header's name": "header's value"}
    ],
    "body": { "the": "response's body"}
  },
  "ID2": {
    "status": "400",
    "headers": [
      {"header's name": "header's value"}
    ],
    "body": { "the": "response's body"}
  }
}
```

这个结构更适合于创建多个对象时使用,而不适合在查询多个对象时。我觉得应该沿用列表页的回包结构:

```json
{
  "data": {
    "totalCount": 5,
    "content": [
      {
        "id": "498e8220-5342-4277-b1cd-40caecbf9840",
        "name": "main-cluster"
      },
      {
        "id": "498e8220-5342-4277-b1cd-40caecbf9840",
        "name": "second-cluster",
      }
    ]
  },
  "code": 0,
  "message": ""
}
```

!!! 分页及不存在的 ID 处理

TODO: 不存在的 ID 会影响返回结构中的 `totalCount`,以及需要一种机制表达该元素不存在。后续考虑。
TypeScript 是 [[JavaScript]] 的超集,意味着大多数的 JavaScript 语法特性都可以直接在 TypeScript 上用。

TypeScript 官方写的 [[handbook|https://www.typescriptlang.org/docs/handbook/basic-types.html]] 非常好,覆盖了大部分需要知道的知识点。因此这里不会描述太多语言细节的内容,更多的是总结好的资源链接。

!! Resources

* [[TypeScript Official|https://www.typescriptlang.org/]]
* [[TypeScript Cheatsheets|https://github.com/typescript-cheatsheets]]:这个组织维护了 React / Vue 下写 TypeScript 的最佳实践

!! Instance side vs static side

```js
class Greeter {
    static standardGreeting = "Hello, there";
    greeting: string;
    greet() {
        if (this.greeting) {
            return "Hello, " + this.greeting;
        }
        else {
            return Greeter.standardGreeting;
        }
    }
}

// greeter1 的类型是「Greeter 实例」
let greeter1: Greeter;
greeter1 = new Greeter();
console.log(greeter1.greet());

// greeterMaker 的类型是「Greeter」
let greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";

let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());
```
为什么在 JS 已经有 class 的情况下,TS 还要发明一个 interface 概念呢?原因是对于 JS、Python 这类弱类型语言来讲,它的一大优势是支持 duck typing。而 TS 的 interface 即是用来实现 duck typing 的。

!! Excess Property Checks

官方的 [[handbook|https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks]] 提到:

> (variable) won't undergo excess property checks

即是说 TS 的属性检查,对 object literal 会比对 variable 严格。不太理解这个设定的原因,于是在 StackOverflow 找到一个 [[回答|https://stackoverflow.com/a/52852358]]:

> It's by design. In short, Typescript creators made it this way because they know Javascript is a very dynamic language with many such use cases.
> Their logic might be like this: if you have a variable, then it may come from some third party and there is not much you can do with it. On the other hand, if you pass object literal, then you are responsible for its correct type.

!! Indexable Types

[[Indexable Types|https://www.typescriptlang.org/docs/handbook/interfaces.html#indexable-types]] 是比较难理解的一环。

```js
interface StringArray {
    [index: number]: string;
}

let myArray: StringArray;
myArray = ["Bob", "Fred"];

let myStr: string = myArray[0];
```

上面的代码中定义了一个 `StringArray`,它可以接受数字作为索引,因此可以是一个数组。同时定义的数组的元素类型为 `string`。注意 `[index: number]: string;` 中的 `index`,可以被任意命名,你叫它 `i` / `x` / `whatever` 都可以。

下面是另外一个例子:

```js
interface StringDict {
    [index: string]: string;
}

let myDict: StringDict = {"a": "hello", "b": "world"};
```

接口定义中可以揉合 indexable 及非 indexable 的 signature parameter,比如:

```js
interface SquareConfig {
    color: string;
    width: number;
    [propName: string]: any;
}
```

此时一个 `SquareConfig` 除了有 `color` 和 `width` 两个具名属性外,还可以有任意属性名的其他属性。

注意 index 仅支持两种类型:string 和 number。假如同时存在两种类型的 index 时,number index 属性的类型应该是 string index 属性类型的子类(因为 JS 最终会把 number 转成 string 再做 indexing 的过程)。同时其他属性的类型也应该是 string index 属性类型的子类:

```js
class Animal {
    name: string;
}

class Dog extends Animal {
    breed: string;
}

interface TestingIndexable {
    // Dog 及 Animal 反过来则会报错
    [propName: number]: Dog;
    [propName: string]: Animal;
	
    // 报错,number 不是 Animal 的子类
    p1: number;
    
    // OK
    p2: Dog;
    
    // OK
    p3: Animal;
}
```

你可以用联合类型来应对一部分场景:

```js
interface NumberDictionary {
    [index: string]: number;
    length: number;    // ok, length is a number
    name: string;      // error, the type of 'name' is not a subtype of the indexer
}

interface NumberOrStringDictionary {
    [index: string]: number | string;
    length: number;    // ok, length is a number
    name: string;      // ok, name is a string
}
```

你也可以给 index signature 加上只读,可以防止赋值给对象 index:

```js
interface ReadonlyStringArray {
    readonly [index: number]: string;
}
let myArray: ReadonlyStringArray = ["Alice", "Bob"];
myArray[2] = "Mallory"; // error!
```

!! Difference between the static and instance sides of classes

[[Difference between the static and instance sides of classes|https://www.typescriptlang.org/docs/handbook/interfaces.html#difference-between-the-static-and-instance-sides-of-classes]] 这节讲的东西感觉复杂。

```js
interface ClockConstructor {
    new (hour: number, minute: number);
}

class Clock implements ClockConstructor {
    currentTime: Date;
    constructor(h: number, m: number) { }
}
```

上面这段代码会报错,因为 `Clock` 并没有实现一个 `new` 函数。构造函数(`constructor`)是 static side of the class,而:

> When a class implements an interface, only the instance side of the class is checked.

而当你把类作为一个参数做类型检查时,会检查它的 static side:

```js
interface ClockConstructor {
    new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
    tick(): void;
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("beep beep");
    }
}
class AnalogClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("tick tock");
    }
}

// 这里 DigitalClock / AnalogClock 类,作为参数调用 `createClock`,
// 而 `createClock` 的参数定义它为 `ClockConstrutor` 类,于是 TS 
// 会检查这个类有没有 `ClockConstructor` 中 `new` 所定义的构造函数
let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
```

可以用 class expression 简化它:

```js
interface ClockConstructor {
    new (hour: number, minute: number);
}

interface ClockInterface {
    tick();
}

const Clock: ClockConstructor = class Clock implements ClockInterface {
    constructor(h: number, m: number) {}
    tick() {
        console.log("beep beep");
    }
}
```

!! Call signature

```
interface Counter {
    (start: number): string;
}

let counter: Counter = function (start: number) { return `${start}`; }
```

上面这种不带函数名的 signature(`(start: number): string`)即叫作 call signature。有这个存在时,Counter 的实例必须是 callable 的(即可被当作函数调用的)。interface 中也可以混合 call signature 和其他的 signature,如:

```js
interface Counter {
    (start: number): string;
    interval: number;
    reset(): void;
}

function getCounter(): Counter {
    let counter = (function (start: number) { }) as Counter;
    counter.interval = 123;
    counter.reset = function () { };
    return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
```
主要参考 [[JavaScript: Module System]]。

如果想在 TS 中实现按绝对路径来 import,先按 [[JavaScript: Module System: Absolute Import]] 配置好 Babel,然后注意在 `tsconfig.json` 配置:

```json
{
  "compilerOptions": {
    "baseUrl": "."
  }
}
```

有了 `baseUrl` 后 WebStorm 和 VSCode(?) 在编辑状态下解析 import 语句的时候才不会报找不到。
少数派上面的这篇「[[别再用「六个点」当省略号了,这些标点都有更规范的输入方式|https://sspai.com/post/45516]]」写得太好了,在 Dropbox dump 了一份 PDF 备份。
这里即放 UI 的内容,也放 UX 的内容。

!! Roadmap

* [[Complete Beginner's Guide on How to Learn UI Design|https://www.mockplus.com/blog/post/learn-ui-design]]
* [[Learn UI Design Course|https://learnui.design]]

!! Resource

* 这个 Twitter [[帖子|https://twitter.com/steveschoger/status/1215673997725196288]] 有大量的 UI/UX Pattern ideas
* Landing page cases: [[Hyperpixel|https://hyperpixel.io/]], [[Landingfolio|https://www.landingfolio.com/]](还包含付费 UI Kit、Icon Pack 等)

低优先级:

* [[优设网|https://www.uisdc.com/]]:综合站点
* [[UI 中国|https://www.ui.cn/]]:综合站点
* [[腾讯 ISUX|https://isux.tencent.com/]]:团队博客
* [[CodePen Topics|https://codepen.io/topics]]:提供了流行库、框架的示例,以及实用的 UI patterns


流行的 UI 工具有:

* Sketch (sketchapp.com, Mac only)
* Affinity Designer (affinity.serif.com/en-us/designer/)
* Adobe XD (www.adobe.com/products/xd.html)
* Figma (figma.com)
* UXPin (uxpin.com)
Unicode 是目前处理多语言字符的标准方式。有几个概念需要理解:

!! Code Point

中文叫「码位」,表示一个字符在一个字符集中唯一的位置,比如 `A` 在 Unicode 字符集中位于 0041 的位置,所以它的 code point 是 U+0041;`ñ` 00F1 的位置,它的 code point 是 U+00F1。

!! Plane

Unicode 的全部字符,分为 17 个 plane(字符平面)存放,plane 类似于一级分类。每个 plane 中包含 0000-FFFF 一共 65536 个 code point。常用的是 Plane 0,Basic Multiligual Plane (BMP)。比如 `ñ` 就处在 BMP 中,它的 code point 是 U+00F1;`𐀀` 处在 Plane 1 中,它的 code point 是 U+10001。

!! Blocks

每个 plane 又分为多个 blocks,类似于二级分类。比如 BMP 中有 Basic Latin (0000-007F),这个 block 中存放 ASCII 里的全部字符;有 CJK Unified Ideographs (4E00-9FFF),存放主要的中文和日文字符。

把上面几个概念串起来,就是这幅图:

{{ unicode-at-a-glance }}

Unicode 像一本字典,每一页纸是一个 plane,每一页里面又分了很多块。Code point 是唯一找到一个字的方法,类似地址。

!! Encodings

Code point 只是 Unicode 字典中的地址,但是计算机间交换数据,并不以这个地址为准,而是发明了编码(encoding)系统,比如 ASCII、GBK、UTF-8 等。编码系统做的是,把一个字符(也就是它的 code point)跟一个二进制表示关联起来,可以互相转换,比如:

{{ different-encodings }}

比如机器 A,想向机器 B 传输一段 "Hello World",它必须跟 B 约定好用某一种编码格式对这个字符串做编码,然后再将这串数据,编码成相应的二进制数据。如果用 ASCII 编码,最终传过去的数据,用十六进制表示就是 `48656C6C6F20576F726C64`。

你可能会觉得,为啥不直接用 code point 的值当作编码后的结果,进行传输。这就必须回去翻翻历史。一开始美国人发明计算机,他们觉得用 ASCII 编码就够表示所有英文字符了。但是一旦要跟中国人通信,ASCII 表达不了中文,于是中国人又搞了个 GBK 编码来表示中文字符。后来大家觉得有必要搞一套 Unicode 来把所有语言的字符包起来,避免混乱,于是 Unicode 出现了,相关的编码格式 UTF-8、UTF-16 出现了。另外,编码格式在设计时还会考虑到一些性能因素,比如现在最主流的编码格式 UTF-8。

UTF-8 是个变长的编码格式,观察这几个字符的 UTF-8 编码:

|!Charater |!UTF-8 |
|A |0x41 |
|ñ |0xC3B1 |
|中 |0xE4B8AD |

可以看到,对于不同的字符,UTF-8 编码出来的长度并不是固定的,比如中文字符编码出来会占 3 个字节。因为互联网中传输的大多数是 ASCII 字符。因此 ASCII 字符在 UTF-8 中只需要 1 个字节就可以表示。这是另外一种意义上的「压缩算法」。

一些编程语言在设计之初,Unicode 规范还没有成形或者成为主流,因此他们在字符串、字符处理上的设计,可能不是最合理的。比如 Python 2 的默认编码类型为 `ascii` 而不是 `utf8`,导致了很多新手头疼的编码问题。Java 的 `char` 使用 16 字节长度,只能存一个 UTF-16 能表达的字符,不知道是不是有意设计。你应该了解你的编程语言有无 Unicode 支持,以何种方式支持。

查询一个 Unicode 字符的信息:

* [[FileFormat.Info|http://www.fileformat.info/info/unicode/char/search.htm]]
* [[Graphemica|http://graphemica.com/]]

参考:

* [[Code point - Wikipedia|https://www.wikiwand.com/en/Code_point]]
* [[Plane_(Unicode) - Wikipedia|https://www.wikiwand.com/en/Plane_(Unicode)]]
* [[Unicode/Character reference/10000-10FFF|https://en.wikibooks.org/wiki/Unicode/Character_reference/10000-10FFF]]




! URI

URI 包含了 URL (Uniform Resource Locator) 和 URN (Uniform Resource Name)。

简单地说,URI 是一种标识,而 URL 表示某种东西的位置。但是这个位置本身也是一种标识,所以 URL 也是一种 URI。URN 表示一种物件的唯一标识,比如 `urn:isbn:0451450523`。

!! 例子

URL:

# `http://example.com/mypage.html`
# `ftp://example.com/download.zip`
# `mailto:user@example.com`
# `file:///home/user/file.txt`
# `tel:1-888-555-5555`
# `http://example.com/resource?foo=bar#fragment`
# `/other/link.html` (A relative URL, only useful in the context of another URL)

URN:

# `urn:isbn:0451450523` to identify a book by its ISBN number.
# `urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66` a globally unique identifier
# `urn:publishing:book` - An XML namespace that identifies the document as a type of book.

URI:

# `data:,Hello%20World` Data URI
# `onlyice` My nickname

!! 使用 URI 的地方

# 规范上定义了 HTML `a` 标签的 `src` 属性使用的是 URI(而不是 URL),所以你给它写一个 `url:isbn:0451450523` 也是符合规范的,只是没有浏览器会去处理它
# XML 的 `SYSTEM` 关键字后面的系统标识符,使用的是 URI

!! 参考文献

# [[URI - Wikipedia|https://en.wikipedia.org/wiki/Uniform_Resource_Identifier]]
# [[What is the difference between a URI, a URL and a URN? - StackOverflow|http://stackoverflow.com/questions/176264/what-is-the-difference-between-a-uri-a-url-and-a-urn]]
# [[RFC 3986 - Uniform Resource Identifiers|https://tools.ietf.org/html/rfc3986.html]]
# [[RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax|https://tools.ietf.org/html/rfc2396.html]]
# [[RFC 1738 - Uniform Resource Locators (URL)|https://tools.ietf.org/html/rfc1738.html]]
Update (2020/02/22): [[pydantic|https://github.com/samuelcolvin/pydantic]] 被认为是更好的方案。

`attrs`([[GitHub|https://github.com/hynek/attrs]] | [[官网|https://attrs.readthedocs.io/]])是一个 Python 第三方库,被 Twisted 的作者 [[强烈推荐|https://glyph.twistedmatrix.com/2016/08/attrs.html]]。它解决的是使用 Python 写 OOP 程序的存在的一个大问题。

!! 问题

Python 的 OOP 实践起来很蛋疼。因为一些原因使得大量的 Python 程序都存在 [[God object|Anti-pattern]],程序耦合严重难维护。而造成这个问题的原因在于写一个 Python 的类需要大量的 boilerplate。比如你想要实现一个带一些基础功能的类,需要写这么一坨又长又臭的代码:

```python
from functools import total_ordering

@total_ordering
class Point3D(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return (self.__class__.__name__ +
                ("(x={}, y={}, z={})".format(self.x, self.y, self.z)))

    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        return (self.x, self.y, self.z) == (other.x, other.y, other.z)

    def __lt__(self, other):
        if not isinstance(other, self.__class__):
            return NotImplemented
        return (self.x, self.y, self.z) < (other.x, other.y, other.z)
```

!! 解决

`attrs` 就是来解决这个问题的。看一段示例代码:

```python
>>> import attr
>>> @attr.s
... class C(object):
...     x = attr.ib(default=42)
...     y = attr.ib(default=attr.Factory(list))
...
...     def hard_math(self, z):
...         return self.x * self.y * z
>>> i = C(x=1, y=2)
>>> i
C(x=1, y=2)
>>> i.hard_math(3)
6
>>> i == C(1, 2)
True
>>> i != C(2, 1)
True
>>> attr.asdict(i)
{'y': 2, 'x': 1}
>>> C()
C(x=42, y=[])
>>> C2 = attr.make_class("C2", ["a", "b"])
>>> C2("foo", "bar")
C2(a='foo', b='bar')
```

写类从没有变得如此方便。

`attrs` 它只是智能地生成一堆 dundle (双下划线)函数以实现 `repr`、相等比较等效果。它生成完之后,就跟你手写的类一样,没有额外的运行时损耗。它还提供了一些函数用来做参数校验等。

所以,在写相对复杂的程序时,尽可能地都用上 `attrs`,提供了方便同时也没什么坏处。

!! Why not...

!!! Plain object

写起来太麻烦,上文已经说过。

!!! tuple

只能靠位置来找属性,不能靠名字。同时结构的改动可能引起大量代码改动:

```python
# 如果 get_point 再返回一个 z 值,所有调用的代码都需要动
x, y = get_point()
```

!!! `dict`

它不是固定 fields 的。这意味着可能有代码会增加新的元素或者删掉不应该删掉的元素。

!!! `namedtuple`

* 属性是只读的,很不灵活
* 又可以当类用又可以当 tuple,很容易迷惑

!! 其他

Twisted 的作者 [[Glyph Lefkowitz|https://glyph.twistedmatrix.com/]] 说他写 Python 十几年了,Python 一直是他的最爱。看了一些 Twisted 上的文档,感觉它是个 Python 功底非常深厚的人。他的博客值得一看。
使用 NVIDIA 控制面板,可以让显示器使用没有列出的分辨率。比如我买了一张 GT 210 显卡,非常弱,但是最高支持 2560x1440(2K 分辨率)。但是不知道为何,Windows 中不会显示出这个 2K 分辨率。可以用 NVIDIA 控制面板设置:

{{ custom-resolution }}

这个配置的关键是,「计时」那块,随便选选「标准」看看哪个可用,同时要保证「活动像素」的数值是 2560x1440。「标准」是「自动」时,活动像素比 2560x1440 小,会导致显卡用低分辨率渲染出内容,再放大到 2K 屏幕上,渲染出来的字体和图像看起来非常模糊。
在华为设备上使用 Google 应用。

使用 [[OurPlay|https://www.ourplay.net/]] 可以做到。OurPlay 是一个卖游戏加速器的,但同时提供了安装谷歌框架等设施方便玩家玩外服游戏。但它可能用了虚拟化 / 沙箱技术,使得谷歌框架并不是装在真机中,在机器的应用列表是看不到相应的谷歌应用的。

''我在 P40 Pro 上成功装上 Google Play Store、Gmail、YouTube,以及依赖于 Google 框架做同步的 Daylio。但是装 Chrome 时试了各种方法没有成功。''

过程:

# 安装 OurPlay,运行它后安装谷歌框架
# 在 [[APKPure|https://apkpure.com/]] 上下载 XAPK 文件,打开文件时会有导入 OurPlay 的选项,导入之
#* 不直接使用 Google Play Store 下载安装,是因为经常装失败,原因不详
UserScript 是开发者自己编写的 JS 脚本,用来增强一些特定网站的功能,比如实现 Google 搜索结果的 [[自动翻页|https://greasyfork.org/en/scripts/293-super-preloaderplus-one]]。

这些代码大多数托管在 [[Greasy Fork|https://greasyfork.org/en]] 上。我在上面也注册并上传了 [[一些脚本|https://greasyfork.org/en/users/189950-zhiheng-lin]]。

浏览器需要安装 [[插件|https://greasyfork.org/en]] 才能跑 UserScript,Chrome 上目前是 TamperMonkey。

!! 等待元素出现

有人写了个函数,用来实现某一元素出现时做特定逻辑。我 fork 了代码在 Gist 上,分别是带 jQuery 依赖的 [[版本|https://gist.github.com/onlyice/f8f0bffaa8e12c05d7314a510037156a]] 和纯 JS 的 [[版本|https://gist.github.com/onlyice/aa9b3f797b10b74797be9397d76cd7a8]]。这两个 [[Stack|https://stackoverflow.com/questions/8281441/fire-greasemonkey-script-on-ajax-request]] [[Overflow|https://stackoverflow.com/questions/10134785/how-can-i-run-a-greasemonkey-function-after-an-ajax-update]] 问题描述了一些使用场景和示例。我在 GreasyFork 上放了一份纯 JS 实现的 [[waitForKeyElements|https://greasyfork.org/scripts/370236-waitforkeyelements/code/waitForKeyElements.user.js]]。

UserScript 中 require 的写法:

```javascript
// @require      https://greasyfork.org/scripts/370236-waitforkeyelements/code/waitForKeyElements.user.js
// @require      https://cdn.jsdelivr.net/npm/jquery
```

!! AJAX Hook

AJAX hook 可以让你通过 JS 修改 AJAX 请求返回的数据。[[wendux/Ajax-hook|https://github.com/wendux/Ajax-hook]] 实现了一套 AJAX hook 接口。

Require:

```javascript
// @require      https://unpkg.com/ajax-hook/dist/ajaxhook.min.js
```

例子:

```javascript
function tamperResponse(xhr) {
    var response = JSON.parse(xhr.responseText);
    var l = response.data.data;
    for (var i = 0; i != l.length; ++i) {
        if (l[i].record_status != 9) {
            l[i].action_label += " (" + recordStatus[l[i].record_status] + ")";
            l[i].record_status = 9;
        }
    }
    xhr.responseText = JSON.stringify(response);
}

hookAjax({
    onreadystatechange:function(xhr){
        if (xhr.responseText.length == 0) {
            return;
        }
        var location = getLocation(xhr.responseURL);
        if (location.pathname.endsWith("/access/list/test")) {
            tamperResponse(xhr);
        }
    },
    onload:function(xhr){
        if (xhr.responseText.length == 0) {
            return;
        }
        var location = getLocation(xhr.responseURL);
        if (location.pathname.endsWith("/access/list/test")) {
            tamperResponse(xhr);
        }
    }
});
```



使用 [[vagrant-proxyconf|https://github.com/tmatilai/vagrant-proxyconf]],可以简单地让虚拟机中的各类包管理软件(`apt`, `npm`, `docker` 等等),走配置好的代理。使用很简单,看文档就行。



很多实际的示例,例如过渡、处理文本和图片或者好的示例素材,都存放在 Eagle 中并做了描述。Wiki 中不会有此类内容。

!! 电影解析类

中文相关的电影内容,感觉偏娱乐化,大体上是:

* X 分钟带你看完权力的游戏
* 头号玩家的 X 个彩蛋

像 [[Just Write|https://www.youtube.com/channel/UCx0L2ZdYfiq-tsAXb8IXpQg]]、[[Lessons from the Screenplay|https://www.youtube.com/channel/UCErSSa3CaP_GJxmFpdjG9Jw]] 和 [[Nerdwriter1|https://www.youtube.com/user/Nerdwriter1]] 这类从剧本、拍摄手法等方面入手的内容很少。

在这方面做得相对好的中文内容有:

* [[Movie Logic 电影逻辑|https://www.youtube.com/channel/UCT4M9QBI8YVXS3_y-OBJ9Qw]] 的影评类内容(非吐槽类)

我觉得做这类的中文内容应该也有市场。

这里收集可免费商用的字体。

!! 思源黑体、思源宋体、Noto

思源黑体及思源宋体是 Adobe 与 Google 一起开发的 CJK 字体。Google 的 Noto Sans CJK 和 Noto Sans Serif 中的中文字体分别是这两个字体,可以在 Google 网站上下载使用。

字幕的处理。

!! 语音听写(声音转文本)

有几种选择:

* [[网易见外|https://jianwai.youdao.com/]]:免费,效果未尝试
* [[讯飞听见|https://www.iflyrec.com/]]:收费,效果不错,而且可以直接在网页上做编辑
* [[万兴喵影|https://miao.wondershare.cn/]] 提供了语音转文本的功能。是个 VIP 功能,可以在拼多多上买号(密码管理器上也纪录了一个)。估计用的是迅飞或者第三方服务的转写能力

<<.warning "''万兴喵影生成的 SRT 文件是用 GBK 编码的。''如果需要转成 UTF-8,可以在 Windows 上用 VSCode 打开并转换;在 Linux 上参考 [[这里|Snippets: Shell: Convert File Encoding]]。">>

!! 字幕编辑

纯音频项目时,用 [[Aegisub|http://www.aegisub.org/]]。支持跨平台。操作非常顺畅,比如有合并多条字幕这样实用的功能。也能输出成不带时间线信息的纯文本。但 2014 年之后就不再更新了,所以不支持 WebVTT 这种新格式。

视频项目用剪辑软件处理。

<<.warning "在用剪辑软件修改字幕时,一般都是导入某个 SRT(比如在听写平台生成的 SRT),再去做修改。但是要留意 ''对字幕文字的修改可能不会写回原始 SRT 文件''。比如万兴喵影就不会。">>

!! 字幕格式转换

在不同字幕的格式之间互转,如 SRT、VTT、ASS 等。

可以用 [[asticode/go-astisub|https://github.com/asticode/go-astisub]] 工具。安装:

* Linux: `go get -u github.com/asticode/go-astisub/...`
* Windows: 我预编译好了一个放在网盘的 `Journey\Toolbox\Executables\astisub.exe` 下了

使用:

```
astisub convert -i example.srt -o example.vtt
```

从已有的视频截取一个片断。

复杂的方式是用 PR 或者高级工具。简单的方式是用 PotPlayer。按 <kbd>Alt+C</kbd> 显示「录制视频」的面板。

实际截取流程是:

* 将进度条拉到要开始截取的地方。可以使用 <kdb>D</kdb> <kdb>F</kdb> 按帧定位
* 在「录制视频」面板点击开始。录制过程中随时可以暂停视频
* 在录制到想要的内容后点击「录制视频」面板中的停止

[img width=1000 [potplayer-record-video]]

注意要把解码方式调成 H/W(硬件解码)。如果使用 S/W(软件解码),截图时总会丢掉前面几帧画面。另外,无论 H/W 还是 S/W,都会出现 ''最前面几帧的声音丢失'' 的情况。
保护自己的内容不被非法盗用。

!! 水印

极客羊的 [[视频|https://www.youtube.com/watch?v=DDh9vLMxfFw]] 中会在中间数次插入自己的水印,一般仅持续一两秒,对观感影响小,应该是个好方法。
制作视频封面图(YouTube 上称之为缩略图)。

!! 尺寸

国内各平台及 YouTube 对视频尺寸、比例的要求(2019 年 1 月):

{{ video-cover-size-table }}

除了 B 站和微信公众号比较特殊,其他都是 16:9,1280x720。

可以先做 16:10 的图片(1280x800),再裁剪成 16:9 及 2.35:1。

用 Photoshop 制作图片时,分辨率建议选 72 像素 / 英寸。不要选 300,不然生成的图片可能超过平台的大小限制。

!! 背景及前景

背景如果杂乱,建议用模糊工具(比如高斯模糊)模糊一下。

前景可以考虑用播客主,通过扣图得出,如果显得不够显眼,可以加白边并加一点阴影。

!! 文字

加文字也是很必要的。简单的做法是直接敲上字,描边并加阴影。

!! 灵感

这些人做的封面很风格化,学习一下:

* https://www.youtube.com/user/Nerdwriter1
* https://www.youtube.com/user/mythicalsage

!! 参考

* [[视频封面制作常用技巧,Photoshop制作视频缩略图,vlog封面制作方法 - WillTV|https://www.youtube.com/watch?v=p4qlzcQOAp8]]
参考 [[简单几步教你做出高大上的视频片头|https://www.youtube.com/watch?v=KK-MY9MjlJI]]。
降低音频中的背景噪音。音频降噪。

很多种方式:

* Audacity,简单
* 万兴喵影,非常简单
* Reaper,相对复杂

分几种场景和任务:

* 普通的录音
* [[录电脑屏幕|Screen Capture and Recording]]
* 拍摄视频内容时的录音(暂未涉及)

这里只讲普通的录音。

不同设备:

* 在 Android 上使用系统自带录音
* 在电脑上可以接上麦克风用 Audacity 录音。常用的快捷键:
** 按 <kbd>R</kbd> 在音频末尾接着录音
** 录音过程中按 <kbd>Space</kbd> 暂停录音
** 想从游标处向后删除内容,按 <kbd>Shift+D</kbd>

对于不同场景的音质选择:

* 播客:单耳道 96kbps
* 自己的语音备忘:32kbps
* 游戏或者视频制作:192kbps ~ 320kbps
视频的转场效果(不知道这个词用得对不对)。收集一些转场效果供后面参考使用。

!! Elina Lin 青青

这个 YouTube 视频中有 [[这一段|https://youtu.be/olUVti4oyUA?t=172]] 转场效果,类似于书的章节标题 / 副标题:

{{ video-transitions-elina-lin }}
!! 调整播放速度

对于本地视频,可以用 PotPlayer 提供的能力去调,快速键 `C`, `X`, `Z`。

对于网页中的 HTML5 视频,用 [[Video Speed Controller|https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk]] 这个 Chrome 插件,也提供了快捷键。

!! 修改 WebVTT 字幕样式

WebVTT 是针对 HTML5 提出的字幕解决方案。在看 Udacity 的视频时,我发现它的字幕太大了挡住视频内容。搜到 [[SO 问题|https://stackoverflow.com/questions/30246138/how-to-change-video-subtitles-font-size-in-html5]] 提供的一个解决方案,在 Stylish (Chrome 自定义样式用的插件) 中建立一个主题,写入下面内容:

```css
video::-webkit-media-text-track-display {
  font-size: 50%;
}
```

你可以选择只对 Udacity 的域名生效。
!! HandBrake <<plat-win>> <<plat-linux>>

[[HandBrake|https://handbrake.fr/]] is an open source and cross-platform video transcoder with many cool features:

* Built-in Device Presets
* Support various input and output formats
* Title / chapter and range selection
* Batch Scan and Queueing of encodes
* Chapter Markers
* Subtitles (VobSub, Closed Captions CEA-608, SSA, SRT)
* ...
|!Origin |{{!!web-page-url}} |

这篇文章对工具的思考给我启发:

<div class="box">

一般工具的出路有两条:1. 加入社交关系链,变成社交产品;2. 加入内容信息流,变成一个内容分发平台。

之所以要这么做,只为两点:

# 工具产品的主要壁垒是体验,但体验的升级是无止境的。而互联网中最高频、最高打开率使用的产品就是社交产品,所以很多工具想给自己增加关系链,让自己能建立起关系链壁垒,增加自己存活下来的概率;
# 工具产品大多是以让用户高效的使用达到目的存在的,因此大部分的工具产品都存在用户使用时长过短的问题,像猎豹的 Clean Master 曾今的平均打开时长只有 1-2 秒,这样的产品不论一天有多少的打开次数,都是缺乏广告价值的,所以很多工具给自己增加 Feed 流,以增加用户使用时长,来让自己更好的卖广告。

这两件事,如果做成了,这个工具要么变成社交产品,要么变成社区产品。这算是鲤鱼跃龙门了。当然,大部分的工具产品是做不到的。哪怕像支付宝这么 6 的,做不到就是做不到...

工具很难做到这一点的原因也很简单,用户的认知中,增加新的非工具的功能这件事,和过去对使用工具的认知是冲突的。所以能成的非常少。

</div>

可能对于大规模的 2C 工具,体验上难以构成壁垒,需要更多地增加用户粘性和使用时间;反之,对于专业类的工具,因为技术或者体验上的门槛高,竞争对手不易复制,可考虑付费使用。


! Cheat Sheets

* [[Basic Vim Tips - Ben Crowder|https://bencrowder.net/files/vim-fu/]]

! Vim Help

Vim 内置的 `!help` 命令可以呼出帮助文档,但是在终端里看不一定方便。有人做了一个有各种关键字跳转的 [[HTML 版本|http://vimhelp.appspot.com/]],更方便检索。代码在 [[GitHub|https://github.com/c4rlo/vimhelp]] 上。

我用 [[HTTrack|Web Scraping]] 把这个网站下了一份到本地上。
VSCode 我很喜欢。新功能推得很快,很灵活,很靠谱。

!! 配置同步

用 [[Settings Sync 插件|https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync]]。GitHub Access Token 及 Gist ID 在 Enpass 里有纪录。

但是它缺乏一些区分平台 / 机器的能力,比如区分 Linux / Windows,比如我有两台电脑,一台是高分屏一台不是,这样 `window.zoomLevel` 在不同机器就有差别。它没有考虑到。
VuePress 作为软件项目的文档实在太好用了。比如这个 [[代码块中的行高亮|https://vuepress.vuejs.org/zh/guide/markdown.html#%E4%BB%A3%E7%A0%81%E5%9D%97%E4%B8%AD%E7%9A%84%E8%A1%8C%E9%AB%98%E4%BA%AE]]。

!! 插件

* [[官方的插件列表|https://vuepress.vuejs.org/zh/plugin/]]
* [[第三方维护的主题和插件的列表|https://vuepress.tools/]]

[[vuepress-plugin-tabs|https://superbiger.github.io/vuepress-plugin-tabs/]] 提供了多个 tab 展示内容的能力,比如按不同平台(Windows、Linux 或 MacOS)给代码片断。

微信小程序开发。

!! Resources

!!! 官方文档

* [[小程序起步 - 微信官方|https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/]]
* [[小程序开发指南 - 微信官方|https://developers.weixin.qq.com/ebook?action=get_post_info&docid=0008aeea9a8978ab0086a685851c0a]]


[[事件机制|https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html]]。

!! Simple Example

```xml
<!-- page.wxml -->
<view id="outer" catch:tap="handleTap">
  <view id="inner">点击我</view>
</view>
```

```js
Page({
  handleTap: function(e) {
	  console.log(e)
  }
})
```

`currentTarget` 总是指向事件绑定的元素,而 `target` 则是事件发生时所在的元素。比如 tap 事件在 `#inner` 上发生,但是最终冒泡到 `#outer` 上才被事件处理函数执行,因此 `currentTarget` 是 `#outer` 而 `target` 是 `#inner`。

!! `bind`, `catch`, `capture-bind`, `capture-catch`

这些都用来做事件绑定,如 `bind:touchstart`、`capture-catch:touchstart`。

`bind` 不会阻止事件向上冒泡,`catch` 会。

带 `capture-` 头的,会在事件捕获阶段被执行,而不是在事件冒泡阶段。看看 [[MDN|https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Building_blocks/Events]] 上对于捕获和冒泡的介绍。看看微信官方 [[文档|https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000846df9a03909b0086a50025180a]] 对这块的描述。现代浏览器都采用在冒泡阶段执行事件处理函数。
[img width=200 [we-app-folder-structure]]

!! 主要配置文件

* `app.json`:控制小程序的展现、页面路径、网络超时等([[链接|https://developers.weixin.qq.com/miniprogram/dev/framework/config.html]])
* `project.config.json`:小程序工具配置,主要设置微信官方出的小程度开发工具([[链接|https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html]])
* `pages` 路径中每个页面的 JSON 配置文件:配置页面本身的属性([[链接|https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#%E9%A1%B5%E9%9D%A2%E9%85%8D%E7%BD%AE]])

!! 样式文件

`app.wxss` 是全局样式文件。`pages` 中的样式文件(如 `index.wxss`)仅对该页面有效。

!! JS 文件

`app.ts` 关心的是整个小程序的生命周期和事件,以及提供整个 app 共享的数据(如下面代码示例中的 `globalData`);`pages` 下的 TS 文件(`index.ts` 等),关心的是一个页面的生命周期和事件。

!!! `app.ts`

```ts
//app.ts
export interface IMyApp {
  userInfoReadyCallback?(res: wx.UserInfo): void
  globalData: {
    userInfo?: wx.UserInfo
  }
}

App<IMyApp>({
  onLaunch() {
    // 展示本地存储能力
    var logs: number[] = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success(_res) {
        // console.log(_res.code)
        // 发送 _res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: (res) => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo
              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res.userInfo)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
  }
})
```

`AppInstance` 接口包含了上面所示的 `onLaunch` 等函数:

```ts
interface AppInstance<T extends IAnyObject = {}> {
  /** 生命周期回调—监听小程序初始化
   *
   * 小程序初始化完成时触发,全局只触发一次。
   */
  onLaunch?(options?: ILaunchShowOption): void
  /** 生命周期回调—监听小程序显示
   *
   * 小程序启动,或从后台进入前台显示时
   */
  onShow?(options?: ILaunchShowOption): void
  /** 生命周期回调—监听小程序隐藏
   *
   * 小程序从前台进入后台时
   */
  onHide?(): void
  /** 错误监听函数
   *
   * 小程序发生脚本错误,或者 api
   */
  onError?(/** 错误信息,包含堆栈 */error?: string): void
  /** 页面不存在监听函数
   *
   * 小程序要打开的页面不存在时触发,会带上页面信息回调该函数
   *
   * **注意:**
   * 1. 如果开发者没有添加 `onPageNotFound` 监听,当跳转页面不存在时,将推入微信客户端原生的页面不存在提示页面。
   * 2. 如果 `onPageNotFound` 回调中又重定向到另一个不存在的页面,将推入微信客户端原生的页面不存在提示页面,并且不再回调 `onPageNotFound`。
   *
   * 最低基础库: 1.9.90
   */
  onPageNotFound?(options?: IPageNotFoundOption): void
}
```

!!! `page.ts`

页面代码示例:

```
import { IMyApp } from '../../app'

const app = getApp<IMyApp>()

Page({
  data: {
    motto: '点击 “编译” 以构建',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo'),
  },
  //事件处理函数
  bindViewTap() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  onLoad() {
    if (app.globalData.userInfo) {
      this.setData!({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true,
      })
    } else if (this.data.canIUse){
      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.userInfoReadyCallback = (res) => {
        this.setData!({
          userInfo: res,
          hasUserInfo: true
        })
      }
    } else {
      // 在没有 open-type=getUserInfo 版本的兼容处理
      wx.getUserInfo({
        success: res => {
          app.globalData.userInfo = res.userInfo
          this.setData!({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  }
})
```

`PageInstance` 的接口如下:

```ts
interface PageInstanceBaseProps<D extends IAnyObject = any> {
  /** 页面的初始数据
   *
   * `data` 是页面第一次渲染使用的**初始数据**。
   *
   * 页面加载时,`data` 将会以`JSON`字符串的形式由逻辑层传至渲染层,因此`data`中的数据必须是可以转成`JSON`的类型:字符串,数字,布尔值,对象,数组。
   *
   * 渲染层可以通过 `WXML` 对数据进行绑定。
   */
  data?: D;

  /** `setData` 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 `this.data` 的值(同步)。
   *
   * **注意:**
   *
   * 1. **直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致**。
   * 1. 仅支持设置可 JSON 化的数据。
   * 1. 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
   * 1. 请不要把 data 中任何一项的 value 设为 `undefined` ,否则这一项将不被设置并可能遗留一些潜在问题。
   */

  setData?<K extends keyof D>(
    /** 这次要改变的数据
     *
     * 以 `key: value` 的形式表示,将 `this.data` 中的 `key` 对应的值改变成 `value`。
     *
     * 其中 `key` 可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 `array[2].message`,`a.b.c.d`,并且不需要在 this.data 中预先定义。
     */
    data: D | Pick<D, K> | IAnyObject,
    /** setData引起的界面更新渲染完毕后的回调函数,最低基础库: `1.5.0` */
    callback?: () => void,
  ): void;

  /** 到当前页面的路径,类型为`String`。最低基础库: `1.2.0` */
  route?: string;
}

interface PageInstance<
  D extends IAnyObject = any,
  T extends IAnyObject = any
> extends PageInstanceBaseProps<D> {
  /** 生命周期回调—监听页面加载
   *
   * 页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
   */
  onLoad?(
    /** 打开当前页面路径中的参数 */
    query?: { [queryKey: string]: string },
  ): void;
  /** 生命周期回调—监听页面显示
   *
   * 页面显示/切入前台时触发。
   */
  onShow?(): void;
  /** 生命周期回调—监听页面初次渲染完成
   * 
   * 页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
   * 
 
   * 注意:对界面内容进行设置的 API 如`wx.setNavigationBarTitle`,请在`onReady`之后进行。
  */
  onReady?(): void;
  /** 生命周期回调—监听页面隐藏
   *
   * 页面隐藏/切入后台时触发。 如 `navigateTo` 或底部 `tab` 切换到其他页面,小程序切入后台等。
   */
  onHide?(): void;
  /** 生命周期回调—监听页面卸载
   *
   * 页面卸载时触发。如`redirectTo`或`navigateBack`到其他页面时。
   */
  onUnload?(): void;
  /** 监听用户下拉动作
   *
   * 监听用户下拉刷新事件。
   * - 需要在`app.json`的`window`选项中或页面配置中开启`enablePullDownRefresh`。
   * - 可以通过`wx.startPullDownRefresh`触发下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。
   * - 当处理完数据刷新后,`wx.stopPullDownRefresh`可以停止当前页面的下拉刷新。
   */
  onPullDownRefresh?(): void;
  /** 页面上拉触底事件的处理函数
   *
   * 监听用户上拉触底事件。
   * - 可以在`app.json`的`window`选项中或页面配置中设置触发距离`onReachBottomDistance`。
   * - 在触发距离内滑动期间,本事件只会被触发一次。
   */
  onReachBottom?(): void;
  /** 用户点击右上角转发
   *
   * 监听用户点击页面内转发按钮(`<button>` 组件 `open-type="share"`)或右上角菜单“转发”按钮的行为,并自定义转发内容。
   *
   * **注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮**
   *
   * 此事件需要 return 一个 Object,用于自定义转发内容
   */
  onShareAppMessage?(
    /** 分享发起来源参数 */
    options?: IShareAppMessageOption,
  ): ICustomShareContent;
  /** 页面滚动触发事件的处理函数
   *
   * 监听用户滑动页面事件。
   */
  onPageScroll?(
    /** 页面滚动参数 */
    options?: IPageScrollOption,
  ): void;

  /** 当前是 tab 页时,点击 tab 时触发,最低基础库: `1.9.0` */
  onTabItemTap?(
    /** tab 点击参数 */
    options?: ITabItemTapOption,
  ): void;

  /** 窗口尺寸改变时触发,最低基础库:`2.4.0` */
  onResize?(
    /** 窗口尺寸参数 */
    options?: IResizeOption,
  ): void;
}
```
一些可能不够直观、需要特别关心的点。

!! 小程序运行机制

JS 逻辑代码在一个线程中;每个页面在单独的渲染线程中。因此在页面 1 设置的 setTimeout,跳转到页面 2 也存在,如果不用了需要清除掉。

!! App 及 Page 的差异

* App 管理全局数据和整个小程序的生命周期
* Page 管理当前页面数据和当前页面的生命周期

对于它们的生命周期和用户动作触发的事件,需要认真看看事件会在什么时候被触发:

* App:https://developers.weixin.qq.com/miniprogram/dev/reference/api/App.html
* Page:https://developers.weixin.qq.com/miniprogram/dev/reference/api/Page.html

!! Page 中 `setData` 的 key 可以表示复杂结构

```js
Page({
  data: {
    a: 1, b: 2, c: 3,
    d: [1, {text: 'Hello'}, 3, 4]
  }
  onLoad: function(){
    // 可以用 'd[1].text' 直接设置到 `d` 里面的属性
    this.setData({'d[1].text' : 'World'})
  }
})
```

!! TabBar 页面及普通页面

微信小程序在设计上,认为 TabBar 的页面是顶级页面,从 API 的设计上可以看到:

> `wx.navigateTo` 和 `wx.redirectTo` 只能打开非 TabBar 页面,`wx.switchTab` 只能打开 Tabbar 页面

因此 `wx.navigateTo` 和 `wx.redirectTo` 只适用于某个 tab 下的页面跳转。
我的需求是:

# 能针对段落 / 句子 / 整个页面,在网页上做笔记
# 能保存成文件,比如能用 Chrome 打印 PDF 时直接把笔记也嵌入进来,就完美了
# 笔记要支持富文本,Markdown 基本语法能支持最佳,图片无所谓

这里第二点最难实现,也很少看到有产品实现。

目前探索的几个产品:

|!产品 |!细粒度标记|!导出能力 |!富文本编辑 |!备注 |
|[[hypothesis|https://hypothes.is/]] |支持 |只能导出标记本身 |支持 |目前看起来最佳 |
|[[Diigo Web Collector|https://www.diigo.com/]] |支持 |只支持导出书签 |不支持 |有网站,有移动端,但是不实用 |
|[[Additor|https://additor.io/]] |支持 |无 |不支持 |主要是用来把各种网页串起来,写成文章<br>标识能力几乎不能用;很漂亮 |

!! Hypothesis

导出用这个工具:http://jonudell.net/h/facet.html?facet=user&mode=documents&search=onlyice
Web API 指浏览器提供的 API。主要参考 MDN 上的 [[Web API 页面|https://developer.mozilla.org/en-US/docs/Web/API]]。

这些 API 大多数是用 JS 调用的,但是不写在 [[JavaScript]] 节点下,因为那边应该写跟语言本身更紧密相关的。

[[axios|https://github.com/axios/axios]] 是一个流行的 JS HTTP client 库。

下面是一个封装 axios 用于项目中使用的例子。同时它使用了 [[axios-case-converter|https://github.com/mpyw/axios-case-converter]] 默认将字段名从 under_scores 形式转化成 camelCase 形式,以配合我使用 Django / DRF 作 API server 时输出的下划线字段名,转换成 JS 惯用的 camelCase。

```javascript
// utils/api.js
import axios from 'axios';
import applyCaseMiddleware from 'axios-case-converter'

const defaults = {
  baseURL: process.env.API_URL || 'http://localhost:8000',
  headers: () => ({
    'Content-Type': 'application/json',
  }),
  error: {
    // 按你的 API 设计中出错时的回包格式进行设计
    detail: "Server error.",
  },
};

const api = (method, url, variables) =>
  new Promise((resolve, reject) => {
    const client = applyCaseMiddleware(axios.create());
    client.request({
      url: `${defaults.baseURL}${url}`,
      method,
      headers: defaults.headers(),
      params: method === 'get' ? variables : undefined,
      data: method !== 'get' ? variables : undefined,
    }).then(
      response => {
        resolve(response.data);
      },
      error => {
        // 按你的 API 设计中出错时的回包格式进行设计
        if (error.response) {
          reject(error.response);
        } else {
          reject(defaults.error);
        }
      },
    );
  });

export default {
  get: (...args) => api('get', ...args),
  post: (...args) => api('post', ...args),
  put: (...args) => api('put', ...args),
  patch: (...args) => api('patch', ...args),
  delete: (...args) => api('delete', ...args),
};
```
[[Fetch API|https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API]] 是 ES2015 中提出的新 API。

它相对 XMLHttpRequest 的接口设计更佳。基于 Promise 的接口也使得代码编写更加方便。同时功能强大。但是它也存在一些问题:

* 错误处理不直观。比如服务器返回 HTTP 500 时,代码仍然会走进 resolve 分支而不是 reject 分支,你需要自行检查 `response.ok`:<div>

```js
fetch("http://httpstat.us/500")
    .then(function(response) {
        if (!response.ok) {
            throw Error(response.statusText);
        }
        return response;
    }).then(function(response) {
        console.log("ok");
    }).catch(function(error) {
        console.log(error);
    });
```
</div>
* 获取数据需要两步。`response.json()` 不返回数据,而是返回一个 Promise 对象:<div>

```js
fetch("http://httpstat.us/500")
    .then(function(response) {
        if (!response.ok) {
            throw Error(response.statusText);
        }
        return response.json();
    }).then(function(response) {
        console.log(response);
    }).catch(function(error) {
        console.log(error);
    });
```

</div>
* 不能设置超时
* 不能取消请求
* 不支持上传进度
* 默认发起请求时不会带上 cookie

[[Axios|https://github.com/axios/axios]] 库是更佳的选择。类似 Python 的 requests,简单易用,默认的行为足够好。

!! Challenge

> The heart of the matter is that as web designers, we never know exactly how the pages we create will be viewed. We don’t know which of the dozens of browsers might be used, whether it is on a desktop computer or something more portable, how large the browser window will be, what fonts are installed, whether functionality such as JavaScript is enabled, how fast the internet connection is, whether the pages are being read by a screen reader, and so on.
> - From [[Learning Web Design Ch03]]



!! Resources

* [[Learning Web Design]] 这本书也是入门网页设计的不二之选。
Accessibility 经常被简写为 A11Y,中文称为「无障碍性」。一般是针对有各种障碍的人采取的一种优化措施:

; 视觉障碍者(Vision impairment)
: 对于盲人或者视力非常差的人,他们可能需要读屏软件辅助阅读网页。对于视力稍好的,他们可能需要放大页面到合适的字体大小、或者调整屏幕对比度来进行阅读
; 行动障碍者(Mobility impairment)
: 对于无法正常用手操作鼠标键盘的,它们可能需要改良的键盘鼠标,或者通过踏板、摇杆或者语音控制来操作
; 听觉障碍者(Auditory impairment)
: 它们可能无法正常听到声音。经常见到的措施是在视频或者游戏中加字幕,并且对一些音效也加上字幕,比如「急促的呼吸声」等
; 认知障碍者(Cognitive impairment)
: 这类人可能有记忆、理解上的问题。设计更简单易用的网站有助于他们使用

W3C 的 Web Accessibility Initiative (WAI) 及 WAI-ARIA (Accessible Rich Internet Applications) 规范旨在解决这类问题。

美国政府规定了,如果一个网站接受了政府资助,那么它必需达到 [[Section 508|http://www.section508.gov/]] 中的无障碍要求,使得残障人士可以正常使用这个网站。

[[Learning Web Design Ch03]] 原书中提供了一系列非常好的材料供扩展阅读。
多维度的设备。

这张图明了地解释了什么是多维度的设备:

{{ the-multitude-of-devices }}

各个设备的不同之处包括:

* 屏幕大小
* 网络连接速度
* 交互方式不一样,比如用 XBox 手柄操作
* 浏览器内核不一样,包含渲染引擎和 JS 引擎

目前看移动端设备的浏览量已经超过了其他端。这也催生了主流的 [[Mobile First|Web Design: Mobile First]] 理念。
Mobile First(移动优先)指的是在网页设计中,先考虑移动端设计,再扩展到更大屏幕的 平板、PC 端的方法论。大部分主流 UI 框架都采纳了这种做法(比如 Bootstrap、Ant Design)。

!! Why Mobile First?

移动端的网页浏览量已经超过了传统的 PC 端。很多人上网的唯一设备即是手机。因为优先考虑移动端上的设计是更好的选择。

!! How?

Responsive Web Design 技术的推广、浏览器中 CSS 能力提升,使得可以针对不同尺寸的屏幕设计不同的页面。

!! Methodologies

存在两套方法论:

* [[Progressive enhancement|Web Design: Progressive Enhancement]],中文作「渐进式增强」,意思是设计或者开发功能时,先考虑限制最多的终端,实现核心能力,再针对限制少的终端,做上锦上添花的功能。例子:
** 基于屏幕小的移动端设计网站,再对屏幕更大的设备提供更详细的信息、更好的交互等
** 在实现单页应用时,同时考虑没有启用 JavaScript 的客户端,对这样的客户端采用 server rendering,使其有一样的使用体验
* Graceful degradation,用腾讯的说法叫「柔性降级」,即一开始设计或者开发功能时,优先考虑限制少的终端,再对于限制多的终端上降低部分体验

现在主流意见认为 progressive enhancement 更好,这也支撑了 mobile first 的理念。

!! Benefits

采用 mobile first 或 progressive enhancement 的好处是,因为屏幕小且浏览器的能力一般弱于 PC 端,因此会迫使设计师及产品经理仅把最核心的功能,用最简洁的方式表达出来,这会产生一个干净的网站设计。同时考虑到移动端一般网络较差,针对移动端设计网站也使得性能成为提前考量的因素,比如你不能放一些非常高像素的图片在移动端上。

!! 反例

实际上业界有很多网站,它们流行于 mobile first 理论和响应式设计之前,导致它们往往先设计了 PC 端,再做的移动端。比如 GitHub,它并没有采用响应式设计,而是为桌面端和移动端分别设计了两套,并且在移动端非常强调了脚本及 CSS 的大小,以提升速度。

同时有一些效率工具,由于主流的使用终端是 PC,且交互比较复杂,开发者可能一开始并没有针对移动端做设计。比如 ClickUp、Everhour 等,它们的移动端网页或者 app 不好用。但是这块也有做得好的,比如 TickTick。

!! Resources

* [[A Hands-On Guide to Mobile-First Responsive Design - UXPin|https://www.uxpin.com/studio/blog/a-hands-on-guide-to-mobile-first-design/]]
* [[What is Mobile First Design? Why It’s Important & How To Make It?|https://medium.com/@Vincentxia77/what-is-mobile-first-design-why-its-important-how-to-make-it-7d3cf2e29d00]]
中文作「渐进式增强」,意思是设计或者开发功能时,先考虑限制最多的终端,实现核心能力,再针对限制少的终端,做上锦上添花的功能。例子:

* 基于屏幕小的移动端设计网站,再对屏幕更大的设备提供更详细的信息、更好的交互等
* 在实现单页应用时,同时考虑没有启用 JavaScript 的客户端,对这样的客户端采用 server rendering,使其有一样的使用体验

对于特定技术,也要多考虑如何渐进式增强:

* HTML:比如你使用了 HTML5 的 [[语义化标签|HTML: Semantic HTML]],那么你要考虑下老版本浏览器是否认识这些标签,可能需要使用 [[CSS Reset|CSS: Reset]]
* CSS:比如你对某块背景使用了渐变,那么你最好也给它设置一个静态的背景,避免有些浏览器还不支持渐变,导致背景一块空白
* JS:如果你使用了高版本的浏览器接口或者 ECMAScript,考虑使用 polyfill 或者 transpiler 来支持老版本浏览器。如果做到极致,甚至应该考虑用户浏览器禁用了 JS 的情况

[[Learning Web Design]] 一书中给了一些这个领域非常好的参考书目。
!! Resources

* [[Learn Web Development in 2019 - gitconnected|https://levelup.gitconnected.com/learn-web-development-in-2019-aecb6dfb3e51]]
* [[Web Development In 2019 - A Practical Guide|https://www.youtube.com/watch?v=UnTQVlqmDQ0]]: 提到非常多的最佳实践,比如 Server-side Rendering、状态管理(Redux)等
* [[SmashingMagazine|https://www.smashingmagazine.com/]]: 专业及易懂的前端文章
* [[A List Apart - For people who make websites|https://alistapart.com/]]

!! Quick Start Guide

* 后台:[[Django: Initial Setup]]
* 前台:[[Next.js: Initial Setup]]



!! See Also

* [[Web UI]]
* [[Web Design]]



提供特定场景下的最佳实践。

!! 在浏览器中发起异步请求

不要用 XMLHttpRequest 或 Fetch,用 [[Axios|https://github.com/axios/axios]]。用 [[axios-case-converter|https://github.com/mpyw/axios-case-converter]] 做字段名大小写转换。
前端在开发过程中需要一个 Dev Server,主要实现 hot reload 功能方便开发。一般框架所带的脚手架/boilerplate 等会带有此类功能,因此这个页面中描述的工具可能不重要。

!! Budo ([[GitHub|https://github.com/mattdesl/budo]])

Budo 是一个针对前端开发的快速原型工具。实时监控 HTML/CSS/JS 修改并自动 reload 页面(CSS 修改不需要 reload,直接可以在页面体现)。

!! nodemon ([[官网|https://nodemon.io/]] | [[GitHub|https://github.com/remy/nodemon]])

对于 Node.js 后台程序,使用 Nodemon 可以监测文件变化,自动重启 node 程序。你可以把你原先的 `node index.js` 命令,直接改成 `nodemon index.js` 命令。

随着 JS 生态在 2016 年左右开始不段更新变化,「前端开发者」这个职位的技能树已经发生了非常大的变化。传统的前端开发者需要懂 HTML、CSS 及可以做基础交互的 JS,但是现在的前端开发者已经分裂成两波人:

{{ front-end-developer-skill-set }}

图片来自 [[The Great Divide|https://css-tricks.com/the-great-divide/]]。

这个事情对于我的意义在于:

* 理解前端世界中对人群分类的变化
* 对偏设计侧的技能,目前不是我的重点。但是对它们有基础的理解,
** 可以让我更好地搜索到需要的内容;
** 当我需要做一些网页设计时,我可能更容易地找到解决办法:
*** 登录页可以找一些好看的来抄,或者直接用 Strikingly、上线了等服务,再或者花点钱找人做;不要尝试自己去设计,暂时力不所及
*** UI 元素,可以找好看的图标集或者直接用框架来解决
Source map 是一种技术,可以将转换过的 CSS / JS 与原始代码关联起来。这篇 [[文章|https://www.mattzeunert.com/2016/02/14/how-do-source-maps-work.html]] 非常好。

转换的原因可能有:

* 将使用了新 JS 语义的代码转换成老运行环境能运行的 JS 代码,比如某浏览器可能还不支持 arrow function,那可以用 Babel 将 arrow function 转成普通函数给浏览器运行
* 将一种类 JS 语言的代码转换成 JS 代码,如 Coffee、TypeScript 等
* 压缩代码或者混淆代码的工具

需要由相应的工具生成 source map,如 Babel、TypeScript 等。

Source map 的重点在于,将转义后的代码的每个表达式等,与原始代码关联起来。''具体的关联细节不重要,有兴趣看看前面提到的文章。''

!! Webpack

如果在开发过程中使用的是 `webpack-dev-server`,在 Webpack 配置文件(一般是 `webpack.config.js`)中加入 `devtool: 'source-map'` 选项来生成 source map([[文档|https://webpack.js.org/configuration/devtool/]])。
功能有可能和 [[Web Library]] 重叠。

传统的 web 开发中,URL 路由是由服务端程序(如 Express、Django 等)负责,根据用户请求的路径(如 `/`, `/about`)返回相应的 HTML 页面。

但由于 SPA(单页应用)的流行,React 及 Vue 的生态中都出现了在客户端做路由的组件,比如 [[React Router|https://reactrouter.com/web]]。

客户端路由即是,当 SPA 的页面变化时,新页面的内容由 JS 加载并渲染出来,同时 JS 代码会通过 [[History API|https://developer.mozilla.org/en/docs/Web/API/History_API]] 修改当面页面的 URL 地址。比如:

# 你在 https://example.com/ 上点击了 About 按钮,
# 页面并没有刷新,About 页面的内容通过 JS 渲染出来,浏览器地址变成了 https://example.com/about

如果你此时再刷新页面,浏览器会向服务器请求 https://example.com/about。由于 /about 页面是 JS 渲染的,服务端可能并没有这个页面,因此会返回 404 给前端。这种问题有几个解法。

!! 用 hash (#) 来表示客户端路由

用 hash 来表达客户端路由的话,about 页的地址则变成 https://example.com/#about。这样服务端每次返回的都是 SPA 的初始 HTML ,客户端再根据 hash 做路由。

好处是 ''实现简单''。缺点是 URL 很丑,并且页面都是 JS 渲染会 ''影响 SEO''。

!! 服务端对任意页面都返回 SPA 的初始 HTML

Express 有一个中间件是实现这种能力的,叫 [[express-history-api-fallback|https://www.npmjs.com/package/express-history-api-fallback]]。

好处是不需要使用 hash 来做客户端路由。缺点有几个:

* ''无法做纯前后端分离'',即是前端页面没法完全托管在 CDN 上,仍然需要后端服务器输出 HTML
* 页面仍然是 JS 渲染,''影响 SEO''

!! 服务端渲染(SSR,Server Side Rendering)

即是服务端先把整个页面,包括 JS 动态生成的内容,都生成一个完整的 HTML 提供给前端,但同时在这个 HTML 页面上也同样有 SPA 能力。这种方案借助于 Node.js 以及 headless webkit 等能力来运行 JS 及生成 HTML。优点是服务器''直出完整内容,有利 SEO'';缺点是实现复杂,并且更消耗服务端资源。

详情信息看 [[Web Frontend: Task: Server Side Rendering]]。

!! 总结

如果页面的内容与 SEO 无关,比如是个工具类应用,那么可以用 hash 方式,简单直接。

如果内容与 SEO 有关,SSR 是首选。
在网页上播放视频或音频。

推荐的库有:

* [[Plyr|https://plyr.io/]]:功能强大,定制能力强
* [[Vime|https://vime-js.com/]]:可以看看;它觉得 Plyr 和 VideoJS 在设计上有一些问题
* [[APlayer|https://aplayer.js.org/]]:简单优雅(仅音频)

同时参考 [[Startup: Service: Vod]]。
网页上的编辑器,一般供用户输入 UGC 内容用,比如在 Github 上写 issue 时会有简易的 Markdown 编辑器供用户使用。

编辑器需要考虑:

* 富文本支持:可以用 Markdown,也可以用传统的富文本(生成 HTML)
* 定能 toolbar 的能力
* 剪贴板的支持:比如能否粘贴一个图片到文中(data URI 或者上传文件),甚至是粘贴表格
* 历史纪录能力:以支持 undo、redo
* 代码高亮
* 好的 API 接口

尽量使用一整套的编辑器解决方案,而不是使用单个的库(比如这类 [[Markdown|Web Library: Markdown Parser / Renderer]] 库仅支持 Markdown 的解析和渲染,并没有提供 toolbar、剪贴板等能力)。

富文本编辑器(非 Markdown)领域的玩家有:

* [[CKEditor|https://ckeditor.com/]]
* [[TinyMCE|https://github.com/tinymce]]
* [[Quill|https://quilljs.com/]]
* [[Draft.js|https://github.com/facebook/draft-js]]
* [[Slate|https://github.com/ianstormtaylor/slate]]

直观的印象是:

* ''CKEditor 及 TinyMCE 由于发展多年,它的功能更强大'',更靠近类似 Word 提供的能力。但 ''CKEditor 是收费的'',费用还不低
* ''Quill 更轻量,以及 API 上设计得更好'',更适合开发者做定制及交互。但 Quill 功能相对较少,比如 ''[[不支持表格|https://github.com/quilljs/quill/issues/117]]''
* Facebook 开源的 Draft.js,看起来不如 Quill 好

!! Quill

Quill 写了一篇 [[文章|https://quilljs.com/guides/comparison-with-other-rich-text-editors/]] 讲述它与其他编辑器的区别。我并没有深入看。

对于 Quill,有社区维护的 [[ReactQuill|https://github.com/zenoamaro/react-quill]] 项目提供了 React 组件。也有一个 jira_clone 项目使用了 React ref 机制来 [[实现|https://github.com/oldboyxx/jira_clone/blob/master/client/src/shared/components/TextEditor/index.jsx]]。

!! Slate

''Slate'' 作者提及它写 Slate 的 [[意图|https://github.com/ianstormtaylor/slate]] 时,表示它尝试过很多其他库,但是在一些问题上做得不好。

我一度被 [Slate][slate] 的理念所吸引,但是实际了解之后发现不符合我的需求:

* 编辑器中的文本在 Slate 内部以一个 JSON 结构体保存,没有原生支持 Markdown
** 虽然框架提供了机制与 Markdown 互转,但是互转的代码需要自己实现(还不容易),而且估计社区也没有好的实现
** 这种情况下,如果想把文本存数据库,可能需要存这个 JSON 对象,这使得无法容易实现全平台支持,比如 iOS / Android 生态中可能没有相应库支持
* 自己实现一套 UI 略复杂。如果想实现类似 Typora 的所见即所得融合文本的功能,它是比较合适的,但是实现成本会很高

!! 方案总结

不考虑实时协作的情况下,实现类似 GitHub / GitLab 的轻量 Markdown 编辑器是比较好的选择。编辑时不能所见即所得,编辑好后点 preview 再转换成 Markdown。

其他方案实现成本略高。
Next.js 和 Gatsby 框架支持 SSR:

* 对于静态的、可预先生成的内容,可直接生成 HTML,方便放在 CDN 上加速访问。比如对于一个博客,可以用 Markdown 文件写好文章,再通过框架生成好 HTML 推到 CDN 上。访问速度是 SEO 考量的一大指标
* 对于动态内容,框架提供了 Node.js server,可以在你访问时再生成 HTML 给到前端

详细实践在有需求时再补齐。
网页上的编辑器,一般供用户输入 UGC 内容用,比如在 Github 上写 issue 时会有简易的 Markdown 编辑器供用户使用。

编辑器需要考虑:

* 富文本支持:可以用 Markdown,也可以用传统的富文本(生成 HTML)
* 定能 toolbar 的能力
* 剪贴板的支持:比如能否粘贴一个图片到文中(data URI 或者上传文件),甚至是粘贴表格
* 历史纪录能力:以支持 undo、redo
* 代码高亮
* 好的 API 接口

尽量使用一整套的编辑器解决方案,而不是使用单个的库(比如这类 [[Markdown|Web Library: Markdown Parser / Renderer]] 库仅支持 Markdown 的解析和渲染,并没有提供 toolbar、剪贴板等能力)。

富文本编辑器(非 Markdown)领域的玩家有:

* [[CKEditor|https://ckeditor.com/]]
* [[TinyMCE|https://github.com/tinymce]]
* [[Quill|https://quilljs.com/]]
* [[Draft.js|https://github.com/facebook/draft-js]]

直观的印象是:

* ''CKEditor 及 TinyMCE 由于发展多年,它的功能更强大'',更靠近类似 Word 提供的能力。但 ''CKEditor 是收费的'',费用还不低
* ''Quill 更轻量,以及 API 上设计得更好'',更适合开发者做定制及交互。但 Quill 功能相对较少,比如 ''[[不支持表格|https://github.com/quilljs/quill/issues/117]]''
* Facebook 开源的 Draft.js,看起来不如 Quill 好

Quill 写了一篇 [[文章|https://quilljs.com/guides/comparison-with-other-rich-text-editors/]] 讲述它与其他编辑器的区别。我并没有深入看。

对于 Quill,有社区维护的 [[ReactQuill|https://github.com/zenoamaro/react-quill]] 项目提供了 React 组件。也有一个 jira_clone 项目使用了 React ref 机制来 [[实现|https://github.com/oldboyxx/jira_clone/blob/master/client/src/shared/components/TextEditor/index.jsx]]。
端到端测试:目前看 [[Cypress|https://www.cypress.io/]] 是大家认为最好的方案([[来源|https://frontendmasters.com/books/front-end-handbook/2019/]])。

普通测试:Jest 是目前(2020)最流行的方案。

[[Testing]] 提供了通用的测试建议。
!! Modernizr

[[Modernizr|https://modernizr.com/]] 用来判断用户运行环境中(一般是浏览器),是否支持特定的 HTML / CSS / JS 特性。对于比较新的环境,开发者可以利用新特性(如 JS API、HTML5 标签等)来实现功能;对于老环境,提供其他的实现。

!! webhint

[[webhint|https://webhint.io/]] 提供了在开发、调试、部署及上线等各阶段对网站的检测。会在兼容性、性能、安全、A11Y 等方面做考量。

[[Axios|https://github.com/axios/axios]] 是目前较优的 HTTP client 方案。GitHub 上有一些使用示例。配合 [[axios-case-converter|https://github.com/mpyw/axios-case-converter]] 可以将字段的命名风格在 JS 结构的 camelCase 和实际 HTTP 请求中的 JSON 字段的 snake_case 间相互转换。

使用 async / await 的代码例子:

```javascript
import axios from 'axios'
import applyConverters from 'axios-case-converter'

async function getServerSideProps ({ params, query }) {
  const client = applyConverters(axios.create())
  const authorResponse = await client.get(`http://127.0.0.1:8000/authors/${params.id}.json`)
  const author = authorResponse.data
  return author
}
```
流行的 JS parser 有:

* [[remark|https://github.com/remarkjs/remark]]
* [[remarkable|https://github.com/jonschlinkert/remarkable]] (pure JS), [[react-remarkable|https://github.com/acdlite/react-remarkable]] (remarkable as React component)
* [[react-markdown|https://github.com/rexxars/react-markdown]]
* [[markdown-it|https://github.com/markdown-it/markdown-it]]

''目前(2021 年 4 月)我倾向于使用 remark''。remark 是后起之秀,GitHub star 数量不如其他,但是它背后有一套生态系统(unified.js、remark、rehype 等),而且是 Gatsby 大力支持(其官方 Markdown 插件使用 remark)的。[[Inkdrop|https://www.inkdrop.app/]] 也使用它作为 Markdown 库。

从功能强大和方便性上看,react-markdown 不如其他的。

CSS Tricks 上有一篇对比各 Markdown 规范和库的 [[文章|https://css-tricks.com/choosing-right-markdown-parser/]] (2019)。

在 React 中使用时不一定要用社区封装好的 React 组件,使用 React ref 的能力也可以以传统方式来使用 Markdown 库。这个 jira_clone 项目使用了一个富文本库 Quill 的 [[例子|https://github.com/oldboyxx/jira_clone/blob/master/client/src/shared/components/TextEditor/index.jsx]],可以供参考。

<<.warning "由于 Markdown 可以传 HTML 标签,对于 UGC 的 Markdown 内容,需要对其内容进行过滤(sanity),防止被 XSS。有些 Markdown 库会做过滤(如 markdown-it),但大部分并不处理。推荐的过滤库有 [[DOMPurify|https://github.com/cure53/DOMPurify]]。">>
纪录阅读过的一些有价值的网页、微信公众号文章等。这类信息相对零散但是也有一定价值。

网页的来源链接放在每篇 tiddler 的 `web-page-url` 域中。


当你需要抓取整个网站到电脑上离线使用时,可以考虑用这些软件。

! 整站抓取

!! HTTrack <<plat-win>> <<plat-linux>>

[[HTTrack|https://www.httrack.com/]] 提供的 GUI 简单易用,成功抓取了 Vim HTML 超链接版的 [[文档|http://vimhelp.appspot.com/]]。

!! wget <<plat-win>> <<plat-linux>>

`wget` 命令是通用的解决办法。用法如下<<footnote "note" "这个办法我没实践过,可能有问题">>:

```bash
$ wget \
     --recursive \
     --no-clobber \
     --page-requisites \
     --html-extension \
     --convert-links \
     --restrict-file-names=windows \
     --domains website.org \
     --no-parent \
         http://www.website.org/tutorials/html/
```

* `--recursive`: download the entire Web site.
* `--domains website.org`: don't follow links outside website.org.
* `--no-parent`: don't follow links outside the directory tutorials/html/.
* `--page-requisites`: get all the elements that compose the page (images, CSS and so on).
* `--html-extension`: save files with the .html extension.
* `--convert-links`: convert links so that they work locally, off-line.
* `--restrict-file-names=windows`: modify filenames so that they will work in Windows as well.
* `--no-clobber`: don't overwrite any existing files (used in case the download is interrupted and resumed).

! 保存单个网页

!! webpage2html <<plat-linux>> <<icon-code>>

webpage2html([[GitHub|http://github.com/zTrix/webpage2html]] | [[PyPI|https://pypi.python.org/pypi/webpage2html/]])是一个将网页保存为单个 HTML (非 MHTML)文件的工具。它的原理是将 CSS / JavaScript 文件内嵌到 HTML 里,同时把图片转为 base64 data URI。安装后可以直接用 `webpage2html` 命令来转换:

```bash
$ webpage2html "http://www.google.com" > google.html
```

!! Chrome print to PDF <<plat-win>> <<plat-linux>>

用 Chrome 可以将一个网页保存为 PDF。具体的入口在 <kbd>Ctrl-P</kbd> 唤起的打印窗口那。优点是简单便捷,缺点是格式信息全无。


Cross-site request forgery (CSRF),跨站请求伪造,是 web 安全中最常见的类型之一。网站往往会用 cookie 来标识某一浏览器的用户已经登录,CSRF 利用这种机制来做攻击。

!! 攻击

!!! 常规例子

设想一个银行提供了这样的 GET 接口用来转帐:

```
https://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory
```

假如你刚好登录了这个银行,银行下发了 cookie 表示你已在登录状态。你再访问了一个恶意网站,网站上放了一张图片:

```html
<img src="https://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
```

此时你访问这个网站时,你就无意中执行了转帐接口。

即使这个接口需要 POST 方式,恶意网站仍可通过 JS 来达到目的,比如在隐藏的 iframe 中放入这些代码:

```html
<form action="https://bank.example.com/withdraw" method="POST">
  <input type="hidden" name="account" value="bob">
  <input type="hidden" name="amount" value="1000000">
  <input type="hidden" name="for" value="mallory">
</form>
<script>window.addEventListener('DOMContentLoaded', (e) => { document.querySelector('form').submit(); }</script>
```

!!! Login CSRF

参考自 OWASP 的 [[CSRF cheatsheet|https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#login-csrf]]。

有些开发者会认为登陆的接口不需要做 CSRF 保护,因为此时用户未登陆,没有被偷身份的风险。但事实上仍有别的风险。比如正常用户访问恶意网站时,网站所有者通过 CSRF 将其自己的身份登陆到电商网站;正常用户再访问电商网站时,可能不知不觉把自己的信用卡信息增加到了攻击者的帐号上。因此同样的 CSRF 防范手段应该被使用上。

!! 防范

防止 CSRF 有几个方法。

!!! 服务器检查 HTTP 头中的 Origin 及 Referer 字段值

这两个字段会告诉服务器,发起请求时用户当前的页面信息。如果你在恶意网站中被发起请求,那么服务器知道你并不是处在正常的网站中,可以拦截掉这些请求。这是最简单的检查手段。

!!! Anti-CSRF tokens

即当你访问正常的网站页面时,服务器在 Form 表单中会给你返回一个 `csrf_token`:

```html
<form action="https://report-uri.io/login/auth" method="POST">
    <input type="hidden" name="csrf_token" value="d82c90fc4a14b01224gde6ddebc23bf0">
    <input type="email" id="email" name="email">
    <input type="password" id="password" name="password">
    <button type="submit" class="btn btn-primary">Login</button>
</form>
```

当你提交表单时,这个 token 也会被带上来,服务器在服务端再检查 token 是否匹配。

对于恶意网站,它受限于 [[CORS|HTTP: CORS]] 规则无法加载正常的页面,因此它也拿不到相应 token,所以无法构造带有 token 的恶意请求。

这种方法依赖于正常网站的服务端功能。大部分 web 框架已内置此功能。

!!! 通过 cookie 的 SameSite 属性控制

相较于上面两种方法,新推出的 SameSite 则从根本的 cookie 访问机制中解决这个问题。看 [[HTTP: Cookie: SameSite]]。

实践中,''anti-CSRF token 和 SameSite 两种机制应该同时被应用''。SameSite 作为一个较新的指令,在一些老的浏览器中并不被支持。

!! Reference

* [[Site Request Forgery Prevention Cheat Sheet - OWASP|https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html]]
* [[HTTP cookies - MDN|https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Security]]
Same-origin Policy 即同源策略,是 web 安全中的一项关键措施,用来决定浏览器在访问某个站点时,能否向非同源的另一站点请求数据。

!! Definition of an origin

两个站点仅在协议(http / https)、主机和端口同时相同时才算同源。

比如,对于 `http://store.company.com/dir/page.html`:

|!URL                                              |!Outcome     |!Reason                                          |
|`http://store.company.com/dir2/other.html`        | Same origin | Only the path differs                           |
|`http://store.company.com/dir/inner/another.html` | Same origin | Only the path differs                           |
|`https://store.company.com/page.html`             | Failure     | Different protocol                              |
|`http://store.company.com:81/dir/page.html`       | Failure     | Different port (`http://` is port 80 by default)|
|`http://news.company.com/dir/page.html`           | Failure     | Different host                                  |

!! What is permitted and what is blocked?

什么情况下访问跨域资源是被允许的,什么情况下是被禁止的?

web.dev 的 [[文章|https://web.dev/same-origin-policy/#what-is-permitted-and-what-is-blocked]] 描述了常见网络请求的情况。MDN 的 [[文章|https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy]] 描述了网络请求、DOM API 以及 data storage 的情况。

网络请求是这其中最受重视的。一般来说:

# Cross-origin //writes// are typically allowed. Examples are links, redirects, and form submissions. Some HTTP requests require [[preflight|https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Preflighted_requests]].
# Cross-origin //embedding// is typically allowed:
#* JavaScript with `<script src="…"></script>`. Error details for syntax errors are only available for same-origin scripts.
#* CSS applied with `<link rel="stylesheet" href="…">`. Due to the relaxed syntax rules of CSS, cross-origin CSS requires a correct Content-Type header.
#* Images displayed by `<img>`.
#* Media played by `<video>` and `<audio>`.
#* External resources embedded with `<object>` and `<embed>`.
#* Fonts applied with `@font-face`. Some browsers allow cross-origin fonts, others require same-origin.
#* Anything embedded by `<iframe>`. Sites can use the `X-Frame-Options` header to prevent cross-origin framing.
# Cross-origin //reads// are typically disallowed, but read access is often leaked by embedding. For example, you can read the dimensions of an embedded image, the actions of an embedded script, or the [[availability of an embedded resource|https://bugzilla.mozilla.org/show_bug.cgi?id=629094]].

HTTP 提供了 [[CORS|HTTP: CORS]] 机制来控制哪些跨域请求是被允许的。

!! Reference

* [[Same-origin policy - MDN|https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy]]
* [[Same-origin policy - web.dev|https://web.dev/same-origin-policy/]]

这篇文章主要探讨 ''在带后台的 SPA 场景下,如何在浏览器上存储 API token''?这里的 API token 指带有用户身份或者会话信息,需要在每次浏览器请求后台 API 时发过去的数据。不限制它的格式和用途,它可以是个 JWT,也可以是个 OAuth 的 access token。

浏览器中存储数据主要有两种方式,cookie 及 HTML5 Storage API(包含 localStorage 及 sessionStorage)。Cookie 虽然主要用于被服务端生成及读取,并不是提供给浏览器存放内容使用,但是它刚好适用于这个场景。这也意味着对于 HTML5 Storage,需要额外的编程实现去将它带给服务端(典型的场景是通过 `Authorization` 头),而 cookie 不需要。

按多个维度进行的对比如下:

|!因素 |!Cookie |!HTML Storage |
|受 XSS 影响?|仅 `HttpOnly` 的不受影响 |是 |
|受 CSRF 影响?|实现得当时不受影响 |否,只有 [[同源|HTTP: CORS]] 的 JS 代码才可访问 |
|内容长度限制 |4096 字节每 cookie |5Mb 数据每域名 |
|会话相关机制 |有 |没有,需额外编程实现 |
|请求后台时自动带上? |是 |否,需额外编程实现;同时你也往往不想把整个 storage 上传,而是只传其中的部分 key |

会话相关机制包括:

* 会话是否应该在某个时间自动失效?比如用户登录 30 天后失效,需要重新登录
* 会话有效期是否随用户使用而延长?比如已登录的用户每次打开页面做操作时,都自动把会话有效期延长到当前时间的 30 天后
* 是否需要实现「记住我(remember me)」功能?虽然目前大部分服务默认是记住的

这些机制在 cookie 上都有成熟的实现;在 JWT 上虽然可以实现,但是框架支持程度不一,有可能需要额外的工作量。

总体来看 Cookie 看起来是实现成本比较低的方式。但是它需要有好的 [[防 CSRF 实现|Web Security: CSRF]],特别是在目前(2020 年 4 月)`SameSite` 未普及的时候。

对于 HTML Storage 方式,如果你的前端框架做好了整合,使得实现成本不高时,感觉比 cookie 更加灵活和安全。

具体选择哪种方式,我觉得更看你使用的前后台技术栈(前台如 React、VueJS 等,后台如 Django、Lavavel 等)中框架和流行库的支持程度。
美团的这篇 [[前端安全系列(一):如何防止XSS攻击?|https://tech.meituan.com/2018/09/27/fe-security.html]](<<coslink "PDF 存档" "/files/archives/2020/04/web-security-xss-meituan-tech-blog.pdf">>)讲得很好。

Web Syndication (信息聚合)。一般跟 RSS 关联在一起。

! Feed Reader

[[Feed reader|https://en.wikipedia.org/wiki/News_aggregator]](信息流阅读器),指对信息进行抓取和聚合并供给读者阅读的工具。流行的在线服务是 Feedly 及 Inoreader。流行的自建服务是 Tiny Tiny RSS。

RSSHub 的作者 DIYgod [[推荐|https://diygod.me/ohmyrss/]] 使用自建的 Tiny Tiny RSS。我实际使用了下,觉得并不适合我:

* 支持自定义 filter,即根据内容自动进行处理;这个功能在 Feedly 或 Inoreader 中都需要付费,但是我并不需要使用
* 虽然有人做了 [[非常方便的 docker 部署|https://ttrss.henry.wang/zh/]],但由于它是个 php 程序,并需要用 Postgres 来存储数据,带来了额外的机器和运维成本(比如备份数据库文件)
* 并没有提供我想要的「对订阅源写备注」的能力(虽然 Feedly 及 Inoreader 也没有)

目前我主力使用 Inoreader。

! RSS v.s. Atom

这节讨论两个主要的 Web Syndication (信息聚合)格式,RSS 以及 Atom。

TL;DR: 比起用 RSS 格式你更应该用 Atom。

!! RSS

RSS 的历史比较混乱。Netscape, RSS-DEV Working Group 和 Dave Winter 都发布过 RSS 格式规范。

RSS 第一个版本 0.9 由 Netscape 的两位开发者发布于 1999 年 5 月。之后 RSS 的关键人物,当时供职于 UserLand Software 的 Dave Winer 又分别发布了 0.92~0.94 多个版本,但是版本之间有兼容性问题。RSS-DEV Working Group 在 2000 年 12 月发布了 RSS 1.0。Dave Winer 于 2002 年 9 月发布了 RSS 2.0,并且最终把 RSS 这个缩写定义为 Really Simple Syndicaton。最终 RSS 2.0 规范的所有权被 Winer 和 UserLand Software 赠予哈佛大学,并且规范被冻结,不再能有显著的更新。

2002 年 11 月,纽约时报开始为读者输出 RSS 流,Winer 称之为 RSS 格式的引爆点。

现在主流的 RSS 版本是 2.0。

!! Atom

由于 RSS 2.0 存在一些问题,并且它的规范被冻结,于是有一些人想制订一个新格式来解决这个问题。2003 年 12 月,Atom 0.3 发布并且被各种信息聚合工具接受,比如很多 Google 相关服务使用了这个协议。Google 的 GData 格式也是在 Atom 1.0 和 RSS 2.0 基础上加以改进。

2005 年 7 月,Atom 1.0 被 IETF 接受并在同年 12 月被标准化至 RFC 4287 中。

要让 feed reader 识别到你的网站有 Atom 输出,可以在网页中添加这行(其中 `atom.xml` 文件需要是你的网站程序有实际生成的文件):

```html
<link href="atom.xml" type="application/atom+xml" rel="alternate" title="Sitewide ATOM Feed" />
```

!! RSS v.s. Atom

Atom 1.0 在几方面优于 RSS 2.0:

* RSS 没有更新时间字段,这导致 feed reader 难以判断内容是否有更新
* 模块化(或者扩展性):RSS 不是一个 XML 命名空间,不易做扩展,比如 `dc:creator` 这种标签无法被加进 RSS 中
* RSS 无法使用相对 URI,导致不同的 feed readers 在这方面实现不一致,没有可互操作性(interoperability)
* Atom 在国际化方面优于 RSS

Reddit 的 feed 格式 [[从 RSS 改为 Atom|https://www.reddit.com/r/changelog/comments/428vdq/upcoming_reddit_change_switching_from_rss_20_to/]] 时,提到了几点:

* RSS 对 HTML 内容支持差,还可能导致 XSS 攻击
* Feed reader 客户端对 Atom 的支持比 RSS 好

Jekyll 有一个 Issue 在讨论 [[应该使用哪种 Feed 格式|https://github.com/jekyll/jekyll-feed/issues/2]],结论是选择(并且只选择) Atom 作为输出格式。

主流网络媒体使用的 RSS 这个词语是一种惯用法,它的网站可能输出的是 Atom 格式的 feed 流,也可能输出 RSS 的。

!! 参考文献

# [[History of web syndication technology  - Wikipedia|https://en.wikipedia.org/wiki/History_of_web_syndication_technology]]
# [[RSS - Wikipedia|https://en.wikipedia.org/wiki/RSS]]
# [[Atom (standard) - Wikipedia|https://en.wikipedia.org/wiki/Atom_(standard)]]
# [[RSS 2.0 And Atom 1.0 Compared|http://www.intertwingly.net/wiki/pie/Rss20AndAtom10Compared]]
# [[Atom Syndication Format - Introduction|http://atomenabled.org/developers/syndication/]]
# [[What feed format is best? - Discussion on Jekyll Issues|https://github.com/jekyll/jekyll-feed/issues/2]]
# [[Reedit Switching from RSS 2.0 to Atom 1.0|https://www.reddit.com/r/changelog/comments/428vdq/upcoming_reddit_change_switching_from_rss_20_to/]]
!! Cases

* [[MarkSheet|https://marksheet.io/]]:排版质量非常高

!! See Also

* [[Web Development]]
* [[Web Design]]

! 我的方案

目前(2021 年 5 月)我的方案是:

''对于框架'',使用 Bulma 配合 Tailwind CSS。Bulma 作为主力,提供布局和各种组件。Tailwind CSS 只作为工具存在。配置时 Tailwind CSS 时,注意只使用它的 utilities 部分,而不使用 base 及 component。base 是个 CSS reset,component 提供了布局系统,这些都是 Bulma 已经做了的:

```postcss
// tailwind.css
@tailwind utilities;
```

''对于组件'',Bulma 提供一些较基础的组件(比如表单、导航栏等)。''对于更复杂的组件'',比如付费服务中常有的 pricing section(不同价格套餐),这些 Bulma 没有覆盖到。这种更上层的 UI component 一般分为 application UI 和 marketing,看看 [[Tailwind UI|https://tailwindui.com/#components]] 的组件分类就能理解。

我很喜欢 [[Tailwind UI|https://tailwindui.com/#components]] 的设计风格,但它 ''价格不菲''(150~250 刀),而且它并不是封装好的组件,''更多地是在教你写 CSS''(随便找一个例子的代码看看就明白了),或者你就用它的样式和结构不做修改。我本来幻想用了这些框架之后就不用怎么碰 CSS,但是后来感觉我的想法过于天真;如果做一个复杂一点的 application UI,大概率很多组件的样式还是得自己写。

另外我看了 Lunch Money 的 [[技术栈|https://lunchmoney.app/stack]],它用的是 2018 年之后已经不再更新的 Semantic UI,再自己自定义了一些样式。我觉得我用 Bulma 也应该能实现。应该考虑重点问题重点解决,比如我不会做三栏界面,那么找相应的文章看懂三栏界面是怎么做的,同时可以模仿 Tailwind UI 的样式和配色。

这些 Tailwind CSS 的开源组件库可以给一些实现参考:

* [[Tailblocks|https://tailblocks.cc/]]
* [[Tailwind UI Kit|https://tailwinduikit.com/]]
* [[Tail-Kit|https://www.tailwind-kit.com/]]
* [[Kometa UI Kit|https://kitwind.io/products/kometa/components]]

! 轻量使用

[[Basscss|http://basscss.com/]] 和 [[Tachyons|http://tachyons.io/]] 是不错的轻量 CSS 框架。它并不像 Bootstrap 一样,要求你整套都用它的,而是你需要的地方用一下就好;就像 helper function 和 framework 之间的区别。

! Utilities

这类 CSS 框架并不提供组件和成套样式,但是提供了非常多的基础设施,方便你调布局、做效果等等。

[[tailwindcss|https://tailwindcss.com/]] 是这其中的典范。这篇 [[文章|https://statickit.com/guides/next-js-tailwind]] 描述它如何与 [[Next.js]] 整合。

! 整套方案

!! 桌面端

<<.tip "桌面端的框架往往是 responsive 的,有对应的移动端框架。但是看了一下 Ant Design 的移动端框架,感觉一般。其他的框架还没考察过。" >>

!!! Ant Design ★★★★★

[[Ant Design|http://ant.design/]] 是蚂蚁金服出品的一套设计语言加 React 组件,非常赞,值得一用。

!!! Bulma ★★★★★

[[Bulma|https://bulma.io/]] 看起来非常非常赞。

!!! bootstrap ★★★★☆

* [[bootstrap|http://getbootstrap.com/]] 是最流行的 CSS 框架。官网有一堆代码片段,直接拷贝就能用。
* [[Flat UI|https://github.com/designmodo/Flat-UI]] 是非常漂亮的免费 Bootstrap 主题。
* [[bootswatch|http://bootswatch.com/]] 有一堆不同色调的免费主题。
* [[wrapbootstrap|https://wrapbootstrap.com/]] 有一些更实用的主题,需要付费。

!!! Foundation ★★★★★

[[Foundation|http://foundation.zurb.com/]] 由一个设计公司 Zurb 出品,看起来丰富全面,用户群体也大。

!!! Semantic UI ★★★★☆

[[Semantic UI|http://semantic-ui.com/]] 的主要特点是 CSS 标签语义化,看起来简单易懂。但是网上它的主题很少,感觉实际应用上的网站也不多,而且我有一次用起来感觉并不舒服,做不出想要的效果又不知道如何调试。

知乎上 [[有人认为|https://www.zhihu.com/question/27827137/answer/48774272]] Semantic UI 没有形成统一规范,而且不够 responsive。

!! 移动端

!!! Framework7 ★★★★★

Framework7 ([[官网|http://framework7.io/]] | [[GitHub|https://github.com/nolimits4web/Framework7]])看起来非常棒。

!!! Material-UI ★★★☆☆

[[Material-UI|http://www.material-ui.com/]] 提供了一些基于 React 的组件。样式也似乎足够丰富。

!!! Pure ★★★★☆

[[Pure|http://purecss.io/]] 由雅虎出品,特点是足够简单又覆盖了常见的使用场景。

! 资源

GitHub 上有个 [[Design Essential|https://github.com/showcases/design-essentials]] 的 showcase,可能包含了一些足够好的库和工具用来做界面。

[[The State of CSS 2019|https://2019.stateofcss.com/technologies/]] 也是个不错的参考。

这里有一份来自 41 个专家的 [[评测|https://psdtowp.net/best-responsive-css-frameworks.html]]。
[[机核网|https://gcores.com]] 的电台播放器实现了一个好看的模糊背景效果,该背景的颜色会根据节目封面而变化。比如下面这期节目,封面是红色的,则背景也是红色:

{{ gcore-player-blur-background }}

研究了一下,发现它将原封面图,用阿里云 OSS 的能力模糊了之后作为背景图:

* 原图:https://image.gcores.com/855c57b6-b031-423c-b5aa-b6f3aa1d5afc.jpg
* 背景图:https://image.gcores.com/855c57b6-b031-423c-b5aa-b6f3aa1d5afc.jpg?x-oss-process=image/resize,limit_1,m_fixed,w_220,h_220/quality,q_90/bright,-20/blur,r_50,s_50/format,jpg

其中各参数的解释是:


|`resize` ([[document|https://www.alibabacloud.com/help/zh/doc-detail/44688.htm]]) |`limit_1` |如果指定的尺寸(本例中 220x220)大于原图,则不处理 |
| |`m_fixed` |固定宽高,强制缩略 |
| |`w_220`, `h_220` |宽和高均为 220px |
|`quality` ([[document|https://www.alibabacloud.com/help/zh/doc-detail/44705.htm?spm=a2c63.p38356.b99.696.1f617ba7BhFMFH]]) |`q_90` |变换为原图质量的 90% |
|`bright` ([[document|https://www.alibabacloud.com/help/zh/doc-detail/44698.htm?spm=a2c63.p38356.b99.690.552a496cd2vERX]]) |`-20` |调低亮度 |
|`blur`([[document|https://www.alibabacloud.com/help/zh/doc-detail/44701.htm?spm=a2c63.p38356.b99.689.231269acyIUiVh]]) |`r_50`, `s_50` |模糊半径及正态分布的标准差,为相对单位,取值 [1, 50] |

是个值得参考的实现。
有这么几个场景需要考虑加载中状态:

* 内容正在拉取,仍未展示出来时:
** CSS 方案:[[CSS: Animation: Content Placeholder]]
** React 方案:[[Implementing Skeleton Screens In React|https://www.smashingmagazine.com/2020/04/skeleton-screens-react/]],我未看,但是感觉靠谱
* 点击按钮等控件后,控件变成加载中,伴随着转圈动画及不可点击的行为。这种一般 CSS 框架会提供样式
* 做了修改操作后,期望页面内容刷新,但是刷新前希望将内容区域变成 loading 状态并且不可操作。参考 [[Bulma: is-loading for Arbitrary Element]]

对于转圈动画,参考 [[react-spinners|https://www.npmjs.com/package/react-spinners]] 及 [[react-loader-spinner|https://www.npmjs.com/package/react-loader-spinner]]。
[[Webpack|http://webpack.github.io/]] 是个模块打包器(module bundler)。

理念:

* 设计理念:[[Webpack: Motivation]]
* 核心概念:[[Webpack: Core Concepts]]

组件:

* Loader
Webpack 文档 [[在这里|https://webpack.js.org/concepts/]]。核心有:

* Entry:表示 webpack 从此处开始扫描文件,构建依赖树。可以配置。
* Output:指示 webpack 将打包后的文件放到何处
* Loaders:对特定文件的处理程序。Webpack 默认只支持 JS 及 JSON,但你可以加入很多不同的 loader,使得你可以在 JS 中 import CSS 代码等。举个例子:<div>

```javascript
// webpack.config.js
const path = require('path');

module.exports = {
  output: {
    filename: 'my-first-webpack.bundle.js'
  },
  module: {
    rules: [
      { test: /\.txt$/, use: 'raw-loader' }
    ]
  }
};
```

这表示:

> "Hey webpack compiler, when you come across a path that resolves to a '.txt' file inside of a `require()`/`import` statement, use the `raw-loader` to transform it before you add it to the bundle."

但注意这种特性可能只对 webpack 可行,其他的构建工具不一定支持。

</div>
* Plugins:Loaders 是针对特定文件的处理,而 plugins 则不区分文件,而是增加某种特定的能力。比如可以通过插件自动生成 source map、生成 HTML 等等
* Mode:表示模式,一般用来区分开发环境或是生产环境,从而指定不同的打包配置
官方文档提到了产生它的 [[动机|http://webpack.github.io/docs/motivation.html]],主要是两点:

# 屏蔽不同模块系统(module system,比如 CommonJS, AMD)间的差异,使它们都可以被使用,平滑整合使用了不同 module system 的第三方库
# 各个 JS 的依赖被解析后,合成合适大小的文件(Code Splitting)传输给客户端
# 它也应该可以用来做各种预处理,比如做 CoffeeScript => JavaScript,Jade 转 HTML 等;这些不在 Webpack 自身被实现,而是用 Loader 机制载入进来
网站的各类角色。

这里的内容来自 //[[Learning Web Design: A Beginner's Guide to HTML, CSS, JavaScript, and Web Graphics|https://www.amazon.com/Learning-Web-Design-Beginners-JavaScript/dp/1491960205/ref=pd_sbs_14_3/136-8147037-9387834]]// 一书的第一章。观察到相对发达地区(欧美、日本、香港等),技术起步早,它们对网站的使用也更多,对网站角色的分工也更明确。国内的网站分工上可能不太一样。

下面各种角色,在 //Learning Web Design// 这本书中都给出了延伸阅读的书目。由于书本可能会更新版本,这里不写入具体书名,需要时再查阅 //Learning Web Design//。

!! Content Wrangling

内容管理。

Information Architect(或者叫 Information Design),负责网站整体的信息结构(导航、内容分类、数据在服务端的组织形式等等),方便网站的各类用户容易找到它们想要的信息。

Content Strategist,有点像国内的运营,负责实际内容的维护、编写、复用。通过内容维护整体的品牌形象。

!! Designer

设计师。

!!! User Experience, Interaction, and User Interface Design

UX、IxD 和 UI 设计师,它们的职责有别但是经常交叉。

UX 是与用户走得最近的,他们需要跟产品经理一样理解用户的需求,关心用户如何使用这个网站,关心内容质量等等。用户调研、测试应该由 UX 设计师来做。

> The User Experience designer takes a holistic view of the design process — ensuring the entire experience with the site is favorable. UX design is based on a solid understanding of users and their needs based on observations and interviews. According to Donald Norman (who coined the term), UX design includes “all  aspects  of  the user’s interaction with the product:  how it is perceived, learned, and used.” For a website or application, that includes the visual design, the user interface, the quality and message of the content, and even the overall site performance. The experience must be in line with the organization’s brand and business goals in order to be successful.

IxD 的主要职责是让网站易用、高效,让用户用起来很方便。UI 设计师会更聚焦于具体的页面展现,如页面功能布局、控件的样式等等。

这几个角色的工作过程一般是这样:

; User research and testing reports
: User research 一般是通过问卷、观察或者对话等各种方式,理解用户需求,从而可以确定网站应该如何更好地解决问题。在设计的各个阶段,也应该经常请用户试用来测试设计的可用性
; Wireframe diagrams
: 构建网站的大框架。此时主要关心网页结构和功能性的内容,比如导航、搜索框,各类表单元素等。颜色、字体和其他视觉元素仍不在考虑之列

<figure>
{{ wireframe-diagram }}
<figcaption>Wireframe diagram</figcaption>
</figure>

; Site diagram
: 表达网站结构,网页间是如何联系的

<figure>
{{ site-diagram }}
<figcaption>Site diagram</figcaption>
</figure>

; Storyboards and user flow charts
: 以用户视角在网站上来完成某个任务,整个过程的文字和图片描述即是指 storyboard。用户流程图可以是 storyboard 中的一种展示方式,用来表示用户行为的不同分支

!!! Visual (graphic) Design

即是视觉设计师,决定了网站的「look and feel」,负责 logo、图形、字体、颜色、布局等等。

一般在于客户沟通过程,可能会通过这些形式进行沟通:

* 草图(mockup),用来表示大致的展现形式和视觉风格,但是由于现在设备尺寸多样,草图往往兼顾不到多种设备的展现效果
* [[Style tiles|http://styletil.es/]],将颜色、UI 控件、字体等风格整合成一页给客户看,但只包含视觉风格相关的元素,而不包含客户网页的具体业务场景、布局等。我猜测这种方式不是现今的主流,应该有很多方便的工具直接将视觉元素用网站表达出来,比如 Ant Design 的文档

另外视觉设计师还需要:

* 生成设计规范。[[Style Guides|http://styleguides.io/]] 上有很多非常好的设计规范,很多还是大公司生产,''非常值得一看''
* 负责图片的优化(比如压缩)

!! Developer

开发者,一般分前端和后端,不需要多描述。

!! Other Roles

Product manager, project manager, SEO specialist 这些顾名思义。Multimedia producers 这种职位比较少听到,我觉得就是内容编辑,专门产生内容,不管是文字、图片还是视频等。
网站模板。

!! 背景

这些场景你可能需要做网站:

* 个人 profilio 页,比如我展示自己的项目、写的文章等;娜娜展示她的摄影作品等
* 创业项目,可能是个网站服务,可能是个 app,需要有个网站做功能介绍、价格对比、收集反馈等

这种时候,手写网站往往是吃力不讨好的事情,因为做精美的网站,要考虑的点非常多:

* 技术上要懂 HTML、CSS、JS 等,而且做出精美的网站对 CSS 要求很高
* 能做一个统一的视觉设计规范
* 考虑 SEO
* 要将大量常用的组件做封装,比如价格对比表、用户评价/赞扬卡等。看看 IndieGo 这个 [[模板|https://indiego-template.webflow.io/]] 它主菜单中的 components

!! 解决方案

所以大致有两个解决方案:

* 用 UI 框架,比如 Bootstrap、Bulma
** 优点是编程上实现比较简单,因为它们往往是非常模块化的,而且可能有 React 的组件实现等
** 缺点是大多数没有抽象程度更高的组件,比如这种 [[promotion block|https://indiego-template.webflow.io/components/promo-features]],需要自己编写;设计上不如网站模板那么精美;
** 但亦有少数 UI 框架带有 marketing blocks,比如 [[Tailwind UI|https://tailwindui.com/]](收费颇贵)
* 找专业的网站模板
** 优点是设计精美,抽象程度高(比如封装了 promotion block、pricing table 等),你只需要拿来改改就好
** 缺点时定制成本会高

目前我觉得像产品介绍页(比如 [[TickTick 的产品介绍页|https://ticktick.com/home]]),用网站模板比较好。因为它涉及的交互并不多,而且对设计的美感要求更高。像功能页面(比如 [[TickTick 的用户操作页面|https://ticktick.com/]]),用 UI 框架比较好,因为你需要定制很多组件,网站模板中提供的 UI 组件可能就不适用了。而且用户操作页面的交互逻辑可能会重得多。

!! 好的网站模板

!!! nicetheme

[[nicetheme|https://www.nicetheme.cn/]] 是国内的 WordPress 主题开发团队。[[罗磊的博客|https://luolei.org/]] 用了它们的 cozy 主题,感觉不错。

!!! Theme Forest

[[Theme Forest|https://themeforest.net/]] 是一个不错的 WordPress 主题站。Smart Blogger [[推荐|https://smartblogger.com/niche-website/]]。

!!! Elegant Themes

[[Elegant Themes|https://www.elegantthemes.com/]] 提供了一个专业的 marketing WordPress 模板,以及页面构建工具。Smart Blogger [[推荐|https://smartblogger.com/niche-website/]]。

!!! Elastic Themes

[[Elastic Themes|https://www.elasticthemes.com/templates]] 给我感觉非常好。针对了不同的用途设计了不同的模板,而且质量很高。它们的模板托管在 [[Webflow|https://webflow.com/templates/designers/elastic-themes]] 上。

!!! Webflow

[[Webflow|https://webflow.com/]] 网站上的模板总体给人质量不错的感觉。尽量看付费模板而不是免费模板。
感谢 Deepin 团队,让 Arch Linux 也可以用上微信和企业微信。

AUR:

* [[deepin-wechat|https://aur.archlinux.org/packages/deepin-wechat/]]
* [[deepin-wxwork|https://aur.archlinux.org/packages/deepin-wxwork/]]

他们都是用 Wine 跑的软件。版本会比官方最新的稍微旧一点,但是至少有得用。

注意需要在 `/etc/locale.gen` 中启用 `zh_CN.UTF8 UTF8`,然后运行 `locale-gen`,不然在这两个程序中无法输入中文。
[[wemake.services|https://wemake.services]] 提供外包服务。在它的 [[网站|https://wemake.services/meta/]] 上详细介绍了:

* [[与客户合作的模式|wemake.services: Working with the client]]
* [[团队组成和招人标准|wemake.services: Hiring]]
* [[研发流程|wemake.services: Development process]]

都非常值得借鉴。

同时它对 [[RSDP|https://wemake.services/meta/]] 的描述也是一个非常好的 [[纯粹的高密度体验|High-density]] 例子。
!! 沟通方式

wemake [[不允许|https://wemake.services/meta/rsdp/communications/]] 团队成员有任何非正式的沟通方式,包括:IM 聊天、Email、电话、面对面交流。它期望所有的沟通都在 GitLab 上的单据完成,这样的作用是:

* 有清晰的话题
* 可追溯
* 讨论是适度的
* 对项目有帮助

这导致跟任务相关的信息,仅需要在这些地方查看:

* 代码本身
* 文档
* GitLab issues

怎样的讨论是被鼓励的?有这些:

* 在开始工作前对任务细节的探讨
* 完成任务过程中的任何疑问
* 文档不完善导致的疑问
* 对技术上的决策发表的意见

!! 单据

每个单据代表了一个任务。单据里面有这些信息:

* 角色:reporter(发起者)和 assignee(分配到的开发者),可以是同个人
* 预估时间:只有架构师可以预估时间
* 类型:
** Bug
** Feature
** Documentation
** Research

对单据内容的要求:

* 必须是自包含的,即是对阅读单据的人来说,里面的信息足够他完成任务
* 必须遵循 [[SMART|https://en.wikipedia.org/wiki/SMART_criteria]] 原则

单据不能被手工关闭。应该在完成后,发起一个 merge request 并关联到这个单据。如果 merge request 通过,则单据会被关闭。

!! 任务流程及完成标准

理清任务要求后,开发者需要拉单独的分支 `issue-{issue_no}` 来开发。开发完成后再合回 master 分支。

wemake 提出的 [[完成标准|https://wemake.services/meta/rsdp/definition-of-done/#steps-to-achieve-it]] 非常有参考价值,覆盖了测试、文档、style lint 和代码走查。同时他在 merge request 的模板中放了 check list 提醒开发者是否完成这些内容。

!! 技术决策

对于 [[技术决策|https://wemake.services/meta/rsdp/making-decision/#research]],wemake 使用 [[ADR|https://github.com/joelparkerhenderson/architecture_decision_record]] 来做纪录。
!! 团队规模

wemake [[相信|https://wemake.services/meta/rsdp/team-and-scaling/]] 一个团队 6-7 人即可,包含一个架构师、一个项目经理以及四到五个开发者。当它希望扩充团队时,它不会考虑在一个团队中新增成员(scale vertically),而是会建立新的团队。

!! 招人标准

wemake [[不做面试|https://wemake.services/meta/rsdp/job-application]]。它会看重申请人的这些点:

* 技术栈与公司是否吻合
* 开源项目、技术演讲经历,技术内容出版物,技术社区(如 Stack Overflow)的内容
* 测试任务的完成情况

[[不会考虑|https://wemake.services/meta/rsdp/employees/#how-my-initial-hourly-rate-is-calculated]]:

* 上一份工作的薪资
* 工作年限、所在地、所在地的工资水平、年龄、性别、国籍

!! 薪资

[[雇员工作方式|https://wemake.services/meta/rsdp/employees/]]:

* 只接受远程工作
* 可以接受同时有另外一份全职工作
* 不接受花客户的钱教育初级开发者

雇员的收入是按任务来计算的:

# 每个雇员一开始都有一个初始费率(即每小时工作的收费)
# 每个任务会有个估算时长,分配到一个雇员身上。一旦任务完成,客户必须付出费用,价格为初始费率乘以估算时长
# 这其中的一半会落入雇员手中。另外的一半中:
#* 20% 付给提单人
#* 20% 付给走查代码的人
#* 30% 付给公司自身,用于维护基础设施和纳税等
#* 剩下的作为公司的收益

雇员进公司会协商一个初始费率,随着后面独立完成任务的次数增加,费率也会随之上升。

!! 工作生活平衡

wemake 没有工作日。随时可以工作、随时可以不工作。建议每天工作 4-6 小时即可。

他们会自动化一切可自动化的东西。比如非常完善的 CI、自动流转状态的单据系统。

会要求开发者在任务中纪录下耗时,来考虑可以优化的点。
!! 开发开始前

wemake 不做任何的 [[估算|https://wemake.services/meta/rsdp/estimates/]]。像这种问题:

> 我想开发一个带自然语言处理的聊天机器人,并且它需要有好看的界面。需要花多少钱和多长时间?

他们认为是不可能准确回答的,除非开发者做过完全同样的产品,并且有完全同样的客户和开发团队。所以 wemake 不做估算,实际的时间和花费需要在需求分析后才给出。但是他们接受项目交付有截止时间。

客户有开发软件产品的需求提出时,wemake 会先做 [[需求分析|https://wemake.services/meta/rsdp/requirements-analysis/]]。需求分析要求客户回答几个问题:

# 你的产品想实现什么功能?
# 谁是这个产品的用户?
# 这个产品想解决用户的什么问题?
# 你什么时候真的需要这个产品?

在沟通之后,客户会收到一份正式的需求文档。这份文档应该是可交付的(deliverable)。它由下面这些部分组成。

!!! 术语

描述一些关键概念,类似高斯算法是什么、管理员和普通角色的区别是什么等。

!!! 需求优先级

wemake 采用 [[MoSCow 方法|https://en.wikipedia.org/wiki/MoSCoW_method]] 来确定需求优先级。MoSCow 方法将优先级分为 4 类:must、should、could 以及 won't,如:

|!Feature                                                      |!Priority |
|Multiple message providers could be supported                 |  Could  |
|Authenticated users must be able to send private messages     |   Must  |
|Authenticated users must be able to log out                   |   Must  |
|There should be a notification about incoming private message |  Should |
|Encrypted private messages won’t be supported                 |  Won’t  |

wemake 会优先支持 must 需求,一般会在此设置里程碑来表示项目有大的进展,并且承诺不会砍掉 must 需求。对于 should 需求,除非有正当理由,否则也不会砍掉。但对于 could 需求,如果在项目截止时间前来不及做,会考虑在客户确认的情况下砍掉。

won't 需求则用来表示产品后续不会有这类需求。这对于架构师和开发者来说是重要的,使得他们可以相应地设计架构和代码。

需求在开发过程中会被测试及验证。

!!! 用户故事(User stories)

[[用户故事|https://en.wikipedia.org/wiki/User_story]] 是以最终用户的视角来描述的需求。wemake 用 [[gherkin|https://cucumber.io/docs/gherkin/]] 格式来描述用户故事,如:

```gherkin
Feature: Account Holder withdraws cash

  Scenario: Account has sufficient funds
   Given the account balance is $100
     And the card is valid
     And the machine contains enough money
    When the Account Holder requests $20
    Then the ATM should dispense $20
     And the account balance should be $80
     And the card should be returned
```

用户故事最终也会被验证。

!!! 业务过程建模(Business process modeling)

wemake 使用 [[BPMN|https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation]] 图表来描述业务过程。

!!! 非功能性需求

这些往往比较模糊,比如客户会希望有健壮和性能高的应用以及优雅的代码。wemake 会把这些要求具体化:

* 服务器程序应该可以扩容支撑 3 倍的访问量,可用率不少于 98%
* 90% 的请求应该可以在 130ms 内被响应
* 代码必须遵循某个代码规范

!!! 里程碑

wemake 的开发团队会花大约 2 周做出一个 POC(proof of concept)原型,然后定义下一个里程碑的截止时间。在每个里程碑时间,都会给客户看半成品,以获得反馈。

!!! 定价

* 小型项目,五个工作日时间,150000 卢布(约合¥16500)
* 中型项目,十个工作日时间,300000 卢布(约合¥33000)

一旦需求明确下来,wemake 团队便开始开发。

!! 开发过程中

项目开始开发后,客户可以随时访问开发中的代码、CI 服务器、issue 等等。wemake 用 GitLab 来管理项目,会在项目开始工作的第一天给到客户永久的访问权限。同时客户如果遇到 bug 或者想提出意见时,也可提单。

!! 计费规则

wemake 对做完的任务收费。

在需求明确后,wemake 团队会把需求拆成小的明确的任务,并且将任务分配给团队中的开发者。每一个开发者都有一个基础费率,同时任务会有一个预估的耗时。任务的费用即等于基础费率乘以预估耗时。wemake 要求客户每周支付一次费用。如果客户较长时间没有支付,开发可能会被中止。

wemake 不提供任何折扣。

!! 为什么应该选择 wemake?

wemake 认为它们的 RSDP(repeatable software development process)是透明高效的,不需要靠过去服务过的客户的品牌和自己团队成员的名气来做广告。而其他外包公司:

* 可能将将失败的项目说成成功的
* 可能与其他公司偷偷合作
* 它的项目成员可能经常变动,你的项目不一定是你想要的明星成员在做
* 做出虚假的承诺,但是最终延期很长时间或者质量不如预期
Windows 相关的经验。


! Windows 10 ddkmd.sys 蓝屏

2016 年 4 月至 5 月时用浏览器看视频时,如果点全屏,必然会发生蓝屏,报 ddkmd.sys 出错。搜索了一番后,大多数的结论是说分屏软件(比如 Duet Display,用来把 iPad 当 PC 第二显示器)会引起这个问题。

我之前装过 Duet Display,但是已经卸载很久。搜了下安装程序列表发现有个叫 Kairos Display 的软件还在,似乎是 Duet Display 带进来的。卸载之后就解决这个蓝屏问题了。
Windows 外接两个 DPI 不一致的屏幕,比如一个 23 寸 1080P 和一个 24 寸 2K 屏幕时,需要注意屏幕设置中,「缩放与布局」「更改文本、应用等项目的大小」这个选项,两边最好保持一致,比如都是 125%。

如果不一致,窗口在一个屏幕拖动到另外一个屏幕时,窗口占屏幕比虽然看起来更舒适,但是对显卡和机器性能有影响,在我的办公电脑上感觉明显;如果一致,窗口在小的屏幕上显得很大,不是太合适,但是对机器性能没影响。
Win 10 的性能真是极差。这些优化可以帮你提升性能。

!! 关掉「最近打开的项」

设置 => 个性化 => 开始,关掉「在“开始”菜单或任务栏的跳转列表中显示最近打开的项」。这会让你右键点击任务栏的某一程序时变快。之前在 Bandizip / VSCode 的任务栏项目上点右键,慢得不能忍受。
提升 Windows 命令行易用性的一些方式。

目前我主要用 PowerShell。

! 通用

!! Multi-tabbed Terminal

使用 [[Groupy|https://www.stardock.com/products/groupy/]] 来实现这个能力。它会自动把 Cmd / PowerShell 窗口做聚合。

! PowerShell

!! Autojump / Theming

用 pshazz:

```cmd
scoop install pshazz
```

装完后它会在你的 PowerShell profile 中加入 `pshazz init` 的语句,这样你就有了:

* 一个类似 zsh 中的 `z`
* 主题(`pshazz -h` 看看)
* SSH 相关的能力

<<.warning "如果你是在 VS Code 的 PowerShell 插件的 Integrated Console 去装的 pshazz,那它会把 `pshazz init` 加在自己的 profile 文件 `%UserProfile%\Documents\WindowsPowerShell\Microsoft.VSCode_profile.ps1` 中。这时你要手动拷贝那行语句到默认的 profile 中。">>

!! Bash Style Completion 

按 tab 时列出选项而不是使用第一个。把下面几行加到 profile:

```powershell
# Init PSReadLine
Import-Module PSReadLine
Set-PSReadlineKeyHandler -Chord Tab -Function Complete
```

!! Fonts

微软对 PowerShell / Cmd 的控制台字体要求苛刻,但是它提供了一个 Microsoft.YaHei.Mono 字体,可以用在控制台。Dropbox 中放了这个字体,安装它然后在控制台的属性里启用。

! Cmd

安装 clink 以获得跟 bash 类似的使用体验:

```cmd
$ scoop install clink
$ clink autorun install
```

安装 [[wting/autojump|https://github.com/wting/autojump]] 并应用上这个 [[patch|https://github.com/wting/autojump/issues/436]]。不过我没实验过。
Windows 装机必备软件。备忘下以防重装系统时漏掉好用的工具。也是一份重装系统后的操作指南。

<<.tip "使用 Scoop 安装软件时,如果网络显得很慢,可以将 shadowsocks-windows 的全局模式打开。">>

!! 翻墙

* [[Shadowsocks Windows|https://github.com/shadowsocks/shadowsocks-windows/releases]]: 大量应用依赖于翻墙,需要优先装。配置同步在 `Dropbox\Sync\Shadowsocks Windows\` 中
* Privoxy: 安装后参考 `Dropbox\Journey\Toolbox\PAC` 配置 `actionfile`
* 系统代理设置:将 `Dropbox\Journey\Toolbox\PAC\pac\generated.pac` 转成 `file://` 协议后填入系统代理设置中

!! 双系统

我基本上是 Windows 和 Linux 双系统同时使用。比较好的做法是让 [[Windows 使用 UTC 时间|https://wiki.archlinux.org/index.php/System_time#UTC_in_Windows]]。

!! 字体

下面的这些字体要安装。可以去网上下新的字体,也可以用 `Dropbox\Fonts` 中的:

* Noto Sans
* Noto Sans Mono
* PT Serif
* Open Sans
* Microsoft Yahei Mono

!! 网盘

* One Drive: 使用 `onlyice@outlook.com` 帐号;Enpass 的数据同步在这上面
* Dropbox: 放弃使用,原因见 [[Data Backup]]
* 百度网盘: 可选,有需要再装

!! 日常工具

* Enpass: 密码管理器,Chrome 等大量软件依赖于上面的密码
* XYplorer:文件浏览器,按 [[Windows: File Explorer]] 做配置
* Listary: 参考 [[Quick Launch and File Search]] 做配置
* Bandizip: 非常好用,安装后:
** 将 context menu 条目折叠起来,把右键菜单中 tgz 格式打开
** 压缩设置中,将「只压缩单个文件夹时不要创建根文件夹」去掉
* Ditto: 安装后配置全局快捷键 <kbd>Ctrl-Alt-V</kbd>
* [[QuickLook|https://github.com/QL-Win/QuickLook]]: 快速预览工具
* [[Git|https://git-scm.com/download/win]]: VSCode / IDE 等需要 Git
* Beyond Compare: 主要是文件夹对比
* PDF-XChange Viewer
* Synergy: 可选,如果你的环境不需要一套键鼠跨多台机器,就不需要装
* TreeSize: 硬盘容量不够时使用
* GoldenDict: 参考 [[Dictionary]] (scoop)
* QQ 五笔:微软五笔不行(输入反应迟钝),用 QQ 五笔。语言列表只保留一个中文,输入法列表只保留一个 QQ 五笔。在系统设置中使用 <kbd>Ctrl-Space</kbd> toggle 输入法(牺牲 IDE 中的自动补全快捷键)。在 QQ 五笔配置中把所有快捷键去掉
* [[Quicker|https://getquicker.net/]]:使用我写的「粘贴到文件」功能
* 视需要安装 [[Screen Capture and Recording]] 中的软件
* 迅雷:有时候下东西的确需要它。网上有迅雷 VIP 日租帐号
* qBittorrent: BT 下载工具
* Free Download Manager: 迅雷表示资源有版权问题不给下载时,可以考虑用这个
* coscmd: 参考 [[这里|https://github.com/onlyice/scoop-bucket/tree/master/scripts/cosupload]]

!! 编辑器

* Visual Studio Code: 装好后安装 Settings Sync 插件,将 Gist 上的配置同步下来
* Typora: Markdown 渲染成 PDF 很专业
* Microsoft Office 365 专业增强版:如果在公司,用工作的授权激活;如果在家,用 Dropbox 中的 `KMSAuto Net.exe` 激活,可以用 `onlyice@outlook.com` 登录

!! 浏览器

* Chrome
* Vivaldi: 多 Tab 分屏,更多实用特性等
* QQ 浏览器:开一些政府网站用,QQ 浏览器可能适配得更好

!! 安全

* 火绒

!! 娱乐

* 网易云音乐
* Steam
* Nvidia GeForce Experience: 根据显卡自动配置游戏显示效果
* PotPlayer

!! IM

* Telegram
* QQ
* 微信
* 企业微信

!! 开发工具

* [[Windows Terminal|https://github.com/microsoft/terminal]]
* [[Scoop|https://scoop.sh]]
** scoop install maven adb sudo vim coreutils proxifier-portable wireshark
** PowerShell 优化,参考 [[PowerShell Profile]] 及 [[Windows Command Line]]
* Charles: 破解麻烦,使用到的功能有限,考虑使用 mitmproxy 取代之
* WireShark
* Python 3
** VC For Python: 参考 [[这里|https://wiki.python.org/moin/WindowsCompilers]] 安装相应的 build tool 来编译 Python C 扩展
* Oracle JDK 8
* Xshell / Xftp: Enpass 中有授权码
* JetBrains 全家桶:通过 JetBrains Toolbox 去装
开放 Windows 系统上的端口供外部访问。

# 在 `控制面板\系统和安全\Windows Defender 防火墙\允许的应用` 把你要提供服务的应用加入这个列表
# 在 `高级安全 Windows Defender 防火墙` 上检查有无规则阻碍你实现这一目的

注意防火墙规则按以下优先级顺序应用:

* 经过身份验证的绕过(覆盖阻止规则的规则)
* 阻止连接
* 允许连接

因此你设的「允许连接」规则,可能会被「阻止连接」规则给覆盖掉。
[[Scoop|https://github.com/lukesampson/scoop]] 和 [[Chocolatey|https://chocolatey.org/]] 是流行的 Windows 软件管理工具。他们都是二进制包发行的,不需要额外的编译过程。

Scoop 是社区驱动的,主要目标是把 Unix 命令行方便地搬到 Windows 上用,但是也有很多其他类型的库,比如 adb、Maven、7zip、VS Code 等。Scoop 仓库有 GUI 软件也有 CLI 软件,可以用 InnoSetup 的安装包,也可以把 GUI 程序的快捷方式放进开始菜单里。软件默认被装进 `~/scoop/apps`。它比较像绿色软件,大部分的安装过程就是把网上的二进制包解压到某个目录,卸载就是删掉某个目录,不需要安装程序和卸载程序。它也支持 InnoSetup 安装包。

Chocolatey 是商业公司驱动的,它更像一个分发平台,用来解决普通用户快速安装软件、运维快速部署 Windows 服务器等需求。各种主流软件都支持。它不注重于 Scoop 想要实现地「快速安装 CLI 程序」。它看起来不像 Scoop 那么绿色,而更像是把官方提供的安装包用 silient 模式安装和卸载。

!! 怎么选?

GUI 程序,比如 Chrome、IDE、Dropbox、VS Code、Ditto 等,可以用 Chocolatey 装,它也是用官方安装包。

编程语言的包,比如 Python、Go、Java 等,建议仍然用 Chocolatey 装。实验过 scoop 安装 jdk8,在双击下载下来的 `jd-gui.exe` 时报了找不到 Java 运行环境。编程语言的安装包还是会涉及一些注册到系统的行为(比如注册表、默认程序等),这种用 scoop 安装不一定靠谱。

CLI 程序,比如 Maven、ADB 等,用 Scoop 装,这样你不用自己配 PATH。

个人更喜欢 Scoop,简单易懂。
`Dropbox/Journey/Toolbox/Windows` 中放了一些 Windows 专用的工具。

* `Display.Lock.exe`: 把鼠标锁定在某个窗口内
* `wumt_x64.exe`: Windows 更新工具
给 Windows 文件浏览器增加 Context Menu。

本质上是修改注册表,可以用各种 Context Menu Editor,也可以执行 `.reg` 文件。

scoop-extras 仓库有个 VS Code Insider 的例子,`vscode-install-context.reg`:

```reg
Windows Registry Editor Version 5.00

; 在文件图标上右键
[HKEY_CLASSES_ROOT\*\shell\Open with Code &Insiders]
"Icon"="C:\\Users\\onlyice\\scoop\\apps\\vscode-insiders\\current\\Code - Insiders.exe"
[HKEY_CLASSES_ROOT\*\shell\Open with Code &Insiders\command]
@="\"C:\\Users\\onlyice\\scoop\\apps\\vscode-insiders\\current\\Code - Insiders.exe\" \"%1\""

; 在某个文件夹图标上右键
[HKEY_CLASSES_ROOT\Directory\shell\Open with Code &Insiders]
"Icon"="C:\\Users\\onlyice\\scoop\\apps\\vscode-insiders\\current\\Code - Insiders.exe"
[HKEY_CLASSES_ROOT\Directory\shell\Open with Code &Insiders\command]
@="\"C:\\Users\\onlyice\\scoop\\apps\\vscode-insiders\\current\\Code - Insiders.exe\" \"%1\""

; 在某个文件夹的背景上右键
[HKEY_CLASSES_ROOT\Directory\Background\shell\Open with Code &Insiders]
"Icon"="C:\\Users\\onlyice\\scoop\\apps\\vscode-insiders\\current\\Code - Insiders.exe"
[HKEY_CLASSES_ROOT\Directory\Background\shell\Open with Code &Insiders\command]
@="\"C:\\Users\\onlyice\\scoop\\apps\\vscode-insiders\\current\\Code - Insiders.exe\" \"%V\""
```

`&` 符号表示后面的字母是快捷键。

在某个文件夹的背景上右键,如下图所示:

{{ background-context-menu }}

VSCode 官方的例子更好(人工从注册表反编译成 reg 文件):

```reg
[HKEY_CLASSES_ROOT\*\shell\VS Code]
@="Open w&ith Code"
"Icon"="C:\\Program Files\\Microsoft VS Code\\Code.exe"
[HKEY_CLASSES_ROOT\*\shell\VS Code\command]
@="\"C:\\Program Files\\Microsoft VS Code\\Code.exe\" \"%1\""

; 在某个文件夹图标上右键
[HKEY_CLASSES_ROOT\Directory\shell\VS Code]
@="Open w&ith Code"
"Icon"="C:\\Program Files\\Microsoft VS Code\\Code.exe"
[HKEY_CLASSES_ROOT\Directory\shell\VS Code\command]
@="\"C:\\Program Files\\Microsoft VS Code\\Code.exe\" \"%1\""

; 在某个文件夹的背景上右键
[HKEY_CLASSES_ROOT\Directory\Background\shell\VS Code]
@="Open w&ith Code"
"Icon"="C:\\Program Files\\Microsoft VS Code\\Code.exe"
[HKEY_CLASSES_ROOT\Directory\Background\shell\VS Code\command]
@="\"C:\\Program Files\\Microsoft VS Code\\Code.exe\" \"%V\""
```
微软的各个软件包、操作系统安装包等,有时间真的是很难找。

[[MSDN I Tell You|https://msdn.itellyou.cn/]] 这个站点罗列了非常多的微软产品下载链接。非常好用。
Windows 上的文件浏览器。

Windows 10 自带的 Explorer 奇慢无比,每次打开新窗口大约要等待 3~5 秒才可用,进一个目录要 1~3 秒才可用,性能慢得无法忍受。于是尝试了一些其他的文件浏览器。

目前觉得最佳是 [[XYplorer|https://www.xyplorer.com/]]

! XYplorer

[[XYplorer|https://www.xyplorer.com/]] 性能非常快,特性最全,而且特性非常的 practical,还支持 Hi-DPI,非常好评。

!! Minimal Tree

Minimal Tree 把不常用的、隐藏的文件夹都隐藏起来了,你访问过的则会出现在树中。这个功能非常用心:

{{ xyplorer-minimal-tree }}

!! Color Filter

Color Filter 可以按条件把 item 染色,比如最近 30 分钟动过的文件夹,会有显眼的绿色。这非常方便了查找文件夹的过程。

{{ xyplorer-color-filter }}

!! Preview

<kbd>Ctrl-F11</kbd> 可以显示 Preview Panel,效果没有 [[Quick Look]] 好,但是凑合用。

!! Listary 集成

在 Listary 选项页中「常规设置」中,把默认文件管理器改成 XYplorer,参数如下:

* `C:\Program Files (x86)\XYplorer\XYplorer.exe`
* `"%1"`

在「应用程序设置」中,把 XYplorer 的「即时搜索」「单击鼠标中键弹出 Listary 快捷菜单」去掉,会跟 XYplorer 的列表中 type ahead 的功能冲突。

!! Open With VSCode 快捷键

在 VSCode 中打开文件夹或者文件,是非常常见的场景。一般的操作是右键 => Open With Code,但是考虑到这个操作过于高频,值得为其单独分配一个快捷键。

做法是通过 XYplorer 提供的 user command 功能。在菜单中,User => Manage Commands,Category "Open With" 中新建一个 Commands,填法:

* Caption: Open With VSCode
* Applicaton: "C:\Users\onlyicelin\AppData\Local\Programs\Microsoft VS Code\Code.exe"
* 分配一个 <kbd>Alt+C</kbd> 作为快捷键
* 其他设置不变

!! 正版售价

[[数码荔枝|https://item.taobao.com/item.htm?id=536088852800]] 上只卖 109 RMB。单用户无限设备使用。

! Directory Opus

[[Directory Opus|https://www.gpsoft.com.au/]] 性能还不错,但是没有 XYplorer 快,关掉动画后还是可以感受到卡顿。功能不够 XYplorer 多,卖得还比它贵。

! Explorer++

[[Explorer++|https://explorerplusplus.com]] 性能非常快,绿色版,但是不够 feature rich。

! Q-Dir

[[Q-Dir|https://www.softwareok.com/?seite=Freeware/Q-Dir]] 性能还 OK,但是本质上只是个快速分屏的文件浏览器,没什么特性。
判断 Windows 中什么软件占用了全局热键。

有些软件莫名会其妙地占用了全局热键,例如企业微信某个版本,把它没用到的 <kbd>Shift+Esc</kbd> 以全局模式给占用了,导致在 IntelliJ 中没法用到这个热键,这个时候就需要排查谁占用了这个热键。

参考这个 SuperUser [[回答|https://superuser.com/a/1204019/500657]],使用 Spy++ 可以找到占用该热键的进程。方法如下:

# 通过安装 VS 的 Community 版以获得 Spy++。Spy++ 在「开发活动」中的「Visual Studio C++ 核心功能」中
# Spy++ 分 64 位和 32 位版,文件名分别是 `spyxx_amd64.exe` 及 `spyxx.exe`,分别能捕获 64 位和 32 位程序的窗口事件。使用 Listary 定位之并打开
# 按 <kbd>Ctrl+M</kbd> 打开「消息选项」,「其他窗口」中勾选上「系统中的所有窗口」,「消息」Tab 中「全部消除」,再选上 `WM_HOTKEY`。点击确定
# 按你想定位的快键(如 <kbd>Shift+Esc</kbd>),看「消息(所有窗口)」上有无内容出现,有的话定位到是哪个窗口和程序

Over。
!! 让 Microsoft Store 走代理

在 IE 设置中设置代理即可。可能需要中断掉已经在下载的 app,重新开始。用任务管理器观察代理软件有无使用网络流量。
!! 安装

从 Windows 10 开始,在 Windows 的可选功能项中有 OpenSSH 客户端和服务端。

但是实际测试下来,这个客户端对 `ProxyCommand` 的支持有问题。''应该使用 Scoop 安装 Git,再使用 Git 中附带的 OpenSSH。''

!! SSH over Proxy

Git for Windows 带了一个 `connect.exe`,可以实现类似 openbsd-netcat 的效果。示例 `~/.ssh/config`:

```
Host github.com
    ProxyCommand connect -S 127.0.0.1:1080 %h %p

Host gitlab.com
    ProxyCommand connect -S 127.0.0.1:1080 %h %p
```
There are serveral ways to run a program after Windows startup.

!! Task Scheduler

Using Task Scheduler is the most convenience way to do this job. There is an example in `Dropbox/Journey/Toolbox/FinalSpeed/Windows CLI Client/启动 FinalSpeed 计划任务.xml` that indicates how to use Task Scheduler to run finalspeed in the background.

!! Startup Folden in Start Menu

The startup folden is located in `C:\Users\[Username]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`. You can put any program inside it that will be executed after user login. Be aware that the program is run foreground, means that there would be a black cmd windows if you run a bat file.

!! Without a Command Prompt?

Refer to [[these|https://superuser.com/questions/62525/run-a-batch-file-in-a-completely-hidden-way]] [[SuperUser|https://superuser.com/questions/140047/how-to-run-a-batch-file-without-launching-a-command-window]] [[questions|https://superuser.com/questions/191149/how-to-execute-cmd-exe-silently]].
语法:

```cmd
mklink /D LINK TARGET
```

实例:

```
mklink /D D:\go\src\consul_access D:\Workbench\tsf-consul\tsf-consul-access
mklink /D D:\go\src\github.com\hashicorp\consul D:\Workbench\tsf-consul\tsf-consul-server
```

上面例子会建一个软链接文件 `D:\go\src\consul_acces`,指向 `D:\Workbench\tsf-consul\tsf-consul-access`。实测在 Goland 下打开 `D:\go\src\consul_access` 能正常使用。

!! 参考

[[The Complete Guide to Creating Symbolic Links (aka Symlinks) on Windows|https://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/]]
Windows HTTP Services (winhttp) 是一个 Windows 上的服务,可以对开发者屏蔽掉运行环境的代理启用情况。具体的细节我没有深究。

主要影响面可能有:

* ''影响 Microsoft Store 下载''
* ''影响 UWP 应用的网络连接''(未深入调研)
** 之前用 `netsh` 指令设置好代理后,MineCraft for Windows 10 在访问游戏内商店的速度飞快
* 影响使用 WinHTTP 库的应用程序连接网络
* 可能影响 Windows Update(未深入调研)

配置代理的方式(需要管理员权限):

* `netsh winhttp set proxy 127.0.0.1:12759`
* `netsh winhttp import proxy source=ie`:从 IE 导入配置(即 Windows 系统的全局配置),但是对于 IE 用了 PAC 的情况无效

!! 参考

* [[Windows proxy settings explained|https://securelink.be/blog/windows-proxy-settings-explained/]]

[[n8n|https://n8n.io/]] 是个用来做多个互联网服务间的工作流工具。

目前对我来说还没有太有效的使用场景。先放在这里作个参考。

!! See Also

* IFTTT
* Zapier

在确定了话题后,往往需要有一个收集素材的过程。

《[[为什么精英这样沟通最高效|The Power of Output]]》书中第 45 节提到一个写卡片的方法。即是你想着要写的主题,

# 把自己脑中能想到的关键词、想法、创意、论文、书籍、故事等等,都写成一个个卡片
# 不停地联想,扩充这些卡片的数量
# 将卡片分类再分类,形成脉络,构思起承转合,然后就可以开始填充内容

用了一段时间后,觉得 WSL 比较鸡肋,没有太多意义。考虑到已经有 Linux 系统做日常开发,不应该再使用 Windows 做开发,因此不要使用 WSL。

按功能做了表格:

|!功能点 |!子功能 |!WSL 上能力 |!Windows 上能力 |
|GNU 工具链 | |`coreutils` 包 |`scoop install coreutils` |
|方便的包管理工具 | |pacman |`scoop` |
| |编程语言包 |有 |有 |
| |后台程序 (Consul / MySQL / Nginx) |有 |有 |
|SSH 及相关配置 | |原生支持 |[[优良支持|Windows: OpenSSH]] |
|好用的终端 (zsh / oh-my-zsh) | |原生支持 |Windows Terminal 体验尚可 |
|配置同步(yadm) | |原生支持 |不支持(不是太重要) |
|开发 Linux 相关程序 | |原生支持 |不支持 |
|启动 TiddlyWiki | |`tw` shell alias |`tw.ps1` script |

大部分需求点,有不错的 Windows 替代解决方案,或者这个能力并不是非有不可。WSL 上的 shell 有一些自定义的脚本、功能,比如 `z`(autojump)、`with-proxy-env` 这些东西要找 Windows 上的对应方案还是有成本的。

另外 WSL 还有一些缺陷:

* 性能太差:参考这篇 [[帖子|https://www.phoronix.com/scan.php?page=article&item=wsl-february-2018]],WSL 的性能居然比虚拟机还差。我在使用时也明显感受到慢,比如 zsh 很多 theme,会在你 cd 进一个目录时去拿 git 信息,这个过程卡得不行。所以你想用 WSL 编译一些中型以上的程序,很可能是不行的
* 没法用 systemd:由于 WSL 并不是运行在一个真正 boot 起来的系统,systemd 是不能用的,意味着一些之前由 systemd service 做的事情,你得手动做。比如启动 TiddlyWiki。(不过这个也可以通过脚本来做)
* 涉及底层的操作做不了:比如你没法用 tcpdump 抓包

[[Scoop|Windows Package Manager]] 的出现很大程度上解决了问题。感谢 Scoop。
[[李笑来:我的读书经验|https://www.zhihu.com/lives/763851343583547392]] 这期 Live 主要讲读书相关的方法论。

大多数内容都在 [[新生|Reborn]] 这本书中提过,所以我没听到太多新的东西。

核心的 Idea 就是:

# 读书少时先广泛地读
# 读得多了要挑好书读
# 要一字不漏地读,不要跳读、扫读<<footnote "[1]" "这个要看上下文的,前提是这本书的内容你都不太懂,而且他是有价值的">>
# 读书之后要用

值得一提的是他推荐的 [[Blinkist|https://www.blinkist.com/]],是一个帮你挑书、同时把书的精华内容摘录出来的付费服务。目前这个服务对我没有太多价值,感觉我读的书还没有多到需要这种服务的时候,而简单地给我灌输书里的精华内容,似乎没有太大帮助。但是后面如果读书多了,可以考虑再尝试下。



YAML 的具体语法,可以参考下面的资源链接。这里给一些快速的示例,以及描述 YAML 的能力。

YAML 目前主流是 1.2 版本(2009 年),1.3 版本在讨论中(2017 年开始)。

!! Scalar Types

```yaml
Language Independent Scalar types:
    { ~, null }                  : Null (no value).
    [ 1234, 0x4D2, 02333 ]       : [ Decimal int, Hexadecimal int, Octal int ]
    [ 1_230.15, 12.3015e+02 ]    : [ Fixed float, Exponential float ]
    [ .inf, -.Inf, .NAN ]        : [ Infinity (float), Negative, Not a number ]
    { Y, true, Yes, ON  }        : Boolean true
    { n, FALSE, No, off }        : Boolean false
    2001-12-14t21:59:43.10-05:00 : Date time value in ISO8601
    1976-07-31                   : Date value in ISO8601
    "Hello\nWorld"               : String literal with escaping (\n would be turned into new line)
    'Hello\nWorld'               : String literal without escaping
```

强制类型转换 `!!`:

```yaml
e: !!float 123
f: !!str true 
```

!! Basics

Array:

```yaml
- apple
- banana
- carrot
```

Hash:

```yaml
foo: whatever
bar: stuff
```

Complex mixed mapping:

```yaml
foo: whatever 
bar: 
 - 
   fruit: apple 
   name: steve 
   sport: baseball 
 - more 
 - 
   python: rocks 
   perl: papers 
   ruby: scissorses 
```

In Ruby:

```ruby
{ 'foo' => 'whatever',  
  'bar' => [ 
    { 
        'fruit' => 'apple',  
        'name' => 'steve', 
        'sport' => 'baseball' 
    }, 
    'more', 
    { 
        'python' => 'rocks', 
        'perl' => 'papers', 
        'ruby' => 'scissorses' 
    } 
  ] 
}
```

!! Flow Mode (Inline Mode)

```yaml
seq:
  - a
  - b
  - c

# The same with above
seq: [a, b, c]
```

```yaml
hash:
  name: Steve
  foo: bar

# The same with above
hash: { name: Steve, foo: bar } 
```

多行字符串,用 `|` `>` 两个符号,规则啰嗦,不展开讲。一般来说用 `|` 会保留你的换行,`>` 倾向于合并。看看 StackOverflow 的 [[回答|https://stackoverflow.com/a/21699210]]。

`&`, `<<` 可以用来合并一个 mapping 到另外一个 mapping。

一般 YAML 文件格式中会带个头 `%YAML 1.2`,`---` 作开始,`...` 作结尾。但是这些符号可有可无,parser 一般不作强制要求:

```yaml
%YAML 1.2
---
# Your content
...
```

!! 工具

* [[Online YAML Parser|http://yaml-online-parser.appspot.com/]] 提供了一个 YAML 的 playground,有不确定的语法时在这上面试试

!! 参考

* [[YAML 语言教程 - 阮一峰|http://www.ruanyifeng.com/blog/2016/07/yaml.html]]:阮一峰这个教程很不错,推荐
* [[Yaml Cookbook|http://yaml.org/YAML_for_ruby.html]]:提供了很多典型的 YAML 用例,推荐
* [[YAML Syntax - Ansible|http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html]]:写了一些 YAML 的陷阱(gotchas)
* [[YAML 1.1 Reference Card|http://yaml.org/refcard.html]]
* [[YAML Official Site|http://yaml.org/]]
[[Yarn|https://yarnpkg.com/zh-Hans/]] provides "fast, reliable and secure dependency management". Core features include:

* Cache packages it downloads so you can install it later even offline. This make it blazing fast.
* Introduce a workflow (`yarn.lock`) to ensure the same dependencies will be installed across every machine.

Using yarn is relatively simple. [[The official documentation|https://yarnpkg.com/zh-Hans/docs]] is awesome, easy to read and comprehesive.

<iframe width="560" height="315" src="https://www.youtube.com/embed/aThFPYKNrgk" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

从评论区拷贝了内容提纲:

# 尽早涂眼霜👁
# Travel Around✈(后续考虑)
# 不要去费力讨好那些永远不会喜欢你的人🖤
# 友情👥也需要呵护和经营 ➡ [[Long-term Planning: Roadmap: Social]]
# 人是拿来爱的,东西是拿来用的
# 健康才是一切👣 ➡ [[Long-term Planning: Health]]
# 职场想成为什么的人,试着从穿得像那样开始👩‍💻👗👠👡(后续考虑)
# 找到属于你自己的减压方式🎡 ➡ [[Long-term Planning: Health]]
# 爱情婚姻🎎,不要掩饰真实的自己
# 永远不要觉得——太迟,现在就是永远🔮
<iframe width="560" height="315" src="https://www.youtube.com/embed/BuV6PHPsPEY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

内容提纲:

# 钱靠赚也靠存 2:05
#* 钱是赚的,更是存的
#* 清楚每月预算,坚守底线
# 规划每月预算 4:28
#* 做到每一笔消费时,你都大概知道这个品类的消费,预算还剩多少,能否支持到月底
#* 不断去调整预算到合理的值
# 正确记账方式 6:40
#* 手动记帐,定期回顾
# 完成理财目标 9:08
#* 与预算类似,要坚持底线
# 存紧急备用金 12:05
#* 3-6 个月家庭开销为佳,需要考虑房租、房贷、车贷等
<iframe width="560" height="315" src="https://www.youtube.com/embed/olUVti4oyUA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

讲 OneNote 用来上课、学习的使用技巧。比较有印象的是:

* 录音功能很实用,比如在一堂课开讲时点击录音,然后中间做笔记,做完笔记回顾时,可以实时把录音定位到做笔记当时的时间点
* 可以把 PDF 展开导入进 OneNote,配合线条和箭头进行做笔记时,效果跟在书上做很类似
<iframe width="560" height="315" src="https://www.youtube.com/embed/jvETIcMXaEo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

这是我听的第一期 Game Score Fanfare 的内容。这期的内容实在太赞了,讲述了:

* 音乐与人的压力状态的关联
* 音乐怎样与 Celeste 的游戏机制融合起来
* Celeste 游戏在表达焦虑上的音画设计

第一次看觉得很 inspiring and impressive.
这里纪录我长时间以来慢慢发现的好的 YouTube channel。如果不知道看什么内容,可以在这里面挖掘下。

每个 channel 中,我会描述为什么订阅它。

有价值的单期会录入在这里,简单描述里面有启发的点、相关的故事等等。每个单期应该有一个自定义 field,名为 `score`,值为 1 - 5,表示我对这个内容的推荐程度,5 是最高,1 是最低。一般只会有 3 - 5。

[[cali_Kallie|https://www.youtube.com/user/DearKallie/featured]]:

> 一个80后麻麻,带娃之余做做自己喜欢的美妆视频!

美妆内容我并不感兴趣,关注到她是因为听了几期闲聊视频,感觉她说话理性中肯,做视频也用心,对我有所启发。

[[Elena Lin 青青|https://www.youtube.com/channel/UCFjqAKR9UVS28ucTNuVTexA]]:

> 我是正在荷兰留学的Elena, 希望能够跟大家一起变美变优秀,分享国外的留学生活,一起成长和提高生活技巧。希望能够给你带来许多的干货和正能量!每周都会更新视频,新来的小伙伴们记得点个关注哟~ !

[[Game Score Fanfare|https://www.youtube.com/channel/UC8P_raHQ4EoWTSH2GMESMQA]](游戏音乐课)讲述了游戏中好的音乐内容、编曲设计以及音乐与游戏机制的结合等。觉得非常有料,值得一看。

第一次发现这个 channel 是看到了这期:[[The Anxiety of Celeste and its Music|https://www.youtube.com/watch?v=jvETIcMXaEo]]

使用 Zsh 搭配 oh my zsh。

配置文件使用 [[yadm|Dotfiles Management]] 托管。



Zuul 是 Netflix 的服务网关。

[img width=700 [zuul-in-netflixs-cloud-architecture]]

!! 核心模型

Zuul 本质上是一个可编程路由服务,并提供了在路由前后执行代码的能力。Zuul 提供了 filter 机制来实现。filter 有几个属性:

* 类型:filter 应该在什么时候被执行,有 PRE, ROUTING, POST, ERROR,具体代表的含义在下面讲
* 执行顺序:同样类型的 filter,应该有怎样的先后顺序来执行
* 条件:满足了这个条件,filter 才被执行
* 动作:实际执行的动作

看看代码就明白:

```java
class DeviceDelayFilter extends ZuulFilter {
    def static Random rand = new Random()
    
    @Override
    String filterType() {
       return 'pre'
    }

    @Override
    int filterOrder() {
       return 5
    }

    @Override
    boolean shouldFilter() {
       return RequestContext.getRequest().getParameter("deviceType") ? equals("BrokenDevice") : false
    }

    @Override
    Object run() {
       sleep(rand.nextInt(20000)) // Sleep for a random time
    }
}
```

不同的 filter 通过 `RequestContext` 共享数据。Zuul 制订了一套 filter 发布的过程,供 Zuul Server 动态地去加载新的 filter。

[img width=700 [zuul-core-architecture]]

!! 生命周期

不同类型的 filter,它的生命周期不一样:

* PRE filter 在请求被路由到源站(origin,意指后端服务 / CDN)前执行。常用来做请求鉴权、选择源站机器([[例子|https://github.com/Netflix/zuul/blob/1.x/zuul-core/src/main/groovy/com/netflix/zuul/filters/SurgicalDebugFilter.groovy]])、纪录调试信息等
* ROUTING filter 实际将请求转发到源站机器,到源站的 HTTP 请求会在这里被构建,同时用 Apache HttpClient 或者 Netflix Ribbon 发送出去。这个 [[例子|https://github.com/Netflix/zuul/blob/1.x/zuul-core/src/main/groovy/com/netflix/zuul/filters/SurgicalDebugFilter.groovy]] 展示了这一过程,并且维护了一个连接池,实现了转发特定请求到调试服务上的能力(配合 PRE filter)
* POST filter 是在转发过程完成后被执行,一般用来收集统计信息
* ERROR filter 在上述几个阶段出错时被执行

[img width=700 [zuul-request-lifecycle]]

Zuul 也允许你创建自定义的 filter 类型并显式运行它们。Zuul 有一个 STATIC 类型,用来直接返回给前端数据,而不是转发到源站。

Zuul 也和 Netflix OSS 中的其他组件紧密联系。

!! 参考

* [[Announcing Zuul: Edge Service in the Cloud|https://medium.com/netflix-techblog/announcing-zuul-edge-service-in-the-cloud-ab3af5be08ee]]
[img width=700 [zuul-2-architecture]]

Zuul 2 主体的架构跟 [[Zuul 1|Zuul 1 Core]] 差别不大。

!! 协议

协议上支持 HTTP/2 和双向 TLS,并且实现了可配置的连接池。

!! 灵活路由

用 Zuul 可以实现非常灵活的路由规则,可以基于根据 URL、query params 或者 HTTP 头做路由。这有一些实用场景:

* 一个服务需要区分不同用户(按地域或者其他条件),到不同的 origin
* 开发者可以把一些流量路由到调试集群,以观察高负载下应用程序是否优雅地降级(类似于腾讯喜欢说的「柔性服务」)
* 开发者发布多个成套的新服务时,可以让特定的用户路由到这套新的服务
* Canary testing or release

!! 负载均衡

Zuul 实现了 adaptive retries,在 origin 返回 HTTP 503 或者连接失败时自动重试。

Zuul 可以用来实现一些特定的负载均衡规则。这里描述的能力可能不是 Zuul 本身就实现的,而是 Netflix 基于 Zuul 做的一些最佳实践:

* Cold instances: 新的 origin 实例上线时,应该慢慢给它导入新的流量,直到他们准备好。这是因为应用可能有懒加载的代码,JIT 也需要应用运行一段时间才达到最佳状态。一口气给它大量的流量,可能会引起服务不稳定。
* High error rates: 一旦一些 origin 实例的错误率提高到一个阈值,Zuul 会限制重试次数并且减少流量。
* Overloaded Instances: origin 在返回数据中添加头部信息,告诉 Zuul 它当前的利用率是多少百分比,以及期望的利用率是多少。Zuul 会根据这些数据来智能决策。这个利用率不限定是具体的机器指标,比如 CPU 密集型应用可以用 CPU 占用率,IO 密集型应用可以用 IO 数据。

!! 调试能力

* Request Passport:一个请求的各种 lifecycle 事件,会被详细地纪录,比如前端请求到了 Zuul 的时间点,Zuul 将其转发到 origin 的时间点等。可以用来定位问题,比如后端超时、后端返回失败等
* Status Categories:比 HTTP 返回码粒度更细的状态码
* Request Attempts:Zuul 将转发过程的详细信息,通过 HTTP 头带给前端,方便定位问题

!! 参考

* [[Open Sourcing Zuul 2|https://medium.com/netflix-techblog/open-sourcing-zuul-2-82ea476cb2b3]]
* [[Zuul 2 Core Features|https://github.com/Netflix/zuul/wiki/Core-Features]]
* [[Zuul 2 : The Netflix Journey to Asynchronous, Non-Blocking Systems|https://medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c]]